Feat: Architecture redesign for Assessments, Commands, Modalities, Training Techniques, Reinforcement Schedules, Distractions, and Assessment Responses.

This commit is contained in:
2025-09-06 12:13:16 +01:00
parent 12f5fc994f
commit 2da465935d
158 changed files with 14781 additions and 3477 deletions

View File

@@ -48,6 +48,7 @@ class Base():
FLAG_DISPLAY_ORDER: ClassVar[str] = 'display_order'
FLAG_EDIT: ClassVar[str] = 'edit'
FLAG_EMAIL: ClassVar[str] = 'email'
FLAG_END_ON: ClassVar[str] = 'end_on'
FLAG_FAX: ClassVar[str] = 'fax'
FLAG_FIRSTNAME: ClassVar[str] = 'firstname'
FLAG_GUID: ClassVar[str] = 'guid'
@@ -69,6 +70,7 @@ class Base():
FLAG_REGION: ClassVar[str] = 'region'
FLAG_ROWS: ClassVar[str] = 'rows'
FLAG_SEARCH: ClassVar[str] = 'search'
FLAG_START_ON: ClassVar[str] = 'start_on'
FLAG_SURNAME: ClassVar[str] = 'surname'
FLAG_SYMBOL: ClassVar[str] = 'symbol'
FLAG_TEXT_COLOUR: ClassVar[str] = 'text_colour'

View File

@@ -9,6 +9,7 @@ Feature: Assessment Business Object
# internal
from business_objects.base import Base
from business_objects.dog.assessment_type import Assessment_Type
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
@@ -30,7 +31,7 @@ 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_ASSESSMENT_COMMAND_LINK: ClassVar[str] = 'assessment_command_link'
FLAG_DISTRACTION: ClassVar[str] = 'distraction'
FLAG_TEMPERATURE_CELCIUS: ClassVar[str] = 'temperature_celcius'
FLAG_USER_HANDLER: ClassVar[str] = Filters_Assessment.FLAG_USER_HANDLER
@@ -41,6 +42,7 @@ class Assessment(SQLAlchemy_ABC, Base):
__table_args__ = { 'extend_existing': True }
id_assessment = db.Column(db.Integer, primary_key=True)
id_assessment_type = db.Column(db.Integer)
id_weather = db.Column(db.Integer)
id_lighting_level = db.Column(db.Integer)
id_location = db.Column(db.Integer)
@@ -48,19 +50,22 @@ class Assessment(SQLAlchemy_ABC, Base):
notes = db.Column(db.Text)
temperature_celcius = db.Column(db.Numeric(5, 2))
# difficulty_level = db.Column(db.Float)
start_on = db.Column(db.DateTime)
end_on = db.Column(db.DateTime)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_assessment = 0
self.is_new = False
self.assessment_type = None
self.weather = None
self.lighting_level = None
self.temperature_celcius = 22
self.location = None
self.user_handler = None
self.distractions = []
self.assessment_command_modality_links = []
self.assessment_command_links = []
super().__init__()
@classmethod
@@ -68,20 +73,24 @@ class Assessment(SQLAlchemy_ABC, Base):
_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.id_assessment = query_row[1]
assessment.id_weather = query_row[2]
assessment.id_lighting_level = query_row[4]
assessment.id_location = query_row[6]
assessment.id_user_handler = query_row[8]
assessment.notes = query_row[11]
assessment.temperature_celcius = query_row[12]
assessment.start_on = query_row[13]
assessment.end_on = query_row[14]
assessment.active = av.input_bool(query_row[15], 'active', _m)
assessment.assessment_type = Assessment_Type.from_db_assessment(query_row)
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'
@@ -89,8 +98,8 @@ class Assessment(SQLAlchemy_ABC, Base):
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'
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
assessment = cls()
assessment.id_assessment = query_row[1]
return assessment
@@ -101,12 +110,15 @@ class Assessment(SQLAlchemy_ABC, Base):
assessment = cls()
if json is None: return assessment
assessment.id_assessment = json.get(Assessment.ATTR_ID_ASSESSMENT, -1)
assessment.id_assessment_type = json[Assessment_Type.ATTR_ID_ASSESSMENT_TYPE]
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.id_user_handler = json[cls.FLAG_USER_HANDLER]
assessment.notes = json[cls.FLAG_NOTES]
assessment.temperature_celcius = json[cls.FLAG_TEMPERATURE_CELCIUS]
assessment.start_on = json[cls.FLAG_START_ON]
assessment.end_on = json[cls.FLAG_END_ON]
assessment.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
assessment.created_on = json.get(cls.FLAG_CREATED_ON, None)
return assessment
@@ -115,17 +127,20 @@ class Assessment(SQLAlchemy_ABC, Base):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT: self.id_assessment
, Assessment_Type.ATTR_ID_ASSESSMENT_TYPE: self.id_assessment_type
, 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_START_ON: self.start_on
, self.FLAG_END_ON: self.end_on
, 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 []
, self.FLAG_ASSESSMENT_COMMAND_LINK: [link.to_json() for link in self.assessment_command_links] if (self.assessment_command_links is not None and len(self.assessment_command_links) > 0) else []
}
return as_json
@@ -133,12 +148,15 @@ class Assessment(SQLAlchemy_ABC, Base):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT}: {self.id_assessment}
{Assessment_Type.FLAG_ASSESSMENT_TYPE}: {self.assessment_type}
{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_START_ON}: {self.start_on}
{self.FLAG_END_ON}: {self.end_on}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
@@ -150,6 +168,7 @@ class Assessment_Temp(db.Model, Base):
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_assessment = db.Column(db.Integer)
id_assessment_type = db.Column(db.Integer)
id_weather = db.Column(db.Integer)
id_lighting_level = db.Column(db.Integer)
id_location = db.Column(db.Integer)
@@ -157,6 +176,8 @@ class Assessment_Temp(db.Model, Base):
notes = db.Column(db.Text)
temperature_celcius = db.Column(db.Numeric(5, 2))
# difficulty_level = db.Column(db.Float)
start_on = db.Column(db.DateTime)
end_on = db.Column(db.DateTime)
active = db.Column(db.Boolean)
# created_on = db.Column(db.DateTime)
guid: str = db.Column(db.String(36))
@@ -169,12 +190,15 @@ class Assessment_Temp(db.Model, Base):
_m = 'Assessment_Temp.from_assessment'
temp = cls()
temp.id_assessment = assessment.id_assessment
temp.id_assessment_type = assessment.id_assessment_type
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.start_on = assessment.start_on
temp.end_on = assessment.end_on
temp.active = assessment.active
# temp.created_on = assessment.created_on
return temp
@@ -187,6 +211,10 @@ class Parameters_Assessment(Get_Many_Parameters_Base):
notes_assessment: str
min_temperature_assessment: Optional[float]
max_temperature_assessment: Optional[float]
get_all_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_type: str
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
@@ -219,6 +247,10 @@ class Parameters_Assessment(Get_Many_Parameters_Base):
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_type = ''
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
@@ -252,6 +284,10 @@ class Parameters_Assessment(Get_Many_Parameters_Base):
, 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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_type', '')
, 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', '')
@@ -281,6 +317,7 @@ class Parameters_Assessment(Get_Many_Parameters_Base):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
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_type = not (form.id_assessment_type.data == '0' or form.id_assessment_type.data == '' or form.id_assessment_type.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)
@@ -291,6 +328,10 @@ class Parameters_Assessment(Get_Many_Parameters_Base):
filters.get_all_assessment = True
filters.get_inactive_assessment = not active_only
filters.ids_assessment = ''
filters.get_all_assessment_type = not has_filter_assessment_type
filters.get_inactive_assessment_type = not active_only
filters.ids_assessment_type = form.id_assessment_type if has_filter_assessment_type else ''
filters.names_assessment_type = form.search.data if has_filter_search_text 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 ''
@@ -319,6 +360,10 @@ class Parameters_Assessment(Get_Many_Parameters_Base):
, 'a_notes_assessment': self.notes_assessment
, 'a_min_temperature_assessment': self.min_temperature_assessment
, 'a_max_temperature_assessment': self.max_temperature_assessment
, 'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_type
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather

View File

