198 lines
13 KiB
Python
198 lines
13 KiB
Python
"""
|
|
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_link import Assessment_Command_Link, Parameters_Assessment_Command_Link
|
|
from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link, Parameters_Assessment_Command_Modality_Link
|
|
from business_objects.dog.assessment_command_technique_link import Assessment_Command_Technique_Link, Parameters_Assessment_Command_Technique_Link
|
|
from business_objects.dog.assessment_response import Assessment_Response, Parameters_Assessment_Response
|
|
from business_objects.dog.assessment_type import Assessment_Type, Parameters_Assessment_Type
|
|
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.reinforcement_schedule import Reinforcement_Schedule, Parameters_Reinforcement_Schedule
|
|
from business_objects.dog.response_quality_metric import Response_Quality_Metric, Parameters_Response_Quality_Metric
|
|
from business_objects.dog.training_technique import Training_Technique, Parameters_Training_Technique
|
|
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_METRES: ClassVar[str] = Assessment_Command_Link.FLAG_DISTANCE_FROM_HANDLER_METRES
|
|
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_Link.FLAG_IS_IN_HEARING_RANGE_OF_HANDLER
|
|
FLAG_IS_IN_SCENT_RANGE_OF_HANDLER: ClassVar[str] = Assessment_Command_Link.FLAG_IS_IN_SCENT_RANGE_OF_HANDLER
|
|
FLAG_IS_IN_SIGHT_OF_HANDLER: ClassVar[str] = Assessment_Command_Link.FLAG_IS_IN_SIGHT_OF_HANDLER
|
|
FLAG_IS_ON_LEAD: ClassVar[str] = Assessment_Command_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_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_LINKS: ClassVar[str] = 'form_assessment_command_links'
|
|
ID_FORM_DISTRACTIONS: ClassVar[str] = 'form_distractions'
|
|
ID_TABLE_ASSESSMENT: ClassVar[str] = 'table_assessment'
|
|
ID_TABLE_ASSESSMENT_COMMAND_LINKS: ClassVar[str] = 'table_assessment_command_links'
|
|
ID_TABLE_ASSESSMENT_RESPONSES: ClassVar[str] = 'table_assessment_responses'
|
|
ID_TABLE_DISTRACTIONS: ClassVar[str] = 'table_distractions'
|
|
filter_assessment_types: 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_reinforcement_schedules: list = None
|
|
filter_response_quality_metrics: list = None
|
|
filter_training_techniques: 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()
|
|
|
|
user_session = datastore_dog.get_user_session()
|
|
|
|
# Assessments + filters
|
|
parameters_filter_assessment_type = Parameters_Assessment_Type.get_default()
|
|
self.filter_assessment_types, errors = datastore_dog.get_many_assessment_type(parameters_filter_assessment_type)
|
|
if len(self.filter_assessment_types) > 0:
|
|
self.form_filters.id_assessment_type.choices += [(str(assessment_type.id_type), assessment_type.name) for assessment_type in self.filter_assessment_types]
|
|
|
|
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(user_session.id_user)
|
|
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)
|
|
|
|
# Assessment Command Links + filters
|
|
parameters_filter_command = Parameters_Command.get_default(user_session.id_user)
|
|
self.filter_command_categories, self.filter_commands, errors = datastore_dog.get_many_command(parameters_filter_command)
|
|
|
|
parameters_filter_reinforcement_schedule = Parameters_Reinforcement_Schedule.get_default()
|
|
self.filter_reinforcement_schedules, errors = datastore_dog.get_many_reinforcement_schedule(parameters_filter_reinforcement_schedule)
|
|
|
|
parameters_filter_assessment_command_link = Parameters_Assessment_Command_Link.from_form_filters_assessment(self.form_filters)
|
|
assessment_command_links, errors = datastore_dog.get_many_assessment_command_link(parameters_filter_assessment_command_link)
|
|
|
|
# Assessment Command Modality Links
|
|
parameters_filter_command_modality = Parameters_Command_Modality.get_default()
|
|
self.filter_command_modalities, errors = datastore_dog.get_many_command_modality(parameters_filter_command_modality)
|
|
|
|
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 Command Technique Links
|
|
parameters_filter_training_technique = Parameters_Training_Technique.get_default()
|
|
self.filter_training_techniques, errors = datastore_dog.get_many_training_technique(parameters_filter_training_technique)
|
|
|
|
parameters_filter_assessment_command_technique_link = Parameters_Assessment_Command_Technique_Link.from_form_filters_assessment(self.form_filters)
|
|
assessment_command_technique_links, errors = datastore_dog.get_many_assessment_command_technique_link(parameters_filter_assessment_command_technique_link)
|
|
|
|
# Distractions + filters
|
|
parameters_filter_distraction_type = Parameters_Distraction_Type.get_default(user_session.id_user)
|
|
self.filter_distraction_types, errors = datastore_dog.get_many_distraction_type(parameters_filter_distraction_type)
|
|
|
|
parameters_filter_distraction_intensity_level = Parameters_Distraction_Intensity_Level.get_default(user_session.id_user)
|
|
self.filter_distraction_intensity_levels, errors = datastore_dog.get_many_distraction_intensity_level(parameters_filter_distraction_intensity_level)
|
|
|
|
parameters_filter_distraction = Parameters_Distraction.from_form_filters_assessment(self.form_filters)
|
|
distractions, errors = datastore_dog.get_many_distraction(parameters_filter_distraction)
|
|
|
|
# Assessment Responses and filters
|
|
parameters_filter_response_quality_metric = Parameters_Response_Quality_Metric.get_default(user_session.id_user)
|
|
self.filter_response_quality_metrics, errors = datastore_dog.get_many_response_quality_metric(parameters_filter_response_quality_metric)
|
|
|
|
parameters_filter_obedience_level = Parameters_Obedience_Level.get_default(user_session.id_user)
|
|
self.filter_obedience_levels, errors = datastore_dog.get_many_obedience_level(parameters_filter_obedience_level)
|
|
|
|
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_links)):
|
|
link = assessment_command_links[index_link]
|
|
link.assessment_command_modality_links = [assessment_command_modality_link for assessment_command_modality_link in assessment_command_modality_links if assessment_command_modality_link.id_assessment_command_link == link.id_link]
|
|
link.assessment_command_technique_links = [assessment_command_technique_link for assessment_command_technique_link in assessment_command_technique_links if assessment_command_technique_link.id_assessment_command_link == link.id_link]
|
|
link.distractions = [distraction for distraction in distractions if distraction.id_assessment_command_link == link.id_link]
|
|
link.assessment_responses = [response for response in assessment_responses if response.id_assessment_command_link == link.id_link]
|
|
assessment_command_links[index_link] = link
|
|
|
|
for index_assessment in range(len(self.assessments)):
|
|
assessment = self.assessments[index_assessment]
|
|
|
|
assessment.assessment_command_links = [link for link in assessment_command_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}')
|
|
|