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

@@ -62,6 +62,7 @@ class Base():
FLAG_PHONE_NUMBER: ClassVar[str] = 'phone_number'
FLAG_POSTCODE: ClassVar[str] = 'postcode'
FLAG_PRIORITY: ClassVar[str] = 'priority'
FLAG_QUANTITY: ClassVar[str] = 'quantity'
FLAG_REGION: ClassVar[str] = 'region'
FLAG_ROWS: ClassVar[str] = 'rows'
FLAG_SEARCH: ClassVar[str] = 'search'

View File

@@ -0,0 +1,357 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Assessment Business Object
"""
# internal
from business_objects.base import Base
from business_objects.dog.command import Command
# from business_objects.dog.command_category import Command_Category
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.dog import Dog
from business_objects.dog.lighting_level import Lighting_Level
from business_objects.dog.location import Location
from business_objects.dog.obedience_level import Obedience_Level
from business_objects.dog.weather import Weather
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
from helpers.helper_app import Helper_App
import lib.argument_validation as av
# external
from dataclasses import dataclass
from typing import ClassVar, Optional
class Assessment(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT: ClassVar[str] = Filters_Assessment.ATTR_ID_ASSESSMENT
FLAG_ASSESSMENT: ClassVar[str] = 'assessment'
FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = 'assessment_command_modality_link'
FLAG_DISTRACTION: ClassVar[str] = 'distraction'
FLAG_TEMPERATURE_CELCIUS: ClassVar[str] = 'temperature_celcius'
FLAG_USER_HANDLER: ClassVar[str] = Filters_Assessment.FLAG_USER_HANDLER
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT
__tablename__ = 'DOG_Assessment'
__table_args__ = { 'extend_existing': True }
id_assessment = db.Column(db.Integer, primary_key=True)
id_weather = db.Column(db.Integer)
id_lighting_level = db.Column(db.Integer)
id_location = db.Column(db.Integer)
id_user_handler = db.Column(db.Integer)
notes = db.Column(db.Text)
temperature_celcius = db.Column(db.Numeric(5, 2))
# difficulty_level = db.Column(db.Float)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_assessment = 0
self.is_new = False
self.weather = None
self.lighting_level = None
self.location = None
self.user_handler = None
self.distractions = None
self.assessment_command_modality_links = None
super().__init__()
@classmethod
def from_db_assessment(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment'
assessment = cls()
assessment.id_assessment = query_row[0]
assessment.id_weather = query_row[1]
assessment.id_lighting_level = query_row[3]
assessment.id_location = query_row[5]
assessment.id_user_handler = query_row[7]
assessment.notes = query_row[10]
assessment.temperature_celcius = query_row[11]
assessment.active = av.input_bool(query_row[12], 'active', _m)
assessment.weather = Weather.from_db_assessment(query_row)
assessment.lighting_level = Lighting_Level.from_db_assessment(query_row)
assessment.location = Location.from_db_assessment(query_row)
assessment.user_handler = User.from_db_assessment(query_row)
return assessment
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
assessment = cls()
assessment.id_assessment = query_row[1]
return assessment
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
assessment = cls()
assessment.id_assessment = query_row[1]
return assessment
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
assessment = cls()
if json is None: return assessment
# Helper_App.console_log(f'{_m}\njson: {json}')
assessment.id_assessment = json.get(Assessment.ATTR_ID_ASSESSMENT, -1)
assessment.id_weather = json[Weather.ATTR_ID_WEATHER]
assessment.id_lighting_level = json[Lighting_Level.ATTR_ID_LIGHTING_LEVEL]
assessment.id_location = json[Location.ATTR_ID_LOCATION]
assessment.user_handler = json[cls.FLAG_USER_HANDLER]
assessment.notes = json[cls.FLAG_NOTES]
assessment.temperature_celcius = json[cls.FLAG_TEMPERATURE_CELCIUS]
assessment.active = json[cls.FLAG_ACTIVE]
assessment.created_on = json.get(cls.FLAG_CREATED_ON, None)
# assessment.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY]
# Helper_App.console_log(f'Dog Command Link: {assessment}')
return assessment
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT: self.id_assessment
, Weather.ATTR_ID_WEATHER: { Weather.ATTR_ID_WEATHER: None } if self.weather is None else self.weather.to_json()
, Lighting_Level.ATTR_ID_LIGHTING_LEVEL: { Lighting_Level.ATTR_ID_LIGHTING_LEVEL: None } if self.lighting_level is None else self.lighting_level.to_json()
, Location.ATTR_ID_LOCATION: { Location.ATTR_ID_LOCATION: None } if self.weather is None else self.weather.to_json()
, self.FLAG_USER_HANDLER: { User.ATTR_ID_USER: None } if self.user_handler is None else self.user_handler.to_json()
, self.FLAG_NOTES: self.notes
, self.FLAG_TEMPERATURE_CELCIUS: self.temperature_celcius
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
, self.FLAG_DISTRACTION: [distraction.to_json() for distraction in self.distractions] if (self.distractions is not None and len(self.distractions) > 0) else []
, self.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: [link.to_json() for link in self.assessment_command_modality_links] if (self.assessment_command_modality_links is not None and len(self.assessment_command_modality_links) > 0) else []
}
# , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT}: {self.id_assessment}
{Weather.FLAG_WEATHER}: {self.weather}
{Lighting_Level.FLAG_LIGHTING_LEVEL}: {self.lighting_level}
{Location.FLAG_LOCATION}: {self.location}
{self.FLAG_USER_HANDLER}: {self.user_handler}
{self.FLAG_NOTES}: {self.notes}
{self.FLAG_TEMPERATURE_CELCIUS}: {self.temperature_celcius}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category}
class Assessment_Temp(db.Model, Base):
__tablename__ = 'DOG_Assessment_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_assessment = db.Column(db.Integer)
id_weather = db.Column(db.Integer)
id_lighting_level = db.Column(db.Integer)
id_location = db.Column(db.Integer)
id_user_handler = db.Column(db.Integer)
notes = db.Column(db.Text)
temperature_celcius = db.Column(db.Numeric(5, 2))
# difficulty_level = db.Column(db.Float)
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_assessment(cls, assessment):
_m = 'Assessment_Temp.from_assessment'
temp = cls()
temp.id_assessment = assessment.id_assessment
temp.id_weather = assessment.id_weather
temp.id_lighting_level = assessment.id_lighting_level
temp.id_location = assessment.id_location
temp.id_user_handler = assessment.id_user_handler
temp.notes = assessment.notes
temp.temperature_celcius = assessment.temperature_celcius
temp.active = assessment.active
# temp.created_on = assessment.created_on
return temp
class Parameters_Assessment(Get_Many_Parameters_Base):
get_all_assessment: bool
get_inactive_assessment: bool
ids_assessment: str
notes_assessment: str
min_temperature_assessment: Optional[float]
max_temperature_assessment: Optional[float]
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
names_weather: str
get_all_lighting_level: bool
get_inactive_lighting_level: bool
ids_lighting_level: str
names_lighting_level: str
get_all_location: bool
get_inactive_location: bool
ids_location: str
names_location: str
get_all_user_handler: bool
get_inactive_user_handler: bool
ids_user_handler: str
#auth0_ids_user_handler: str
names_user_handler: str
emails_user_handler: 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_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
, names_weather = ''
, get_all_lighting_level = True
, get_inactive_lighting_level = False
, ids_lighting_level = ''
, names_lighting_level = ''
, get_all_location = True
, get_inactive_location = False
, ids_location = ''
, names_location = ''
, get_all_user_handler = True
, get_inactive_user_handler = False
, ids_user_handler = ''
# , auth0_ids_user_handler = ''
, names_user_handler = ''
, emails_user_handler = ''
, 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_assessment = json.get('a_get_all_assessment', False)
, get_inactive_assessment = json.get('a_get_inactive_assessment', False)
, ids_assessment = json.get('a_ids_assessment', '')
, notes_assessment = json.get('a_notes_assessment', '')
, min_temperature_assessment = json.get('a_min_temperature_assessment', None)
, max_temperature_assessment = json.get('a_max_temperature_assessment', None)
, get_all_weather = json.get('a_get_all_weather', False)
, get_inactive_weather = json.get('a_get_inactive_weather', False)
, ids_weather = json.get('a_ids_weather', '')
, names_weather = json.get('a_names_weather', '')
, get_all_lighting_level = json.get('a_get_all_lighting_level', False)
, get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False)
, ids_lighting_level = json.get('a_ids_lighting_level', '')
, names_lighting_level = json.get('a_names_lighting_level', '')
, get_all_location = json.get('a_get_all_location', False)
, get_inactive_location = json.get('a_get_inactive_location', False)
, ids_location = json.get('a_ids_location', '')
, names_location = json.get('a_names_location', '')
, get_all_user_handler = json.get('a_get_all_user_handler', False)
, get_inactive_user_handler = json.get('a_get_inactive_user_handler', False)
, ids_user_handler = json.get('a_ids_user_handler', '')
# , auth0_ids_user_handler = json.get('a_ids_user_handler', '')
, names_user_handler = json.get('a_names_user_handler', '')
, emails_user_handler = json.get('a_emails_user_handler', '')
, 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_assessment(cls, form):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
Helper_App.console_log(_m)
Helper_App.console_log(f'Filters: {form}')
av.val_instance(form, 'form', _m, Filters_Assessment)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
has_filter_weather = not (form.id_weather.data == '0' or form.id_weather.data == '' or form.id_weather.data is None)
has_filter_lighting_level = not (form.id_lighting_level.data == '0' or form.id_lighting_level.data == '' or form.id_lighting_level.data is None)
has_filter_location = not (form.id_location.data == '0' or form.id_location.data == '' or form.id_location.data is None)
has_filter_user_handler = not (form.id_user_handler.data == '0' or form.id_user_handler.data == '' or form.id_user_handler.data is None)
active_only = av.input_bool(form.active_only.data, "active", _m)
Helper_App.console_log(f'''
has_filter_search_text: {has_filter_search_text}
has_filter_weather: {has_filter_weather}
has_filter_lighting_level: {has_filter_lighting_level}
has_filter_location: {has_filter_location}
has_filter_user_handler: {has_filter_user_handler}
active_only: {active_only}
''')
filters = cls.get_default()
filters.get_all_assessment = True
filters.get_inactive_assessment = not active_only
filters.ids_assessment = ''
filters.get_all_weather = not has_filter_weather
filters.get_inactive_weather = not active_only
filters.ids_weather = form.id_weather.data if has_filter_weather else ''
filters.names_weather = form.search.data if has_filter_search_text else ''
filters.get_all_lighting_level = not has_filter_lighting_level
filters.get_inactive_lighting_level = not active_only
filters.ids_lighting_level = form.id_lighting_level.data if has_filter_lighting_level else ''
filters.names_lighting_level = form.search.data if has_filter_search_text else ''
filters.get_all_location = not has_filter_location
filters.get_inactive_location = not active_only
filters.ids_location = form.id_location.data if has_filter_location else ''
filters.names_location = form.search.data if has_filter_search_text else ''
filters.get_all_user_handler = not has_filter_user_handler
filters.get_inactive_user_handler = not active_only
filters.ids_user_handler = form.id_user_handler.data if has_filter_user_handler else ''
# filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else ''
filters.names_user_handler = form.search.data if has_filter_search_text else ''
filters.emails_user_handler = form.search.data if has_filter_search_text else ''
return filters
def to_json(self):
return {
'a_get_all_assessment': self.get_all_assessment
, 'a_get_inactive_assessment': self.get_inactive_assessment
, 'a_ids_assessment': self.ids_assessment
, 'a_notes_assessment': self.notes_assessment
, 'a_min_temperature_assessment': self.min_temperature_assessment
, 'a_max_temperature_assessment': self.max_temperature_assessment
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
, 'names_weather': self.names_weather
, 'get_all_lighting_level': self.get_all_lighting_level
, 'get_inactive_lighting_level': self.get_inactive_lighting_level
, 'ids_lighting_level': self.ids_lighting_level
, 'names_lighting_level': self.names_lighting_level
, 'get_all_location': self.get_all_location
, 'get_inactive_location': self.get_inactive_location
, 'ids_location': self.ids_location
, 'names_location': self.names_location
, 'get_all_user_handler': self.get_all_user_handler
, 'get_inactive_user_handler': self.get_inactive_user_handler
, 'ids_user_handler': self.ids_user_handler
#, 'auth0_ids_user_handler': self.ids_user_handler
, 'names_user_handler': self.names_user_handler
, 'emails_user_handler': self.emails_user_handler
, '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
}

View File

@@ -0,0 +1,513 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Assessment_Command_Modality_Link Command Modality Link Business Object
"""
# internal
from business_objects.base import Base
from business_objects.dog.assessment import Assessment
from business_objects.dog.bribe import Bribe
from business_objects.dog.command import Command
# from business_objects.dog.command_category import Command_Category
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.dog import Dog
from business_objects.dog.command import Command
from business_objects.dog.command_modality import Command_Modality
from business_objects.dog.obedience_level import Obedience_Level
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
# from forms.dog.assessment_command_modality_link import Filters_Assessment_Command_Modality_Link
from helpers.helper_app import Helper_App
import lib.argument_validation as av
# external
from dataclasses import dataclass
from typing import ClassVar, Optional
class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = 'id_link'
FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK
FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = 'assessment_response'
FLAG_DISTANCE_FROM_HANDLER: ClassVar[str] = 'distance-from-handler'
FLAG_IS_IN_HEARING_RANGE_OF_HANDLER: ClassVar[str] = 'is-in-hearing-range-of-handler'
FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: ClassVar[str] = 'is-in-scent-range-of-handler'
FLAG_IS_IN_SIGHT_OF_HANDLER: ClassVar[str] = 'is-in-sight-of-handler'
FLAG_IS_ON_LEAD: ClassVar[str] = 'is-on-lead'
FLAG_TRIAL_COUNT: ClassVar[str] = 'trial-count'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK
__tablename__ = 'DOG_Assessment_Command_Modality_Link'
__table_args__ = { 'extend_existing': True }
id_link = db.Column(db.Integer, primary_key=True)
id_assessment = db.Column(db.Integer)
id_command = db.Column(db.Integer)
id_command_modality = db.Column(db.Integer)
id_bribe = db.Column(db.Integer)
distance_from_handler = db.Column(db.Float)
is_in_hearing_range_of_handler = db.Column(db.Boolean)
is_in_scent_range_of_handler = db.Column(db.Boolean)
is_in_sight_of_handler = db.Column(db.Boolean)
is_on_lead = db.Column(db.Boolean)
trial_count = db.Column(db.Integer)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_link = 0
self.is_new = False
self.assessment = None
self.command = None
self.command_modality = None
self.bribe = None
self.assessment_responses = None
super().__init__()
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
assessment_command_modality_link = cls()
assessment_command_modality_link.id_link = query_row[0]
assessment_command_modality_link.id_assessment = query_row[1]
assessment_command_modality_link.id_command = query_row[5]
assessment_command_modality_link.id_command_modality = query_row[7]
assessment_command_modality_link.id_bribe = query_row[9]
assessment_command_modality_link.distance_from_handler = query_row[11]
assessment_command_modality_link.is_in_hearing_range_of_handler = av.input_bool(query_row[12], 'is_in_hearing_range_of_handler', _m)
assessment_command_modality_link.is_in_scent_range_of_handler = av.input_bool(query_row[13], 'is_in_scent_range_of_handler', _m)
assessment_command_modality_link.is_in_sight_of_handler = av.input_bool(query_row[14], 'is_in_sight_of_handler', _m)
assessment_command_modality_link.is_on_lead = av.input_bool(query_row[15], 'is_on_lead', _m)
assessment_command_modality_link.trial_count = query_row[16]
assessment_command_modality_link.active = av.input_bool(query_row[17], 'active', _m)
assessment_command_modality_link.assessment = Assessment.from_db_assessment_command_modality_link(query_row)
assessment_command_modality_link.command = Command.from_db_assessment_command_modality_link(query_row)
assessment_command_modality_link.command_modality = Command_Modality.from_db_assessment_command_modality_link(query_row)
assessment_command_modality_link.bribe = Bribe.from_db_assessment_command_modality_link(query_row)
return assessment_command_modality_link
@classmethod
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
assessment_command_modality_link = cls()
assessment_command_modality_link.id_link = query_row[1]
return assessment_command_modality_link
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
assessment_command_modality_link = cls()
if json is None: return assessment_command_modality_link
# Helper_App.console_log(f'{_m}\njson: {json}')
assessment_command_modality_link.id_link = json.get(Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK, -1)
assessment_command_modality_link.id_assessment = json[Assessment.ATTR_ID_ASSESSMENT]
assessment_command_modality_link.id_command = json[Command.ATTR_ID_COMMAND]
assessment_command_modality_link.id_command_modality = json[Command_Modality.ATTR_ID_COMMAND_MODALITY]
assessment_command_modality_link.id_bribe = json[Bribe.ATTR_ID_BRIBE]
assessment_command_modality_link.distance_from_handler = json[cls.FLAG_DISTANCE_FROM_HANDLER]
assessment_command_modality_link.is_in_hearing_range_of_handler = json[cls.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER]
assessment_command_modality_link.is_in_scent_range_of_handler = json[cls.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER]
assessment_command_modality_link.is_in_sight_of_handler = json[cls.FLAG_IS_IN_SIGHT_OF_HANDLER]
assessment_command_modality_link.is_on_lead = json[cls.FLAG_IS_ON_LEAD]
assessment_command_modality_link.trial_count = json[cls.FLAG_TRIAL_COUNT]
assessment_command_modality_link.active = json[cls.FLAG_ACTIVE]
assessment_command_modality_link.created_on = json.get(cls.FLAG_CREATED_ON, None)
# assessment_command_modality_link.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY]
# Helper_App.console_log(f'Dog Command Link: {assessment_command_modality_link}')
return assessment_command_modality_link
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: self.id_link
, Assessment.ATTR_ID_ASSESSMENT: { Assessment.ATTR_ID_ASSESSMENT: None } if self.assessment is None else self.assessment.to_json()
, Command.ATTR_ID_COMMAND: { Command.ATTR_ID_COMMAND: None } if self.command is None else self.command.to_json()
, Command_Modality.ATTR_ID_COMMAND_MODALITY: { Command_Modality.ATTR_ID_COMMAND_MODALITY: None } if self.command_modality is None else self.command_modality.to_json()
, Bribe.FLAG_BRIBE: { Bribe.FLAG_BRIBE: None } if self.bribe is None else self.bribe.to_json()
, self.FLAG_DISTANCE_FROM_HANDLER: self.distance_from_handler
, self.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER: self.is_in_hearing_range_of_handler
, self.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: self.is_in_scent_range_of_handler
, self.FLAG_IS_IN_SIGHT_OF_HANDLER: self.is_in_sight_of_handler
, self.FLAG_IS_ON_LEAD: self.is_on_lead
, self.FLAG_TRIAL_COUNT: self.trial_count
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
, self.FLAG_ASSESSMENT_RESPONSE: [] if self.assessment_responses is None else [response.to_json() for response in self.assessment_responses]
}
# , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK}: {self.id_link}
{Assessment.FLAG_ASSESSMENT}: {self.assessment}
{Command.FLAG_COMMAND}: {self.command}
{Command_Modality.FLAG_COMMAND_MODALITY}: {self.command_modality}
{Bribe.FLAG_BRIBE}: {self.bribe}
{self.FLAG_DISTANCE_FROM_HANDLER}: {self.distance_from_handler}
{self.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER}: {self.is_in_hearing_range_of_handler}
{self.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER}: {self.is_in_scent_range_of_handler}
{self.FLAG_IS_IN_SIGHT_OF_HANDLER}: {self.is_in_sight_of_handler}
{self.FLAG_IS_ON_LEAD}: {self.is_on_lead}
{self.FLAG_TRIAL_COUNT}: {self.trial_count}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category}
class Assessment_Command_Modality_Link_Temp(db.Model, Base):
__tablename__ = 'DOG_Assessment_Command_Modality_Link_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_link = db.Column(db.Integer)
id_assessment = db.Column(db.Integer)
id_command = db.Column(db.Integer)
id_command_modality = db.Column(db.Integer)
id_bribe = db.Column(db.Integer)
distance_from_handler = db.Column(db.Float)
is_in_hearing_range_of_handler = db.Column(db.Boolean)
is_in_scent_range_of_handler = db.Column(db.Boolean)
is_in_sight_of_handler = db.Column(db.Boolean)
is_on_lead = db.Column(db.Boolean)
trial_count = db.Column(db.Integer)
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_assessment_command_modality_link(cls, assessment_command_modality_link):
_m = f'{cls.__qualname__}.from_assessment_command_modality_link'
temp = cls()
temp.id_link = assessment_command_modality_link.id_link
temp.id_assessment = assessment_command_modality_link.id_assessment
temp.id_command = assessment_command_modality_link.id_command
temp.id_command_modality = assessment_command_modality_link.id_command_modality
temp.id_bribe = assessment_command_modality_link.id_bribe
temp.distance_from_handler = assessment_command_modality_link.distance_from_handler
temp.is_in_hearing_range_of_handler = assessment_command_modality_link.is_in_hearing_range_of_handler
temp.is_in_scent_range_of_handler = assessment_command_modality_link.is_in_scent_range_of_handler
temp.is_in_sight_of_handler = assessment_command_modality_link.is_in_sight_of_handler
temp.is_on_lead = assessment_command_modality_link.is_on_lead
temp.trial_count = assessment_command_modality_link.trial_count
temp.active = assessment_command_modality_link.active
# temp.created_on = assessment_command_modality_link.created_on
return temp
class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
get_all_link: bool
get_inactive_link: bool
ids_link: str
min_distance_from_handler_link: Optional[float]
max_distance_from_handler_link: Optional[float]
value_is_in_sight_of_handler_link: Optional[bool]
value_is_in_scent_range_of_handler_link: Optional[bool]
value_is_in_hearing_range_of_handler_link: Optional[bool]
value_is_on_lead_link: Optional[bool]
min_trial_count_link: Optional[float]
max_trial_count_link: Optional[float]
get_all_assessment: bool
get_inactive_assessment: bool
ids_assessment: str
notes_assessment: str
min_temperature_assessment: Optional[float]
max_temperature_assessment: Optional[float]
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
names_weather: str
get_all_lighting_level: bool
get_inactive_lighting_level: bool
ids_lighting_level: str
names_lighting_level: str
get_all_location: bool
get_inactive_location: bool
ids_location: str
names_location: str
get_all_user_handler: bool
get_inactive_user_handler: bool
ids_user_handler: str
#auth0_ids_user_handler: str
names_user_handler: str
emails_user_handler: str
get_all_command_category: bool
get_inactive_command_category: bool
ids_command_category: str
names_command_category: str
get_all_command: bool
get_inactive_command: bool
ids_command: str
names_command: str
hand_signal_default_descriptions_command: str
notes_command: str
get_all_command_modality: bool
get_inactive_command_modality: bool
ids_command_modality: str
names_command_modality: str
get_all_bribe: bool
get_inactive_bribe: bool
ids_bribe: str
names_bribe: 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_link = True
, get_inactive_link = False
, ids_link = ''
, min_distance_from_handler_link = None
, max_distance_from_handler_link = None
, value_is_in_sight_of_handler_link = None
, value_is_in_scent_range_of_handler_link = None
, value_is_in_hearing_range_of_handler_link = None
, value_is_on_lead_link = None
, min_trial_count_link = None
, max_trial_count_link = None
, get_all_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
, names_weather = ''
, get_all_lighting_level = True
, get_inactive_lighting_level = False
, ids_lighting_level = ''
, names_lighting_level = ''
, get_all_location = True
, get_inactive_location = False
, ids_location = ''
, names_location = ''
, get_all_user_handler = True
, get_inactive_user_handler = False
, ids_user_handler = ''
# , auth0_ids_user_handler = ''
, names_user_handler = ''
, emails_user_handler = ''
, get_all_command_category = True
, get_inactive_command_category = False
, ids_command_category = ''
, names_command_category = ''
, get_all_command = True
, get_inactive_command = False
, ids_command = ''
, names_command = ''
, hand_signal_default_descriptions_command = ''
, notes_command = ''
, get_all_command_modality = True
, get_inactive_command_modality = False
, ids_command_modality = ''
, names_command_modality = ''
, get_all_bribe = True
, get_inactive_bribe = False
, ids_bribe = ''
, names_bribe = ''
, 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_link = json.get('a_get_all_link', False)
, get_inactive_link = json.get('a_get_inactive_link', False)
, ids_link = json.get('a_ids_link', '')
, notes_assessment_command_modality_link = json.get('a_notes_assessment_command_modality_link', '')
, min_distance_from_handler_link = json.get('a_min_distance_from_handler_link', None)
, max_distance_from_handler_link = json.get('a_max_distance_from_handler_link', None)
, value_is_in_sight_of_handler_link = json.get('a_value_is_in_sight_of_handler_link', None)
, value_is_in_scent_range_of_handler_link = json.get('a_value_is_in_scent_range_of_handler_link', None)
, value_is_in_hearing_range_of_handler_link = json.get('a_value_is_in_hearing_range_of_handler_link', None)
, value_is_on_lead_link = json.get('a_value_is_on_lead_link', None)
, min_trial_count_link = json.get('a_min_trial_count_link', None)
, max_trial_count_link = json.get('a_max_trial_count_link', None)
, get_all_assessment = json.get('a_get_all_assessment', False)
, get_inactive_assessment = json.get('a_get_inactive_assessment', False)
, ids_assessment = json.get('a_ids_assessment', '')
, notes_assessment = json.get('a_notes_assessment', '')
, min_temperature_assessment = json.get('a_min_temperature_assessment', None)
, max_temperature_assessment = json.get('a_max_temperature_assessment', None)
, get_all_weather = json.get('a_get_all_weather', False)
, get_inactive_weather = json.get('a_get_inactive_weather', False)
, ids_weather = json.get('a_ids_weather', '')
, names_weather = json.get('a_names_weather', '')
, get_all_lighting_level = json.get('a_get_all_lighting_level', False)
, get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False)
, ids_lighting_level = json.get('a_ids_lighting_level', '')
, names_lighting_level = json.get('a_names_lighting_level', '')
, get_all_location = json.get('a_get_all_location', False)
, get_inactive_location = json.get('a_get_inactive_location', False)
, ids_location = json.get('a_ids_location', '')
, names_location = json.get('a_names_location', '')
, get_all_user_handler = json.get('a_get_all_user_handler', False)
, get_inactive_user_handler = json.get('a_get_inactive_user_handler', False)
, ids_user_handler = json.get('a_ids_user_handler', '')
# , auth0_ids_user_handler = json.get('a_ids_user_handler', '')
, names_user_handler = json.get('a_names_user_handler', '')
, emails_user_handler = json.get('a_emails_user_handler', '')
, get_all_command_category = json.get('a_get_all_command_category', False)
, get_inactive_command_category = json.get('a_get_inactive_command_category', False)
, ids_command_category = json.get('a_ids_command_category', '')
, names_command_category = json.get('a_names_command_category', '')
, get_all_command = json.get('a_get_all_command', False)
, get_inactive_command = json.get('a_get_inactive_command', False)
, ids_command = json.get('a_ids_command', '')
, names_command = json.get('a_names_command', '')
, hand_signal_default_descriptions_command = json.get('a_hand_signal_default_descriptions_command', '')
, notes_command = json.get('a_notes_command', '')
, get_all_command_modality = json.get('a_get_all_command_modality', False)
, get_inactive_command_modality = json.get('a_get_inactive_command_modality', False)
, ids_command_modality = json.get('a_ids_command_modality', '')
, names_command_modality = json.get('a_names_command_modality', '')
, get_all_bribe = json.get('a_get_all_bribe', False)
, get_inactive_bribe = json.get('a_get_inactive_bribe', False)
, ids_bribe = json.get('a_ids_bribe', '')
, names_bribe = json.get('a_names_bribe', '')
, 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_assessment(cls, form):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
Helper_App.console_log(_m)
Helper_App.console_log(f'Filters: {form}')
av.val_instance(form, 'form', _m, Filters_Assessment)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
has_filter_assessment = not (form.id_assessment.data == '0' or form.id_assessment.data == '' or form.id_assessment.data is None)
has_filter_command = False
has_filter_command_modality = False
has_filter_bribe = False
active_only = av.input_bool(form.active_only.data, "active", _m)
Helper_App.console_log(f'''
has_filter_search_text: {has_filter_search_text}
has_filter_assessment: {has_filter_assessment}
has_filter_command: {has_filter_command}
has_filter_command_modality: {has_filter_command_modality}
has_filter_bribe: {has_filter_bribe}
active_only: {active_only}
''')
filters = cls.get_default()
filters.get_all_link = True
filters.get_inactive_link = not active_only
filters.ids_link = ''
filters.get_all_assessment = not has_filter_assessment
filters.get_inactive_assessment = not active_only
filters.ids_assessment = form.id_assessment.data if has_filter_assessment else ''
filters.get_all_command = not has_filter_command
filters.get_inactive_command = not active_only
filters.ids_command = ''
filters.names_command = form.search.data if has_filter_search_text else ''
filters.get_all_command_modality = not has_filter_command_modality
filters.get_inactive_command_modality = not active_only
filters.ids_command_modality = ''
filters.names_command_modality = form.search.data if has_filter_search_text else ''
filters.get_all_bribe = not has_filter_bribe
filters.get_inactive_bribe = not active_only
filters.ids_bribe = ''
filters.names_bribe = form.search.data if has_filter_search_text else ''
return filters
def to_json(self):
return {
'a_get_all_link': self.get_all_link
, 'a_get_inactive_link': self.get_inactive_link
, 'a_ids_link': self.ids_link
, 'a_min_distance_from_handler_link': self.min_distance_from_handler_link
, 'a_max_distance_from_handler_link': self.max_distance_from_handler_link
, 'a_value_is_in_sight_of_handler_link': self.value_is_in_sight_of_handler_link
, 'a_value_is_in_scent_range_of_handler_link': self.value_is_in_scent_range_of_handler_link
, 'a_value_is_in_hearing_range_of_handler_link': self.value_is_in_hearing_range_of_handler_link
, 'a_value_is_on_lead_link': self.value_is_on_lead_link
, 'a_min_trial_count_link': self.min_trial_count_link
, 'a_max_trial_count_link': self.max_trial_count_link
, 'a_get_all_assessment': self.get_all_assessment
, 'a_get_inactive_assessment': self.get_inactive_assessment
, 'a_ids_assessment': self.ids_assessment
, 'a_notes_assessment': self.notes_assessment
, 'a_min_temperature_assessment': self.min_temperature_assessment
, 'a_max_temperature_assessment': self.max_temperature_assessment
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
, 'names_weather': self.names_weather
, 'get_all_lighting_level': self.get_all_lighting_level
, 'get_inactive_lighting_level': self.get_inactive_lighting_level
, 'ids_lighting_level': self.ids_lighting_level
, 'names_lighting_level': self.names_lighting_level
, 'get_all_location': self.get_all_location
, 'get_inactive_location': self.get_inactive_location
, 'ids_location': self.ids_location
, 'names_location': self.names_location
, 'get_all_user_handler': self.get_all_user_handler
, 'get_inactive_user_handler': self.get_inactive_user_handler
, 'ids_user_handler': self.ids_user_handler
#, 'auth0_ids_user_handler': self.ids_user_handler
, 'names_user_handler': self.names_user_handler
, 'emails_user_handler': self.emails_user_handler
, 'a_get_all_command_category': self.get_all_command_category
, 'a_get_inactive_command_category': self.get_inactive_command_category
, 'a_ids_command_category': self.ids_command_category
, 'a_names_command_category': self.names_command_category
, 'a_get_all_command': self.get_all_command
, 'a_get_inactive_command': self.get_inactive_command
, 'a_ids_command': self.ids_command
, 'a_names_command': self.names_command
, 'a_hand_signal_default_descriptions_command': self.hand_signal_default_descriptions_command
, 'a_notes_command': self.notes_command
, 'a_get_all_command_modality': self.get_all_command_modality
, 'a_get_inactive_command_modality': self.get_inactive_command_modality
, 'a_ids_command_modality': self.ids_command_modality
, 'a_names_command_modality': self.names_command_modality
, 'a_get_all_bribe': self.get_all_bribe
, 'a_get_inactive_bribe': self.get_inactive_bribe
, 'a_ids_bribe': self.ids_bribe
, 'a_names_bribe': self.names_bribe
, '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
}

