from __future__ import annotations import datetime, hashlib, logging, os, pytz, redis, secrets from typing import Dict, List, Optional, Set, Union, ClassVar from pydantic import BaseModel, EmailStr, Field, Json, PrivateAttr, ValidationError, validator, root_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 class Event_Registration_Cfg_Base(BaseModel): log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL log.debug(locals()) # --- Standardized Vision IDs (Strings) --- id: Optional[str] = Field(None, **base_fields['event_registration_cfg_id_random']) event_registration_cfg_id: Optional[str] = Field(None, **base_fields['event_registration_cfg_id_random']) account_id: Optional[str] = Field(None, **base_fields['account_id_random']) event_id: Optional[str] = Field(None, **base_fields['event_id_random']) # --- Standardized Legacy / Internal IDs (Excluded) --- id_random: Optional[str] = Field(None, alias='event_registration_cfg_id_random', exclude=True) account_id_random: Optional[str] = Field(None, exclude=True) event_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. """ # 1. Map Random Strings to Clean Names if rid := values.get('id_random') or values.get('event_registration_cfg_id_random'): values['id'] = rid values['event_registration_cfg_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 # 2. Prevent "Collision Population" for k in ['id', 'event_registration_cfg_id', 'account_id', 'event_id']: if k in values and not isinstance(values[k], str) and values[k] is not None: del values[k] return values start_on: Optional[datetime.datetime] end_on: Optional[datetime.datetime] deadline_1: Optional[datetime.datetime] deadline_2: Optional[datetime.datetime] deadline_3: Optional[datetime.datetime] deadline_4: Optional[datetime.datetime] deadline_5: Optional[datetime.datetime] start_buffer_days: Optional[int] end_buffer_days: Optional[int] welcome_message: Optional[str] attendee_message: Optional[str] guest_message: Optional[str] order_code: Optional[str] order_confirm_title: Optional[str] order_confirm_header: Optional[str] order_confirm_thanks: Optional[str] order_confirm_message: Optional[str] order_confirm_footer: Optional[str] support_email: Optional[str] support_name: Optional[str] extended_registration_profile: Optional[str] registration_info_json: Optional[str] # Should this be Json type? attendee_info_json: Optional[str] # Should this be Json type? agreements_json: Optional[str] # Should this be Json type? # Including other related objects _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) # Fields that are part of the model (for reading) but should not be saved to the DB table fields_to_exclude_from_db: ClassVar[list] = [] class Config: underscore_attrs_are_private = True allow_population_by_field_name = True # fields = base_fields