@@ -0,0 +1,484 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Assessment_Command_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.obedience_level import Obedience_Level
from business_objects.dog.reinforcement_schedule import Reinforcement_Schedule
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
# from forms.dog.assessment_command_link import Filters_Assessment_Command_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_Link(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT_COMMAND_LINK: ClassVar[str] = 'id_link'
FLAG_ASSESSMENT_COMMAND_LINK: ClassVar[str] = Assessment.FLAG_ASSESSMENT_COMMAND_LINK
FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = 'assessment_command_modality_link'
FLAG_ASSESSMENT_COMMAND_TECHNIQUE_LINK: ClassVar[str] = 'assessment_command_technique_link'
FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = 'assessment_response'
FLAG_DISTANCE_FROM_HANDLER_METRES: ClassVar[str] = 'distance-from-handler-metres'
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_LINK
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_LINK
__tablename__ = 'DOG_Assessment_Command_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_reinforcement_schedule = db.Column(db.Integer)
distance_from_handler_metres = 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.reinforcement_schedule = None
self.assessment_command_modality_links = None
self.assessment_command_technique_links = None
self.assessment_responses = None
super().__init__()
@classmethod
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
assessment_command_link = cls()
assessment_command_link.id_link = query_row[0]
assessment_command_link.id_assessment = query_row[1]
assessment_command_link.id_command = query_row[5]
assessment_command_link.id_reinforcement_schedule = query_row[7]
assessment_command_link.distance_from_handler_metres = query_row[11]
assessment_command_link.is_in_hearing_range_of_handler = av.input_bool(query_row[12], 'is_in_hearing_range_of_handler', _m)
assessment_command_link.is_in_scent_range_of_handler = av.input_bool(query_row[13], 'is_in_scent_range_of_handler', _m)
assessment_command_link.is_in_sight_of_handler = av.input_bool(query_row[14], 'is_in_sight_of_handler', _m)
assessment_command_link.is_on_lead = av.input_bool(query_row[15], 'is_on_lead', _m)
assessment_command_link.trial_count = query_row[16]
assessment_command_link.active = av.input_bool(query_row[17], 'active', _m)
assessment_command_link.assessment = Assessment.from_db_assessment_command_link(query_row)
assessment_command_link.command = Command.from_db_assessment_command_link(query_row)
assessment_command_link.reinforcement_schedule = Reinforcement_Schedule.from_db_assessment_command_link(query_row)
return assessment_command_link
@classmethod
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
assessment_command_link = cls()
assessment_command_link.id_link = query_row[1]
return assessment_command_link
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
assessment_command_link = cls()
if json is None: return assessment_command_link
assessment_command_link.id_link = json.get(Assessment_Command_Link.ATTR_ID_ASSESSMENT_COMMAND_LINK, -1)
assessment_command_link.id_assessment = json[Assessment.ATTR_ID_ASSESSMENT]
assessment_command_link.id_command = json[Command.ATTR_ID_COMMAND]
assessment_command_link.id_reinforcement_schedule = json[Reinforcement_Schedule.ATTR_ID_REINFORCEMENT_SCHEDULE]
assessment_command_link.distance_from_handler_metres = json[cls.FLAG_DISTANCE_FROM_HANDLER_METRES]
assessment_command_link.is_in_hearing_range_of_handler = av.input_bool(json[cls.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER], cls.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER, _m)
assessment_command_link.is_in_scent_range_of_handler = av.input_bool(json[cls.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER], cls.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER, _m)
assessment_command_link.is_in_sight_of_handler = av.input_bool(json[cls.FLAG_IS_IN_SIGHT_OF_HANDLER], cls.FLAG_IS_IN_SIGHT_OF_HANDLER, _m)
assessment_command_link.is_on_lead = av.input_bool(json[cls.FLAG_IS_ON_LEAD], cls.FLAG_IS_ON_LEAD, _m)
assessment_command_link.trial_count = json.get(cls.FLAG_TRIAL_COUNT)
assessment_command_link.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
assessment_command_link.created_on = json.get(cls.FLAG_CREATED_ON, None)
return assessment_command_link
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT_COMMAND_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()
, Reinforcement_Schedule.ATTR_ID_REINFORCEMENT_SCHEDULE: { Reinforcement_Schedule.ATTR_ID_REINFORCEMENT_SCHEDULE: None } if self.reinforcement_schedule is None else self.reinforcement_schedule.to_json()
, self.FLAG_DISTANCE_FROM_HANDLER_METRES: self.distance_from_handler_metres
, 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]
}
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT_COMMAND_LINK}: {self.id_link}
{Assessment.FLAG_ASSESSMENT}: {self.assessment}
{Command.FLAG_COMMAND}: {self.command}
{Reinforcement_Schedule.FLAG_REINFORCEMENT_SCHEDULE}: {self.reinforcement_schedule}
{self.FLAG_DISTANCE_FROM_HANDLER_METRES}: {self.distance_from_handler_metres}
{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_Link_Temp(db.Model, Base):
__tablename__ = 'DOG_Assessment_Command_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_reinforcement_schedule = db.Column(db.Integer)
distance_from_handler_metres = 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_link(cls, assessment_command_link):
_m = f'{cls.__qualname__}.from_assessment_command_link'
temp = cls()
temp.id_link = assessment_command_link.id_link
temp.id_assessment = assessment_command_link.id_assessment
temp.id_command = assessment_command_link.id_command
temp.id_reinforcement_schedule = assessment_command_link.id_reinforcement_schedule
temp.distance_from_handler_metres = assessment_command_link.distance_from_handler_metres
temp.is_in_hearing_range_of_handler = assessment_command_link.is_in_hearing_range_of_handler
temp.is_in_scent_range_of_handler = assessment_command_link.is_in_scent_range_of_handler
temp.is_in_sight_of_handler = assessment_command_link.is_in_sight_of_handler
temp.is_on_lead = assessment_command_link.is_on_lead
temp.trial_count = assessment_command_link.trial_count
temp.active = assessment_command_link.active
# temp.created_on = assessment_command_link.created_on
return temp
class Parameters_Assessment_Command_Link(Get_Many_Parameters_Base):
get_all_link: bool
get_inactive_link: bool
ids_link: str
min_distance_from_handler_metres_link: Optional[float]
max_distance_from_handler_metres_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_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_type: str
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_reinforcement_schedule: bool
get_inactive_reinforcement_schedule: bool
ids_reinforcement_schedule: str
names_reinforcement_schedule: 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_metres_link = None
, max_distance_from_handler_metres_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_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_type = ''
, 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_reinforcement_schedule = True
, get_inactive_reinforcement_schedule = False
, ids_reinforcement_schedule = ''
, names_reinforcement_schedule = ''
, 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_link = json.get('a_notes_assessment_command_link', '')
, min_distance_from_handler_metres_link = json.get('a_min_distance_from_handler_metres_link', None)
, max_distance_from_handler_metres_link = json.get('a_max_distance_from_handler_metres_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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_type', '')
, 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_reinforcement_schedule = json.get('a_get_all_reinforcement_schedule', False)
, get_inactive_reinforcement_schedule = json.get('a_get_inactive_reinforcement_schedule', False)
, ids_reinforcement_schedule = json.get('a_ids_reinforcement_schedule', '')
, names_reinforcement_schedule = json.get('a_names_reinforcement_schedule', '')
, 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'
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_reinforcement_schedule = False
active_only = av.input_bool(form.active_only.data, "active", _m)
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_reinforcement_schedule = not has_filter_reinforcement_schedule
filters.get_inactive_reinforcement_schedule = not active_only
filters.ids_reinforcement_schedule = ''
filters.names_reinforcement_schedule = 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_metres_link': self.min_distance_from_handler_metres_link
, 'a_max_distance_from_handler_metres_link': self.max_distance_from_handler_metres_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
, 'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_type
, '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_reinforcement_schedule': self.get_all_reinforcement_schedule
, 'a_get_inactive_reinforcement_schedule': self.get_inactive_reinforcement_schedule
, 'a_ids_reinforcement_schedule': self.ids_reinforcement_schedule
, 'a_names_reinforcement_schedule': self.names_reinforcement_schedule
, '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

@@ -10,14 +10,15 @@ Feature: Assessment_Command_Modality_Link Command Modality Link Business Obje
# 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.assessment_command_link import Assessment_Command_Link
# 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.obedience_level import Obedience_Level
from business_objects.dog.reinforcement_schedule import Reinforcement_Schedule
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
@@ -31,14 +32,7 @@ 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_METRES: ClassVar[str] = 'distance-from-handler-metres'
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'
FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment_Command_Link.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK
@@ -46,27 +40,16 @@ class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base):
__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_assessment_command_link = db.Column(db.Integer)
id_command_modality = db.Column(db.Integer)
id_bribe = db.Column(db.Integer)
distance_from_handler_metres = 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.assessment_command_link = None
self.command_modality = None
self.bribe = None
self.assessment_responses = None
super().__init__()
@classmethod
@@ -74,22 +57,12 @@ class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base):
_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_assessment_command_link = query_row[1]
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_metres = 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.assessment_command_link = Assessment_Command_Link.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
@@ -105,16 +78,8 @@ class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base):
assessment_command_modality_link = cls()
if json is None: return assessment_command_modality_link
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_assessment_command_link = json[Assessment.ATTR_ID_ASSESSMENT_COMMAND_LINK]
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_metres = json[cls.FLAG_DISTANCE_FROM_HANDLER_METRES]
assessment_command_modality_link.is_in_hearing_range_of_handler = av.input_bool(json[cls.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER], cls.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER, _m)
assessment_command_modality_link.is_in_scent_range_of_handler = av.input_bool(json[cls.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER], cls.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER, _m)
assessment_command_modality_link.is_in_sight_of_handler = av.input_bool(json[cls.FLAG_IS_IN_SIGHT_OF_HANDLER], cls.FLAG_IS_IN_SIGHT_OF_HANDLER, _m)
assessment_command_modality_link.is_on_lead = av.input_bool(json[cls.FLAG_IS_ON_LEAD], cls.FLAG_IS_ON_LEAD, _m)
assessment_command_modality_link.trial_count = json.get(cls.FLAG_TRIAL_COUNT)
assessment_command_modality_link.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
assessment_command_modality_link.created_on = json.get(cls.FLAG_CREATED_ON, None)
return assessment_command_modality_link
@@ -123,16 +88,8 @@ class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base):
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()
, Assessment.ATTR_ID_ASSESSMENT_COMMAND_LINK: { Assessment.ATTR_ID_ASSESSMENT_COMMAND_LINK: None } if self.assessment_command_link is None else self.assessment_command_link.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_METRES: self.distance_from_handler_metres
, 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]
@@ -143,16 +100,8 @@ class Assessment_Command_Modality_Link(SQLAlchemy_ABC, Base):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK}: {self.id_link}
{Assessment.FLAG_ASSESSMENT}: {self.assessment}
{Command.FLAG_COMMAND}: {self.command}
{Assessment_Command_Link.FLAG_ASSESSMENT_COMMAND_LINK}: {self.assessment_command_link}
{Command_Modality.FLAG_COMMAND_MODALITY}: {self.command_modality}
{Bribe.FLAG_BRIBE}: {self.bribe}
{self.FLAG_DISTANCE_FROM_HANDLER_METRES}: {self.distance_from_handler_metres}
{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}
)
@@ -164,16 +113,8 @@ class Assessment_Command_Modality_Link_Temp(db.Model, Base):
__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_assessment_command_link = db.Column(db.Integer)
id_command_modality = db.Column(db.Integer)
id_bribe = db.Column(db.Integer)
distance_from_handler_metres = 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))
@@ -186,16 +127,8 @@ class Assessment_Command_Modality_Link_Temp(db.Model, Base):
_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_assessment_command_link = assessment_command_modality_link.id_assessment_command_link
temp.id_command_modality = assessment_command_modality_link.id_command_modality
temp.id_bribe = assessment_command_modality_link.id_bribe
temp.distance_from_handler_metres = assessment_command_modality_link.distance_from_handler_metres
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
@@ -205,14 +138,18 @@ 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_metres_link: Optional[float]
max_distance_from_handler_metres_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_AC_link: bool
get_inactive_AC_link: bool
ids_AC_link: str
min_distance_from_handler_metres_AC_link: Optional[float]
max_distance_from_handler_metres_AC_link: Optional[float]
value_is_in_sight_of_handler_AC_link: Optional[bool]
value_is_in_scent_range_of_handler_AC_link: Optional[bool]
value_is_in_hearing_range_of_handler_AC_link: Optional[bool]
value_is_on_lead_AC_link: Optional[bool]
min_trial_count_AC_link: Optional[float]
max_trial_count_AC_link: Optional[float]
get_all_assessment: bool
get_inactive_assessment: bool
@@ -220,6 +157,10 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
notes_assessment: str
min_temperature_assessment: Optional[float]
max_temperature_assessment: Optional[float]
get_all_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_type: str
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
@@ -250,16 +191,16 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
hand_signal_default_descriptions_command: str
notes_command: str
get_all_reinforcement_schedule: bool
get_inactive_reinforcement_schedule: bool
ids_reinforcement_schedule: str
names_reinforcement_schedule: 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
@@ -271,14 +212,17 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
get_all_link = True
, get_inactive_link = False
, ids_link = ''
, min_distance_from_handler_metres_link = None
, max_distance_from_handler_metres_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_AC_link = True
, get_inactive_AC_link = False
, ids_AC_link = ''
, min_distance_from_handler_metres_AC_link = None
, max_distance_from_handler_metres_AC_link = None
, value_is_in_sight_of_handler_AC_link = None
, value_is_in_scent_range_of_handler_AC_link = None
, value_is_in_hearing_range_of_handler_AC_link = None
, value_is_on_lead_AC_link = None
, min_trial_count_AC_link = None
, max_trial_count_AC_link = None
, get_all_assessment = True
, get_inactive_assessment = False
@@ -286,6 +230,10 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_type = ''
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
@@ -316,16 +264,16 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
, hand_signal_default_descriptions_command = ''
, notes_command = ''
, get_all_reinforcement_schedule = True
, get_inactive_reinforcement_schedule = False
, ids_reinforcement_schedule = ''
, names_reinforcement_schedule = ''
, 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
@@ -338,15 +286,18 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
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_metres_link = json.get('a_min_distance_from_handler_metres_link', None)
, max_distance_from_handler_metres_link = json.get('a_max_distance_from_handler_metres_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_AC_link = json.get('a_get_all_AC_link', False)
, get_inactive_AC_link = json.get('a_get_inactive_AC_link', False)
, ids_AC_link = json.get('a_ids_AC_link', '')
, notes_assessment_command_modality_AC_link = json.get('a_notes_assessment_command_modality_AC_link', '')
, min_distance_from_handler_metres_AC_link = json.get('a_min_distance_from_handler_metres_AC_link', None)
, max_distance_from_handler_metres_AC_link = json.get('a_max_distance_from_handler_metres_AC_link', None)
, value_is_in_sight_of_handler_AC_link = json.get('a_value_is_in_sight_of_handler_AC_link', None)
, value_is_in_scent_range_of_handler_AC_link = json.get('a_value_is_in_scent_range_of_handler_AC_link', None)
, value_is_in_hearing_range_of_handler_AC_link = json.get('a_value_is_in_hearing_range_of_handler_AC_link', None)
, value_is_on_lead_AC_link = json.get('a_value_is_on_lead_AC_link', None)
, min_trial_count_AC_link = json.get('a_min_trial_count_AC_link', None)
, max_trial_count_AC_link = json.get('a_max_trial_count_AC_link', None)
, get_all_assessment = json.get('a_get_all_assessment', False)
, get_inactive_assessment = json.get('a_get_inactive_assessment', False)
@@ -354,6 +305,10 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
, 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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_type', '')
, 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', '')
@@ -384,16 +339,16 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
, hand_signal_default_descriptions_command = json.get('a_hand_signal_default_descriptions_command', '')
, notes_command = json.get('a_notes_command', '')
, get_all_reinforcement_schedule = json.get('a_get_all_reinforcement_schedule', False)
, get_inactive_reinforcement_schedule = json.get('a_get_inactive_reinforcement_schedule', False)
, ids_reinforcement_schedule = json.get('a_ids_reinforcement_schedule', '')
, names_reinforcement_schedule = json.get('a_names_reinforcement_schedule', '')
, 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)
@@ -405,31 +360,39 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
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
has_filter_assessment_type = not (form.id_assessment_type.data == '0' or form.id_assessment_type.data == '' or form.id_assessment_type.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)
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_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_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 ''
filters.ids_assessment = ''
filters.get_all_assessment_type = not has_filter_assessment_type
filters.get_inactive_assessment_type = not active_only
filters.ids_assessment_type = form.id_assessment_type if has_filter_assessment_type else ''
filters.names_assessment_type = form.search.data if has_filter_search_text 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
def to_json(self):
@@ -437,14 +400,17 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
'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_metres_link': self.min_distance_from_handler_metres_link
, 'a_max_distance_from_handler_metres_link': self.max_distance_from_handler_metres_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_AC_link': self.get_all_AC_link
, 'a_get_inactive_AC_link': self.get_inactive_AC_link
, 'a_ids_AC_link': self.ids_AC_link
, 'a_min_distance_from_handler_metres_AC_link': self.min_distance_from_handler_metres_AC_link
, 'a_max_distance_from_handler_metres_AC_link': self.max_distance_from_handler_metres_AC_link
, 'a_value_is_in_sight_of_handler_AC_link': self.value_is_in_sight_of_handler_AC_link
, 'a_value_is_in_scent_range_of_handler_AC_link': self.value_is_in_scent_range_of_handler_AC_link
, 'a_value_is_in_hearing_range_of_handler_AC_link': self.value_is_in_hearing_range_of_handler_AC_link
, 'a_value_is_on_lead_AC_link': self.value_is_on_lead_AC_link
, 'a_min_trial_count_AC_link': self.min_trial_count_AC_link
, 'a_max_trial_count_AC_link': self.max_trial_count_AC_link
, 'a_get_all_assessment': self.get_all_assessment
, 'a_get_inactive_assessment': self.get_inactive_assessment
@@ -452,6 +418,10 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
, 'a_notes_assessment': self.notes_assessment
, 'a_min_temperature_assessment': self.min_temperature_assessment
, 'a_max_temperature_assessment': self.max_temperature_assessment
, 'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_type
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
@@ -482,16 +452,16 @@ class Parameters_Assessment_Command_Modality_Link(Get_Many_Parameters_Base):
, 'a_hand_signal_default_descriptions_command': self.hand_signal_default_descriptions_command
, 'a_notes_command': self.notes_command
, 'a_get_all_reinforcement_schedule': self.get_all_reinforcement_schedule
, 'a_get_inactive_reinforcement_schedule': self.get_inactive_reinforcement_schedule
, 'a_ids_reinforcement_schedule': self.ids_reinforcement_schedule
, 'a_names_reinforcement_schedule': self.names_reinforcement_schedule
, '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