View File

@@ -0,0 +1,516 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Assessment_Response Business Object
"""
# internal
from business_objects.base import Base
from business_objects.dog.command import Command
# from business_objects.dog.command_category import Command_Category
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.dog import Dog
from business_objects.dog.response_quality_metric import Response_Quality_Metric
from business_objects.dog.obedience_level import Obedience_Level
from business_objects.dog.obedience_level import Obedience_Level
from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
from helpers.helper_app import Helper_App
import lib.argument_validation as av
# external
from dataclasses import dataclass
from typing import ClassVar, Optional
class Assessment_Response(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT_RESPONSE: ClassVar[str] = 'id_response'
FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_ASSESSMENT_RESPONSE
FLAG_VALUE_MEASURED: ClassVar[str] = 'value-measured'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE
__tablename__ = 'DOG_Assessment_Response'
__table_args__ = { 'extend_existing': True }
id_response = db.Column(db.Integer, primary_key=True)
id_assessment_command_modality_link = db.Column(db.Integer)
id_response_quality_metric = db.Column(db.Integer)
id_obedience_level = db.Column(db.Integer)
value_measured = db.Column(db.Float)
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_response = 0
self.is_new = False
self.assessment_command_modality_link = None
self.response_quality_metric = None
self.obedience_level = None
super().__init__()
@classmethod
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
assessment_response = cls()
assessment_response.id_response = query_row[0]
assessment_response.id_assessment_command_modality_link = query_row[1]
assessment_response.id_response_quality_metric = query_row[2]
assessment_response.id_obedience_level = query_row[3]
assessment_response.value_measured = query_row[11]
assessment_response.notes = query_row[10]
assessment_response.active = av.input_bool(query_row[12], 'active', _m)
assessment_response.assessment_command_modality_link = Assessment_Command_Modality_Link.from_db_assessment_response(query_row)
assessment_response.response_quality_metric = Response_Quality_Metric.from_db_assessment_response(query_row)
assessment_response.obedience_level = Obedience_Level.from_db_assessment_response(query_row)
return assessment_response
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
assessment_response = cls()
if json is None: return assessment_response
# Helper_App.console_log(f'{_m}\njson: {json}')
assessment_response.id_response = json.get(Assessment_Response.ATTR_ID_ASSESSMENT_RESPONSE, -1)
assessment_response.id_assessment_command_modality_link = json[Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK]
assessment_response.id_response_quality_metric = json[Response_Quality_Metric.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC]
assessment_response.id_obedience_level = json[Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL]
assessment_response.value_measured = json[cls.FLAG_VALUE_MEASURED]
assessment_response.notes = json[cls.FLAG_NOTES]
assessment_response.active = json[cls.FLAG_ACTIVE]
assessment_response.created_on = json.get(cls.FLAG_CREATED_ON, None)
# assessment_response.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY]
# Helper_App.console_log(f'Dog Command Link: {assessment_response}')
return assessment_response
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT_RESPONSE: self.id_response
, Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: { Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: None } if self.assessment_command_modality_link is None else self.assessment_command_modality_link.to_json()
, Response_Quality_Metric.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: { Response_Quality_Metric.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: None } if self.response_quality_metric is None else self.response_quality_metric.to_json()
, Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL: { Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL: None } if self.assessment_command_modality_link is None else self.assessment_command_modality_link.to_json()
, self.FLAG_VALUE_MEASURED: self.value_measured
, self.FLAG_NOTES: self.notes
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
}
# , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT_RESPONSE}: {self.id_response}
{Assessment_Command_Modality_Link.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK}: {self.assessment_command_modality_link}
{Response_Quality_Metric.FLAG_RESPONSE_QUALITY_METRIC}: {self.response_quality_metric}
{Obedience_Level.FLAG_OBEDIENCE_LEVEL}: {self.obedience_level}
{self.FLAG_VALUE_MEASURED}: {self.value_measured}
{self.FLAG_NOTES}: {self.notes}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category}
class Assessment_Response_Temp(db.Model, Base):
__tablename__ = 'DOG_Assessment_Response_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_response = db.Column(db.Integer)
id_assessment_command_modality_link = db.Column(db.Integer)
id_response_quality_metric = db.Column(db.Integer)
id_obedience_level = db.Column(db.Integer)
value_measured = db.Column(db.Float)
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_assessment_response(cls, assessment_response):
_m = 'Assessment_Response_Temp.from_assessment_response'
temp = cls()
temp.id_response = assessment_response.id_response
temp.id_assessment_command_modality_link = assessment_response.id_assessment_command_modality_link
temp.id_response_quality_metric = assessment_response.id_response_quality_metric
temp.id_obedience_level = assessment_response.id_obedience_level
temp.value_measured = assessment_response.value_measured
temp.notes = assessment_response.notes
temp.active = assessment_response.active
# temp.created_on = assessment_response.created_on
return temp
class Parameters_Assessment_Response(Get_Many_Parameters_Base):
get_all_assessment_response: bool
get_inactive_assessment_response: bool
ids_assessment_response: str
notes_assessment_response: str
min_value_measured_assessment_response: Optional[float]
max_value_measured_assessment_response: Optional[float]
get_all_ACM_link: bool
get_inactive_ACM_link: bool
ids_ACM_link: str
min_distance_from_handler_ACM_link: Optional[float]
max_distance_from_handler_ACM_link: Optional[float]
value_is_in_sight_of_handler_ACM_link: Optional[bool]
value_is_in_scent_range_of_handler_ACM_link: Optional[bool]
value_is_in_hearing_range_of_handler_ACM_link: Optional[bool]
value_is_on_lead_ACM_link: Optional[bool]
min_trial_count_ACM_link: Optional[float]
max_trial_count_ACM_link: Optional[float]
get_all_assessment: bool
get_inactive_assessment: bool
ids_assessment: str
notes_assessment: str
min_temperature_assessment: Optional[float]
max_temperature_assessment: Optional[float]
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
names_weather: str
get_all_lighting_level: bool
get_inactive_lighting_level: bool
ids_lighting_level: str
names_lighting_level: str
get_all_location: bool
get_inactive_location: bool
ids_location: str
names_location: str
get_all_user_handler: bool
get_inactive_user_handler: bool
ids_user_handler: str
#auth0_ids_user_handler: str
names_user_handler: str
emails_user_handler: str
get_all_command_category: bool
get_inactive_command_category: bool
ids_command_category: str
names_command_category: str
get_all_command: bool
get_inactive_command: bool
ids_command: str
names_command: str
hand_signal_default_descriptions_command: str
notes_command: str
get_all_command_modality: bool
get_inactive_command_modality: bool
ids_command_modality: str
names_command_modality: str
get_all_bribe: bool
get_inactive_bribe: bool
ids_bribe: str
names_bribe: str
get_all_response_quality_metric: bool
get_inactive_response_quality_metric: bool
ids_response_quality_metric: str
names_response_quality_metric: str
get_all_obedience_level: bool
get_inactive_obedience_level: bool
ids_obedience_level: str
names_obedience_level: 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_assessment_response = True
, get_inactive_assessment_response = False
, ids_assessment_response = ''
, notes_assessment_response = ''
, min_value_measured_assessment_response = None
, max_value_measured_assessment_response = None
, get_all_ACM_link = True
, get_inactive_ACM_link = False
, ids_ACM_link = ''
, min_distance_from_handler_ACM_link = None
, max_distance_from_handler_ACM_link = None
, value_is_in_sight_of_handler_ACM_link = None
, value_is_in_scent_range_of_handler_ACM_link = None
, value_is_in_hearing_range_of_handler_ACM_link = None
, value_is_on_lead_ACM_link = None
, min_trial_count_ACM_link = None
, max_trial_count_ACM_link = None
, get_all_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
, names_weather = ''
, get_all_lighting_level = True
, get_inactive_lighting_level = False
, ids_lighting_level = ''
, names_lighting_level = ''
, get_all_location = True
, get_inactive_location = False
, ids_location = ''
, names_location = ''
, get_all_user_handler = True
, get_inactive_user_handler = False
, ids_user_handler = ''
# , auth0_ids_user_handler = ''
, names_user_handler = ''
, emails_user_handler = ''
, get_all_command_category = True
, get_inactive_command_category = False
, ids_command_category = ''
, names_command_category = ''
, get_all_command = True
, get_inactive_command = False
, ids_command = ''
, names_command = ''
, hand_signal_default_descriptions_command = ''
, notes_command = ''
, get_all_command_modality = True
, get_inactive_command_modality = False
, ids_command_modality = ''
, names_command_modality = ''
, get_all_bribe = True
, get_inactive_bribe = False
, ids_bribe = ''
, names_bribe = ''
, get_all_response_quality_metric = True
, get_inactive_response_quality_metric = False
, ids_response_quality_metric = ''
, names_response_quality_metric = ''
, get_all_obedience_level = True
, get_inactive_obedience_level = False
, ids_obedience_level = ''
, names_obedience_level = ''
, 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_assessment_response = json.get('a_get_all_assessment_response', False)
, get_inactive_assessment_response = json.get('a_get_inactive_assessment_response', False)
, ids_assessment_response = json.get('a_ids_assessment_response', '')
, notes_assessment_response = json.get('a_notes_assessment_response', '')
, min_value_measured_assessment_response = json.get('a_min_value_measured_assessment_response', None)
, max_value_measured_assessment_response = json.get('a_max_value_measured_assessment_response', None)
, get_all_ACM_link = json.get('a_get_all_ACM_link', False)
, get_inactive_ACM_link = json.get('a_get_inactive_ACM_link', False)
, ids_ACM_link = json.get('a_ids_ACM_link', '')
, notes_assessment_command_modality_link = json.get('a_notes_assessment_command_modality_link', '')
, min_distance_from_handler_ACM_link = json.get('a_min_distance_from_handler_ACM_link', None)
, max_distance_from_handler_ACM_link = json.get('a_max_distance_from_handler_ACM_link', None)
, value_is_in_sight_of_handler_ACM_link = json.get('a_value_is_in_sight_of_handler_ACM_link', None)
, value_is_in_scent_range_of_handler_ACM_link = json.get('a_value_is_in_scent_range_of_handler_ACM_link', None)
, value_is_in_hearing_range_of_handler_ACM_link = json.get('a_value_is_in_hearing_range_of_handler_ACM_link', None)
, value_is_on_lead_ACM_link = json.get('a_value_is_on_lead_ACM_link', None)
, min_trial_count_ACM_link = json.get('a_min_trial_count_ACM_link', None)
, max_trial_count_ACM_link = json.get('a_max_trial_count_ACM_link', None)
, get_all_assessment = json.get('a_get_all_assessment', False)
, get_inactive_assessment = json.get('a_get_inactive_assessment', False)
, ids_assessment = json.get('a_ids_assessment', '')
, notes_assessment = json.get('a_notes_assessment', '')
, min_temperature_assessment = json.get('a_min_temperature_assessment', None)
, max_temperature_assessment = json.get('a_max_temperature_assessment', None)
, get_all_weather = json.get('a_get_all_weather', False)
, get_inactive_weather = json.get('a_get_inactive_weather', False)
, ids_weather = json.get('a_ids_weather', '')
, names_weather = json.get('a_names_weather', '')
, get_all_lighting_level = json.get('a_get_all_lighting_level', False)
, get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False)
, ids_lighting_level = json.get('a_ids_lighting_level', '')
, names_lighting_level = json.get('a_names_lighting_level', '')
, get_all_location = json.get('a_get_all_location', False)
, get_inactive_location = json.get('a_get_inactive_location', False)
, ids_location = json.get('a_ids_location', '')
, names_location = json.get('a_names_location', '')
, get_all_user_handler = json.get('a_get_all_user_handler', False)
, get_inactive_user_handler = json.get('a_get_inactive_user_handler', False)
, ids_user_handler = json.get('a_ids_user_handler', '')
# , auth0_ids_user_handler = json.get('a_ids_user_handler', '')
, names_user_handler = json.get('a_names_user_handler', '')
, emails_user_handler = json.get('a_emails_user_handler', '')
, get_all_command_category = json.get('a_get_all_command_category', False)
, get_inactive_command_category = json.get('a_get_inactive_command_category', False)
, ids_command_category = json.get('a_ids_command_category', '')
, names_command_category = json.get('a_names_command_category', '')
, get_all_command = json.get('a_get_all_command', False)
, get_inactive_command = json.get('a_get_inactive_command', False)
, ids_command = json.get('a_ids_command', '')
, names_command = json.get('a_names_command', '')
, hand_signal_default_descriptions_command = json.get('a_hand_signal_default_descriptions_command', '')
, notes_command = json.get('a_notes_command', '')
, get_all_command_modality = json.get('a_get_all_command_modality', False)
, get_inactive_command_modality = json.get('a_get_inactive_command_modality', False)
, ids_command_modality = json.get('a_ids_command_modality', '')
, names_command_modality = json.get('a_names_command_modality', '')
, get_all_bribe = json.get('a_get_all_bribe', False)
, get_inactive_bribe = json.get('a_get_inactive_bribe', False)
, ids_bribe = json.get('a_ids_bribe', '')
, names_bribe = json.get('a_names_bribe', '')
, get_all_response_quality_metric = json.get('a_get_all_response_quality_metric', False)
, get_inactive_response_quality_metric = json.get('a_get_inactive_response_quality_metric', False)
, ids_response_quality_metric = json.get('a_ids_response_quality_metric', '')
, names_response_quality_metric = json.get('a_names_response_quality_metric', '')
, get_all_obedience_level = json.get('a_get_all_obedience_level', False)
, get_inactive_obedience_level = json.get('a_get_inactive_obedience_level', False)
, ids_obedience_level = json.get('a_ids_obedience_level', '')
, names_obedience_level = json.get('a_names_obedience_level', '')
, 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_assessment(cls, form):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
Helper_App.console_log(_m)
Helper_App.console_log(f'Filters: {form}')
av.val_instance(form, 'form', _m, Filters_Assessment)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
has_filter_assessment_command_modality_link = False
has_filter_response_quality_metric = False
has_filter_obedience_level = False
has_filter_user_handler = False
has_filter_assessment = not (form.id_assessment.data == '' or form.id_assessment.data == '0' or form.id_assessment.data is None)
active_only = av.input_bool(form.active_only.data, "active", _m)
Helper_App.console_log(f'''
has_filter_search_text: {has_filter_search_text}
has_filter_assessment_command_modality_link: {has_filter_assessment_command_modality_link}
has_filter_response_quality_metric: {has_filter_response_quality_metric}
has_filter_obedience_level: {has_filter_obedience_level}
has_filter_user_handler: {has_filter_user_handler}
active_only: {active_only}
''')
filters = cls.get_default()
filters.get_all_assessment_response = True
filters.get_inactive_assessment_response = not active_only
filters.ids_assessment_response = ''
filters.get_all_ACM_link = not has_filter_assessment_command_modality_link
filters.get_inactive_ACM_link = not active_only
filters.ids_ACM_link = ''
filters.get_all_response_quality_metric = not has_filter_response_quality_metric
filters.get_inactive_response_quality_metric = not active_only
filters.ids_response_quality_metric = ''
filters.names_response_quality_metric = form.search.data if has_filter_search_text else ''
filters.get_all_obedience_level = not has_filter_obedience_level
filters.get_inactive_obedience_level = not active_only
filters.ids_obedience_level = ''
filters.names_obedience_level = form.search.data if has_filter_search_text else ''
filters.get_all_user_handler = not has_filter_user_handler
filters.get_inactive_user_handler = not active_only
filters.ids_user_handler = ''
# filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else ''
filters.names_user_handler = form.search.data if has_filter_search_text else ''
filters.emails_user_handler = form.search.data if has_filter_search_text else ''
filters.ids_assessment = form.id_assessment.data if has_filter_assessment else ''
return filters
def to_json(self):
return {
'a_get_all_assessment_response': self.get_all_assessment_response
, 'a_get_inactive_assessment_response': self.get_inactive_assessment_response
, 'a_ids_assessment_response': self.ids_assessment_response
, 'a_notes_assessment_response': self.notes_assessment_response
, 'a_min_value_measured_assessment_response': self.min_value_measured_assessment_response
, 'a_max_value_measured_assessment_response': self.max_value_measured_assessment_response
, 'a_get_all_ACM_link': self.get_all_ACM_link
, 'a_get_inactive_ACM_link': self.get_inactive_ACM_link
, 'a_ids_ACM_link': self.ids_ACM_link
, 'a_min_distance_from_handler_ACM_link': self.min_distance_from_handler_ACM_link
, 'a_max_distance_from_handler_ACM_link': self.max_distance_from_handler_ACM_link
, 'a_value_is_in_sight_of_handler_ACM_link': self.value_is_in_sight_of_handler_ACM_link
, 'a_value_is_in_scent_range_of_handler_ACM_link': self.value_is_in_scent_range_of_handler_ACM_link
, 'a_value_is_in_hearing_range_of_handler_ACM_link': self.value_is_in_hearing_range_of_handler_ACM_link
, 'a_value_is_on_lead_ACM_link': self.value_is_on_lead_ACM_link
, 'a_min_trial_count_ACM_link': self.min_trial_count_ACM_link
, 'a_max_trial_count_ACM_link': self.max_trial_count_ACM_link
, 'a_get_all_assessment': self.get_all_assessment
, 'a_get_inactive_assessment': self.get_inactive_assessment
, 'a_ids_assessment': self.ids_assessment
, 'a_notes_assessment': self.notes_assessment
, 'a_min_temperature_assessment': self.min_temperature_assessment
, 'a_max_temperature_assessment': self.max_temperature_assessment
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
, 'names_weather': self.names_weather
, 'get_all_lighting_level': self.get_all_lighting_level
, 'get_inactive_lighting_level': self.get_inactive_lighting_level
, 'ids_lighting_level': self.ids_lighting_level
, 'names_lighting_level': self.names_lighting_level
, 'get_all_location': self.get_all_location
, 'get_inactive_location': self.get_inactive_location
, 'ids_location': self.ids_location
, 'names_location': self.names_location
, 'get_all_user_handler': self.get_all_user_handler
, 'get_inactive_user_handler': self.get_inactive_user_handler
, 'ids_user_handler': self.ids_user_handler
#, 'auth0_ids_user_handler': self.ids_user_handler
, 'names_user_handler': self.names_user_handler
, 'emails_user_handler': self.emails_user_handler
, 'a_get_all_command_category': self.get_all_command_category
, 'a_get_inactive_command_category': self.get_inactive_command_category
, 'a_ids_command_category': self.ids_command_category
, 'a_names_command_category': self.names_command_category
, 'a_get_all_command': self.get_all_command
, 'a_get_inactive_command': self.get_inactive_command
, 'a_ids_command': self.ids_command
, 'a_names_command': self.names_command
, 'a_hand_signal_default_descriptions_command': self.hand_signal_default_descriptions_command
, 'a_notes_command': self.notes_command
, 'a_get_all_command_modality': self.get_all_command_modality
, 'a_get_inactive_command_modality': self.get_inactive_command_modality
, 'a_ids_command_modality': self.ids_command_modality
, 'a_names_command_modality': self.names_command_modality
, 'a_get_all_bribe': self.get_all_bribe
, 'a_get_inactive_bribe': self.get_inactive_bribe
, 'a_ids_bribe': self.ids_bribe
, 'a_names_bribe': self.names_bribe
, 'a_get_all_response_quality_metric': self.get_all_response_quality_metric
, 'a_get_inactive_response_quality_metric': self.get_inactive_response_quality_metric
, 'a_ids_response_quality_metric': self.ids_response_quality_metric
, 'a_names_response_quality_metric': self.names_response_quality_metric
, 'a_get_all_obedience_level': self.get_all_obedience_level
, 'a_get_inactive_obedience_level': self.get_inactive_obedience_level
, 'a_ids_obedience_level': self.ids_obedience_level
, 'a_names_obedience_level': self.names_obedience_level
, '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
}

View File

@@ -0,0 +1,190 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Bribe 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 Bribe(SQLAlchemy_ABC, Base):
ATTR_ID_BRIBE: ClassVar[str] = 'id_bribe'
FLAG_BRIBE: ClassVar[str] = 'bribe'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_BRIBE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Bribe'
__table_args__ = { 'extend_existing': True }
id_bribe = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_bribe = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_bribe(cls, query_row):
_m = f'{cls.__qualname__}.from_db_bribe'
category = cls()
category.id_bribe = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
level = cls()
level.id_bribe = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
level = cls()
level.id_bribe = query_row[9]
level.name = query_row[10]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Bribe.from_json'
bribe = cls()
if json is None: return Bribe
# Helper_App.console_log(f'{_m}\njson: {json}')
bribe.id_bribe = json.get(cls.ATTR_ID_BRIBE, -1)
bribe.name = json[cls.FLAG_NAME]
bribe.code = json.get(cls.FLAG_CODE, bribe.name.upper().replace(" ", "_"))
bribe.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Bribe: {bribe}')
return bribe
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_BRIBE: self.id_bribe
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, 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_BRIBE}: {self.id_bribe}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Bribe_Temp(db.Model, Base):
__tablename__ = 'DOG_Bribe_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_bribe = 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_bribe(cls, bribe):
_m = 'Bribe_Temp.from_Bribe'
temp = cls()
temp.id_bribe = bribe.id_bribe
temp.code = bribe.code
temp.name = bribe.name
temp.active = bribe.active
return temp
class Parameters_Bribe(Get_Many_Parameters_Base):
get_all_bribe: bool
get_inactive_bribe: bool
ids_bribe: str
names_bribe: 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_bribe = True
, get_inactive_bribe = False
, ids_bribe = ''
, names_bribe = ''
, 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_bribe = json.get('a_get_all_bribe', False)
, get_inactive_bribe = json.get('a_get_inactive_bribe', False)
, ids_bribe = json.get('a_ids_bribe', '')
, names_bribe = json.get('a_names_bribe', '')
, 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_bribe(cls, form):
av.val_instance(form, 'form', 'Parameters_Bribe.from_form_filters_bribe', Filters_Bribe)
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_Bribe.from_form_filters_bribe")
filters = cls.get_default()
filters.get_all_bribe = True
filters.get_inactive_bribe = not active_only
filters.ids_bribe = ''
filters.names_bribe = form.search.data if has_filter_search_text else ''
filters.notes_bribe = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_bribe': self.get_all_bribe
, 'a_get_inactive_bribe': self.get_inactive_bribe
, 'a_ids_bribe': self.ids_bribe
, 'a_names_bribe': self.names_bribe
, '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
}

View File

@@ -90,6 +90,16 @@ class Command(SQLAlchemy_ABC, Base):
command.command_category = Command_Category.from_db_command_button_link(query_row)
return command
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
command = cls()
command.id_command = query_row[5]
command.name = query_row[6]
command.active = True
command.command_category = Command_Category.from_db_assessment_command_modality_link(query_row)
return command
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'

View File

@@ -66,6 +66,15 @@ class Command_Category(SQLAlchemy_ABC, Base):
level.name = query_row[2]
level.active = True
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
level = cls()
level.id_command_category = query_row[3]
level.name = query_row[4]
level.active = True
return level
@classmethod
def from_json(cls, json):
@@ -108,7 +117,7 @@ class Command_Category_Temp(db.Model, Base):
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_command_category = db.Column(db.Integer)
# code = db.Column(db.String(250))
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
@@ -121,7 +130,7 @@ class Command_Category_Temp(db.Model, Base):
_m = 'Command_Category_Temp.from_Command_Category'
temp = cls()
temp.id_command_category = command_category.id_command_category
# temp.code = command_category.code
temp.code = command_category.code
temp.name = command_category.name
temp.active = command_category.active
return temp

View File

@@ -0,0 +1,190 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Command Modality 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 Command_Modality(SQLAlchemy_ABC, Base):
ATTR_ID_COMMAND_MODALITY: ClassVar[str] = 'id_command_modality'
FLAG_COMMAND_MODALITY: ClassVar[str] = 'command-modality'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_COMMAND_MODALITY
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Command_Modality'
__table_args__ = { 'extend_existing': True }
id_command_modality = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_command_modality = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_command_modality(cls, query_row):
_m = f'{cls.__qualname__}.from_db_command_modality'
category = cls()
category.id_command_modality = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
level = cls()
level.id_command_modality = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
level = cls()
level.id_command_modality = query_row[7]
level.name = query_row[8]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Command_Modality.from_json'
command_modality = cls()
if json is None: return Command_Modality
# Helper_App.console_log(f'{_m}\njson: {json}')
command_modality.id_command_modality = json.get(cls.ATTR_ID_COMMAND_MODALITY, -1)
command_modality.name = json[cls.FLAG_NAME]
command_modality.code = json.get(cls.FLAG_CODE, command_modality.name.upper().replace(" ", "_"))
command_modality.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Command_Modality: {command_modality}')
return command_modality
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_COMMAND_MODALITY: self.id_command_modality
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, 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_COMMAND_MODALITY}: {self.id_command_modality}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Command_Modality_Temp(db.Model, Base):
__tablename__ = 'DOG_Command_Modality_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_command_modality = 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_command_modality(cls, command_modality):
_m = 'Command_Modality_Temp.from_Command_Modality'
temp = cls()
temp.id_command_modality = command_modality.id_command_modality
temp.code = command_modality.code
temp.name = command_modality.name
temp.active = command_modality.active
return temp
class Parameters_Command_Modality(Get_Many_Parameters_Base):
get_all_command_modality: bool
get_inactive_command_modality: bool
ids_command_modality: str
names_command_modality: 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_command_modality = True
, get_inactive_command_modality = False
, ids_command_modality = ''
, names_command_modality = ''
, 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_command_modality = json.get('a_get_all_command_modality', False)
, get_inactive_command_modality = json.get('a_get_inactive_command_modality', False)
, ids_command_modality = json.get('a_ids_command_modality', '')
, names_command_modality = json.get('a_names_command_modality', '')
, 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_command_modality(cls, form):
av.val_instance(form, 'form', 'Parameters_Command_Modality.from_form_filters_command_modality', Filters_Command_Modality)
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_Command_Modality.from_form_filters_command_modality")
filters = cls.get_default()
filters.get_all_command_modality = True
filters.get_inactive_command_modality = not active_only
filters.ids_command_modality = ''
filters.names_command_modality = form.search.data if has_filter_search_text else ''
filters.notes_command_modality = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_command_modality': self.get_all_command_modality
, 'a_get_inactive_command_modality': self.get_inactive_command_modality
, 'a_ids_command_modality': self.ids_command_modality
, 'a_names_command_modality': self.names_command_modality
, '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
}

View File

@@ -0,0 +1,655 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Distraction Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.assessment import Assessment
from business_objects.dog.command import Command
# from business_objects.dog.command_category import Command_Category
from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level
from business_objects.dog.distraction_type import Distraction_Type
from business_objects.dog.dog import Dog
from extensions import db
from forms.dog.assessment import Filters_Assessment
# from forms.dog.distraction import Filters_Distraction
from helpers.helper_app import Helper_App
import lib.argument_validation as av
# external
from dataclasses import dataclass
from typing import ClassVar, Optional
class Distraction(SQLAlchemy_ABC, Base):
ATTR_ID_DISTRACTION: ClassVar[str] = 'id_distraction'
FLAG_DISTRACTION: ClassVar[str] = Assessment.FLAG_DISTRACTION
FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-emotional'
FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-scent'
FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-sight'
FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-sound'
FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: ClassVar[str] = f'{Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL}-touch'
FLAG_PROXIMITY_METRES: ClassVar[str] = 'proximity-metres'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_DISTRACTION
__tablename__ = 'DOG_Distraction'
__table_args__ = { 'extend_existing': True }
id_distraction = db.Column(db.Integer, primary_key=True)
id_assessment = db.Column(db.Integer)
id_distraction_type = db.Column(db.Integer)
id_intensity_level_emotional = db.Column(db.Integer)
id_intensity_level_scent = db.Column(db.Integer)
id_intensity_level_sight = db.Column(db.Integer)
id_intensity_level_sound = db.Column(db.Integer)
id_intensity_level_touch = db.Column(db.Integer)
quantity = db.Column(db.Integer)
proximity_metres = db.Column(db.Float)
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_distraction = 0
self.is_new = False
self.assessment = None
self.distraction_type = None
self.intensity_level_emotional = None
self.intensity_level_scent = None
self.intensity_level_sight = None
self.intensity_level_sound = None
self.intensity_level_touch = None
super().__init__()
@classmethod
def from_db_distraction(cls, query_row):
_m = 'Distraction.from_db_distraction'
distraction = cls()
distraction.id_distraction = query_row[0]
distraction.id_assessment = query_row[1]
distraction.id_distraction_type = query_row[2]
#distraction.id_command_category = query_row[3]
distraction.id_intensity_level_emotional = query_row[4]
distraction.id_intensity_level_scent = query_row[6]
distraction.id_intensity_level_sight = query_row[8]
distraction.id_intensity_level_sound = query_row[10]
distraction.id_intensity_level_touch = query_row[12]
distraction.quantity = query_row[14]
distraction.proximity_metres = query_row[15]
distraction.notes = query_row[16]
distraction.active = av.input_bool(query_row[17], 'active', _m)
# distraction.created_on = query_row[7]
distraction.assessment = Assessment.from_db_distraction(query_row)
distraction.distraction_type = Distraction_Type.from_db_distraction(query_row)
distraction.intensity_level_emotional = Distraction_Intensity_Level.from_db_distraction_emotional(query_row)
distraction.intensity_level_scent = Distraction_Intensity_Level.from_db_distraction_scent(query_row)
distraction.intensity_level_sight = Distraction_Intensity_Level.from_db_distraction_sight(query_row)
distraction.intensity_level_sound = Distraction_Intensity_Level.from_db_distraction_sound(query_row)
distraction.intensity_level_touch = Distraction_Intensity_Level.from_db_distraction_touch(query_row)
return distraction
@classmethod
def from_json(cls, json):
_m = 'Distraction.from_json'
distraction = cls()
if json is None: return distraction
# Helper_App.console_log(f'{_m}\njson: {json}')
distraction.id_distraction = json.get(cls.ATTR_ID_DISTRACTION, -1)
distraction.id_assessment = json[Assessment.ATTR_ID_ASSESSMENT]
distraction.id_distraction_type = json[Distraction_Type.ATTR_ID_DISTRACTION_TYPE]
distraction.id_intensity_level_emotional = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL]
distraction.id_intensity_level_scent = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT]
distraction.id_intensity_level_sight = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT]
distraction.id_intensity_level_sound = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND]
distraction.id_intensity_level_touch = json[cls.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH]
distraction.quantity = json[cls.FLAG_QUANTITY]
distraction.proximity_metres = json[cls.FLAG_PROXIMITY_METRES]
distraction.notes = json[cls.FLAG_NOTES]
distraction.active = json[cls.FLAG_ACTIVE]
distraction.created_on = json.get(cls.FLAG_CREATED_ON, None)
# distraction.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY]
# Helper_App.console_log(f'Dog Command Link: {distraction}')
return distraction
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_DISTRACTION: self.id_distraction
, Assessment.ATTR_ID_ASSESSMENT: { Assessment.ATTR_ID_ASSESSMENT: None } if self.assessment is None else self.assessment.to_json()
, Distraction_Type.ATTR_ID_DISTRACTION_TYPE: { Distraction_Type.ATTR_ID_DISTRACTION_TYPE: None } if self.distraction_type is None else self.distraction_type.to_json()
, self.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: None } if self.intensity_level_emotional is None else self.intensity_level_emotional.to_json()
, self.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: None } if self.intensity_level_scent is None else self.intensity_level_scent.to_json()
, self.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: None } if self.intensity_level_sight is None else self.intensity_level_sight.to_json()
, self.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: None } if self.intensity_level_sound is None else self.intensity_level_sound.to_json()
, self.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: { self.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: None } if self.intensity_level_touch is None else self.intensity_level_touch.to_json()
, self.FLAG_QUANTITY: self.quantity
, self.FLAG_PROXIMITY_METRES: self.proximity_metres
, self.FLAG_NOTES: self.notes
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
}
# , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_DISTRACTION}: {self.id_distraction}
{Assessment.ATTR_ID_ASSESSMENT}: {self.id_assessment}
{Distraction_Type.ATTR_ID_DISTRACTION_TYPE}: {self.id_distraction_type}
{self.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL}: {self.intensity_level_emotional}
{self.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT}: {self.intensity_level_scent}
{self.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT}: {self.intensity_level_sight}
{self.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND}: {self.intensity_level_sound}
{self.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH}: {self.intensity_level_touch}
{self.FLAG_QUANTITY}: {self.quantity}
{self.FLAG_PROXIMITY_METRES}: {self.proximity_metres}
{self.FLAG_NOTES}: {self.notes}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category}
class Distraction_Temp(db.Model, Base):
__tablename__ = 'DOG_Distraction_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_distraction = db.Column(db.Integer)
id_assessment = db.Column(db.Integer)
id_distraction_type = db.Column(db.Integer)
id_intensity_level_emotional = db.Column(db.Integer)
id_intensity_level_scent = db.Column(db.Integer)
id_intensity_level_sight = db.Column(db.Integer)
id_intensity_level_sound = db.Column(db.Integer)
id_intensity_level_touch = db.Column(db.Integer)
quantity = db.Column(db.Integer)
proximity_metres = db.Column(db.Float)
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_distraction(cls, distraction):
_m = 'Distraction_Temp.from_distraction'
temp = cls()
temp.id_distraction = distraction.id_distraction
temp.id_assessment = distraction.id_assessment
temp.id_distraction_type = distraction.id_distraction_type
temp.id_intensity_level_emotional = distraction.id_intensity_level_emotional
temp.id_intensity_level_scent = distraction.id_intensity_level_scent
temp.id_intensity_level_sight = distraction.id_intensity_level_sight
temp.id_intensity_level_sound = distraction.id_intensity_level_sound
temp.id_intensity_level_touch = distraction.id_intensity_level_touch
temp.quantity = distraction.quantity
temp.proximity_metres = distraction.proximity_metres
temp.notes = distraction.notes
temp.active = distraction.active
# temp.created_on = distraction.created_on
return temp
class Parameters_Distraction(Get_Many_Parameters_Base):
get_all_distraction: bool
get_inactive_distraction: bool
ids_distraction: str
notes_distraction: str
min_quantity_distraction: Optional[int]
max_quantity_distraction: Optional[int]
min_proximity_metres_distraction: Optional[float]
max_proximity_metres_distraction: Optional[float]
get_all_distraction_type: bool
get_inactive_distraction_type: bool
ids_distraction_type: str
names_distraction_type: str
get_all_distraction_intensity_level_emotional: bool
get_inactive_distraction_intensity_level_emotional: bool
ids_distraction_intensity_level_emotional: str
names_distraction_intensity_level_emotional: str
get_all_distraction_intensity_level_scent: bool
get_inactive_distraction_intensity_level_scent: bool
ids_distraction_intensity_level_scent: str
names_distraction_intensity_level_scent: str
get_all_distraction_intensity_level_sight: bool
get_inactive_distraction_intensity_level_sight: bool
ids_distraction_intensity_level_sight: str
names_distraction_intensity_level_sight: str
get_all_distraction_intensity_level_sound: bool
get_inactive_distraction_intensity_level_sound: bool
ids_distraction_intensity_level_sound: str
names_distraction_intensity_level_sound: str
get_all_distraction_intensity_level_touch: bool
get_inactive_distraction_intensity_level_touch: bool
ids_distraction_intensity_level_touch: str
names_distraction_intensity_level_touch: str
get_all_assessment: bool
get_inactive_assessment: bool
ids_assessment: str
notes_assessment: str
min_temperature_assessment: Optional[float]
max_temperature_assessment: Optional[float]
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
names_weather: str
get_all_lighting_level: bool
get_inactive_lighting_level: bool
ids_lighting_level: str
names_lighting_level: str
get_all_location: bool
get_inactive_location: bool
ids_location: str
names_location: str
get_all_user_handler: bool
get_inactive_user_handler: bool
ids_user_handler: str
#auth0_ids_user_handler: str
names_user_handler: str
emails_user_handler: 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_distraction = True
, get_inactive_distraction = False
, ids_distraction = ''
, notes_distraction = ''
, min_quantity_distraction = None
, max_quantity_distraction = None
, min_proximity_metres_distraction = None
, max_proximity_metres_distraction = None
, get_all_distraction_type = True
, get_inactive_distraction_type = False
, ids_distraction_type = ''
, names_distraction_type = ''
, get_all_distraction_intensity_level_emotional = True
, get_inactive_distraction_intensity_level_emotional = False
, ids_distraction_intensity_level_emotional = ''
, names_distraction_intensity_level_emotional = ''
, get_all_distraction_intensity_level_scent = True
, get_inactive_distraction_intensity_level_scent = False
, ids_distraction_intensity_level_scent = ''
, names_distraction_intensity_level_scent = ''
, get_all_distraction_intensity_level_sight = True
, get_inactive_distraction_intensity_level_sight = False
, ids_distraction_intensity_level_sight = ''
, names_distraction_intensity_level_sight = ''
, get_all_distraction_intensity_level_sound = True
, get_inactive_distraction_intensity_level_sound = False
, ids_distraction_intensity_level_sound = ''
, names_distraction_intensity_level_sound = ''
, get_all_distraction_intensity_level_touch = True
, get_inactive_distraction_intensity_level_touch = False
, ids_distraction_intensity_level_touch = ''
, names_distraction_intensity_level_touch = ''
, get_all_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
, names_weather = ''
, get_all_lighting_level = True
, get_inactive_lighting_level = False
, ids_lighting_level = ''
, names_lighting_level = ''
, get_all_location = True
, get_inactive_location = False
, ids_location = ''
, names_location = ''
, get_all_user_handler = True
, get_inactive_user_handler = False
, ids_user_handler = ''
# , auth0_ids_user_handler = ''
, names_user_handler = ''
, emails_user_handler = ''
, 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_distraction = json.get('a_get_all_distraction', False)
, get_inactive_distraction = json.get('a_get_inactive_distraction', False)
, ids_distraction = json.get('a_ids_distraction', '')
, notes_distraction = json.get('a_notes_distraction', '')
, min_quantity_distraction = json.get('a_min_quantity_distraction', None)
, max_quantity_distraction = json.get('a_max_quantity_distraction', None)
, min_proximity_metres_distraction = json.get('a_min_proximity_metres_distraction', None)
, max_proximity_metres_distraction = json.get('a_max_proximity_metres_distraction', None)
, get_all_distraction_type = json.get('a_get_all_distraction_type', False)
, get_inactive_distraction_type = json.get('a_get_inactive_distraction_type', False)
, ids_distraction_type = json.get('a_ids_distraction_type', '')
, names_distraction_type = json.get('a_names_distraction_type', '')
, get_all_distraction_intensity_level_emotional = json.get('a_get_all_distraction_intensity_level_emotional', False)
, get_inactive_distraction_intensity_level_emotional = json.get('a_get_inactive_distraction_intensity_level_emotional', False)
, ids_distraction_intensity_level_emotional = json.get('a_ids_distraction_intensity_level_emotional', '')
, names_distraction_intensity_level_emotional = json.get('a_names_distraction_intensity_level_emotional', '')
, get_all_distraction_intensity_level_scent = json.get('a_get_all_distraction_intensity_level_scent', False)
, get_inactive_distraction_intensity_level_scent = json.get('a_get_inactive_distraction_intensity_level_scent', False)
, ids_distraction_intensity_level_scent = json.get('a_ids_distraction_intensity_level_scent', '')
, names_distraction_intensity_level_scent = json.get('a_names_distraction_intensity_level_scent', '')
, get_all_distraction_intensity_level_sight = json.get('a_get_all_distraction_intensity_level_sight', False)
, get_inactive_distraction_intensity_level_sight = json.get('a_get_inactive_distraction_intensity_level_sight', False)
, ids_distraction_intensity_level_sight = json.get('a_ids_distraction_intensity_level_sight', '')
, names_distraction_intensity_level_sight = json.get('a_names_distraction_intensity_level_sight', '')
, get_all_distraction_intensity_level_sound = json.get('a_get_all_distraction_intensity_level_sound', False)
, get_inactive_distraction_intensity_level_sound = json.get('a_get_inactive_distraction_intensity_level_sound', False)
, ids_distraction_intensity_level_sound = json.get('a_ids_distraction_intensity_level_sound', '')
, names_distraction_intensity_level_sound = json.get('a_names_distraction_intensity_level_sound', '')
, get_all_distraction_intensity_level_touch = json.get('a_get_all_distraction_intensity_level_touch', False)
, get_inactive_distraction_intensity_level_touch = json.get('a_get_inactive_distraction_intensity_level_touch', False)
, ids_distraction_intensity_level_touch = json.get('a_ids_distraction_intensity_level_touch', '')
, names_distraction_intensity_level_touch = json.get('a_names_distraction_intensity_level_touch', '')
, get_all_assessment = json.get('a_get_all_assessment', False)
, get_inactive_assessment = json.get('a_get_inactive_assessment', False)
, ids_assessment = json.get('a_ids_assessment', '')
, notes_assessment = json.get('a_notes_assessment', '')
, min_temperature_assessment = json.get('a_min_temperature_assessment', None)
, max_temperature_assessment = json.get('a_max_temperature_assessment', None)
, get_all_weather = json.get('a_get_all_weather', False)
, get_inactive_weather = json.get('a_get_inactive_weather', False)
, ids_weather = json.get('a_ids_weather', '')
, names_weather = json.get('a_names_weather', '')
, get_all_lighting_level = json.get('a_get_all_lighting_level', False)
, get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False)
, ids_lighting_level = json.get('a_ids_lighting_level', '')
, names_lighting_level = json.get('a_names_lighting_level', '')
, get_all_location = json.get('a_get_all_location', False)
, get_inactive_location = json.get('a_get_inactive_location', False)
, ids_location = json.get('a_ids_location', '')
, names_location = json.get('a_names_location', '')
, get_all_user_handler = json.get('a_get_all_user_handler', False)
, get_inactive_user_handler = json.get('a_get_inactive_user_handler', False)
, ids_user_handler = json.get('a_ids_user_handler', '')
# , auth0_ids_user_handler = json.get('a_ids_user_handler', '')
, names_user_handler = json.get('a_names_user_handler', '')
, emails_user_handler = json.get('a_emails_user_handler', '')
, 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_distraction(cls, form):
_m = f'{cls.__qualname__}.from_form_filters_distraction'
Helper_App.console_log(_m)
Helper_App.console_log(f'Filters: {form}')
av.val_instance(form, 'form', _m, Filters_Distraction)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
has_filter_distraction_type = not (form.id_distraction_type.data == '0' or form.id_distraction_type.data == '' or form.id_distraction_type.data is None)
has_filter_intensity_level_emotional = not (form.id_intensity_level_emotional.data == '0' or form.id_intensity_level_emotional.data == '' or form.id_intensity_level_emotional.data is None)
has_filter_intensity_level_scent = not (form.id_intensity_level_scent.data == '0' or form.id_intensity_level_scent.data == '' or form.id_intensity_level_scent.data is None)
has_filter_intensity_level_sight = not (form.id_intensity_level_sight.data == '0' or form.id_intensity_level_sight.data == '' or form.id_intensity_level_sight.data is None)
has_filter_intensity_level_sound = not (form.id_intensity_level_sound.data == '0' or form.id_intensity_level_sound.data == '' or form.id_intensity_level_sound.data is None)
has_filter_intensity_level_touch = not (form.id_intensity_level_touch.data == '0' or form.id_intensity_level_touch.data == '' or form.id_intensity_level_touch.data is None)
has_filter_assessment = not (form.id_assessment.data == '0' or form.id_assessment.data == '' or form.id_assessment.data is None)
has_filter_weather = not (form.id_weather.data == '0' or form.id_weather.data == '' or form.id_weather.data is None)
has_filter_lighting_level = not (form.id_lighting_level.data == '0' or form.id_lighting_level.data == '' or form.id_lighting_level.data is None)
has_filter_location = not (form.id_location.data == '0' or form.id_location.data == '' or form.id_location.data is None)
has_filter_user_handler = not (form.id_user_handler.data == '0' or form.id_user_handler.data == '' or form.id_user_handler.data is None)
active_only = av.input_bool(form.active_only.data, "active", _m)
Helper_App.console_log(f'''
has_filter_search_text: {has_filter_search_text}
has_filter_distraction_type: {has_filter_distraction_type}
has_filter_intensity_level_emotional: {has_filter_intensity_level_emotional}
has_filter_intensity_level_scent: {has_filter_intensity_level_scent}
has_filter_intensity_level_sight: {has_filter_intensity_level_sight}
has_filter_intensity_level_sound: {has_filter_intensity_level_sound}
has_filter_intensity_level_touch: {has_filter_intensity_level_touch}
has_filter_assessment: {has_filter_assessment}
has_filter_weather: {has_filter_weather}
has_filter_lighting_level: {has_filter_lighting_level}
has_filter_location: {has_filter_location}
has_filter_user_handler: {has_filter_user_handler}
active_only: {active_only}
''')
filters = cls.get_default()
filters.get_all_distraction = True
filters.get_inactive_distraction = not active_only
filters.ids_distraction = ''
filters.notes_distraction = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_type = True
filters.get_inactive_distraction_type = not active_only
filters.ids_distraction_type = form.id_distraction_type.data if has_filter_distraction_type else ''
filters.names_distraction_type = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_emotional = True
filters.get_inactive_distraction_intensity_level_emotional = not active_only
filters.ids_distraction_intensity_level_emotional = form.id_intensity_level_emotional.data if has_filter_intensity_level_emotional else ''
filters.names_distraction_intensity_level_emotional = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_scent = True
filters.get_inactive_distraction_intensity_level_scent = not active_only
filters.ids_distraction_intensity_level_scent = form.id_intensity_level_scent.data if has_filter_intensity_level_scent else ''
filters.names_distraction_intensity_level_scent = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_sight = True
filters.get_inactive_distraction_intensity_level_sight = not active_only
filters.ids_distraction_intensity_level_sight = form.id_intensity_level_sight.data if has_filter_intensity_level_sight else ''
filters.names_distraction_intensity_level_sight = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_sound = True
filters.get_inactive_distraction_intensity_level_sound = not active_only
filters.ids_distraction_intensity_level_sound = form.id_intensity_level_sound.data if has_filter_intensity_level_sound else ''
filters.names_distraction_intensity_level_sound = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_touch = True
filters.get_inactive_distraction_intensity_level_touch = not active_only
filters.ids_distraction_intensity_level_touch = form.id_intensity_level_touch.data if has_filter_intensity_level_touch else ''
filters.names_distraction_intensity_level_touch = form.search.data if has_filter_search_text else ''
filters.get_all_assessment = True
filters.get_inactive_assessment = not active_only
filters.ids_assessment = form.id_assessment.data if has_filter_assessment else ''
filters.get_all_weather = not has_filter_weather
filters.get_inactive_weather = not active_only
filters.ids_weather = form.id_weather.data if has_filter_weather else ''
filters.names_weather = form.search.data if has_filter_search_text else ''
filters.get_all_lighting_level = not has_filter_lighting_level
filters.get_inactive_lighting_level = not active_only
filters.ids_lighting_level = form.id_lighting_level.data if has_filter_lighting_level else ''
filters.names_lighting_level = form.search.data if has_filter_search_text else ''
filters.get_all_location = not has_filter_location
filters.get_inactive_location = not active_only
filters.ids_location = form.id_location.data if has_filter_location else ''
filters.names_location = form.search.data if has_filter_search_text else ''
filters.get_all_user_handler = not has_filter_user_handler
filters.get_inactive_user_handler = not active_only
filters.ids_user_handler = form.id_user_handler.data if has_filter_user_handler else ''
# filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else ''
filters.names_user_handler = form.search.data if has_filter_search_text else ''
filters.emails_user_handler = form.search.data if has_filter_search_text else ''
return filters
"""
@classmethod
def from_form_filters_assessment(cls, form):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
Helper_App.console_log(_m)
Helper_App.console_log(f'Filters: {form}')
av.val_instance(form, 'form', _m, Filters_Assessment)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
has_filter_distraction_type = False
has_filter_intensity_level_emotional = False
has_filter_intensity_level_scent = False
has_filter_intensity_level_sight = False
has_filter_intensity_level_sound = False
has_filter_intensity_level_touch = False
has_filter_assessment = not (form.id_assessment.data == '0' or form.id_assessment.data == '' or form.id_assessment.data is None)
active_only = av.input_bool(form.active_only.data, "active", _m)
Helper_App.console_log(f'''
has_filter_search_text: {has_filter_search_text}
has_filter_distraction_type: {has_filter_distraction_type}
has_filter_intensity_level_emotional: {has_filter_intensity_level_emotional}
has_filter_intensity_level_scent: {has_filter_intensity_level_scent}
has_filter_intensity_level_sight: {has_filter_intensity_level_sight}
has_filter_intensity_level_sound: {has_filter_intensity_level_sound}
has_filter_intensity_level_touch: {has_filter_intensity_level_touch}
has_filter_assessment: {has_filter_assessment}
active_only: {active_only}
''')
filters = cls.get_default()
filters.get_all_distraction = True
filters.get_inactive_distraction = not active_only
filters.ids_distraction = ''
filters.notes_distraction = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_type = True
filters.get_inactive_distraction_type = not active_only
filters.ids_distraction_type = ''
filters.names_distraction_type = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_emotional = True
filters.get_inactive_distraction_intensity_level_emotional = not active_only
filters.ids_distraction_intensity_level_emotional = ''
filters.names_distraction_intensity_level_emotional = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_scent = True
filters.get_inactive_distraction_intensity_level_scent = not active_only
filters.ids_distraction_intensity_level_scent = ''
filters.names_distraction_intensity_level_scent = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_sight = True
filters.get_inactive_distraction_intensity_level_sight = not active_only
filters.ids_distraction_intensity_level_sight = ''
filters.names_distraction_intensity_level_sight = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_sound = True
filters.get_inactive_distraction_intensity_level_sound = not active_only
filters.ids_distraction_intensity_level_sound = ''
filters.names_distraction_intensity_level_sound = form.search.data if has_filter_search_text else ''
filters.get_all_distraction_intensity_level_touch = True
filters.get_inactive_distraction_intensity_level_touch = not active_only
filters.ids_distraction_intensity_level_touch = ''
filters.names_distraction_intensity_level_touch = form.search.data if has_filter_search_text else ''
filters.get_all_assessment = True
filters.get_inactive_assessment = not active_only
filters.ids_assessment = form.id_assessment.data if has_filter_assessment else ''
return filters
def to_json(self):
return {
'a_get_all_distraction': self.get_all_distraction
, 'a_get_inactive_distraction': self.get_inactive_distraction
, 'a_ids_distraction': self.ids_distraction
, 'a_notes_distraction': self.notes_distraction
, 'a_min_quantity_distraction': self.min_quantity_distraction
, 'a_max_quantity_distraction': self.max_quantity_distraction
, 'a_min_proximity_metres_distraction': self.min_proximity_metres_distraction
, 'a_max_proximity_metres_distraction': self.max_proximity_metres_distraction
, 'a_get_all_distraction_type': self.get_all_distraction_type
, 'a_get_inactive_distraction_type': self.get_inactive_distraction_type
, 'a_ids_distraction_type': self.ids_distraction_type
, 'a_names_distraction_type': self.names_distraction_type
, 'a_get_all_distraction_intensity_level_emotional': self.get_all_distraction_intensity_level_emotional
, 'a_get_inactive_distraction_intensity_level_emotional': self.get_inactive_distraction_intensity_level_emotional
, 'a_ids_distraction_intensity_level_emotional': self.ids_distraction_intensity_level_emotional
, 'a_names_distraction_intensity_level_emotional': self.names_distraction_intensity_level_emotional
, 'a_get_all_distraction_intensity_level_scent': self.get_all_distraction_intensity_level_scent
, 'a_get_inactive_distraction_intensity_level_scent': self.get_inactive_distraction_intensity_level_scent
, 'a_ids_distraction_intensity_level_scent': self.ids_distraction_intensity_level_scent
, 'a_names_distraction_intensity_level_scent': self.names_distraction_intensity_level_scent
, 'a_get_all_distraction_intensity_level_sight': self.get_all_distraction_intensity_level_sight
, 'a_get_inactive_distraction_intensity_level_sight': self.get_inactive_distraction_intensity_level_sight
, 'a_ids_distraction_intensity_level_sight': self.ids_distraction_intensity_level_sight
, 'a_names_distraction_intensity_level_sight': self.names_distraction_intensity_level_sight
, 'a_get_all_distraction_intensity_level_sound': self.get_all_distraction_intensity_level_sound
, 'a_get_inactive_distraction_intensity_level_sound': self.get_inactive_distraction_intensity_level_sound
, 'a_ids_distraction_intensity_level_sound': self.ids_distraction_intensity_level_sound
, 'a_names_distraction_intensity_level_sound': self.names_distraction_intensity_level_sound
, 'a_get_all_distraction_intensity_level_touch': self.get_all_distraction_intensity_level_touch
, 'a_get_inactive_distraction_intensity_level_touch': self.get_inactive_distraction_intensity_level_touch
, 'a_ids_distraction_intensity_level_touch': self.ids_distraction_intensity_level_touch
, 'a_names_distraction_intensity_level_touch': self.names_distraction_intensity_level_touch
, 'a_get_all_assessment': self.get_all_assessment
, 'a_get_inactive_assessment': self.get_inactive_assessment
, 'a_ids_assessment': self.ids_assessment
, 'a_notes_assessment': self.notes_assessment
, 'a_min_temperature_assessment': self.min_temperature_assessment
, 'a_max_temperature_assessment': self.max_temperature_assessment
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
, 'names_weather': self.names_weather
, 'get_all_lighting_level': self.get_all_lighting_level
, 'get_inactive_lighting_level': self.get_inactive_lighting_level
, 'ids_lighting_level': self.ids_lighting_level
, 'names_lighting_level': self.names_lighting_level
, 'get_all_location': self.get_all_location
, 'get_inactive_location': self.get_inactive_location
, 'ids_location': self.ids_location
, 'names_location': self.names_location
, 'get_all_user_handler': self.get_all_user_handler
, 'get_inactive_user_handler': self.get_inactive_user_handler
, 'ids_user_handler': self.ids_user_handler
#, 'auth0_ids_user_handler': self.ids_user_handler
, 'names_user_handler': self.names_user_handler
, 'emails_user_handler': self.emails_user_handler
, '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
}

