Work on event person tracking for exhibitors

This commit is contained in:
Scott Idem
2022-02-14 17:14:18 -05:00
parent 6fc7905b04
commit 13fe6adbb2
3 changed files with 288 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
from __future__ import annotations
import datetime
from typing import Dict, List, Optional, Set, Union
from pydantic import BaseModel, EmailStr, Field, PrivateAttr, ValidationError, validator
from app.db_sql import get_account_id_w_for_type_id, redis_lookup_id_random, sql_insert, sql_select, sql_update
from app.lib_general import log, logging, logger_reset
from app.models.common_field_schema import default_num_bytes
from app.models.event_exhibit_tracking_models import Event_Exhibit_Tracking_Base
# ### BEGIN ### API Event Exhibit Tracking Methods ### load_event_exhibit_tracking_obj() ###
# Updated 2022-02-14
@logger_reset
def load_event_exhibit_tracking_obj(
event_exhibit_tracking_id: int|str,
limit: int = 100,
offset: int = 0,
by_alias: bool = True,
exclude_unset: bool = True,
model_as_dict: bool = False,
enabled: str = 'enabled', # enabled, disabled, all
inc_address: bool = False,
inc_contact: bool = False,
inc_event_badge: bool = False,
inc_event_exhibit: bool = False,
inc_event_person: bool = False,
) -> Event_Exhibit_Tracking_Base|dict|bool:
log.setLevel(logging.DEBUG) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
if event_exhibit_tracking_id := redis_lookup_id_random(record_id_random=event_exhibit_tracking_id, table_name='event_exhibit_tracking'): pass
else: return False
if event_exhibit_tracking_rec := sql_select(table_name='v_event_exhibit_tracking', record_id=event_exhibit_tracking_id): pass
else: return False
try:
event_exhibit_tracking_obj = Event_Exhibit_Tracking_Base(**event_exhibit_tracking_rec)
log.debug(event_exhibit_tracking_obj)
except ValidationError as e:
log.error(e.json())
return False
if inc_event_exhibit:
log.info('Need to include Event Exhibit data...')
event_exhibit_id = event_exhibit_tracking_rec.get('event_exhibit_id', None)
log.debug(event_exhibit_id)
from app.methods.event_exhibit_methods import load_event_exhibit_obj
if event_exhibit_result := load_event_exhibit_obj(
event_exhibit_id = event_exhibit_id,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = model_as_dict,
):
event_exhibit_tracking_obj.event_exhibit = event_exhibit_result
else: event_exhibit_tracking_obj.event_exhibit = None
if inc_event_person:
log.info('Need to include Event Person data...')
event_person_id = event_exhibit_tracking_rec.get('event_person_id', None)
log.debug(event_person_id)
from app.methods.event_person_methods import load_event_person_obj
if event_person_result := load_event_person_obj(
event_person_id = event_person_id,
by_alias = by_alias,
exclude_unset = exclude_unset,
model_as_dict = model_as_dict,
):
event_exhibit_tracking_obj.event_person = event_person_result
else: event_exhibit_tracking_obj.event_person = None
if model_as_dict:
return event_exhibit_tracking_obj.dict(by_alias=by_alias, exclude_unset=exclude_unset) # pylint: disable=no-member
else:
return event_exhibit_tracking_obj
# ### END ### API Event Exhibit Tracking Methods ### load_event_exhibit_tracking_obj() ###
# ### BEGIN ### API Event Exhibit Tracking Methods ### get_event_exhibit_tracking_rec_list() ###
# for_obj_type: account, event, event_person, event_exhibit
# Updated 2022-02-14
@logger_reset
def get_event_exhibit_tracking_rec_list(
event_id: int|str = None,
event_exhibit_id: int|str = None,
event_person_id: int|str = None,
enabled: str = 'enabled', # enabled, disabled, all
limit: int = 100,
offset: int = 0,
) -> list|bool:
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
data = {}
sql_select_event_id = ''
sql_select_event_exhibit_id = ''
sql_select_event_person_id = ''
if event_id:
if event_id := redis_lookup_id_random(record_id_random=event_id, table_name='event'): pass
else: return False
data['event_id'] = event_id
sql_select_event_id = f'`event_exhibit_tracking`.event_id = :event_id'
else:
sql_select_event_id = f'`event_exhibit_tracking`.event_id IS NOT NULL'
if event_exhibit_id:
if event_exhibit_id := redis_lookup_id_random(record_id_random=event_exhibit_id, table_name='event_exhibit'): pass
else: return False
data['event_exhibit_id'] = event_exhibit_id
sql_select_event_exhibit_id = f'AND `event_exhibit_tracking`.event_exhibit_id = :event_exhibit_id'
if event_person_id:
if event_person_id := redis_lookup_id_random(record_id_random=event_person_id, table_name='event_person'): pass
else: return False
data['event_person_id'] = event_person_id
sql_select_event_person_id = f'AND `event_exhibit_tracking`.event_person_id = :event_person_id'
sql_enabled, data['enable'] = sql_enable_part(table_name='event_exhibit_tracking', enabled=enabled) # Reasonably safe return str and bool
sql_limit = sql_limit_offset_part(limit=limit, offset=offset) # Reasonably safe return str
if event_id or event_exhibit_id or event_person_id: pass
else: return False
sql_enabled = ''
if limit:
data['limit'] = limit
sql_limit = f'LIMIT :limit'
else:
sql_limit = ''
sql = f"""
SELECT `event_exhibit_tracking`.id AS 'event_exhibit_tracking_id', `event_exhibit_tracking`.id_random AS 'event_exhibit_tracking_id_random'
FROM `event_exhibit_tracking` AS `event_exhibit_tracking`
WHERE
{sql_select_event_id}
{sql_select_event_exhibit_id}
{sql_select_event_person_id}
{sql_enabled}
ORDER BY `event_exhibit_tracking`.created_on DESC, `event_exhibit_tracking`.updated_on DESC
{sql_limit};
"""
if event_exhibit_rec_li_result := sql_select(data=data, sql=sql, as_list=True):
log.info('Got a list result')
event_exhibit_rec_li = event_exhibit_rec_li_result
else: # [] or False
log.info('No results or something went wrong')
event_exhibit_rec_li = event_exhibit_rec_li_result
log.debug(event_exhibit_rec_li_result)
return event_exhibit_rec_li
# ### END ### API Event Exhibit Tracking Methods ### get_event_exhibit_tracking_rec_list() ###