View File

@@ -0,0 +1,470 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Assessment_Command_Technique_Link Command Modality Link Business Object
"""
# internal
from business_objects.base import Base
from business_objects.dog.assessment import Assessment
from business_objects.dog.assessment_command_link import Assessment_Command_Link
# 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.obedience_level import Obedience_Level
from business_objects.dog.reinforcement_schedule import Reinforcement_Schedule
from business_objects.dog.training_technique import Training_Technique
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
# from forms.dog.assessment_command_technique_link import Filters_Assessment_Command_Technique_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_Technique_Link(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT_COMMAND_TECHNIQUE_LINK: ClassVar[str] = 'id_link'
FLAG_ASSESSMENT_COMMAND_TECHNIQUE_LINK: ClassVar[str] = Assessment_Command_Link.FLAG_ASSESSMENT_COMMAND_TECHNIQUE_LINK
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_TECHNIQUE_LINK
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_COMMAND_TECHNIQUE_LINK
__tablename__ = 'DOG_Assessment_Command_Technique_Link'
__table_args__ = { 'extend_existing': True }
id_link = db.Column(db.Integer, primary_key=True)
id_assessment_command_link = db.Column(db.Integer)
id_training_technique = 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_command_link = None
self.training_technique = None
super().__init__()
@classmethod
def from_db_assessment_command_technique_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_technique_link'
assessment_command_technique_link = cls()
assessment_command_technique_link.id_link = query_row[0]
assessment_command_technique_link.id_assessment_command_link = query_row[1]
assessment_command_technique_link.id_training_technique = query_row[7]
assessment_command_technique_link.active = av.input_bool(query_row[17], 'active', _m)
assessment_command_technique_link.assessment_command_link = Assessment_Command_Link.from_db_assessment_command_technique_link(query_row)
assessment_command_technique_link.training_technique = Training_Technique.from_db_assessment_command_technique_link(query_row)
return assessment_command_technique_link
@classmethod
def from_db_assessment_response(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_response'
assessment_command_technique_link = cls()
assessment_command_technique_link.id_link = query_row[1]
return assessment_command_technique_link
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
assessment_command_technique_link = cls()
if json is None: return assessment_command_technique_link
assessment_command_technique_link.id_link = json.get(Assessment_Command_Technique_Link.ATTR_ID_ASSESSMENT_COMMAND_TECHNIQUE_LINK, -1)
assessment_command_technique_link.id_assessment_command_link = json[Assessment.ATTR_ID_ASSESSMENT_COMMAND_LINK]
assessment_command_technique_link.id_training_technique = json[Training_Technique.ATTR_ID_TRAINING_TECHNIQUE]
assessment_command_technique_link.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
assessment_command_technique_link.created_on = json.get(cls.FLAG_CREATED_ON, None)
return assessment_command_technique_link
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT_COMMAND_TECHNIQUE_LINK: self.id_link
, Assessment.ATTR_ID_ASSESSMENT_COMMAND_LINK: { Assessment.ATTR_ID_ASSESSMENT_COMMAND_LINK: None } if self.assessment_command_link is None else self.assessment_command_link.to_json()
, Training_Technique.ATTR_ID_TRAINING_TECHNIQUE: { Training_Technique.ATTR_ID_TRAINING_TECHNIQUE: None } if self.training_technique is None else self.training_technique.to_json()
, 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]
}
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT_COMMAND_TECHNIQUE_LINK}: {self.id_link}
{Assessment_Command_Link.FLAG_ASSESSMENT_COMMAND_LINK}: {self.assessment_command_link}
{Training_Technique.FLAG_TRAINING_TECHNIQUE}: {self.training_technique}
{self.FLAG_ACTIVE}: {self.active}
{self.FLAG_CREATED_ON}: {self.created_on}
)
'''
# {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category}
class Assessment_Command_Technique_Link_Temp(db.Model, Base):
__tablename__ = 'DOG_Assessment_Command_Technique_Link_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_link = db.Column(db.Integer)
id_assessment_command_link = db.Column(db.Integer)
id_training_technique = 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_technique_link(cls, assessment_command_technique_link):
_m = f'{cls.__qualname__}.from_assessment_command_technique_link'
temp = cls()
temp.id_link = assessment_command_technique_link.id_link
temp.id_assessment_command_link = assessment_command_technique_link.id_assessment_command_link
temp.id_training_technique = assessment_command_technique_link.id_training_technique
temp.active = assessment_command_technique_link.active
# temp.created_on = assessment_command_technique_link.created_on
return temp
class Parameters_Assessment_Command_Technique_Link(Get_Many_Parameters_Base):
get_all_link: bool
get_inactive_link: bool
ids_link: str
get_all_AC_link: bool
get_inactive_AC_link: bool
ids_AC_link: str
min_distance_from_handler_metres_AC_link: Optional[float]
max_distance_from_handler_metres_AC_link: Optional[float]
value_is_in_sight_of_handler_AC_link: Optional[bool]
value_is_in_scent_range_of_handler_AC_link: Optional[bool]
value_is_in_hearing_range_of_handler_AC_link: Optional[bool]
value_is_on_lead_AC_link: Optional[bool]
min_trial_count_AC_link: Optional[float]
max_trial_count_AC_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_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_type: str
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_reinforcement_schedule: bool
get_inactive_reinforcement_schedule: bool
ids_reinforcement_schedule: str
names_reinforcement_schedule: str
get_all_training_technique: bool
get_inactive_training_technique: bool
ids_training_technique: str
names_training_technique: 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 = ''
, get_all_AC_link = True
, get_inactive_AC_link = False
, ids_AC_link = ''
, min_distance_from_handler_metres_AC_link = None
, max_distance_from_handler_metres_AC_link = None
, value_is_in_sight_of_handler_AC_link = None
, value_is_in_scent_range_of_handler_AC_link = None
, value_is_in_hearing_range_of_handler_AC_link = None
, value_is_on_lead_AC_link = None
, min_trial_count_AC_link = None
, max_trial_count_AC_link = None
, get_all_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_type = ''
, 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_reinforcement_schedule = True
, get_inactive_reinforcement_schedule = False
, ids_reinforcement_schedule = ''
, names_reinforcement_schedule = ''
, get_all_training_technique = True
, get_inactive_training_technique = False
, ids_training_technique = ''
, names_training_technique = ''
, 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', '')
, get_all_AC_link = json.get('a_get_all_AC_link', False)
, get_inactive_AC_link = json.get('a_get_inactive_AC_link', False)
, ids_AC_link = json.get('a_ids_AC_link', '')
, notes_assessment_command_modality_AC_link = json.get('a_notes_assessment_command_modality_AC_link', '')
, min_distance_from_handler_metres_AC_link = json.get('a_min_distance_from_handler_metres_AC_link', None)
, max_distance_from_handler_metres_AC_link = json.get('a_max_distance_from_handler_metres_AC_link', None)
, value_is_in_sight_of_handler_AC_link = json.get('a_value_is_in_sight_of_handler_AC_link', None)
, value_is_in_scent_range_of_handler_AC_link = json.get('a_value_is_in_scent_range_of_handler_AC_link', None)
, value_is_in_hearing_range_of_handler_AC_link = json.get('a_value_is_in_hearing_range_of_handler_AC_link', None)
, value_is_on_lead_AC_link = json.get('a_value_is_on_lead_AC_link', None)
, min_trial_count_AC_link = json.get('a_min_trial_count_AC_link', None)
, max_trial_count_AC_link = json.get('a_max_trial_count_AC_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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_type', '')
, 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_reinforcement_schedule = json.get('a_get_all_reinforcement_schedule', False)
, get_inactive_reinforcement_schedule = json.get('a_get_inactive_reinforcement_schedule', False)
, ids_reinforcement_schedule = json.get('a_ids_reinforcement_schedule', '')
, names_reinforcement_schedule = json.get('a_names_reinforcement_schedule', '')
, get_all_training_technique = json.get('a_get_all_training_technique', False)
, get_inactive_training_technique = json.get('a_get_inactive_training_technique', False)
, ids_training_technique = json.get('a_ids_training_technique', '')
, names_training_technique = json.get('a_names_training_technique', '')
, 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'
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_type = not (form.id_assessment_type.data == '0' or form.id_assessment_type.data == '' or form.id_assessment_type.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)
filters = cls.get_default()
filters.get_all_assessment = True
filters.get_inactive_assessment = not active_only
filters.ids_assessment = ''
filters.get_all_assessment_type = not has_filter_assessment_type
filters.get_inactive_assessment_type = not active_only
filters.ids_assessment_type = form.id_assessment_type if has_filter_assessment_type else ''
filters.names_assessment_type = form.search.data if has_filter_search_text 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
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_get_all_AC_link': self.get_all_AC_link
, 'a_get_inactive_AC_link': self.get_inactive_AC_link
, 'a_ids_AC_link': self.ids_AC_link
, 'a_min_distance_from_handler_metres_AC_link': self.min_distance_from_handler_metres_AC_link
, 'a_max_distance_from_handler_metres_AC_link': self.max_distance_from_handler_metres_AC_link
, 'a_value_is_in_sight_of_handler_AC_link': self.value_is_in_sight_of_handler_AC_link
, 'a_value_is_in_scent_range_of_handler_AC_link': self.value_is_in_scent_range_of_handler_AC_link
, 'a_value_is_in_hearing_range_of_handler_AC_link': self.value_is_in_hearing_range_of_handler_AC_link
, 'a_value_is_on_lead_AC_link': self.value_is_on_lead_AC_link
, 'a_min_trial_count_AC_link': self.min_trial_count_AC_link
, 'a_max_trial_count_AC_link': self.max_trial_count_AC_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
, 'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_type
, '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_reinforcement_schedule': self.get_all_reinforcement_schedule
, 'a_get_inactive_reinforcement_schedule': self.get_inactive_reinforcement_schedule
, 'a_ids_reinforcement_schedule': self.ids_reinforcement_schedule
, 'a_names_reinforcement_schedule': self.names_reinforcement_schedule
, 'a_get_all_training_technique': self.get_all_training_technique
, 'a_get_inactive_training_technique': self.get_inactive_training_technique
, 'a_ids_training_technique': self.ids_training_technique
, 'a_names_training_technique': self.names_training_technique
, '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

@@ -16,7 +16,7 @@ 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.assessment_command_link import Assessment_Command_Link
from business_objects.dog.user import User
from extensions import db
from forms.dog.assessment import Filters_Assessment
@@ -29,7 +29,7 @@ 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_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Command_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
@@ -38,7 +38,7 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
__table_args__ = { 'extend_existing': True }
id_response = db.Column(db.Integer, primary_key=True)
id_assessment_command_modality_link = db.Column(db.Integer)
id_assessment_command_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)
@@ -49,7 +49,7 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
def __init__(self):
self.id_response = 0
self.is_new = False
self.assessment_command_modality_link = None
self.assessment_command_link = None
self.response_quality_metric = None
self.obedience_level = None
super().__init__()
@@ -59,14 +59,14 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
_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_assessment_command_link = query_row[1]
assessment_response.id_response_quality_metric = query_row[2]
assessment_response.id_obedience_level = query_row[5]
assessment_response.value_measured = query_row[7]
assessment_response.notes = query_row[8]
assessment_response.active = av.input_bool(query_row[9], 'active', _m)
assessment_response.assessment_command_modality_link = Assessment_Command_Modality_Link.from_db_assessment_response(query_row)
assessment_response.assessment_command_link = Assessment_Command_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
@@ -77,7 +77,7 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
assessment_response = cls()
if json is None: return assessment_response
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_assessment_command_link = json[Assessment_Command_Link.ATTR_ID_ASSESSMENT_COMMAND_LINK]
assessment_response.id_response_quality_metric = json[Response_Quality_Metric.ATTR_ID_RESPONSE_QUALITY_METRIC]
assessment_response.id_obedience_level = json[Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL]
assessment_response.value_measured = json[cls.FLAG_VALUE_MEASURED]
@@ -90,7 +90,7 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
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()
, Assessment_Command_Link.ATTR_ID_ASSESSMENT_COMMAND_LINK: { Assessment_Command_Link.ATTR_ID_ASSESSMENT_COMMAND_LINK: None } if self.assessment_command_link is None else self.assessment_command_link.to_json()
, Response_Quality_Metric.ATTR_ID_RESPONSE_QUALITY_METRIC: { Response_Quality_Metric.ATTR_ID_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.obedience_level is None else self.obedience_level.to_json()
, self.FLAG_VALUE_MEASURED: self.value_measured
@@ -104,7 +104,7 @@ class Assessment_Response(SQLAlchemy_ABC, Base):
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}
{Assessment_Command_Link.FLAG_ASSESSMENT_COMMAND_LINK}: {self.assessment_command_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}
@@ -120,7 +120,7 @@ class Assessment_Response_Temp(db.Model, Base):
__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_assessment_command_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)
@@ -137,7 +137,7 @@ class Assessment_Response_Temp(db.Model, Base):
_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_assessment_command_link = assessment_response.id_assessment_command_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
@@ -155,23 +155,28 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
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_metres_ACM_link: Optional[float]
max_distance_from_handler_metres_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_AC_link: bool
get_inactive_AC_link: bool
ids_AC_link: str
min_distance_from_handler_metres_AC_link: Optional[float]
max_distance_from_handler_metres_AC_link: Optional[float]
value_is_in_sight_of_handler_AC_link: Optional[bool]
value_is_in_scent_range_of_handler_AC_link: Optional[bool]
value_is_in_hearing_range_of_handler_AC_link: Optional[bool]
value_is_on_lead_AC_link: Optional[bool]
min_trial_count_AC_link: Optional[float]
max_trial_count_AC_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_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_type: str
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
@@ -190,6 +195,7 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
#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
@@ -200,14 +206,11 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
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_reinforcement_schedule: bool
get_inactive_reinforcement_schedule: bool
ids_reinforcement_schedule: str
names_reinforcement_schedule: str
get_all_response_quality_metric: bool
get_inactive_response_quality_metric: bool
@@ -234,23 +237,28 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
, 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_metres_ACM_link = None
, max_distance_from_handler_metres_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_AC_link = True
, get_inactive_AC_link = False
, ids_AC_link = ''
, min_distance_from_handler_metres_AC_link = None
, max_distance_from_handler_metres_AC_link = None
, value_is_in_sight_of_handler_AC_link = None
, value_is_in_scent_range_of_handler_AC_link = None
, value_is_in_hearing_range_of_handler_AC_link = None
, value_is_on_lead_AC_link = None
, min_trial_count_AC_link = None
, max_trial_count_AC_link = None
, get_all_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_type = ''
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
@@ -269,6 +277,7 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
# , auth0_ids_user_handler = ''
, names_user_handler = ''
, emails_user_handler = ''
, get_all_command_category = True
, get_inactive_command_category = False
, ids_command_category = ''
@@ -279,14 +288,11 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
, 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_reinforcement_schedule = True
, get_inactive_reinforcement_schedule = False
, ids_reinforcement_schedule = ''
, names_reinforcement_schedule = ''
, get_all_response_quality_metric = True
, get_inactive_response_quality_metric = False
@@ -314,24 +320,29 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
, 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_metres_ACM_link = json.get('a_min_distance_from_handler_metres_ACM_link', None)
, max_distance_from_handler_metres_ACM_link = json.get('a_max_distance_from_handler_metres_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_AC_link = json.get('a_get_all_AC_link', False)
, get_inactive_AC_link = json.get('a_get_inactive_AC_link', False)
, ids_AC_link = json.get('a_ids_AC_link', '')
, notes_assessment_command_modality_AC_link = json.get('a_notes_assessment_command_modality_AC_link', '')
, min_distance_from_handler_metres_AC_link = json.get('a_min_distance_from_handler_metres_AC_link', None)
, max_distance_from_handler_metres_AC_link = json.get('a_max_distance_from_handler_metres_AC_link', None)
, value_is_in_sight_of_handler_AC_link = json.get('a_value_is_in_sight_of_handler_AC_link', None)
, value_is_in_scent_range_of_handler_AC_link = json.get('a_value_is_in_scent_range_of_handler_AC_link', None)
, value_is_in_hearing_range_of_handler_AC_link = json.get('a_value_is_in_hearing_range_of_handler_AC_link', None)
, value_is_on_lead_AC_link = json.get('a_value_is_on_lead_AC_link', None)
, min_trial_count_AC_link = json.get('a_min_trial_count_AC_link', None)
, max_trial_count_AC_link = json.get('a_max_trial_count_AC_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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_type', '')
, 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', '')
@@ -350,6 +361,7 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
# , 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', '')
@@ -360,14 +372,11 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
, 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_reinforcement_schedule = json.get('a_get_all_reinforcement_schedule', False)
, get_inactive_reinforcement_schedule = json.get('a_get_inactive_reinforcement_schedule', False)
, ids_reinforcement_schedule = json.get('a_ids_reinforcement_schedule', '')
, names_reinforcement_schedule = json.get('a_names_reinforcement_schedule', '')
, 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)
@@ -390,7 +399,7 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
_m = f'{cls.__qualname__}.from_form_filters_assessment'
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_assessment_command_link = False
has_filter_response_quality_metric = False
has_filter_obedience_level = False
has_filter_user_handler = False
@@ -401,9 +410,20 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
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_AC_link = True
filters.get_inactive_AC_link = not active_only
filters.ids_AC_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 = True
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_reinforcement_schedule = True
filters.get_inactive_reinforcement_schedule = not active_only
filters.ids_reinforcement_schedule = ''
filters.names_reinforcement_schedule = form.search.data if has_filter_search_text else ''
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 = ''
@@ -431,23 +451,28 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
, '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_metres_ACM_link': self.min_distance_from_handler_metres_ACM_link
, 'a_max_distance_from_handler_metres_ACM_link': self.max_distance_from_handler_metres_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_AC_link': self.get_all_AC_link
, 'a_get_inactive_AC_link': self.get_inactive_AC_link
, 'a_ids_AC_link': self.ids_AC_link
, 'a_min_distance_from_handler_metres_AC_link': self.min_distance_from_handler_metres_AC_link
, 'a_max_distance_from_handler_metres_AC_link': self.max_distance_from_handler_metres_AC_link
, 'a_value_is_in_sight_of_handler_AC_link': self.value_is_in_sight_of_handler_AC_link
, 'a_value_is_in_scent_range_of_handler_AC_link': self.value_is_in_scent_range_of_handler_AC_link
, 'a_value_is_in_hearing_range_of_handler_AC_link': self.value_is_in_hearing_range_of_handler_AC_link
, 'a_value_is_on_lead_AC_link': self.value_is_on_lead_AC_link
, 'a_min_trial_count_AC_link': self.min_trial_count_AC_link
, 'a_max_trial_count_AC_link': self.max_trial_count_AC_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
, 'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_type
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
@@ -466,6 +491,7 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
#, '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
@@ -476,14 +502,11 @@ class Parameters_Assessment_Response(Get_Many_Parameters_Base):
, '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_reinforcement_schedule': self.get_all_reinforcement_schedule
, 'a_get_inactive_reinforcement_schedule': self.get_inactive_reinforcement_schedule
, 'a_ids_reinforcement_schedule': self.ids_reinforcement_schedule
, 'a_names_reinforcement_schedule': self.names_reinforcement_schedule
, 'a_get_all_response_quality_metric': self.get_all_response_quality_metric
, 'a_get_inactive_response_quality_metric': self.get_inactive_response_quality_metric

View File

@@ -0,0 +1,195 @@
"""
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 Assessment_Type(SQLAlchemy_ABC, Base):
ATTR_ID_ASSESSMENT_TYPE: ClassVar[str] = 'id_type'
FLAG_ASSESSMENT_TYPE: ClassVar[str] = 'command-modality'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_TYPE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Assessment_Type'
__table_args__ = { 'extend_existing': True }
id_type = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
description = db.Column(db.String(1000))
active = db.Column(db.Boolean)
def __init__(self):
self.id_type = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_assessment_type(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_type'
assessment_type = cls()
assessment_type.id_type = query_row[0]
assessment_type.code = query_row[1]
assessment_type.name = query_row[2]
assessment_type.description = query_row[3]
assessment_type.active = av.input_bool(query_row[4], 'active', _m)
# assessment_type.created_on = query_row[7]
return assessment_type
@classmethod
def from_db_assessment(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment'
assessment_type = cls()
assessment_type.id_type = query_row[1]
assessment_type.name = query_row[2]
assessment_type.active = True
return assessment_type
"""
@classmethod
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
assessment_type = cls()
assessment_type.id_type = query_row[7]
assessment_type.name = query_row[8]
assessment_type.active = True
return assessment_type
"""
@classmethod
def from_json(cls, json):
_m = 'Assessment_Type.from_json'
assessment_type = cls()
if json is None: return assessment_type
assessment_type.id_type = json.get(cls.ATTR_ID_ASSESSMENT_TYPE, -1)
assessment_type.name = json[cls.FLAG_NAME]
assessment_type.code = json.get(cls.FLAG_CODE, assessment_type.name.upper().replace(" ", "_"))
assessment_type.description = json[cls.FLAG_DESCRIPTION]
assessment_type.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
return assessment_type
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_ASSESSMENT_TYPE: self.id_type
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_DESCRIPTION: self.description
, self.FLAG_ACTIVE: self.active
}
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_ASSESSMENT_TYPE}: {self.id_type}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_DESCRIPTION}: {self.description}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Assessment_Type_Temp(db.Model, Base):
__tablename__ = 'DOG_Assessment_Type_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_type = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
description = db.Column(db.String(1000))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_assessment_type(cls, assessment_type):
_m = 'Assessment_Type_Temp.from_Assessment_Type'
temp = cls()
temp.id_type = assessment_type.id_type
temp.code = assessment_type.code
temp.name = assessment_type.name
temp.description = assessment_type.description
temp.active = assessment_type.active
return temp
class Parameters_Assessment_Type(Get_Many_Parameters_Base):
get_all_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_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_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_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_assessment_type(cls, form):
av.val_instance(form, 'form', 'Parameters_Assessment_Type.from_form_filters_assessment_type', Filters_Assessment_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_Assessment_Type.from_form_filters_assessment_type")
filters = cls.get_default()
filters.get_all_assessment_type = True
filters.get_inactive_assessment_type = not active_only
filters.ids_assessment_type = ''
filters.names_assessment_type = form.search.data if has_filter_search_text else ''
filters.notes_assessment_type = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_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

@@ -91,13 +91,13 @@ class Command(SQLAlchemy_ABC, Base):
return command
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_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)
command.command_category = Command_Category.from_db_assessment_command_link(query_row)
return command
@classmethod