View File

@@ -0,0 +1,217 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Distraction Intensity Level 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 Distraction_Intensity_Level(SQLAlchemy_ABC, Base):
ATTR_ID_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = 'id_intensity_level'
FLAG_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = 'distraction-intensity-level'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION_INTENSITY_LEVEL
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Distraction_Intensity_Level'
__table_args__ = { 'extend_existing': True }
id_intensity_level = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_intensity_level = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_distraction_intensity_level(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_intensity_level'
category = cls()
category.id_intensity_level = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction_emotional(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_emotional'
level = cls()
level.id_intensity_level = query_row[4]
level.name = query_row[5]
level.active = True
return level
@classmethod
def from_db_distraction_scent(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_scent'
level = cls()
level.id_intensity_level = query_row[6]
level.name = query_row[7]
level.active = True
return level
@classmethod
def from_db_distraction_sight(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_sight'
level = cls()
level.id_intensity_level = query_row[8]
level.name = query_row[9]
level.active = True
return level
@classmethod
def from_db_distraction_sound(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_sound'
level = cls()
level.id_intensity_level = query_row[10]
level.name = query_row[11]
level.active = True
return level
@classmethod
def from_db_distraction_touch(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_touch'
level = cls()
level.id_intensity_level = query_row[12]
level.name = query_row[13]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Distraction_Intensity_Level.from_json'
distraction_intensity_level = cls()
if json is None: return Distraction_Intensity_Level
# Helper_App.console_log(f'{_m}\njson: {json}')
distraction_intensity_level.id_intensity_level = json.get(cls.ATTR_ID_DISTRACTION_INTENSITY_LEVEL, -1)
distraction_intensity_level.name = json[cls.FLAG_NAME]
distraction_intensity_level.code = json.get(cls.FLAG_CODE, distraction_intensity_level.name.upper().replace(" ", "_"))
distraction_intensity_level.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Distraction_Intensity_Level: {distraction_intensity_level}')
return distraction_intensity_level
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_DISTRACTION_INTENSITY_LEVEL: self.id_intensity_level
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, 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_DISTRACTION_INTENSITY_LEVEL}: {self.id_intensity_level}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Distraction_Intensity_Level_Temp(db.Model, Base):
__tablename__ = 'DOG_Distraction_Intensity_Level_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_intensity_level = 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_distraction_intensity_level(cls, distraction_intensity_level):
_m = 'Distraction_Intensity_Level_Temp.from_Distraction_Intensity_Level'
temp = cls()
temp.id_intensity_level = distraction_intensity_level.id_intensity_level
temp.code = distraction_intensity_level.code
temp.name = distraction_intensity_level.name
temp.active = distraction_intensity_level.active
return temp
class Parameters_Distraction_Intensity_Level(Get_Many_Parameters_Base):
get_all_distraction_intensity_level: bool
get_inactive_distraction_intensity_level: bool
ids_distraction_intensity_level: str
names_distraction_intensity_level: 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_distraction_intensity_level = True
, get_inactive_distraction_intensity_level = False
, ids_distraction_intensity_level = ''
, names_distraction_intensity_level = ''
, 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_distraction_intensity_level = json.get('a_get_all_distraction_intensity_level', False)
, get_inactive_distraction_intensity_level = json.get('a_get_inactive_distraction_intensity_level', False)
, ids_distraction_intensity_level = json.get('a_ids_distraction_intensity_level', '')
, names_distraction_intensity_level = json.get('a_names_distraction_intensity_level', '')
, 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_distraction_intensity_level(cls, form):
av.val_instance(form, 'form', 'Parameters_Distraction_Intensity_Level.from_form_filters_distraction_intensity_level', Filters_Distraction_Intensity_Level)
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_Distraction_Intensity_Level.from_form_filters_distraction_intensity_level")
filters = cls.get_default()
filters.get_all_distraction_intensity_level = True
filters.get_inactive_distraction_intensity_level = not active_only
filters.ids_distraction_intensity_level = ''
filters.names_distraction_intensity_level = form.search.data if has_filter_search_text else ''
filters.notes_distraction_intensity_level = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_distraction_intensity_level': self.get_all_distraction_intensity_level
, 'a_get_inactive_distraction_intensity_level': self.get_inactive_distraction_intensity_level
, 'a_ids_distraction_intensity_level': self.ids_distraction_intensity_level
, 'a_names_distraction_intensity_level': self.names_distraction_intensity_level
, '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
}

View File

@@ -0,0 +1,181 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Distraction Type 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 Distraction_Type(SQLAlchemy_ABC, Base):
ATTR_ID_DISTRACTION_TYPE: ClassVar[str] = 'id_distraction_type'
FLAG_DISTRACTION_TYPE: ClassVar[str] = 'distraction-type'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION_TYPE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Distraction_Type'
__table_args__ = { 'extend_existing': True }
id_distraction_type = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_distraction_type = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_distraction_type(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_type'
category = cls()
category.id_distraction_type = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
level = cls()
level.id_distraction_type = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Distraction_Type.from_json'
distraction_type = cls()
if json is None: return Distraction_Type
# Helper_App.console_log(f'{_m}\njson: {json}')
distraction_type.id_distraction_type = json.get(cls.ATTR_ID_DISTRACTION_TYPE, -1)
distraction_type.name = json[cls.FLAG_NAME]
distraction_type.code = json.get(cls.FLAG_CODE, distraction_type.name.upper().replace(" ", "_"))
distraction_type.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Distraction_Type: {distraction_type}')
return distraction_type
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_DISTRACTION_TYPE: self.id_distraction_type
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, 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_DISTRACTION_TYPE}: {self.id_distraction_type}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Distraction_Type_Temp(db.Model, Base):
__tablename__ = 'DOG_Distraction_Type_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_distraction_type = 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_distraction_type(cls, distraction_type):
_m = 'Distraction_Type_Temp.from_Distraction_Type'
temp = cls()
temp.id_distraction_type = distraction_type.id_distraction_type
temp.code = distraction_type.code
temp.name = distraction_type.name
temp.active = distraction_type.active
return temp
class Parameters_Distraction_Type(Get_Many_Parameters_Base):
get_all_distraction_type: bool
get_inactive_distraction_type: bool
ids_distraction_type: str
names_distraction_type: 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_distraction_type = True
, get_inactive_distraction_type = False
, ids_distraction_type = ''
, names_distraction_type = ''
, 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_distraction_type = json.get('a_get_all_distraction_type', False)
, get_inactive_distraction_type = json.get('a_get_inactive_distraction_type', False)
, ids_distraction_type = json.get('a_ids_distraction_type', '')
, names_distraction_type = json.get('a_names_distraction_type', '')
, 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_distraction_type(cls, form):
av.val_instance(form, 'form', 'Parameters_Distraction_Type.from_form_filters_distraction_type', Filters_Distraction_Type)
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_Distraction_Type.from_form_filters_distraction_type")
filters = cls.get_default()
filters.get_all_distraction_type = True
filters.get_inactive_distraction_type = not active_only
filters.ids_distraction_type = ''
filters.names_distraction_type = form.search.data if has_filter_search_text else ''
filters.notes_distraction_type = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_distraction_type': self.get_all_distraction_type
, 'a_get_inactive_distraction_type': self.get_inactive_distraction_type
, 'a_ids_distraction_type': self.ids_distraction_type
, 'a_names_distraction_type': self.names_distraction_type
, '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
}

View File

@@ -0,0 +1,180 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Button Shape Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.image import Image
import lib.argument_validation as av
from extensions import db
# from forms.dog.lighting_level import Filters_Lighting_Level
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Lighting_Level(SQLAlchemy_ABC, Base):
ATTR_ID_LIGHTING_LEVEL: ClassVar[str] = 'id_lighting_level'
FLAG_LIGHTING_LEVEL: ClassVar[str] = 'lighting_level'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_LIGHTING_LEVEL
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Lighting_Level'
__table_args__ = { 'extend_existing': True }
id_lighting_level = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_lighting_level = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_lighting_level(cls, query_row):
_m = f'{cls.__qualname__}.from_db_lighting_level'
lighting_level = cls()
lighting_level.id_lighting_level = query_row[0]
lighting_level.code = query_row[1]
lighting_level.name = query_row[2]
lighting_level.active = av.input_bool(query_row[3], 'active', _m)
return lighting_level
@classmethod
def from_db_assessment(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment'
lighting_level = cls()
lighting_level.id_lighting_level = query_row[3]
lighting_level.name = query_row[4]
lighting_level.active = True
return lighting_level
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
lighting_level = cls()
if json is None: return lighting_level
# Helper_App.console_log(f'{_m}\njson: {json}')
lighting_level.id_lighting_level = json.get(Lighting_Level.ATTR_ID_LIGHTING_LEVEL, -1)
lighting_level.name = json[cls.FLAG_NAME]
lighting_level.code = json.get(cls.FLAG_CODE, lighting_level.name.upper().replace(" ", "_"))
lighting_level.active = json[cls.FLAG_ACTIVE]
lighting_level.created_on = json.get(cls.FLAG_CREATED_ON, None)
# Helper_App.console_log(f'Lighting_Level: {lighting_level}')
return lighting_level
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_LIGHTING_LEVEL: self.id_lighting_level
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_LIGHTING_LEVEL}: {self.id_lighting_level}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
class Lighting_Level_Temp(db.Model, Base):
__tablename__ = 'DOG_Lighting_Level_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_lighting_level = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_lighting_level(cls, lighting_level):
_m = 'Lighting_Level_Temp.from_lighting_level'
temp = cls()
temp.id_lighting_level = lighting_level.id_lighting_level
temp.code = lighting_level.code
temp.name = lighting_level.name
temp.active = lighting_level.active
# temp.created_on = lighting_level.created_on
return temp
def __repr__(self):
return f'''
{self.__class__.__name__}(
{Lighting_Level.FLAG_LIGHTING_LEVEL}: {self.id_lighting_level}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Parameters_Lighting_Level(Get_Many_Parameters_Base):
get_all_lighting_level: bool
get_inactive_lighting_level: bool
ids_lighting_level: str
names_lighting_level: 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_lighting_level = True
, get_inactive_lighting_level = False
, ids_lighting_level = ''
, names_lighting_level = ''
, 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_lighting_level = json.get('a_get_all_lighting_level', False)
, get_inactive_lighting_level = json.get('a_get_inactive_lighting_level', False)
, ids_lighting_level = json.get('a_ids_lighting_level', '')
, names_lighting_level = json.get('a_names_lighting_level', '')
, 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)
)
def to_json(self):
return {
'a_get_all_lighting_level': self.get_all_lighting_level
, 'a_get_inactive_lighting_level': self.get_inactive_lighting_level
, 'a_ids_lighting_level': self.ids_lighting_level
, 'a_names_lighting_level': self.names_lighting_level
, '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
}

View File

@@ -65,6 +65,15 @@ class Location(SQLAlchemy_ABC, Base):
location.name = query_row[15]
location.active = True
return location
@classmethod
def from_db_assessment(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment'
location = cls()
location.id_location = query_row[5]
location.name = query_row[6]
location.active = True
return location
@classmethod
def from_json(cls, json):

View File

@@ -9,7 +9,7 @@ Feature: Obedience Level Business Object
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
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
@@ -21,7 +21,7 @@ from typing import ClassVar
class Obedience_Level(SQLAlchemy_ABC, Base):
ATTR_ID_OBEDIENCE_LEVEL: ClassVar[str] = "id_obedience_level"
FLAG_OBEDIENCE_LEVEL: ClassVar[str] = 'obedience-level'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = FLAG_OBEDIENCE_LEVEL
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_OBEDIENCE_LEVEL
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Obedience_Level'
@@ -36,17 +36,26 @@ class Obedience_Level(SQLAlchemy_ABC, Base):
self.id_obedience_level = 0
self.is_new = False
super().__init__()
"""
@classmethod
def from_db_dog_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_dog_command_link'
def from_db_obedience_level(cls, query_row):
_m = f'{cls.__qualname__}.from_db_obedience_level'
level = cls()
level.id_obedience_level = query_row[5]
level.code = query_row[6]
level.name = query_row[7]
level.id_obedience_level = query_row[0]
level.code = query_row[1]
level.name = query_row[2]
level.active = av.input_bool(query_row[3], "active", _m)
return level
@classmethod
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
level = cls()
level.id_obedience_level = query_row[4]
level.name = query_row[5]
level.active = True
return level
"""
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
@@ -104,4 +113,68 @@ class Obedience_Level_Temp(db.Model, Base):
temp.code = obedience_level.code
temp.name = obedience_level.name
temp.active = obedience_level.active
return temp
return temp
class Parameters_Obedience_Level(Get_Many_Parameters_Base):
get_all_obedience_level: bool
get_inactive_obedience_level: bool
ids_obedience_level: str
names_obedience_level: 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_obedience_level = True
, get_inactive_obedience_level = False
, ids_obedience_level = ''
, names_obedience_level = ''
, 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_obedience_level = json.get('a_get_all_obedience_level', False)
, get_inactive_obedience_level = json.get('a_get_inactive_obedience_level', False)
, ids_obedience_level = json.get('a_ids_obedience_level', '')
, names_obedience_level = json.get('a_names_obedience_level', '')
, 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_obedience_level(cls, form):
av.val_instance(form, 'form', 'Parameters_Obedience_Level.from_form_filters_obedience_level', Filters_Obedience_Level)
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_Obedience_Level.from_form_filters_obedience_level")
filters = cls.get_default()
filters.get_all_obedience_level = True
filters.get_inactive_obedience_level = not active_only
filters.ids_obedience_level = ''
filters.names_obedience_level = form.search.data if has_filter_search_text else ''
filters.notes_obedience_level = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_obedience_level': self.get_all_obedience_level
, 'a_get_inactive_obedience_level': self.get_inactive_obedience_level
, 'a_ids_obedience_level': self.ids_obedience_level
, 'a_names_obedience_level': self.names_obedience_level
, '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
}

View File

@@ -0,0 +1,202 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Response Quality Metric Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.unit_measurement import Unit_Measurement
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 Response_Quality_Metric(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: ClassVar[str] = 'id_response_quality_metric'
FLAG_RESPONSE_QUALITY_METRIC: ClassVar[str] = 'response-quality-metric'
FLAG_VALUE_MIN: ClassVar[str] = 'value-min'
FLAG_VALUE_MAX: ClassVar[str] = 'value-max'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Response_Quality_Metric'
__table_args__ = { 'extend_existing': True }
id_response_quality_metric = 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))
value_min = db.Column(db.Float)
value_max = db.Column(db.Float)
active = db.Column(db.Boolean)
def __init__(self):
self.id_response_quality_metric = 0
self.is_new = False
self.unit_measurement = None
super().__init__()
@classmethod
def from_db_response_quality_metric(cls, query_row):
_m = f'{cls.__qualname__}.from_db_response_quality_metric'
response = cls()
response.id_response_quality_metric = query_row[0]
response.id_unit_measurement = query_row[1]
response.code = query_row[5]
response.name = query_row[6]
response.value_min = query_row[7]
response.value_max = query_row[8]
response.active = av.input_bool(query_row[9], 'active', _m)
response.unit_measurement = Unit_Measurement.from_db_response_quality_metric(query_row)
return response
@classmethod
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
level = cls()
level.id_response_quality_metric = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Response_Quality_Metric.from_json'
response_quality_metric = cls()
if json is None: return Response_Quality_Metric
# Helper_App.console_log(f'{_m}\njson: {json}')
response_quality_metric.id_response_quality_metric = json.get(cls.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC, -1)
response_quality_metric.name = json[cls.FLAG_NAME]
response_quality_metric.code = json.get(cls.FLAG_CODE, response_quality_metric.name.upper().replace(" ", "_"))
response_quality_metric.value_min = json[cls.FLAG_VALUE_MIN]
response_quality_metric.value_max = json[cls.FLAG_VALUE_MAX]
response_quality_metric.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Response_Quality_Metric: {response_quality_metric}')
return response_quality_metric
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT_RESPONSE_QUALITY_METRIC: self.id_response_quality_metric
, self.FLAG_CODE: self.code
, self.FLAG_NAME: f'{self.name} ({self.unit_measurement.symbol})'
, self.FLAG_VALUE_MIN: self.value_min
, self.FLAG_VALUE_MAX: self.value_max
, self.FLAG_ACTIVE: self.active
, Unit_Measurement.FLAG_UNIT_MEASUREMENT: None if self.unit_measurement is None else self.unit_measurement.to_json()
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_RESPONSE_QUALITY_METRIC}: {self.id_response_quality_metric}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_VALUE_MIN}: {self.value_min}
{self.FLAG_VALUE_MAX}: {self.value_max}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Response_Quality_Metric_Temp(db.Model, Base):
__tablename__ = 'DOG_Response_Quality_Metric_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_response_quality_metric = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
value_min = db.Column(db.Float)
value_max = db.Column(db.Float)
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_response_quality_metric(cls, response_quality_metric):
_m = 'Response_Quality_Metric_Temp.from_Response_Quality_Metric'
temp = cls()
temp.id_response_quality_metric = response_quality_metric.id_response_quality_metric
temp.code = response_quality_metric.code
temp.name = response_quality_metric.name
temp.value_min = response_quality_metric.value_min
temp.value_max = response_quality_metric.value_max
temp.active = response_quality_metric.active
return temp
class Parameters_Response_Quality_Metric(Get_Many_Parameters_Base):
get_all_response_quality_metric: bool
get_inactive_response_quality_metric: bool
ids_response_quality_metric: str
names_response_quality_metric: 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_response_quality_metric = True
, get_inactive_response_quality_metric = False
, ids_response_quality_metric = ''
, names_response_quality_metric = ''
, 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_response_quality_metric = json.get('a_get_all_response_quality_metric', False)
, get_inactive_response_quality_metric = json.get('a_get_inactive_response_quality_metric', False)
, ids_response_quality_metric = json.get('a_ids_response_quality_metric', '')
, names_response_quality_metric = json.get('a_names_response_quality_metric', '')
, 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_response_quality_metric(cls, form):
av.val_instance(form, 'form', 'Parameters_Response_Quality_Metric.from_form_filters_response_quality_metric', Filters_Response_Quality_Metric)
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_Response_Quality_Metric.from_form_filters_response_quality_metric")
filters = cls.get_default()
filters.get_all_response_quality_metric = True
filters.get_inactive_response_quality_metric = not active_only
filters.ids_response_quality_metric = ''
filters.names_response_quality_metric = form.search.data if has_filter_search_text else ''
filters.notes_response_quality_metric = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_response_quality_metric': self.get_all_response_quality_metric
, 'a_get_inactive_response_quality_metric': self.get_inactive_response_quality_metric
, 'a_ids_response_quality_metric': self.ids_response_quality_metric
, 'a_names_response_quality_metric': self.names_response_quality_metric
, '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
}

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
}
"""

View File

@@ -21,7 +21,7 @@ from typing import ClassVar, Optional
class User(SQLAlchemy_ABC, Base):
NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_USER
NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'email'
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_User'
__table_args__ = { 'extend_existing': True }
@@ -41,10 +41,11 @@ class User(SQLAlchemy_ABC, Base):
self.can_admin_dog = False
self.can_admin_user = False
super().__init__()
def from_DB_user(query_row):
_m = 'User.from_DB_user'
user = User()
@classmethod
def from_db_user(cls, query_row):
_m = f'{cls.__qualname__}.from_db_user'
user = cls()
user.id_user = query_row[0]
user.id_user_auth0 = query_row[1]
user.firstname = query_row[2]
@@ -56,6 +57,15 @@ class User(SQLAlchemy_ABC, Base):
user.can_admin_user = av.input_bool(query_row[8], 'can_admin_user', _m)
# user.is_new = av.input_bool(query_row[9], 'is_new', _m)
return user
@classmethod
def from_db_assessment(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment'
user = cls()
user.id_user = query_row[7]
user.firstname = query_row[8]
user.surname = query_row[9]
return user
@staticmethod
def from_json(json):
@@ -98,14 +108,15 @@ class User(SQLAlchemy_ABC, Base):
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self),
'id_user': self.id_user,
'id_user_auth0': self.id_user_auth0,
'firstname': self.firstname,
'surname': self.surname,
'email': self.email,
'is_email_verified': self.is_email_verified,
'is_super_user': self.is_super_user
**self.get_shared_json_attributes(self)
, 'id_user': self.id_user
, 'id_user_auth0': self.id_user_auth0
, 'firstname': self.firstname
, 'surname': self.surname
, self.FLAG_NAME: self.get_name()
, 'email': self.email
, 'is_email_verified': self.is_email_verified
, 'is_super_user': self.is_super_user
}
Helper_App.console_log(f'as_json: {as_json}')
return as_json
@@ -123,6 +134,9 @@ class User(SQLAlchemy_ABC, Base):
def get_is_logged_in(self):
return (self.id_user > 0 and self.id_user != Base.ID_USER_GUEST)
def get_name(self):
return f'{self.firstname} {self.surname}'
class User_Temp(db.Model, Base):
__tablename__ = 'DOG_User_Temp'
@@ -238,7 +252,7 @@ class User_Permission_Evaluation(db.Model):
can_edit = db.Column(db.Boolean)
can_admin = db.Column(db.Boolean)
def from_DB_user_eval(query_row):
def from_db_user_eval(query_row):
user_permission_evaluation = User_Permission_Evaluation()
user_permission_evaluation.id_evaluation = query_row[0]
user_permission_evaluation.guid = query_row[1]

View File

@@ -0,0 +1,180 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Button Shape Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from business_objects.dog.image import Image
import lib.argument_validation as av
from extensions import db
# from forms.dog.weather import Filters_Weather
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Weather(SQLAlchemy_ABC, Base):
ATTR_ID_WEATHER: ClassVar[str] = 'id_weather'
FLAG_WEATHER: ClassVar[str] = 'weather'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_WEATHER
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Weather'
__table_args__ = { 'extend_existing': True }
id_weather = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_weather = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_weather(cls, query_row):
_m = f'{cls.__qualname__}.from_db_weather'
weather = cls()
weather.id_weather = query_row[0]
weather.code = query_row[1]
weather.name = query_row[2]
weather.active = av.input_bool(query_row[3], 'active', _m)
return weather
@classmethod
def from_db_assessment(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment'
weather = cls()
weather.id_weather = query_row[1]
weather.name = query_row[2]
weather.active = True
return weather
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
weather = cls()
if json is None: return weather
# Helper_App.console_log(f'{_m}\njson: {json}')
weather.id_weather = json.get(Weather.ATTR_ID_WEATHER, -1)
weather.name = json[cls.FLAG_NAME]
weather.code = json.get(cls.FLAG_CODE, weather.name.upper().replace(" ", "_"))
weather.active = json[cls.FLAG_ACTIVE]
weather.created_on = json.get(cls.FLAG_CREATED_ON, None)
# Helper_App.console_log(f'Weather: {weather}')
return weather
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_WEATHER: self.id_weather
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
, self.FLAG_CREATED_ON: self.created_on
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_WEATHER}: {self.id_weather}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
class Weather_Temp(db.Model, Base):
__tablename__ = 'DOG_Weather_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_weather = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_weather(cls, weather):
_m = 'Weather_Temp.from_weather'
temp = cls()
temp.id_weather = weather.id_weather
temp.code = weather.code
temp.name = weather.name
temp.active = weather.active
# temp.created_on = weather.created_on
return temp
def __repr__(self):
return f'''
{self.__class__.__name__}(
{Weather.FLAG_WEATHER}: {self.id_weather}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Parameters_Weather(Get_Many_Parameters_Base):
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
names_weather: 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_weather = True
, get_inactive_weather = False
, ids_weather = ''
, names_weather = ''
, 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_weather = json.get('a_get_all_weather', False)
, get_inactive_weather = json.get('a_get_inactive_weather', False)
, ids_weather = json.get('a_ids_weather', '')
, names_weather = json.get('a_names_weather', '')
, 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)
)
def to_json(self):
return {
'a_get_all_weather': self.get_all_weather
, 'a_get_inactive_weather': self.get_inactive_weather
, 'a_ids_weather': self.ids_weather
, 'a_names_weather': self.names_weather
, '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
}

View File

@@ -95,7 +95,7 @@ class File_Type_Temp(db.Model, Base):
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_file_type = db.Column(db.Integer)
# code = db.Column(db.String(250))
code = db.Column(db.String(250))
name = db.Column(db.String(250))
is_image = db.Column(db.Boolean)
active = db.Column(db.Boolean)
@@ -109,7 +109,7 @@ class File_Type_Temp(db.Model, Base):
_m = 'File_Type_Temp.from_File_Type'
temp = cls()
temp.id_file_type = file_type.id_file_type
# temp.code = file_type.code
temp.code = file_type.code
temp.name = file_type.name
temp.is_image = file_type.is_image
temp.active = file_type.active