""" Project: PARTS Website Author: Edward Middleton-Smith Precision And Research Technology Systems Limited Technology: Business Objects Feature: Assessment_Response Business Object """ # internal from business_objects.base import Base from business_objects.dog.command import Command # from business_objects.dog.command_category import Command_Category from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base from business_objects.dog.dog import Dog from business_objects.dog.response_quality_metric import Response_Quality_Metric from business_objects.dog.obedience_level import Obedience_Level from business_objects.dog.obedience_level import Obedience_Level from business_objects.dog.assessment_command_link import Assessment_Command_Link from business_objects.dog.user import User from extensions import db from forms.dog.assessment import Filters_Assessment from helpers.helper_app import Helper_App import lib.argument_validation as av # external from dataclasses import dataclass from typing import ClassVar, Optional class Assessment_Response(SQLAlchemy_ABC, Base): ATTR_ID_ASSESSMENT_RESPONSE: ClassVar[str] = 'id_response' FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Command_Link.FLAG_ASSESSMENT_RESPONSE FLAG_VALUE_MEASURED: ClassVar[str] = 'value-measured' NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE NAME_ATTR_OPTION_TEXT: ClassVar[str] = ATTR_ID_ASSESSMENT_RESPONSE __tablename__ = 'DOG_Assessment_Response' __table_args__ = { 'extend_existing': True } id_response = db.Column(db.Integer, primary_key=True) id_assessment_command_link = db.Column(db.Integer) id_response_quality_metric = db.Column(db.Integer) id_obedience_level = db.Column(db.Integer) value_measured = db.Column(db.Float) notes = db.Column(db.Text) active = db.Column(db.Boolean) created_on = db.Column(db.DateTime) def __init__(self): self.id_response = 0 self.is_new = False self.assessment_command_link = None self.response_quality_metric = None self.obedience_level = None super().__init__() @classmethod def from_db_assessment_response(cls, query_row): _m = f'{cls.__qualname__}.from_db_assessment_response' assessment_response = cls() assessment_response.id_response = query_row[0] assessment_response.id_assessment_command_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_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 @classmethod def from_json(cls, json): _m = f'{cls.__qualname__}.from_json' 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_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] assessment_response.notes = json[cls.FLAG_NOTES] assessment_response.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m) assessment_response.created_on = json.get(cls.FLAG_CREATED_ON, None) return assessment_response def to_json(self): as_json = { **self.get_shared_json_attributes(self) , self.ATTR_ID_ASSESSMENT_RESPONSE: self.id_response , Assessment_Command_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 , self.FLAG_NOTES: self.notes , self.FLAG_ACTIVE: self.active , self.FLAG_CREATED_ON: self.created_on } return as_json def __repr__(self): return f''' {self.__class__.__name__}( {self.FLAG_ASSESSMENT_RESPONSE}: {self.id_response} {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} {self.FLAG_NOTES}: {self.notes} {self.FLAG_ACTIVE}: {self.active} {self.FLAG_CREATED_ON}: {self.created_on} ) ''' # {Command_Category.FLAG_COMMAND_CATEGORY}: {self.id_command_category} class Assessment_Response_Temp(db.Model, Base): __tablename__ = 'DOG_Assessment_Response_Temp' __table_args__ = { 'extend_existing': True } id_temp = db.Column(db.Integer, primary_key=True) id_response = db.Column(db.Integer) id_assessment_command_link = db.Column(db.Integer) id_response_quality_metric = db.Column(db.Integer) id_obedience_level = db.Column(db.Integer) value_measured = db.Column(db.Float) notes = db.Column(db.Text) active = db.Column(db.Boolean) # created_on = db.Column(db.DateTime) guid: str = db.Column(db.String(36)) def __init__(self): super().__init__() @classmethod def from_assessment_response(cls, assessment_response): _m = 'Assessment_Response_Temp.from_assessment_response' temp = cls() temp.id_response = assessment_response.id_response temp.id_assessment_command_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 temp.notes = assessment_response.notes temp.active = assessment_response.active # temp.created_on = assessment_response.created_on return temp class Parameters_Assessment_Response(Get_Many_Parameters_Base): get_all_assessment_response: bool get_inactive_assessment_response: bool ids_assessment_response: str notes_assessment_response: str min_value_measured_assessment_response: Optional[float] max_value_measured_assessment_response: Optional[float] get_all_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_response_quality_metric: bool get_inactive_response_quality_metric: bool ids_response_quality_metric: str names_response_quality_metric: str get_all_obedience_level: bool get_inactive_obedience_level: bool ids_obedience_level: str names_obedience_level: str require_all_id_search_filters_met: bool require_any_id_search_filters_met: bool require_all_non_id_search_filters_met: bool require_any_non_id_search_filters_met: bool @classmethod def get_default(cls): return cls( get_all_assessment_response = True , get_inactive_assessment_response = False , ids_assessment_response = '' , notes_assessment_response = '' , min_value_measured_assessment_response = None , max_value_measured_assessment_response = None , get_all_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_response_quality_metric = True , get_inactive_response_quality_metric = False , ids_response_quality_metric = '' , names_response_quality_metric = '' , get_all_obedience_level = True , get_inactive_obedience_level = False , ids_obedience_level = '' , names_obedience_level = '' , require_all_id_search_filters_met = True , require_any_id_search_filters_met = True , require_all_non_id_search_filters_met = False , require_any_non_id_search_filters_met = True ) @classmethod def from_json(cls, json): return cls( get_all_assessment_response = json.get('a_get_all_assessment_response', False) , get_inactive_assessment_response = json.get('a_get_inactive_assessment_response', False) , ids_assessment_response = json.get('a_ids_assessment_response', '') , notes_assessment_response = json.get('a_notes_assessment_response', '') , min_value_measured_assessment_response = json.get('a_min_value_measured_assessment_response', None) , max_value_measured_assessment_response = json.get('a_max_value_measured_assessment_response', None) , get_all_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_response_quality_metric = json.get('a_get_all_response_quality_metric', False) , get_inactive_response_quality_metric = json.get('a_get_inactive_response_quality_metric', False) , ids_response_quality_metric = json.get('a_ids_response_quality_metric', '') , names_response_quality_metric = json.get('a_names_response_quality_metric', '') , get_all_obedience_level = json.get('a_get_all_obedience_level', False) , get_inactive_obedience_level = json.get('a_get_inactive_obedience_level', False) , ids_obedience_level = json.get('a_ids_obedience_level', '') , names_obedience_level = json.get('a_names_obedience_level', '') , require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True) , require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True) , require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False) , require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True) ) @classmethod def from_form_filters_assessment(cls, form): _m = f'{cls.__qualname__}.from_form_filters_assessment' 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_link = False has_filter_response_quality_metric = False has_filter_obedience_level = False has_filter_user_handler = False has_filter_assessment = not (form.id_assessment.data == '' or form.id_assessment.data == '0' or form.id_assessment.data is None) active_only = av.input_bool(form.active_only.data, "active", _m) filters = cls.get_default() filters.get_all_assessment_response = True filters.get_inactive_assessment_response = not active_only filters.ids_assessment_response = '' filters.get_all_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 = '' filters.names_response_quality_metric = form.search.data if has_filter_search_text else '' filters.get_all_obedience_level = not has_filter_obedience_level filters.get_inactive_obedience_level = not active_only filters.ids_obedience_level = '' filters.names_obedience_level = form.search.data if has_filter_search_text else '' filters.get_all_user_handler = not has_filter_user_handler filters.get_inactive_user_handler = not active_only filters.ids_user_handler = '' # filters.auth0_ids_user_handler = form.id_user_handler.data if has_filter_user_handler else '' filters.names_user_handler = form.search.data if has_filter_search_text else '' filters.emails_user_handler = form.search.data if has_filter_search_text else '' filters.ids_assessment = form.id_assessment.data if has_filter_assessment else '' return filters def to_json(self): return { 'a_get_all_assessment_response': self.get_all_assessment_response , 'a_get_inactive_assessment_response': self.get_inactive_assessment_response , 'a_ids_assessment_response': self.ids_assessment_response , 'a_notes_assessment_response': self.notes_assessment_response , 'a_min_value_measured_assessment_response': self.min_value_measured_assessment_response , 'a_max_value_measured_assessment_response': self.max_value_measured_assessment_response , 'a_get_all_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_response_quality_metric': self.get_all_response_quality_metric , 'a_get_inactive_response_quality_metric': self.get_inactive_response_quality_metric , 'a_ids_response_quality_metric': self.ids_response_quality_metric , 'a_names_response_quality_metric': self.names_response_quality_metric , 'a_get_all_obedience_level': self.get_all_obedience_level , 'a_get_inactive_obedience_level': self.get_inactive_obedience_level , 'a_ids_obedience_level': self.ids_obedience_level , 'a_names_obedience_level': self.names_obedience_level , 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met , 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met , 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met , 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met }