from __future__ import annotations import datetime, hashlib, logging, os, pytz, redis, secrets 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 class Membership_Base(BaseModel): log.setLevel(logging.WARNING) log.debug(locals()) id_random: Optional[str] = Field( **base_fields['membership_id_random'], alias='membership_id_random', default_factory=lambda:secrets.token_urlsafe(default_num_bytes), ) id: Optional[int] = Field( #alias='membership_id' ) account_id_random: Optional[str] account_id: Optional[int] name: Optional[str] description: Optional[str] cycle_type: Optional[str] # Override membership_cfg membership_length: Optional[int] = Field(0, ge=0, lt=150) # Override membership_cfg prorate: Optional[bool] = False # Override membership_cfg calendar_year_start_buffer_days: Optional[int] = Field(0, ge=0, lt=150) # Override membership_cfg calendar_year_start_buffer_on: Optional[datetime.datetime] # Override membership_cfg calendar_year_start_on: Optional[datetime.datetime] # Override membership_cfg calendar_year_end_on: Optional[datetime.datetime] # Override membership_cfg calendar_year_end_buffer_days: Optional[int] = Field(0, ge=0, lt=150) # Override membership_cfg calendar_year_end_buffer_on: Optional[datetime.datetime] # Override membership_cfg enable_privacy_view: Optional[bool] # Override membership_cfg renew_warning_hours: Optional[int] # Override membership_cfg accept_message: Optional[str] # Override membership_cfg reject_message: Optional[str] # Override membership_cfg renew_message: Optional[str] # Override membership_cfg default_no_reply_email: Optional[str] # Override membership_cfg default_no_reply_name: Optional[str] # Override membership_cfg confirm_email: Optional[str] # Override membership_cfg confirm_name: Optional[str] # Override membership_cfg enable: Optional[bool] enable_from: Optional[datetime.datetime] = None enable_to: Optional[datetime.datetime] = None priority: Optional[bool] sort: Optional[int] = Field(0, ge=0, lt=100) # Essentially the membership level. Should there be a range limit? group: Optional[str] notes: Optional[str] created_on: Optional[datetime.datetime] = None updated_on: Optional[datetime.datetime] = None # Including JSON data # additional_terms_conditions: Optional[dict] = {} # Is this useful? # Including other related objects product: Optional[list] # Product_Base() List of products (for_type and for_id) that get this membership option cfg: Optional[Membership_Cfg_Base] = Membership_Cfg_Base() _processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now) #@validator('membership_id_random', always=True) def membership_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_id_lookup(cls, v, values, **kwargs): log.setLevel(logging.WARNING) log.debug(locals()) if values['id_random']: return redis_lookup_id_random(record_id_random=values['id_random'], table_name='membership') return None # @validator('account_id', always=True) # def account_id_lookup(cls, v, values, **kwargs): # log.setLevel(logging.WARNING) # log.debug(locals()) # if values['account_id_random']: # return redis_lookup_id_random(record_id_random=values['account_id_random'], table_name='account') # return None # Membership_Base.update_forward_refs()