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.membership_cfg_models import Membership_Cfg_Base from app.models.membership_group_models import Membership_Group_Base from app.models.membership_person_group_models import Membership_Person_Group_Base from app.models.membership_person_profile_models import Membership_Person_Profile_Base from app.models.membership_type_models import Membership_Type_Base from app.models.membership_person_type_models import Membership_Person_Type_Base # from app.models.person_models import Person_Base from app.models.product_models import Product_Base # from app.models.user_models import User_Base # ### BEGIN ### API Membership Person Models ### Membership_Person_Base() ### class Membership_Person_Base(BaseModel): log.setLevel(logging.INFO) log.debug(locals()) id_random: Optional[str] = Field( **base_fields['membership_person_id_random'], alias = 'membership_person_id_random', ) id: Optional[int] = Field( alias = 'membership_person_id' ) account_id_random: Optional[str] account_id: Optional[int] lu_membership_person_status_id: Optional[int] = Field( # lu_membership_person_status_id alias = 'membership_person_status_id' ) membership_person_status_name: Optional[str] = Field( # alias = 'status_name' ) # NOTE: Currently there is not going to be a designated primary group. 2021-12-16 # membership_group_id_random: Optional[str] = Field( # alias = 'group_id_random', # ) # NOTE: This is not optional # membership_group_id: Optional[int] = Field( # alias = 'group_id', # ) # NOTE: This is not optional # membership_group_name: Optional[str] = Field( # alias = 'group_name', # ) # NOTE: Currently there is not going to be a designated primary group. 2021-12-16 # membership_person_group_id_random: Optional[str] = Field( # # alias = 'group_person_id_random', # ) # NOTE: This is not optional # membership_person_group_id: Optional[int] = Field( # # alias = 'group_person_id', # ) # NOTE: This is not optional # membership_person_group_name: Optional[str] = Field( # alias = 'membership_group_name', # group_person_name # ) membership_group_status_id: Optional[int] membership_group_status_name: Optional[str] membership_type_id_random: Optional[str] = Field( # alias = 'type_id_random', ) # NOTE: This is not optional membership_type_id: Optional[int] = Field( # alias = 'type_id', ) # NOTE: This is not optional membership_type_name: Optional[str] = Field( # alias = 'type_name', ) membership_person_type_id_random: Optional[str] = Field( # alias = 'type_person_id_random', ) # NOTE: This is not optional membership_person_type_id: Optional[int] = Field( # alias = 'type_person_id', ) # NOTE: This is not optional membership_person_type_name: Optional[str] = Field( # alias = 'membership_type_name', # type_person_name ) membership_person_type_status_id: Optional[int] membership_person_type_status_name: Optional[str] person_id_random: Optional[str] person_id: Optional[int] # For products use: # link using membership_person.membership_person_group_id to membership_person_group.id # link using membership_person.membership_person_type_id to membership_person_type.id # product_id_random: Optional[str] # product_id: Optional[int] # The product they purchased to get this membership # membership_group_product_id_random: Optional[str] # membership_group_product_id: Optional[int] # The product they purchased to get this group # membership_type_product_id_random: Optional[str] # membership_type_product_id: Optional[int] # The product they purchased to get this type # user_id_random: Optional[str] # user_id: Optional[int] level: Optional[int] = Field(0, ge=0, lt=150) first_application_start_on: Optional[Union[datetime.datetime,None]] # application_start_on: Optional[Union[datetime.datetime,None]] first_approved_on: Optional[Union[datetime.datetime,None]] first_start_on: Optional[Union[datetime.datetime,None]] start_buffer_on: Optional[Union[datetime.datetime,None]] start_on: Optional[Union[datetime.datetime,None]] end_on: Optional[Union[datetime.datetime,None]] end_buffer_on: Optional[Union[datetime.datetime,None]] last_end_on: Optional[Union[datetime.datetime,None]] flag: Optional[Union[bool,None]] flag_message: Optional[str] notes: Optional[str] created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None # Including other related objects membership_cfg: Optional[Membership_Cfg_Base] = Field( alias = 'cfg', ) # membership_person_group: Optional[Membership_Person_Group_Base] # Not currently used membership_person_group_list: Optional[list[Membership_Person_Group_Base]] # The list of membership group information the person has membership_person_profile: Optional[Membership_Person_Profile_Base] membership_person_type: Optional[Membership_Person_Type_Base] # The membership type information for the primary membership type the person has # membership_person_type_list: Optional[list[Membership_Person_Type_Base]] # Not currently used membership_group: Optional[Membership_Group_Base] membership_group_list: Optional[list[Membership_Group_Base]] membership_type: Optional[Membership_Type_Base] # The primary membership type option they currently have # membership_type: Optional[dict] membership_type_list: Optional[list[Membership_Type_Base]] # membership_group_list: Optional[list] = Field( # # alias = 'group_list', # ) # Membership_Group_Base() The group information for all the membership groups they are a part of # membership_person_group: Optional[Membership_Person_Group_Base] # The group person information for the primary membership group they currently have # membership_person_group_list: Optional[list] = Field( # # alias = 'group_person_list', # ) # Membership_Group_Base() The group person information for all the membership groups they are a part of # = Field( # alias = 'profile', # ) # = Field( # alias = 'extended_membership_person_profile', # ) # membership_type_list: Optional[list] = Field( # # alias = 'type_list', # ) # Membership_Type_Base() The type information for all the membership types they are a part of # membership_person_type_list: Optional[list] = Field( # alias = 'type_person_list', # ) # Membership_Person_Type_Base() The type person information for all the membership types they are a part of # person: Optional[dict] # should be Person_Base() but causes an import loop product: Optional[Product_Base] # The product used to become a member? # user: Optional[dict] # should be User_Base() but causes an import loop extended_member_profile: Optional[dict] = {} _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('membership_person_id_random', always=True) def membership_person_id_random_copy(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) if values['id_random']: return values['id_random'] return None @validator('id', always=True) def membership_person_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.INFO) log.debug(locals()) 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='membership_person') return None @validator('account_id', always=True) def account_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.INFO) log.debug(locals()) 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('membership_group_id', always=True) # def membership_group_id_lookup(cls, v, values, **kwargs): # log.setLevel(logging.DEBUG) # log.debug(locals()) # if values.get('membership_group_id_random', None): # return redis_lookup_id_random(record_id_random=values['membership_group_id_random'], table_name='membership_group') # return None # @validator('membership_person_group_id', always=True) # def membership_person_group_id_lookup(cls, v, values, **kwargs): # log.setLevel(logging.WARNING) # log.debug(locals()) # if values['membership_person_group_id_random']: # return redis_lookup_id_random(record_id_random=values['membership_person_group_id_random'], table_name='membership_person_group') # return None @validator('membership_type_id', always=True) def membership_type_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.INFO) log.debug(locals()) if isinstance(v, int) and v > 0: return v elif id_random := values.get('membership_type_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='membership_type') return None @validator('membership_person_type_id', always=True) def membership_person_type_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.INFO) log.debug(locals()) if isinstance(v, int) and v > 0: return v elif id_random := values.get('membership_person_type_id_random'): return redis_lookup_id_random(record_id_random=id_random, table_name='membership_person_type') return None @validator('person_id', always=True) def person_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.INFO) log.debug(locals()) 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 class Config: underscore_attrs_are_private = True allow_population_by_field_name = True fields = base_fields # ### END ### API Membership Person Models ### Membership_Person_Base() ###