Standardized Badge, Exhibit, and Tracking models to ID Vision standards. Included account_id support for exhibit tracking and removed legacy validators to ensure stable CRUD operations for the Tuesday demo.
201 lines
8.0 KiB
Python
201 lines
8.0 KiB
Python
import datetime, pytz
|
|
|
|
from typing import Dict, List, Optional, Set, Union
|
|
from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator
|
|
|
|
from app.db_sql import redis_lookup_id_random
|
|
from app.lib_general import log, logging
|
|
|
|
from app.models.common_field_schema import base_fields, default_num_bytes
|
|
|
|
# from app.models.event_badge_models import Event_Badge_Base
|
|
from app.models.event_person_models import Event_Person_Base
|
|
|
|
|
|
# ### BEGIN ### API Event Exhibit Tracking Models ### Event_Exhibit_Base() ###
|
|
class Event_Exhibit_Tracking_Base(BaseModel):
|
|
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
|
|
log.debug(locals())
|
|
|
|
# --- Standardized Vision IDs (Strings for API, Integers for DB) ---
|
|
id: Optional[Union[int, str]] = Field(None, **base_fields['event_exhibit_tracking_id_random'])
|
|
event_exhibit_tracking_id: Optional[Union[int, str]] = Field(None, **base_fields['event_exhibit_tracking_id_random'])
|
|
account_id: Optional[Union[int, str]] = Field(None, **base_fields['account_id_random'])
|
|
event_id: Optional[Union[int, str]] = Field(None, **base_fields['event_id_random'])
|
|
event_exhibit_id: Optional[Union[int, str]] = Field(None, **base_fields['event_exhibit_id_random'])
|
|
event_person_id: Optional[Union[int, str]] = Field(None, **base_fields['event_person_id_random'])
|
|
event_badge_id: Optional[Union[int, str]] = Field(None, **base_fields['event_badge_id_random'])
|
|
|
|
# --- Standardized Legacy / Internal IDs (Excluded) ---
|
|
id_random: Optional[str] = Field(None, alias='event_exhibit_tracking_id_random', exclude=True)
|
|
account_id_random: Optional[str] = Field(None, exclude=True)
|
|
event_id_random: Optional[str] = Field(None, exclude=True)
|
|
event_exhibit_id_random: Optional[str] = Field(None, exclude=True)
|
|
event_person_id_random: Optional[str] = Field(None, exclude=True)
|
|
event_badge_id_random: Optional[str] = Field(None, exclude=True)
|
|
|
|
@root_validator(pre=True)
|
|
def map_v3_ids(cls, values):
|
|
"""
|
|
Vision Transformer:
|
|
Map DB keys to clean API keys and strip internal integers during READ operations.
|
|
During CREATE (POST) operations, we ensure resolved integers are preserved.
|
|
"""
|
|
# 1. Map Random Strings to Clean Names
|
|
rid = values.get('id_random') or values.get('event_exhibit_tracking_id_random')
|
|
if rid and isinstance(rid, str):
|
|
values['id'] = rid
|
|
values['event_exhibit_tracking_id'] = rid
|
|
|
|
if a_rid := values.get('account_id_random'): values['account_id'] = a_rid
|
|
if e_rid := values.get('event_id_random'): values['event_id'] = e_rid
|
|
if ex_rid := values.get('event_exhibit_id_random'): values['event_exhibit_id'] = ex_rid
|
|
if ep_rid := values.get('event_person_id_random'): values['event_person_id'] = ep_rid
|
|
if eb_rid := values.get('event_badge_id_random'): values['event_badge_id'] = eb_rid
|
|
|
|
# 2. Prevent "Collision Population" or leakage of integers during API responses
|
|
for k in ['id', 'event_exhibit_tracking_id', 'account_id', 'event_id', 'event_exhibit_id', 'event_person_id', 'event_badge_id']:
|
|
val = values.get(k)
|
|
if val is not None and not isinstance(val, str):
|
|
if values.get(f'{k}_random') or (k=='id' and values.get('id_random')):
|
|
del values[k]
|
|
|
|
return values
|
|
|
|
external_person_id: Optional[str] # This is probably an email address
|
|
|
|
exhibitor_notes: Optional[str]
|
|
responses_json: Optional[Json] # NOTE: Responses to custom questions
|
|
# Example:
|
|
# {"5_years": {"response": "I see myself in 5 years doing something."}, "colors": {"response": "green"}}
|
|
# {"example_text": {"response": "This is an example of an text answer."}, "example_option_list": {"response": "no"}, "the_code": {"response": "yes"}, "question_everything": {"response": "tomorrow"}, "pre_assesment": {"response": "yes"}}
|
|
|
|
data_json: Optional[Json] # NOTE: Additional data
|
|
|
|
enable: Optional[bool]
|
|
hide: Optional[bool]
|
|
priority: Optional[bool] = False
|
|
sort: Optional[Union[None, int]] = None
|
|
group: Optional[str]
|
|
|
|
notes: Optional[str]
|
|
created_on: Optional[datetime.datetime] = None
|
|
updated_on: Optional[datetime.datetime] = None
|
|
|
|
# Including convenience data
|
|
# This is only for convenience. Probably going to keep unless it causes a problem.
|
|
event_badge_pronouns: Optional[str] = Field(
|
|
alias = 'person_pronouns'
|
|
) # Preferred pronouns
|
|
event_badge_pronouns_override: Optional[str] = Field(
|
|
alias = 'person_pronouns_override'
|
|
) # Override pronouns
|
|
|
|
event_badge_informal_name: Optional[str] = Field(
|
|
alias = 'person_informal_name'
|
|
)
|
|
|
|
event_badge_title_names: Optional[str] = Field(
|
|
# alias = 'person_title_names'
|
|
)
|
|
event_badge_given_name: Optional[str] = Field(
|
|
# alias = 'person_given_name'
|
|
)
|
|
event_badge_middle_name: Optional[str] = Field(
|
|
# alias = 'person_middle_name'
|
|
)
|
|
event_badge_family_name: Optional[str] = Field(
|
|
# alias = 'person_family_name'
|
|
)
|
|
event_badge_designations: Optional[str] = Field(
|
|
# alias = 'person_designations'
|
|
)
|
|
|
|
event_badge_professional_title: Optional[str] = Field(
|
|
# alias = 'person_pronouns_override'
|
|
)
|
|
event_badge_professional_title_override: Optional[str] = Field(
|
|
# alias = 'person_professional_title'
|
|
)
|
|
|
|
event_badge_full_name: Optional[str] = Field(
|
|
# alias = 'person_full_name'
|
|
)
|
|
event_badge_full_name_override: Optional[str] = Field(
|
|
# alias = 'person_full_name_override'
|
|
)
|
|
|
|
event_badge_affiliations: Optional[str] = Field(
|
|
# alias = 'person_affiliations'
|
|
)
|
|
event_badge_affiliations_override: Optional[str] = Field(
|
|
# alias = 'person_affiliations_override'
|
|
)
|
|
|
|
event_badge_email: Optional[str] = Field(
|
|
# alias = 'person_email'
|
|
)
|
|
event_badge_email_override: Optional[str] = Field(
|
|
# alias = 'person_email_override'
|
|
)
|
|
|
|
event_badge_phone: Optional[str] = Field(
|
|
# alias = 'person_phone'
|
|
)
|
|
event_badge_phone_override: Optional[str] = Field(
|
|
# alias = 'person_phone_override'
|
|
)
|
|
|
|
event_badge_address_line_1: Optional[str]
|
|
event_badge_address_line_2: Optional[str]
|
|
event_badge_address_line_3: Optional[str]
|
|
|
|
event_badge_city: Optional[str]
|
|
|
|
event_badge_county: Optional[str] # NOTE: This is for a county within a state or province
|
|
|
|
event_badge_country_subdivision_code: Optional[str]
|
|
event_badge_state_province: Optional[str]
|
|
event_badge_state_province_abb: Optional[str]
|
|
|
|
event_badge_postal_code: Optional[str]
|
|
|
|
event_badge_country_alpha_2_code: Optional[str] = Field(
|
|
# alias = 'person_country_alpha_2_code'
|
|
)
|
|
event_badge_country: Optional[str] = Field(
|
|
# alias = 'person_country'
|
|
)
|
|
|
|
event_badge_location: Optional[str] = Field(
|
|
# alias = 'person_location'
|
|
)
|
|
event_badge_location_override: Optional[str] = Field(
|
|
# alias = 'person_location_override'
|
|
)
|
|
|
|
event_person_informal_name: Optional[str]
|
|
event_person_given_name: Optional[str]
|
|
event_person_family_name: Optional[str]
|
|
event_person_full_name: Optional[str]
|
|
event_person_full_name_override: Optional[str]
|
|
event_person_affiliations: Optional[str]
|
|
event_person_email: Optional[str]
|
|
|
|
event_exhibit_name: Optional[str]
|
|
|
|
allow_tracking: Optional[bool]
|
|
# event_exhibit_allow_tracking: Optional[bool] # This seems unnecessarily specific
|
|
|
|
# Including other related objects
|
|
# event_badge: Optional[Union[Event_Badge_Base, None]]
|
|
event_person: Optional[Union[Event_Person_Base, None]]
|
|
|
|
_processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now)
|
|
|
|
class Config:
|
|
underscore_attrs_are_private = True
|
|
allow_population_by_field_name = True
|
|
fields = base_fields
|
|
# ### END ### API Event Exhibit Tracking Models ### Event_Exhibit_Base() ###
|