View File

@@ -68,8 +68,8 @@ class Command_Category(SQLAlchemy_ABC, Base):
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
level = cls()
level.id_command_category = query_row[3]
level.name = query_row[4]

View File

@@ -58,8 +58,8 @@ class Command_Modality(SQLAlchemy_ABC, Base):
return command_modality
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
command_modality = cls()
command_modality.id_command_modality = query_row[7]
command_modality.name = query_row[8]
@@ -70,7 +70,7 @@ class Command_Modality(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Command_Modality.from_json'
command_modality = cls()
if json is None: return Command_Modality
if json is None: return command_modality
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(" ", "_"))

View File

@@ -49,7 +49,7 @@ class Understanding_Level(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Understanding_Level.from_json'
understanding_level = cls()
if json is None: return Understanding_Level
if json is None: return understanding_level
Helper_App.console_log(f'{_m}\njson: {json}')
understanding_level.id_understanding_level = -1
understanding_level.code = json[cls.FLAG_CODE]

View File

@@ -58,8 +58,8 @@ class Bribe(SQLAlchemy_ABC, Base):
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
level = cls()
level.id_bribe = query_row[9]
level.name = query_row[10]
@@ -70,7 +70,7 @@ class Bribe(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Bribe.from_json'
bribe = cls()
if json is None: return Bribe
if json is None: return bribe
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(" ", "_"))

View File

@@ -240,12 +240,28 @@ class Parameters_Distraction(Get_Many_Parameters_Base):
ids_distraction_intensity_level_touch: str
names_distraction_intensity_level_touch: str
get_all_AC_link: bool
get_inactive_AC_link: bool
ids_AC_link: str
min_distance_from_handler_metres_AC_link: Optional[float]
max_distance_from_handler_metres_AC_link: Optional[float]
value_is_in_sight_of_handler_AC_link: Optional[bool]
value_is_in_scent_range_of_handler_AC_link: Optional[bool]
value_is_in_hearing_range_of_handler_AC_link: Optional[bool]
value_is_on_lead_AC_link: Optional[bool]
min_trial_count_AC_link: Optional[float]
max_trial_count_AC_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_assessment_type: bool
get_inactive_assessment_type: bool
ids_assessment_type: str
names_assessment_type: str
get_all_weather: bool
get_inactive_weather: bool
ids_weather: str
@@ -265,6 +281,22 @@ class Parameters_Distraction(Get_Many_Parameters_Base):
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_reinforcement_schedule: bool
get_inactive_reinforcement_schedule: bool
ids_reinforcement_schedule: str
names_reinforcement_schedule: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
@@ -312,12 +344,28 @@ class Parameters_Distraction(Get_Many_Parameters_Base):
, ids_distraction_intensity_level_touch = ''
, names_distraction_intensity_level_touch = ''
, get_all_AC_link = True
, get_inactive_AC_link = False
, ids_AC_link = ''
, min_distance_from_handler_metres_AC_link = None
, max_distance_from_handler_metres_AC_link = None
, value_is_in_sight_of_handler_AC_link = None
, value_is_in_scent_range_of_handler_AC_link = None
, value_is_in_hearing_range_of_handler_AC_link = None
, value_is_on_lead_AC_link = None
, min_trial_count_AC_link = None
, max_trial_count_AC_link = None
, get_all_assessment = True
, get_inactive_assessment = False
, ids_assessment = ''
, notes_assessment = ''
, min_temperature_assessment = None
, max_temperature_assessment = None
, get_all_assessment_type = True
, get_inactive_assessment_type = False
, ids_assessment_type = ''
, names_assessment_type = ''
, get_all_weather = True
, get_inactive_weather = False
, ids_weather = ''
@@ -337,6 +385,22 @@ class Parameters_Distraction(Get_Many_Parameters_Base):
, 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_reinforcement_schedule = True
, get_inactive_reinforcement_schedule = False
, ids_reinforcement_schedule = ''
, names_reinforcement_schedule = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
@@ -385,12 +449,29 @@ class Parameters_Distraction(Get_Many_Parameters_Base):
, 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_AC_link = json.get('a_get_all_AC_link', False)
, get_inactive_AC_link = json.get('a_get_inactive_AC_link', False)
, ids_AC_link = json.get('a_ids_AC_link', '')
, notes_assessment_command_modality_AC_link = json.get('a_notes_assessment_command_modality_AC_link', '')
, min_distance_from_handler_metres_AC_link = json.get('a_min_distance_from_handler_metres_AC_link', None)
, max_distance_from_handler_metres_AC_link = json.get('a_max_distance_from_handler_metres_AC_link', None)
, value_is_in_sight_of_handler_AC_link = json.get('a_value_is_in_sight_of_handler_AC_link', None)
, value_is_in_scent_range_of_handler_AC_link = json.get('a_value_is_in_scent_range_of_handler_AC_link', None)
, value_is_in_hearing_range_of_handler_AC_link = json.get('a_value_is_in_hearing_range_of_handler_AC_link', None)
, value_is_on_lead_AC_link = json.get('a_value_is_on_lead_AC_link', None)
, min_trial_count_AC_link = json.get('a_min_trial_count_AC_link', None)
, max_trial_count_AC_link = json.get('a_max_trial_count_AC_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_assessment_type = json.get('a_get_all_assessment_type', False)
, get_inactive_assessment_type = json.get('a_get_inactive_assessment_type', False)
, ids_assessment_type = json.get('a_ids_assessment_type', '')
, names_assessment_type = json.get('a_names_assessment_type', '')
, 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', '')
@@ -410,6 +491,22 @@ class Parameters_Distraction(Get_Many_Parameters_Base):
, 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_reinforcement_schedule = json.get('a_get_all_reinforcement_schedule', False)
, get_inactive_reinforcement_schedule = json.get('a_get_inactive_reinforcement_schedule', False)
, ids_reinforcement_schedule = json.get('a_ids_reinforcement_schedule', '')
, names_reinforcement_schedule = json.get('a_names_reinforcement_schedule', '')
, 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)
@@ -623,12 +720,28 @@ active_only: {active_only}
, '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_AC_link': self.get_all_AC_link
, 'a_get_inactive_AC_link': self.get_inactive_AC_link
, 'a_ids_AC_link': self.ids_AC_link
, 'a_min_distance_from_handler_metres_AC_link': self.min_distance_from_handler_metres_AC_link
, 'a_max_distance_from_handler_metres_AC_link': self.max_distance_from_handler_metres_AC_link
, 'a_value_is_in_sight_of_handler_AC_link': self.value_is_in_sight_of_handler_AC_link
, 'a_value_is_in_scent_range_of_handler_AC_link': self.value_is_in_scent_range_of_handler_AC_link
, 'a_value_is_in_hearing_range_of_handler_AC_link': self.value_is_in_hearing_range_of_handler_AC_link
, 'a_value_is_on_lead_AC_link': self.value_is_on_lead_AC_link
, 'a_min_trial_count_AC_link': self.min_trial_count_AC_link
, 'a_max_trial_count_AC_link': self.max_trial_count_AC_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
, 'a_get_all_assessment_type': self.get_all_assessment_type
, 'a_get_inactive_assessment_type': self.get_inactive_assessment_type
, 'a_ids_assessment_type': self.ids_assessment_type
, 'a_names_assessment_type': self.names_assessment_type
, 'get_all_weather': self.get_all_weather
, 'get_inactive_weather': self.get_inactive_weather
, 'ids_weather': self.ids_weather
@@ -648,6 +761,22 @@ active_only: {active_only}
, '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_reinforcement_schedule': self.get_all_reinforcement_schedule
, 'a_get_inactive_reinforcement_schedule': self.get_inactive_reinforcement_schedule
, 'a_ids_reinforcement_schedule': self.ids_reinforcement_schedule
, 'a_names_reinforcement_schedule': self.names_reinforcement_schedule
, '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

View File

@@ -97,7 +97,7 @@ class Distraction_Intensity_Level(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Distraction_Intensity_Level.from_json'
distraction_intensity_level = cls()
if json is None: return Distraction_Intensity_Level
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]

View File

@@ -61,7 +61,7 @@ class Distraction_Type(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Distraction_Type.from_json'
distraction_type = cls()
if json is None: return Distraction_Type
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]

View File

@@ -73,7 +73,7 @@ class Dog(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Dog.from_json'
dog = cls()
if json is None: return Dog
if json is None: return dog
# Helper_App.console_log(f'{_m}\njson: {json}')
dog.id_dog = json.get(Dog.ATTR_ID_DOG, -1)
dog.name = json[cls.FLAG_NAME]

View File

@@ -60,7 +60,7 @@ class Obedience_Level(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
obedience_level = cls()
if json is None: return Obedience_Level
if json is None: return obedience_level
obedience_level.id_obedience_level = json.get(Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL, -1)
obedience_level.code = json[cls.FLAG_CODE]
obedience_level.name = json[cls.FLAG_NAME]

View File

@@ -0,0 +1,194 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Reinforcement Schedule 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 Reinforcement_Schedule(SQLAlchemy_ABC, Base):
ATTR_ID_REINFORCEMENT_SCHEDULE: ClassVar[str] = 'id_reinforcement_schedule'
FLAG_REINFORCEMENT_SCHEDULE: ClassVar[str] = 'reinforcement-schedule'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_REINFORCEMENT_SCHEDULE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Reinforcement_Schedule'
__table_args__ = { 'extend_existing': True }
id_reinforcement_schedule = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
description = db.Column(db.String(1000))
active = db.Column(db.Boolean)
def __init__(self):
self.id_reinforcement_schedule = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_reinforcement_schedule(cls, query_row):
_m = f'{cls.__qualname__}.from_db_reinforcement_schedule'
reinforcement_schedule = cls()
reinforcement_schedule.id_reinforcement_schedule = query_row[0]
reinforcement_schedule.code = query_row[1]
reinforcement_schedule.name = query_row[2]
reinforcement_schedule.description = query_row[3]
reinforcement_schedule.active = av.input_bool(query_row[4], 'active', _m)
# reinforcement_schedule.created_on = query_row[7]
return reinforcement_schedule
"""
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
reinforcement_schedule = cls()
reinforcement_schedule.id_reinforcement_schedule = query_row[2]
reinforcement_schedule.name = query_row[3]
reinforcement_schedule.active = True
return reinforcement_schedule
@classmethod
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
reinforcement_schedule = cls()
reinforcement_schedule.id_reinforcement_schedule = query_row[7]
reinforcement_schedule.name = query_row[8]
reinforcement_schedule.active = True
return reinforcement_schedule
"""
@classmethod
def from_json(cls, json):
_m = 'Reinforcement_Schedule.from_json'
reinforcement_schedule = cls()
if json is None: return reinforcement_schedule
reinforcement_schedule.id_reinforcement_schedule = json.get(cls.ATTR_ID_REINFORCEMENT_SCHEDULE, -1)
reinforcement_schedule.name = json[cls.FLAG_NAME]
reinforcement_schedule.code = json.get(cls.FLAG_CODE, reinforcement_schedule.name.upper().replace(" ", "_"))
reinforcement_schedule.description = json[cls.FLAG_DESCRIPTION]
reinforcement_schedule.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
return reinforcement_schedule
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_REINFORCEMENT_SCHEDULE: self.id_reinforcement_schedule
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_DESCRIPTION: self.description
, self.FLAG_ACTIVE: self.active
}
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_REINFORCEMENT_SCHEDULE}: {self.id_reinforcement_schedule}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_DESCRIPTION}: {self.description}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Reinforcement_Schedule_Temp(db.Model, Base):
__tablename__ = 'DOG_Reinforcement_Schedule_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_reinforcement_schedule = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
description = db.Column(db.String(1000))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_reinforcement_schedule(cls, reinforcement_schedule):
_m = 'Reinforcement_Schedule_Temp.from_Reinforcement_Schedule'
temp = cls()
temp.id_reinforcement_schedule = reinforcement_schedule.id_reinforcement_schedule
temp.code = reinforcement_schedule.code
temp.name = reinforcement_schedule.name
temp.description = reinforcement_schedule.description
temp.active = reinforcement_schedule.active
return temp
class Parameters_Reinforcement_Schedule(Get_Many_Parameters_Base):
get_all_reinforcement_schedule: bool
get_inactive_reinforcement_schedule: bool
ids_reinforcement_schedule: str
names_reinforcement_schedule: 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_reinforcement_schedule = True
, get_inactive_reinforcement_schedule = False
, ids_reinforcement_schedule = ''
, names_reinforcement_schedule = ''
, 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_reinforcement_schedule = json.get('a_get_all_reinforcement_schedule', False)
, get_inactive_reinforcement_schedule = json.get('a_get_inactive_reinforcement_schedule', False)
, ids_reinforcement_schedule = json.get('a_ids_reinforcement_schedule', '')
, names_reinforcement_schedule = json.get('a_names_reinforcement_schedule', '')
, 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_reinforcement_schedule(cls, form):
av.val_instance(form, 'form', 'Parameters_Reinforcement_Schedule.from_form_filters_reinforcement_schedule', Filters_Reinforcement_Schedule)
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_Reinforcement_Schedule.from_form_filters_reinforcement_schedule")
filters = cls.get_default()
filters.get_all_reinforcement_schedule = True
filters.get_inactive_reinforcement_schedule = not active_only
filters.ids_reinforcement_schedule = ''
filters.names_reinforcement_schedule = form.search.data if has_filter_search_text else ''
filters.notes_reinforcement_schedule = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_reinforcement_schedule': self.get_all_reinforcement_schedule
, 'a_get_inactive_reinforcement_schedule': self.get_inactive_reinforcement_schedule
, 'a_ids_reinforcement_schedule': self.ids_reinforcement_schedule
, 'a_names_reinforcement_schedule': self.names_reinforcement_schedule
, '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

