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_models import Event_Base # Causes an import loop # from app.models.event_abstract_models import Event_Abstract_Base from app.models.event_badge_models import Event_Badge_Base # from app.models.event_exhibit_tracking_models import Event_Exhibit_Tracking_Base # Causes an import loop from app.models.event_person_profile_models import Event_Person_Profile_Base from app.models.event_registration_models import Event_Registration_Base from app.models.person_models import Person_Base from app.models.user_models import User_Base, User_Out_Base # ### BEGIN ### API Event Person Models ### Event_Person_Base() ### class Event_Person_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) id_random: Optional[str] = Field( # **base_fields['event_person_id_random'], alias = 'event_person_id_random', ) id: Optional[int] = Field( alias = 'event_person_id' ) account_id_random: Optional[str] account_id: Optional[int] event_id_random: Optional[str] event_id: Optional[int] event_badge_id_random: Optional[str] # Default attendee badge event_badge_id: Optional[int] event_badge_vendor_id_random: Optional[str] # Additional vendor badge event_badge_vendor_id: Optional[int] event_badge_vip_id_random: Optional[str] # Additional VIP badge event_badge_vip_id: Optional[int] event_person_profile_id_random: Optional[str] event_person_profile_id: Optional[int] event_registration_id_random: Optional[str] event_registration_id: Optional[int] person_id_random: Optional[str] person_id: Optional[int] user_id_random: Optional[str] user_id: Optional[int] external_id: Optional[str] # Generated internally or externally. Needs to be stable. It should not change. external_event_id: Optional[str] # Event ID generated by external system. Needs to be stable. It should not change. external_registration_id: Optional[str] # Registration ID generated by external system (should be stable and not change) external_reg_id: Optional[str] # NOTE: Deprecated; Move to external_registration_id. Registration ID generated by external system (should be stable and not change) external_person_id: Optional[str] # Person ID generated by external system (should be stable and not change) external_sys_id: Optional[str] # NOTE: Deprecated; Move to external_person_id. Person ID generated by external system (should be stable and not change) agree_to_tc: Optional[bool] # Agree to terms and conditions allow_tracking: Optional[bool] # Allow tracking for lead retrieval and other marketing file_count: Optional[int] priority: Optional[bool] sort: Optional[int] group: Optional[str] enable: Optional[bool] 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. # This block of person data should come from the event_person_profile table informal_name: Optional[str] given_name: Optional[str] middle_name: Optional[str] family_name: Optional[str] full_name_override: Optional[str] full_name: Optional[str] affiliations: Optional[str] email: Optional[str] website_url: Optional[str] # state_province_name: Optional[str] # Using extended_json for now for AACC abstracts extended_json: Optional[Union[Json, None]] event_badge_informal_name: Optional[str] event_badge_given_name: Optional[str] event_badge_middle_name: Optional[str] event_badge_family_name: Optional[str] event_badge_full_name: Optional[str] event_badge_full_name_override: Optional[str] event_badge_affiliations: Optional[str] event_badge_email: Optional[str] event_badge_city: Optional[str] event_badge_state_province: Optional[str] event_badge_country_alpha_2_code: Optional[str] event_badge_country: Optional[str] # This is the same as the other person data above event_person_informal_name: Optional[str] event_person_given_name: Optional[str] event_person_middle_name: Optional[str] event_person_family_name: Optional[str] event_person_name_override: Optional[str] event_person_full_name: Optional[str] event_person_affiliations: Optional[str] event_person_email: Optional[str] event_person_extended_json: Optional[Union[Json, None]] person_informal_name: Optional[str] person_given_name: Optional[str] person_middle_name: Optional[str] person_family_name: Optional[str] person_display_name: Optional[str] person_full_name: Optional[str] person_affiliations: Optional[str] person_email: Optional[str] user_email: Optional[str] user_name: Optional[str] user_username: Optional[str] # Including other related objects # event: Optional[Event_Base] # Causes an import loop # event_abstract_list: Optional[list[Event_Abstract_Base]] # Use event_person_detail table. An event_person record can be linked to one or more abstracts event_badge: Optional[Event_Badge_Base] # Default attendee badge event_badge_vendor: Optional[Event_Badge_Base] # Additional vendor badge event_badge_vip: Optional[Event_Badge_Base] # Additional VIP badge event_exhibit_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more exhibits # event_exhibit_tracking_list: Optional[list[Event_Exhibit_Tracking_Base]] event_file_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more files event_location_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more locations (but unlikely?) #event_person_detail_list: Optional[list] # list of Event_Person_Detail event_person_profile: Optional[Event_Person_Profile_Base] event_presentation_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more presentations event_presenter_list: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more presenters (part of multiple presentations) event_registration: Optional[Event_Registration_Base] event_session: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more sessions event_track: Optional[list] # Use event_person_detail table. An event_person record can be linked to one or more tracks person: Optional[Person_Base] user: Optional[User_Base] _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('event_person_id_random', always=True) def event_person_id_random_copy(cls, v, values, **kwargs): if values['id_random']: return values['id_random'] return None @validator('id', always=True) def event_person_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_person') return None @validator('account_id', always=True) def account_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('account_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='account') return None @validator('event_id', always=True) def event_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event') return None @validator('event_badge_id', always=True) def event_badge_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_badge_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_badge') return None @validator('event_badge_vendor_id', always=True) def event_badge_vendor_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_badge_vendor_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_badge') return None @validator('event_badge_vip_id', always=True) def event_badge_vip_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_badge_vip_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_badge') return None @validator('event_person_profile_id', always=True) def event_person_profile_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_person_profile_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_person_profile') return None @validator('event_registration_id', always=True) def event_registration_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_registration_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_registration') return None @validator('person_id', always=True) def person_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('person_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='person') return None @validator('user_id', always=True) def user_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('user_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='user') return None class Config: underscore_attrs_are_private = True allow_population_by_field_name = True fields = base_fields # ### END ### API Event Person Models ### Event_Person_Base() ### # ### BEGIN ### API Event Person Models ### Event_Person_New_Base() ### class Event_Person_New_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) id_random: Optional[str] = Field( **base_fields['event_person_id_random'], alias = 'event_person_id_random', ) id: Optional[int] = Field( alias = 'event_person_id' ) account_id_random: Optional[str] account_id: Optional[int] event_id_random: Optional[str] event_id: Optional[int] extended_json: Optional[Union[Json, None]] # Including convenience data # This is only for convenience. Probably going to keep unless it causes a problem. # This block of person data should come from the event_person_profile table informal_name: Optional[str] given_name: Optional[str] middle_name: Optional[str] family_name: Optional[str] full_name: Optional[str] full_name_override: Optional[str] affiliations: Optional[str] email: Optional[str] website_url: Optional[str] state_province_name: Optional[str] event_badge_informal_name: Optional[str] event_badge_given_name: Optional[str] event_badge_middle_name: Optional[str] event_badge_family_name: Optional[str] event_badge_full_name: Optional[str] event_badge_full_name_override: Optional[str] event_badge_affiliations: Optional[str] event_badge_email: Optional[str] event_badge_city: Optional[str] event_badge_state_province: Optional[str] event_badge_country_alpha_2_code: Optional[str] event_badge_country: Optional[str] # This is the same as the other person data above event_person_informal_name: Optional[str] event_person_given_name: Optional[str] event_person_middle_name: Optional[str] event_person_family_name: Optional[str] event_person_name_override: Optional[str] event_person_full_name: Optional[str] event_person_affiliations: Optional[str] event_person_email: Optional[str] person_given_name: Optional[str] person_middle_name: Optional[str] person_family_name: Optional[str] person_full_name: Optional[str] person_display_name: Optional[str] # affiliations: Optional[str] # One or more affiliations with organizations, companies, and other groups # email: Optional[str] #new_password: str = Field(default_factory = lambda:secrets.token_urlsafe(default_num_bytes)) #password: Optional[str] new_password: Optional[str] notes: Optional[str] created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('event_person_id_random', always=True) def event_person_id_random_copy(cls, v, values, **kwargs): if values['id_random']: return values['id_random'] return None @validator('id', always=True) def event_person_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event_person') return None @validator('account_id', always=True) def account_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('account_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='account') return None @validator('event_id', always=True) def event_id_lookup(cls, v, values, **kwargs): if isinstance(v, int) and v > 0: return v elif id_random := values.get('event_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='event') return None class Config: underscore_attrs_are_private = True allow_population_by_field_name = True fields = base_fields # ### END ### API Event Person Models ### Event_Person_New_Base() ###