Feat(SQL, UI): 1. Calc and Get Many Stored Procedures created for Weather, Lighting Level, Assessment, Distraction Type, Distraction Intensity Level, Distraction, Bribe, Assessment Command Modality Link, Response Quality Metric, Obedience Level, and Assessment Response. \n 2. Assessments and Assessment pages created with data loading and hooked up, but not saving.

This commit is contained in:
2025-07-24 16:48:18 +01:00
parent 6bb3a77a34
commit fad5336cc4
137 changed files with 10442 additions and 1116 deletions

View File

@@ -0,0 +1,224 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Unit Measurement 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
class Unit_Measurement(SQLAlchemy_ABC, Base):
ATTR_ID_UNIT_MEASUREMENT: ClassVar[str] = "id_unit_measurement"
FLAG_IS_BASE_UNIT: ClassVar[str] = "is-base-unit"
FLAG_IS_UNIT_OF_DISTANCE: ClassVar[str] = "is-unit-of-distance"
FLAG_IS_UNIT_OF_MASS: ClassVar[str] = "is-unit-of-mass"
FLAG_IS_UNIT_OF_TIME: ClassVar[str] = "is-unit-of-time"
FLAG_IS_UNIT_OF_VOLUME: ClassVar[str] = "is-unit-of-volume"
FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX: ClassVar[str] = "symbol-is-suffix-not-prefix"
FLAG_UNIT_MEASUREMENT: ClassVar[str] = 'unit-measurement'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = FLAG_UNIT_MEASUREMENT
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_SYMBOL
__tablename__ = 'DOG_Unit_Measurement'
__table_args__ = { 'extend_existing': True }
id_unit_measurement = db.Column(db.Integer, primary_key=True)
name_singular = db.Column(db.String(250))
name_plural = db.Column(db.String(250))
symbol = db.Column(db.String(50))
symbol_is_suffix_not_prefix = db.Column(db.Boolean)
is_base_unit = db.Column(db.Boolean)
is_unit_of_distance = db.Column(db.Boolean)
is_unit_of_mass = db.Column(db.Boolean)
is_unit_of_time = db.Column(db.Boolean)
is_unit_of_volume = db.Column(db.Boolean)
active = db.Column(db.Boolean)
def __init__(self):
self.id_unit_measurement = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_unit_measurement(cls, query_row):
_m = f'{cls.__qualname__}.from_db_unit_measurement'
level = cls()
level.id_unit_measurement = query_row[0]
level.name_singular = query_row[1]
level.name_plural = query_row[2]
level.symbol = query_row[3]
level.symbol_is_suffix_not_prefix = query_row[4]
level.is_base_unit = query_row[5]
level.is_unit_of_distance = query_row[6]
level.is_unit_of_mass = query_row[7]
level.is_unit_of_time = query_row[8]
level.is_unit_of_volume = query_row[9]
level.active = True
return level
@classmethod
def from_db_response_quality_metric(cls, query_row):
_m = f'{cls.__qualname__}.from_db_response_quality_metric'
level = cls()
level.id_unit_measurement = query_row[1]
level.name_singular = query_row[2]
level.name_plural = query_row[3]
level.symbol = query_row[4]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
unit_measurement = cls()
if json is None: return Unit_Measurement
Helper_App.console_log(f'{_m}\njson: {json}')
unit_measurement.id_unit_measurement = json.get(Unit_Measurement.ATTR_ID_UNIT_MEASUREMENT, -1)
unit_measurement.name_singular = json[cls.FLAG_NAME_SINGULAR]
unit_measurement.name_plural = json[cls.FLAG_NAME_PLURAL]
unit_measurement.symbol = json[cls.FLAG_SYMBOL]
unit_measurement.symbol_is_suffix_not_prefix = json[cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX]
unit_measurement.is_base_unit = json[cls.FLAG_IS_BASE_UNIT]
unit_measurement.is_unit_of_distance = json[cls.FLAG_IS_UNIT_OF_DISTANCE]
unit_measurement.is_unit_of_mass = json[cls.FLAG_IS_UNIT_OF_MASS]
unit_measurement.is_unit_of_time = json[cls.FLAG_IS_UNIT_OF_TIME]
unit_measurement.is_unit_of_volume = json[cls.FLAG_IS_UNIT_OF_VOLUME]
unit_measurement.active = json[cls.FLAG_ACTIVE]
Helper_App.console_log(f'Unit_Measurement: {unit_measurement}')
return unit_measurement
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_UNIT_MEASUREMENT: self.id_unit_measurement
, self.FLAG_NAME_SINGULAR: self.name_singular
, self.FLAG_NAME_PLURAL: self.name_plural
, self.FLAG_SYMBOL: self.symbol
, self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX: self.symbol_is_suffix_not_prefix
, self.FLAG_IS_BASE_UNIT: self.is_base_unit
, self.FLAG_IS_UNIT_OF_DISTANCE: self.is_unit_of_distance
, self.FLAG_IS_UNIT_OF_MASS: self.is_unit_of_mass
, self.FLAG_IS_UNIT_OF_TIME: self.is_unit_of_time
, self.FLAG_IS_UNIT_OF_VOLUME: self.is_unit_of_volume
, self.FLAG_ACTIVE: self.active
}
Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_UNIT_MEASUREMENT}: {self.id_unit_measurement}
{self.FLAG_NAME_SINGULAR}: {self.name_singular}
{self.FLAG_NAME_PLURAL}: {self.name_plural}
{self.FLAG_SYMBOL}: {self.symbol}
{self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX}: {self.symbol_is_suffix_not_prefix}
{self.FLAG_IS_BASE_UNIT}: {self.is_base_unit}
{self.FLAG_IS_UNIT_OF_DISTANCE}: {self.is_unit_of_distance}
{self.FLAG_IS_UNIT_OF_MASS}: {self.is_unit_of_mass}
{self.FLAG_IS_UNIT_OF_TIME}: {self.is_unit_of_time}
{self.FLAG_IS_UNIT_OF_VOLUME}: {self.is_unit_of_volume}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Unit_Measurement_Temp(db.Model, Base):
__tablename__ = 'DOG_Unit_Measurement_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_unit_measurement = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_unit_measurement(cls, unit_measurement):
_m = 'Unit_Measurement_Temp.from_Unit_Measurement'
temp = cls()
temp.id_unit_measurement = unit_measurement.id_unit_measurement
temp.code = unit_measurement.code
temp.name = unit_measurement.name
temp.active = unit_measurement.active
return temp
"""
class Parameters_Unit_Measurement(Get_Many_Parameters_Base):
get_all_unit_measurement: bool
get_inactive_unit_measurement: bool
ids_unit_measurement: str
names_unit_measurement: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_unit_measurement = True
, get_inactive_unit_measurement = False
, ids_unit_measurement = ''
, names_unit_measurement = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_unit_measurement = json.get('a_get_all_unit_measurement', False)
, get_inactive_unit_measurement = json.get('a_get_inactive_unit_measurement', False)
, ids_unit_measurement = json.get('a_ids_unit_measurement', '')
, names_unit_measurement = json.get('a_names_unit_measurement', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
"" "
@classmethod
def from_form_filters_unit_measurement(cls, form):
av.val_instance(form, 'form', 'Parameters_Unit_Measurement.from_form_filters_unit_measurement', Filters_Unit_Measurement)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Unit_Measurement.from_form_filters_unit_measurement")
filters = cls.get_default()
filters.get_all_unit_measurement = True
filters.get_inactive_unit_measurement = not active_only
filters.ids_unit_measurement = ''
filters.names_unit_measurement = form.search.data if has_filter_search_text else ''
filters.notes_unit_measurement = form.search.data if has_filter_search_text else ''
return filters
"" "
def to_json(self):
return {
'a_get_all_unit_measurement': self.get_all_unit_measurement
, 'a_get_inactive_unit_measurement': self.get_inactive_unit_measurement
, 'a_ids_unit_measurement': self.ids_unit_measurement
, 'a_names_unit_measurement': self.names_unit_measurement
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}
"""