""" Project: PARTS Website Author: Edward Middleton-Smith Precision And Research Technology Systems Limited Technology: View Models Feature: Dog Assessments View Model Description: Data model for dog assessments view """ # internal from business_objects.dog.assessment import Assessment, Parameters_Assessment from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link, Parameters_Assessment_Command_Modality_Link from business_objects.dog.assessment_response import Assessment_Response, Parameters_Assessment_Response from business_objects.dog.bribe import Bribe, Parameters_Bribe from business_objects.dog.command import Command, Parameters_Command from business_objects.dog.command_category import Command_Category from business_objects.dog.command_modality import Command_Modality, Parameters_Command_Modality from business_objects.dog.distraction import Distraction, Parameters_Distraction from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level, Parameters_Distraction_Intensity_Level from business_objects.dog.distraction_type import Distraction_Type, Parameters_Distraction_Type from business_objects.dog.lighting_level import Lighting_Level, Parameters_Lighting_Level from business_objects.dog.location import Location, Parameters_Location from business_objects.dog.obedience_level import Obedience_Level, Parameters_Obedience_Level from business_objects.dog.response_quality_metric import Response_Quality_Metric, Parameters_Response_Quality_Metric from business_objects.dog.user import User, Parameters_User from business_objects.dog.weather import Weather, Parameters_Weather from datastores.datastore_dog import DataStore_Dog from datastores.datastore_user import DataStore_User from models.model_view_dog_base import Model_View_Dog_Base from forms.dog.assessment import Filters_Assessment # from routes import bp_home from helpers.helper_app import Helper_App import lib.argument_validation as av # external from pydantic import BaseModel from typing import ClassVar, Optional from operator import attrgetter class Model_View_Dog_Assessment(Model_View_Dog_Base): FLAG_DISTANCE_FROM_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_DISTANCE_FROM_HANDLER FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_EMOTIONAL FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_SCENT FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_SIGHT FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_SOUND FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH: ClassVar[str] = Distraction.FLAG_DISTRACTION_INTENSITY_LEVEL_TOUCH FLAG_IS_IN_HEARING_RANGE_OF_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER FLAG_IS_IN_SIGHT_OF_HANDLER: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_IN_SIGHT_OF_HANDLER FLAG_IS_ON_LEAD: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_IS_ON_LEAD FLAG_PROXIMITY_METRES: ClassVar[str] = Distraction.FLAG_PROXIMITY_METRES FLAG_TEMPERATURE_CELCIUS: ClassVar[str] = Assessment.FLAG_TEMPERATURE_CELCIUS FLAG_TRIAL_COUNT: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_TRIAL_COUNT FLAG_USER_HANDLER: ClassVar[str] = Assessment.FLAG_USER_HANDLER FLAG_VALUE_MEASURED: ClassVar[str] = Assessment_Response.FLAG_VALUE_MEASURED ID_FORM_ASSESSMENT: ClassVar[str] = 'form_assessment' ID_FORM_ASSESSMENT_COMMAND_MODALITY_LINKS: ClassVar[str] = 'form_assessment_command_modality_links' ID_FORM_DISTRACTIONS: ClassVar[str] = 'form_distractions' ID_TABLE_ASSESSMENT: ClassVar[str] = 'table_assessment' ID_TABLE_ASSESSMENT_COMMAND_MODALITY_LINKS: ClassVar[str] = 'table_assessment_command_modality_links' ID_TABLE_ASSESSMENT_RESPONSES: ClassVar[str] = 'table_assessment_responses' ID_TABLE_DISTRACTIONS: ClassVar[str] = 'table_distractions' filter_bribes: list = None filter_command_categories: list = None filter_command_modalities: list = None filter_commands: list = None filter_distraction_intensity_levels: list = None filter_distraction_types: list = None filter_lighting_levels: list = None filter_locations: list = None filter_obedience_levels: list = None filter_response_quality_metrics: list = None filter_user_handlers: list = None filter_weathers: list = None assessments: list = None form_filters: Filters_Assessment = None form_filters_old: Filters_Assessment id_assessment: Optional[int] def __init__(self, form_filters_old, id_assessment = None, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_ASSESSMENTS): _m = 'Model_View_Dog_Assessment.__init__' Helper_App.console_log(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old, id_assessment=id_assessment) self._title = 'Assessments' self.form_filters = form_filters_old datastore_dog = DataStore_Dog() datastore_user = DataStore_User() # Assessments + filters parameters_filter_lighting_level = Parameters_Lighting_Level.get_default() self.filter_lighting_levels, errors = datastore_dog.get_many_lighting_level(parameters_filter_lighting_level) if len(self.filter_lighting_levels) > 0: self.form_filters.id_lighting_level.choices += [(str(lighting_level.id_lighting_level), lighting_level.name) for lighting_level in self.filter_lighting_levels] parameters_filter_location = Parameters_Location.get_default() self.filter_locations, errors = datastore_dog.get_many_location(parameters_filter_location) if len(self.filter_locations) > 0: self.form_filters.id_location.choices += [(str(location.id_location), location.name) for location in self.filter_locations] parameters_filter_user = Parameters_User.get_default() parameters_filter_user.id_user = self.user.id_user parameters_filter_user.get_all_user = True self.filter_user_handlers, errors = datastore_user.get_many_user(parameters_filter_user) if len(self.filter_user_handlers) > 0: self.form_filters.id_user_handler.choices += [(str(user.id_user), user.get_name()) for user in self.filter_user_handlers] parameters_filter_weather = Parameters_Weather.get_default() self.filter_weathers, errors = datastore_dog.get_many_weather(parameters_filter_weather) if len(self.filter_weathers) > 0: self.form_filters.id_weather.choices += [(str(weather.id_weather), weather.name) for weather in self.filter_weathers] Helper_App.console_log(f'Form filters: {self.form_filters}') parameters_filter_assessment = Parameters_Assessment.from_form_filters_assessment(self.form_filters) if self.id_assessment is not None: parameters_filter_assessment.ids_assessment = str(self.id_assessment) Helper_App.console_log(f'Query args: {parameters_filter_assessment}') self.assessments, errors = datastore_dog.get_many_assessment(parameters_filter_assessment) # Distractions + filters parameters_filter_distraction_type = Parameters_Distraction_Type.get_default() self.filter_distraction_types, errors = datastore_dog.get_many_distraction_type(parameters_filter_distraction_type) """ if len(self.filter_distraction_types) > 0: self.form_filters.id_distraction_type.choices += [(str(distraction_type.id_type), distraction_type.name) for distraction_type in self.filter_distraction_types] """ parameters_filter_distraction_intensity_level = Parameters_Distraction_Intensity_Level.get_default() self.filter_distraction_intensity_levels, errors = datastore_dog.get_many_distraction_intensity_level(parameters_filter_distraction_intensity_level) """ if len(self.filter_distraction_intensity_levels) > 0: self.form_filters.id_intensity_level.choices += [(str(distraction_intensity_level.id_intensity_level), distraction_intensity_level.name) for distraction_intensity_level in self.filter_distraction_intensity_levels] """ parameters_filter_distraction = Parameters_Distraction.from_form_filters_assessment(self.form_filters) distractions, errors = datastore_dog.get_many_distraction(parameters_filter_distraction) # Assessment Command Modality Links + filters parameters_filter_command = Parameters_Command.get_default() self.filter_command_categories, self.filter_commands, errors = datastore_dog.get_many_command(parameters_filter_command) """ if len(self.filter_command_categories) > 0: self.form_filters.id_command_category.choices += [(str(command_category.id_command_category), command_category.name) for command_category in self.filter_command_categories] if len(self.filter_commands) > 0: Helper_App.console_log(f'filter commands: {self.filter_commands}') sorted_filter_commands = self.filter_commands sorted_filter_commands.sort(key = attrgetter('name')) Helper_App.console_log(f'sorted filter commands: {sorted_filter_commands}') self.form_filters.id_command.choices += [(str(command.id_command), command.name) for command in sorted_filter_commands] # .sort(key = lambda command: command[1]) """ parameters_filter_command_modality = Parameters_Command_Modality.get_default() self.filter_command_modalities, errors = datastore_dog.get_many_command_modality(parameters_filter_command_modality) """ if len(self.filter_command_modalities) > 0: self.form_filters.id_command_modality.choices += [(str(command_modality.id_command_modality), command_modality.name) for command_modality in self.filter_command_modalities] """ parameters_filter_bribe = Parameters_Bribe.get_default() self.filter_bribes, errors = datastore_dog.get_many_bribe(parameters_filter_bribe) """ if len(self.filter_bribes) > 0: self.form_filters.id_bribe.choices += [(str(bribe.id_bribe), bribe.name) for bribe in self.filter_bribes] """ parameters_filter_assessment_command_modality_link = Parameters_Assessment_Command_Modality_Link.from_form_filters_assessment(self.form_filters) assessment_command_modality_links, errors = datastore_dog.get_many_assessment_command_modality_link(parameters_filter_assessment_command_modality_link) # Assessment Responses and filters parameters_filter_response_quality_metric = Parameters_Response_Quality_Metric.get_default() self.filter_response_quality_metrics, errors = datastore_dog.get_many_response_quality_metric(parameters_filter_response_quality_metric) """ if len(self.filter_response_quality_metrics) > 0: self.form_filters.id_response_quality_metric.choices += [(str(response_quality_metric.id_response_quality_metric), response_quality_metric.name) for response_quality_metric in self.filter_response_quality_metrics] """ parameters_filter_obedience_level = Parameters_Obedience_Level.get_default() self.filter_obedience_levels, errors = datastore_dog.get_many_obedience_level(parameters_filter_obedience_level) """ if len(self.filter_obedience_levels) > 0: self.form_filters.id_obedience_level.choices += [(str(obedience_level.id_obedience_level), obedience_level.name) for obedience_level in self.filter_obedience_levels] """ parameters_filter_assessment_response = Parameters_Assessment_Response.from_form_filters_assessment(self.form_filters) assessment_responses, errors = datastore_dog.get_many_assessment_response(parameters_filter_assessment_response) for index_link in range(len(assessment_command_modality_links)): link = assessment_command_modality_links[index_link] link.assessment_responses = [response for response in assessment_responses if response.id_assessment_command_modality_link == link.id_link] assessment_command_modality_links[index_link] = link for index_assessment in range(len(self.assessments)): assessment = self.assessments[index_assessment] assessment.distractions = [distraction for distraction in distractions if distraction.id_assessment == assessment.id_assessment] assessment.assessment_command_modality_links = [link for link in assessment_command_modality_links if link.id_assessment == assessment.id_assessment] self.assessments[index_assessment] = assessment Helper_App.console_log(f'Final assessments: {self.assessments}') test_assessments = Model_View_Dog_Assessment.convert_list_objects_to_dict_json_by_attribute_key_default(self.assessments) Helper_App.console_log(f'JSON assessments: {test_assessments}')