View File

@@ -22,6 +22,7 @@ from app.models.person_models import Person_Base
# ### BEGIN ### API Person Methods ### create_person_kiss() ###
# Updated 2022-01-06
@logger_reset
def create_person_kiss(
account_id: int,
person_dict_obj: Person_Base,
@@ -140,6 +141,7 @@ def create_person_kiss(
# ### BEGIN ### API Person Methods ### update_person_kiss() ###
# Updated 2022-01-06
@logger_reset
def update_person_kiss(
person_id: int,
person_dict_obj: Person_Base,
@@ -254,6 +256,7 @@ def update_person_kiss(
# ### BEGIN ### API Person Methods ### load_person_obj() ###
# Updated 2021-12-15
@logger_reset
def load_person_obj(
person_id: int|str,
auth_key: str = None,
@@ -615,6 +618,7 @@ def load_person_obj(
# ### BEGIN ### API Person Methods ### get_person_rec_list() ###
# Updated 2021-12-14
@logger_reset
def get_person_rec_list(
for_obj_type: str,

View File

@@ -0,0 +1,122 @@
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
class Event_Exhibit_Tracking_Base(BaseModel):
log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL
log.debug(locals())
id_random: Optional[str] = Field(
**base_fields['event_exhibit_tracking_id_random'],
alias = 'event_exhibit_tracking_id_random',
default_factory = lambda:secrets.token_urlsafe(default_num_bytes),
)
id: Optional[int] = Field(
alias = 'event_exhibit_tracking_id'
)
# event_id_random: Optional[str]
# event_id: Optional[int]
event_exhibit_id_random: Optional[str]
event_exhibit_id: Optional[int]
event_person_id_random: Optional[str]
event_person_id: Optional[int]
event_badge_id_random: Optional[str]
event_badge_id: Optional[int]
enable: Optional[bool]
hide: Optional[bool]
priority: Optional[bool]
sort: Optional[int]
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_informal_name: Optional[str]
event_badge_given_name: Optional[str]
event_badge_family_name: Optional[str]
event_badge_display_name: Optional[str]
event_badge_full_name: Optional[str]
event_badge_affiliations: Optional[str]
event_badge_email: Optional[str]
event_person_informal_name: Optional[str]
event_person_given_name: Optional[str]
event_person_family_name: Optional[str]
event_person_display_name: Optional[str]
event_person_full_name: Optional[str]
event_person_affiliations: Optional[str]
event_person_email: Optional[str]
event_exhibit_name: Optional[str]
_processed_at: datetime.datetime = PrivateAttr(default_factory=datetime.datetime.now)
#@validator('event_exhibit_tracking_id_random', always=True)
def event_exhibit_tracking_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 event_exhibit_tracking_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
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='event_exhibit_tracking')
return None
@validator('event_exhibit_id', always=True)
def event_exhibit_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.debug(locals())
if isinstance(v, int) and v > 0: return v
elif id_random := values.get('event_exhibit_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='event_exhibit')
return None
@validator('event_person_id', always=True)
def event_person_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.debug(locals())
if isinstance(v, int) and v > 0: return v
elif id_random := values.get('event_person_id_random'):
return redis_lookup_id_random(record_id_random=id_random, table_name='event_person')
return None
@validator('event_badge_id', always=True)
def event_badge_id_lookup(cls, v, values, **kwargs):
log.setLevel(logging.WARNING)
log.debug(locals())
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
class Config:
underscore_attrs_are_private = True
allow_population_by_field_name = True
fields = base_fields