@@ -72,7 +72,7 @@ class Response_Quality_Metric(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'Response_Quality_Metric.from_json'
response_quality_metric = cls()
if json is None: return Response_Quality_Metric
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_RESPONSE_QUALITY_METRIC, -1)
response_quality_metric.name = json[cls.FLAG_NAME]

View File

@@ -0,0 +1,194 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Training Technique 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 Training_Technique(SQLAlchemy_ABC, Base):
ATTR_ID_TRAINING_TECHNIQUE: ClassVar[str] = 'id_training_technique'
FLAG_TRAINING_TECHNIQUE: ClassVar[str] = 'training-technique'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_TRAINING_TECHNIQUE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Training_Technique'
__table_args__ = { 'extend_existing': True }
id_training_technique = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
description = db.Column(db.String(1000))
active = db.Column(db.Boolean)
def __init__(self):
self.id_training_technique = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_training_technique(cls, query_row):
_m = f'{cls.__qualname__}.from_db_training_technique'
training_technique = cls()
training_technique.id_training_technique = query_row[0]
training_technique.code = query_row[1]
training_technique.name = query_row[2]
training_technique.description = query_row[3]
training_technique.active = av.input_bool(query_row[4], 'active', _m)
# training_technique.created_on = query_row[7]
return training_technique
"""
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
training_technique = cls()
training_technique.id_training_technique = query_row[2]
training_technique.name = query_row[3]
training_technique.active = True
return training_technique
@classmethod
def from_db_assessment_command_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_link'
training_technique = cls()
training_technique.id_training_technique = query_row[7]
training_technique.name = query_row[8]
training_technique.active = True
return training_technique
"""
@classmethod
def from_json(cls, json):
_m = 'Training_Technique.from_json'
training_technique = cls()
if json is None: return training_technique
training_technique.id_training_technique = json.get(cls.ATTR_ID_TRAINING_TECHNIQUE, -1)
training_technique.name = json[cls.FLAG_NAME]
training_technique.code = json.get(cls.FLAG_CODE, training_technique.name.upper().replace(" ", "_"))
training_technique.description = json[cls.FLAG_DESCRIPTION]
training_technique.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
return training_technique
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_TRAINING_TECHNIQUE: self.id_training_technique
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_DESCRIPTION: self.description
, self.FLAG_ACTIVE: self.active
}
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_TRAINING_TECHNIQUE}: {self.id_training_technique}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_DESCRIPTION}: {self.description}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Training_Technique_Temp(db.Model, Base):
__tablename__ = 'DOG_Training_Technique_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_training_technique = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
description = db.Column(db.String(1000))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_training_technique(cls, training_technique):
_m = 'Training_Technique_Temp.from_Training_Technique'
temp = cls()
temp.id_training_technique = training_technique.id_training_technique
temp.code = training_technique.code
temp.name = training_technique.name
temp.description = training_technique.description
temp.active = training_technique.active
return temp
class Parameters_Training_Technique(Get_Many_Parameters_Base):
get_all_training_technique: bool
get_inactive_training_technique: bool
ids_training_technique: str
names_training_technique: 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_training_technique = True
, get_inactive_training_technique = False
, ids_training_technique = ''
, names_training_technique = ''
, 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_training_technique = json.get('a_get_all_training_technique', False)
, get_inactive_training_technique = json.get('a_get_inactive_training_technique', False)
, ids_training_technique = json.get('a_ids_training_technique', '')
, names_training_technique = json.get('a_names_training_technique', '')
, 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_training_technique(cls, form):
av.val_instance(form, 'form', 'Parameters_Training_Technique.from_form_filters_training_technique', Filters_Training_Technique)
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_Training_Technique.from_form_filters_training_technique")
filters = cls.get_default()
filters.get_all_training_technique = True
filters.get_inactive_training_technique = not active_only
filters.ids_training_technique = ''
filters.names_training_technique = form.search.data if has_filter_search_text else ''
filters.notes_training_technique = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_training_technique': self.get_all_training_technique
, 'a_get_inactive_training_technique': self.get_inactive_training_technique
, 'a_ids_training_technique': self.ids_training_technique
, 'a_names_training_technique': self.names_training_technique
, '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

@@ -92,7 +92,7 @@ class Unit_Measurement(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
unit_measurement = cls()
if json is None: return Unit_Measurement
if json is None: return unit_measurement
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]

View File

@@ -55,7 +55,7 @@ class File_Type(SQLAlchemy_ABC, Base):
def from_json(cls, json):
_m = 'File_Type.from_json'
file_type = cls()
if json is None: return File_Type
if json is None: return file_type
file_type.id_file_type = json.get(cls.ATTR_ID_FILE_TYPE, -1)
file_type.name = json[cls.FLAG_NAME]
file_type.code = json.get(cls.FLAG_CODE, file_type.name.upper().replace(" ", "_"))