293 lines
12 KiB
Python
293 lines
12 KiB
Python
"""
|
|
Project: Magic Tracker
|
|
Author: Edward Middleton-Smith
|
|
Shuffle & Skirmish
|
|
|
|
Technology: Business Objects
|
|
Feature: Statistic Business Object
|
|
"""
|
|
|
|
# internal
|
|
from business_objects.base import Base
|
|
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
|
|
import lib.argument_validation as av
|
|
from extensions import db
|
|
from helpers.helper_app import Helper_App
|
|
# external
|
|
from dataclasses import dataclass
|
|
from typing import ClassVar
|
|
from sqlalchemy import Uuid, Interval
|
|
from sqlalchemy.types import Text, Boolean, Integer
|
|
|
|
|
|
class Statistic(SQLAlchemy_ABC, Base):
|
|
ATTR_ENTITY_RECORD_ID: ClassVar[str] = 'entity_record_id'
|
|
ATTR_STATISTIC_ID: ClassVar[str] = 'statistic_id'
|
|
FLAG_ENTITY_TYPE_CODE: ClassVar[str] = 'entity_type_code'
|
|
FLAG_IS_BOOL: ClassVar[str] = 'is_bool'
|
|
FLAG_IS_FLOAT: ClassVar[str] = 'is_float'
|
|
FLAG_IS_INTERVAL: ClassVar[str] = 'is_interval'
|
|
FLAG_IS_TEXT: ClassVar[str] = 'is_text'
|
|
FLAG_IS_TIMESTAMP: ClassVar[str] = 'is_timestamp'
|
|
FLAG_VALUE_BOOL: ClassVar[str] = 'value_bool'
|
|
FLAG_VALUE_FLOAT: ClassVar[str] = 'value_float'
|
|
FLAG_VALUE_INTERVAL: ClassVar[str] = 'value_interval'
|
|
FLAG_VALUE_TEXT: ClassVar[str] = 'value_text'
|
|
FLAG_VALUE_TIMESTAMP: ClassVar[str] = 'value_timestamp'
|
|
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_STATISTIC_ID
|
|
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
|
|
|
|
__tablename__ = 'tcg_statistic'
|
|
__table_args__ = { 'extend_existing': True }
|
|
|
|
statistic_id = db.Column(db.Integer, primary_key=True)
|
|
entity_type_code = db.Column(db.Text) # replace with lookup table later
|
|
entity_record_id = db.Column(db.Text)
|
|
name = db.Column(db.Text)
|
|
value_bool = db.Column(db.Boolean)
|
|
value_float = db.Column(db.Float)
|
|
value_interval = db.Column(Interval)
|
|
value_text = db.Column(db.Text)
|
|
value_timestamp = db.Column(db.DateTime)
|
|
is_bool = db.Column(db.Boolean)
|
|
is_float = db.Column(db.Boolean)
|
|
is_interval = db.Column(db.Boolean)
|
|
is_text = db.Column(db.Boolean)
|
|
is_timestamp = db.Column(db.Boolean)
|
|
display_order = db.Column(db.Integer)
|
|
active = db.Column(db.Boolean)
|
|
created_on = db.Column(db.DateTime)
|
|
created_by_user_id = db.Column(db.Integer)
|
|
updated_last_on = db.Column(db.DateTime)
|
|
updated_last_by_user_id = db.Column(db.Integer)
|
|
change_set_id = db.Column(db.Integer)
|
|
|
|
def __init__(self):
|
|
self.statistic_id = 0
|
|
self.is_new = False
|
|
super().__init__()
|
|
|
|
@classmethod
|
|
def from_db_statistic(cls, query_row):
|
|
_m = f'{cls.__qualname__}.from_db_statistic'
|
|
statistic = cls()
|
|
statistic.statistic_id = query_row[0]
|
|
statistic.entity_type_code = query_row[1]
|
|
statistic.entity_record_id = query_row[2]
|
|
statistic.name = query_row[3]
|
|
statistic.value_bool = query_row[4]
|
|
statistic.value_float = query_row[5]
|
|
statistic.value_interval = query_row[6]
|
|
statistic.value_text = query_row[7]
|
|
statistic.value_timestamp = query_row[8]
|
|
statistic.is_bool = query_row[9]
|
|
statistic.is_float = query_row[10]
|
|
statistic.is_interval = query_row[11]
|
|
statistic.is_text = query_row[12]
|
|
statistic.is_timestamp = query_row[13]
|
|
statistic.display_order = query_row[14]
|
|
statistic.active = av.input_bool(query_row[15], cls.FLAG_ACTIVE, _m)
|
|
statistic.created_on = query_row[16]
|
|
statistic.created_by_user_id = query_row[17]
|
|
return statistic
|
|
|
|
@classmethod
|
|
def from_json(cls, json):
|
|
_m = f'{cls.__qualname__}.from_json'
|
|
statistic = cls()
|
|
if json is None: return statistic
|
|
statistic.statistic_id = json.get(cls.ATTR_STATISTIC_ID, -1)
|
|
statistic.entity_type_code = json.get(cls.FLAG_ENTITY_TYPE_CODE, None)
|
|
statistic.entity_record_id = json.get(cls.ATTR_ENTITY_RECORD_ID, None)
|
|
statistic.name = json.get(cls.FLAG_NAME, '')
|
|
statistic.value_bool = json.get(cls.FLAG_VALUE_BOOL, None)
|
|
statistic.value_float = json.get(cls.FLAG_VALUE_FLOAT, None)
|
|
statistic.value_interval = json.get(cls.FLAG_VALUE_INTERVAL, None)
|
|
statistic.value_text = json.get(cls.FLAG_VALUE_TEXT, None)
|
|
statistic.value_timestamp = json.get(cls.FLAG_VALUE_TIMESTAMP, None)
|
|
statistic.is_bool = json.get(cls.FLAG_IS_BOOL, False)
|
|
statistic.is_float = json.get(cls.FLAG_IS_FLOAT, False)
|
|
statistic.is_interval = json.get(cls.FLAG_IS_INTERVAL, False)
|
|
statistic.is_text = json.get(cls.FLAG_IS_TEXT, False)
|
|
statistic.is_timestamp = json.get(cls.FLAG_IS_TIMESTAMP, False)
|
|
statistic.display_order = json.get(cls.FLAG_DISPLAY_ORDER, -1)
|
|
statistic.active = av.input_bool(json.get(cls.FLAG_ACTIVE, True), cls.FLAG_ACTIVE, _m)
|
|
statistic.created_on = json.get(cls.FLAG_CREATED_ON, None)
|
|
statistic.created_by_user_id = json.get(Base.ATTR_USER_ID, None)
|
|
return statistic
|
|
|
|
def to_json(self):
|
|
as_json = {
|
|
**self.get_shared_json_attributes(self)
|
|
, self.ATTR_STATISTIC_ID: self.statistic_id
|
|
, self.FLAG_ENTITY_TYPE_CODE: self.entity_type_code
|
|
, self.ATTR_ENTITY_RECORD_ID: self.entity_record_id
|
|
, self.FLAG_NAME: self.name
|
|
, self.FLAG_VALUE_BOOL: self.value_bool
|
|
, self.FLAG_VALUE_FLOAT: self.value_float
|
|
, self.FLAG_VALUE_INTERVAL: self.value_interval
|
|
, self.FLAG_VALUE_TEXT: self.value_text
|
|
, self.FLAG_VALUE_TIMESTAMP: self.value_timestamp
|
|
, self.FLAG_IS_BOOL: self.is_bool
|
|
, self.FLAG_IS_FLOAT: self.is_float
|
|
, self.FLAG_IS_INTERVAL: self.is_interval
|
|
, self.FLAG_IS_TEXT: self.is_text
|
|
, self.FLAG_IS_TIMESTAMP: self.is_timestamp
|
|
, self.FLAG_DISPLAY_ORDER: self.display_order
|
|
, self.FLAG_ACTIVE: self.active
|
|
, self.FLAG_CREATED_ON: self.created_on
|
|
, Base.ATTR_USER_ID: self.created_by_user_id
|
|
}
|
|
return as_json
|
|
|
|
def __repr__(self):
|
|
return f'''
|
|
{self.__class__.__name__}(
|
|
{self.ATTR_STATISTIC_ID}: {self.statistic_id}
|
|
{self.FLAG_ENTITY_TYPE_CODE}: {self.entity_type_code}
|
|
{self.ATTR_ENTITY_RECORD_ID}: {self.entity_record_id}
|
|
{self.FLAG_NAME}: {self.name}
|
|
{self.FLAG_VALUE_BOOL}: {self.value_bool}
|
|
{self.FLAG_VALUE_FLOAT}: {self.value_float}
|
|
{self.FLAG_VALUE_INTERVAL}: {self.value_interval}
|
|
{self.FLAG_VALUE_TEXT}: {self.value_text}
|
|
{self.FLAG_VALUE_TIMESTAMP}: {self.value_timestamp}
|
|
{self.FLAG_IS_BOOL}: {self.is_bool}
|
|
{self.FLAG_IS_FLOAT}: {self.is_float}
|
|
{self.FLAG_IS_INTERVAL}: {self.is_interval}
|
|
{self.FLAG_IS_TEXT}: {self.is_text}
|
|
{self.FLAG_IS_TIMESTAMP}: {self.is_timestamp}
|
|
{self.FLAG_DISPLAY_ORDER}: {self.display_order}
|
|
{self.FLAG_ACTIVE}: {self.active}
|
|
{self.FLAG_CREATED_ON}: {self.created_on}
|
|
{Base.ATTR_USER_ID}: {self.created_by_user_id}
|
|
)
|
|
'''
|
|
|
|
def get_formatted_value(self):
|
|
if self.is_bool:
|
|
return self.value_bool
|
|
elif self.is_float:
|
|
return self.value_float
|
|
elif self.is_interval:
|
|
return self.value_interval
|
|
elif self.is_text:
|
|
return self.value_text
|
|
elif self.is_timestamp:
|
|
return self.value_timestamp
|
|
else:
|
|
return None
|
|
|
|
class Statistic_Temp(db.Model, Base):
|
|
__tablename__ = 'tcg_statistic_temp'
|
|
__table_args__ = { 'extend_existing': True }
|
|
temp_id = db.Column(db.Integer, primary_key=True)
|
|
statistic_id = db.Column(db.Integer)
|
|
entity_type_code = db.Column(db.Text)
|
|
entity_record_id = db.Column(db.Integer)
|
|
name = db.Column(db.Integer)
|
|
value_bool = db.Column(db.Boolean)
|
|
value_float = db.Column(db.Float)
|
|
value_interval = db.Column(Interval)
|
|
value_text = db.Column(db.Text)
|
|
value_timestamp = db.Column(db.DateTime)
|
|
is_bool = db.Column(db.Boolean)
|
|
is_float = db.Column(db.Boolean)
|
|
is_interval = db.Column(db.Boolean)
|
|
is_text = db.Column(db.Boolean)
|
|
is_timestamp = db.Column(db.Boolean)
|
|
display_order = db.Column(db.Integer)
|
|
active = db.Column(db.Boolean)
|
|
created_on = db.Column(db.DateTime)
|
|
guid = db.Column(Uuid)
|
|
|
|
def __init__(self):
|
|
self.entity_record_name = None
|
|
super().__init__()
|
|
|
|
@classmethod
|
|
def from_statistic(cls, statistic, guid):
|
|
_m = 'Statistic_Temp.from_statistic'
|
|
temp = cls()
|
|
temp.statistic_id = statistic.statistic_id
|
|
temp.entity_type_code = statistic.entity_type_code
|
|
temp.entity_record_id = statistic.entity_record_id
|
|
temp.name = statistic.name
|
|
temp.value_bool = statistic.value_bool
|
|
temp.value_float = statistic.value_float
|
|
temp.value_interval = statistic.value_interval
|
|
temp.value_text = statistic.value_text
|
|
temp.value_timestamp = statistic.value_timestamp
|
|
temp.is_bool = statistic.is_bool
|
|
temp.is_float = statistic.is_float
|
|
temp.is_interval = statistic.is_interval
|
|
temp.is_text = statistic.is_text
|
|
temp.is_timestamp = statistic.is_timestamp
|
|
temp.display_order = statistic.display_order
|
|
temp.active = statistic.active
|
|
temp.created_on = statistic.created_on
|
|
temp.guid = guid
|
|
return temp
|
|
|
|
|
|
class Parameters_Statistic(Get_Many_Parameters_Base):
|
|
access_user_id: int
|
|
get_all_statistic: bool
|
|
get_inactive_statistic: bool
|
|
statistic_ids: str
|
|
entity_type_codes: str
|
|
entity_record_ids: str
|
|
require_all_id_filters_met: bool
|
|
require_any_id_filters_met: bool
|
|
|
|
@classmethod
|
|
def get_default(cls, user_id_session):
|
|
return cls(
|
|
access_user_id = user_id_session
|
|
, get_all_statistic = True
|
|
, get_inactive_statistic = False
|
|
, statistic_ids = ''
|
|
, entity_type_codes = ''
|
|
, entity_record_ids = ''
|
|
, require_all_id_filters_met = True
|
|
, require_any_id_filters_met = True
|
|
)
|
|
|
|
@classmethod
|
|
def from_json(cls, json):
|
|
return cls(
|
|
access_user_id = json.get('a_access_user_id', None)
|
|
, get_all_statistic = json.get('a_get_all_statistic', False)
|
|
, get_inactive_statistic = json.get('a_get_inactive_statistic', False)
|
|
, statistic_ids = json.get('a_statistic_ids', '')
|
|
, entity_type_codes = json.get('a_entity_type_codes', '')
|
|
, entity_record_ids = json.get('a_entity_record_ids', '')
|
|
, require_all_id_filters_met = json.get('a_require_all_id_filters_met', True)
|
|
, require_any_id_filters_met = json.get('a_require_any_id_filters_met', True)
|
|
)
|
|
|
|
def to_json(self):
|
|
return {
|
|
'a_access_user_id': self.access_user_id
|
|
, 'a_get_all_statistic': self.get_all_statistic
|
|
, 'a_get_inactive_statistic': self.get_inactive_statistic
|
|
, 'a_statistic_ids': self.statistic_ids
|
|
, 'a_entity_type_codes': self.entity_type_codes
|
|
, 'a_entity_record_ids': self.entity_record_ids
|
|
, 'a_require_all_id_filters_met': self.require_all_id_filters_met
|
|
, 'a_require_any_id_filters_met': self.require_any_id_filters_met
|
|
}
|
|
|
|
@staticmethod
|
|
def get_type_hints():
|
|
return {
|
|
'a_access_user_id': Integer
|
|
, 'a_get_all_statistic': Boolean
|
|
, 'a_get_inactive_statistic': Boolean
|
|
, 'a_statistic_ids': Text
|
|
, 'a_entity_type_codes': Text
|
|
, 'a_entity_record_ids': Text
|
|
, 'a_require_all_id_filters_met': Boolean
|
|
, 'a_require_any_id_filters_met': Boolean
|
|
}
|