Feat(SQL, UI): 1. Calc and Get Many Stored Procedures created for Weather, Lighting Level, Assessment, Distraction Type, Distraction Intensity Level, Distraction, Bribe, Assessment Command Modality Link, Response Quality Metric, Obedience Level, and Assessment Response. \n 2. Assessments and Assessment pages created with data loading and hooked up, but not saving.

This commit is contained in:
2025-07-24 16:48:18 +01:00
parent 6bb3a77a34
commit fad5336cc4
137 changed files with 10442 additions and 1116 deletions

2
app.py
View File

@@ -17,6 +17,7 @@ Initializes the Flask application, sets the configuration based on the environme
# IMPORTS # IMPORTS
# internal # internal
from config import app_config, Config from config import app_config, Config
from controllers.dog.assessment import routes_dog_assessment
from controllers.dog.button_icon import routes_dog_button_icon from controllers.dog.button_icon import routes_dog_button_icon
from controllers.dog.command import routes_dog_command from controllers.dog.command import routes_dog_command
from controllers.dog.command_button_link import routes_dog_command_button_link from controllers.dog.command_button_link import routes_dog_command_button_link
@@ -125,6 +126,7 @@ app.register_blueprint(routes_dog_home)
app.register_blueprint(routes_dog_location) app.register_blueprint(routes_dog_location)
app.register_blueprint(routes_dog_button_icon) app.register_blueprint(routes_dog_button_icon)
app.register_blueprint(routes_dog_command_button_link) app.register_blueprint(routes_dog_command_button_link)
app.register_blueprint(routes_dog_assessment)
app.register_blueprint(routes_legal) app.register_blueprint(routes_legal)
app.register_blueprint(routes_user) app.register_blueprint(routes_user)

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,190 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Bribe Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Bribe(SQLAlchemy_ABC, Base):
ATTR_ID_BRIBE: ClassVar[str] = 'id_bribe'
FLAG_BRIBE: ClassVar[str] = 'bribe'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_BRIBE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Bribe'
__table_args__ = { 'extend_existing': True }
id_bribe = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_bribe = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_bribe(cls, query_row):
_m = f'{cls.__qualname__}.from_db_bribe'
category = cls()
category.id_bribe = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
level = cls()
level.id_bribe = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
level = cls()
level.id_bribe = query_row[9]
level.name = query_row[10]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Bribe.from_json'
bribe = cls()
if json is None: return Bribe
# Helper_App.console_log(f'{_m}\njson: {json}')
bribe.id_bribe = json.get(cls.ATTR_ID_BRIBE, -1)
bribe.name = json[cls.FLAG_NAME]
bribe.code = json.get(cls.FLAG_CODE, bribe.name.upper().replace(" ", "_"))
bribe.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Bribe: {bribe}')
return bribe
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_BRIBE: self.id_bribe
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_BRIBE}: {self.id_bribe}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Bribe_Temp(db.Model, Base):
__tablename__ = 'DOG_Bribe_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_bribe = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_bribe(cls, bribe):
_m = 'Bribe_Temp.from_Bribe'
temp = cls()
temp.id_bribe = bribe.id_bribe
temp.code = bribe.code
temp.name = bribe.name
temp.active = bribe.active
return temp
class Parameters_Bribe(Get_Many_Parameters_Base):
get_all_bribe: bool
get_inactive_bribe: bool
ids_bribe: str
names_bribe: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_bribe = True
, get_inactive_bribe = False
, ids_bribe = ''
, names_bribe = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_bribe = json.get('a_get_all_bribe', False)
, get_inactive_bribe = json.get('a_get_inactive_bribe', False)
, ids_bribe = json.get('a_ids_bribe', '')
, names_bribe = json.get('a_names_bribe', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
"""
@classmethod
def from_form_filters_bribe(cls, form):
av.val_instance(form, 'form', 'Parameters_Bribe.from_form_filters_bribe', Filters_Bribe)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Bribe.from_form_filters_bribe")
filters = cls.get_default()
filters.get_all_bribe = True
filters.get_inactive_bribe = not active_only
filters.ids_bribe = ''
filters.names_bribe = form.search.data if has_filter_search_text else ''
filters.notes_bribe = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_bribe': self.get_all_bribe
, 'a_get_inactive_bribe': self.get_inactive_bribe
, 'a_ids_bribe': self.ids_bribe
, 'a_names_bribe': self.names_bribe
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}

View File

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

View File

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

View File

@@ -0,0 +1,190 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Command Modality Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Command_Modality(SQLAlchemy_ABC, Base):
ATTR_ID_COMMAND_MODALITY: ClassVar[str] = 'id_command_modality'
FLAG_COMMAND_MODALITY: ClassVar[str] = 'command-modality'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_COMMAND_MODALITY
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Command_Modality'
__table_args__ = { 'extend_existing': True }
id_command_modality = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_command_modality = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_command_modality(cls, query_row):
_m = f'{cls.__qualname__}.from_db_command_modality'
category = cls()
category.id_command_modality = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
level = cls()
level.id_command_modality = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_db_assessment_command_modality_link(cls, query_row):
_m = f'{cls.__qualname__}.from_db_assessment_command_modality_link'
level = cls()
level.id_command_modality = query_row[7]
level.name = query_row[8]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Command_Modality.from_json'
command_modality = cls()
if json is None: return Command_Modality
# Helper_App.console_log(f'{_m}\njson: {json}')
command_modality.id_command_modality = json.get(cls.ATTR_ID_COMMAND_MODALITY, -1)
command_modality.name = json[cls.FLAG_NAME]
command_modality.code = json.get(cls.FLAG_CODE, command_modality.name.upper().replace(" ", "_"))
command_modality.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Command_Modality: {command_modality}')
return command_modality
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_COMMAND_MODALITY: self.id_command_modality
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_COMMAND_MODALITY}: {self.id_command_modality}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Command_Modality_Temp(db.Model, Base):
__tablename__ = 'DOG_Command_Modality_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_command_modality = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_command_modality(cls, command_modality):
_m = 'Command_Modality_Temp.from_Command_Modality'
temp = cls()
temp.id_command_modality = command_modality.id_command_modality
temp.code = command_modality.code
temp.name = command_modality.name
temp.active = command_modality.active
return temp
class Parameters_Command_Modality(Get_Many_Parameters_Base):
get_all_command_modality: bool
get_inactive_command_modality: bool
ids_command_modality: str
names_command_modality: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_command_modality = True
, get_inactive_command_modality = False
, ids_command_modality = ''
, names_command_modality = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_command_modality = json.get('a_get_all_command_modality', False)
, get_inactive_command_modality = json.get('a_get_inactive_command_modality', False)
, ids_command_modality = json.get('a_ids_command_modality', '')
, names_command_modality = json.get('a_names_command_modality', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
"""
@classmethod
def from_form_filters_command_modality(cls, form):
av.val_instance(form, 'form', 'Parameters_Command_Modality.from_form_filters_command_modality', Filters_Command_Modality)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Command_Modality.from_form_filters_command_modality")
filters = cls.get_default()
filters.get_all_command_modality = True
filters.get_inactive_command_modality = not active_only
filters.ids_command_modality = ''
filters.names_command_modality = form.search.data if has_filter_search_text else ''
filters.notes_command_modality = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_command_modality': self.get_all_command_modality
, 'a_get_inactive_command_modality': self.get_inactive_command_modality
, 'a_ids_command_modality': self.ids_command_modality
, 'a_names_command_modality': self.names_command_modality
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}

View File

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

View File

@@ -0,0 +1,217 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Distraction Intensity Level Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Distraction_Intensity_Level(SQLAlchemy_ABC, Base):
ATTR_ID_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = 'id_intensity_level'
FLAG_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = 'distraction-intensity-level'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION_INTENSITY_LEVEL
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Distraction_Intensity_Level'
__table_args__ = { 'extend_existing': True }
id_intensity_level = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_intensity_level = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_distraction_intensity_level(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_intensity_level'
category = cls()
category.id_intensity_level = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction_emotional(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_emotional'
level = cls()
level.id_intensity_level = query_row[4]
level.name = query_row[5]
level.active = True
return level
@classmethod
def from_db_distraction_scent(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_scent'
level = cls()
level.id_intensity_level = query_row[6]
level.name = query_row[7]
level.active = True
return level
@classmethod
def from_db_distraction_sight(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_sight'
level = cls()
level.id_intensity_level = query_row[8]
level.name = query_row[9]
level.active = True
return level
@classmethod
def from_db_distraction_sound(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_sound'
level = cls()
level.id_intensity_level = query_row[10]
level.name = query_row[11]
level.active = True
return level
@classmethod
def from_db_distraction_touch(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_touch'
level = cls()
level.id_intensity_level = query_row[12]
level.name = query_row[13]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Distraction_Intensity_Level.from_json'
distraction_intensity_level = cls()
if json is None: return Distraction_Intensity_Level
# Helper_App.console_log(f'{_m}\njson: {json}')
distraction_intensity_level.id_intensity_level = json.get(cls.ATTR_ID_DISTRACTION_INTENSITY_LEVEL, -1)
distraction_intensity_level.name = json[cls.FLAG_NAME]
distraction_intensity_level.code = json.get(cls.FLAG_CODE, distraction_intensity_level.name.upper().replace(" ", "_"))
distraction_intensity_level.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Distraction_Intensity_Level: {distraction_intensity_level}')
return distraction_intensity_level
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_DISTRACTION_INTENSITY_LEVEL: self.id_intensity_level
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_DISTRACTION_INTENSITY_LEVEL}: {self.id_intensity_level}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Distraction_Intensity_Level_Temp(db.Model, Base):
__tablename__ = 'DOG_Distraction_Intensity_Level_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_intensity_level = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_distraction_intensity_level(cls, distraction_intensity_level):
_m = 'Distraction_Intensity_Level_Temp.from_Distraction_Intensity_Level'
temp = cls()
temp.id_intensity_level = distraction_intensity_level.id_intensity_level
temp.code = distraction_intensity_level.code
temp.name = distraction_intensity_level.name
temp.active = distraction_intensity_level.active
return temp
class Parameters_Distraction_Intensity_Level(Get_Many_Parameters_Base):
get_all_distraction_intensity_level: bool
get_inactive_distraction_intensity_level: bool
ids_distraction_intensity_level: str
names_distraction_intensity_level: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_distraction_intensity_level = True
, get_inactive_distraction_intensity_level = False
, ids_distraction_intensity_level = ''
, names_distraction_intensity_level = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_distraction_intensity_level = json.get('a_get_all_distraction_intensity_level', False)
, get_inactive_distraction_intensity_level = json.get('a_get_inactive_distraction_intensity_level', False)
, ids_distraction_intensity_level = json.get('a_ids_distraction_intensity_level', '')
, names_distraction_intensity_level = json.get('a_names_distraction_intensity_level', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
"""
@classmethod
def from_form_filters_distraction_intensity_level(cls, form):
av.val_instance(form, 'form', 'Parameters_Distraction_Intensity_Level.from_form_filters_distraction_intensity_level', Filters_Distraction_Intensity_Level)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Distraction_Intensity_Level.from_form_filters_distraction_intensity_level")
filters = cls.get_default()
filters.get_all_distraction_intensity_level = True
filters.get_inactive_distraction_intensity_level = not active_only
filters.ids_distraction_intensity_level = ''
filters.names_distraction_intensity_level = form.search.data if has_filter_search_text else ''
filters.notes_distraction_intensity_level = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_distraction_intensity_level': self.get_all_distraction_intensity_level
, 'a_get_inactive_distraction_intensity_level': self.get_inactive_distraction_intensity_level
, 'a_ids_distraction_intensity_level': self.ids_distraction_intensity_level
, 'a_names_distraction_intensity_level': self.names_distraction_intensity_level
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}

View File

@@ -0,0 +1,181 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Distraction Type Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Distraction_Type(SQLAlchemy_ABC, Base):
ATTR_ID_DISTRACTION_TYPE: ClassVar[str] = 'id_distraction_type'
FLAG_DISTRACTION_TYPE: ClassVar[str] = 'distraction-type'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = ATTR_ID_DISTRACTION_TYPE
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Distraction_Type'
__table_args__ = { 'extend_existing': True }
id_distraction_type = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
def __init__(self):
self.id_distraction_type = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_distraction_type(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction_type'
category = cls()
category.id_distraction_type = query_row[0]
category.code = query_row[1]
category.name = query_row[2]
category.active = av.input_bool(query_row[3], 'active', _m)
# command.created_on = query_row[7]
return category
@classmethod
def from_db_distraction(cls, query_row):
_m = f'{cls.__qualname__}.from_db_distraction'
level = cls()
level.id_distraction_type = query_row[2]
level.name = query_row[3]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = 'Distraction_Type.from_json'
distraction_type = cls()
if json is None: return Distraction_Type
# Helper_App.console_log(f'{_m}\njson: {json}')
distraction_type.id_distraction_type = json.get(cls.ATTR_ID_DISTRACTION_TYPE, -1)
distraction_type.name = json[cls.FLAG_NAME]
distraction_type.code = json.get(cls.FLAG_CODE, distraction_type.name.upper().replace(" ", "_"))
distraction_type.active = json[cls.FLAG_ACTIVE]
# Helper_App.console_log(f'Distraction_Type: {distraction_type}')
return distraction_type
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_DISTRACTION_TYPE: self.id_distraction_type
, self.FLAG_CODE: self.code
, self.FLAG_NAME: self.name
, self.FLAG_ACTIVE: self.active
}
# Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_DISTRACTION_TYPE}: {self.id_distraction_type}
{self.FLAG_CODE}: {self.code}
{self.FLAG_NAME}: {self.name}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Distraction_Type_Temp(db.Model, Base):
__tablename__ = 'DOG_Distraction_Type_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_distraction_type = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_distraction_type(cls, distraction_type):
_m = 'Distraction_Type_Temp.from_Distraction_Type'
temp = cls()
temp.id_distraction_type = distraction_type.id_distraction_type
temp.code = distraction_type.code
temp.name = distraction_type.name
temp.active = distraction_type.active
return temp
class Parameters_Distraction_Type(Get_Many_Parameters_Base):
get_all_distraction_type: bool
get_inactive_distraction_type: bool
ids_distraction_type: str
names_distraction_type: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_distraction_type = True
, get_inactive_distraction_type = False
, ids_distraction_type = ''
, names_distraction_type = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_distraction_type = json.get('a_get_all_distraction_type', False)
, get_inactive_distraction_type = json.get('a_get_inactive_distraction_type', False)
, ids_distraction_type = json.get('a_ids_distraction_type', '')
, names_distraction_type = json.get('a_names_distraction_type', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
"""
@classmethod
def from_form_filters_distraction_type(cls, form):
av.val_instance(form, 'form', 'Parameters_Distraction_Type.from_form_filters_distraction_type', Filters_Distraction_Type)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Distraction_Type.from_form_filters_distraction_type")
filters = cls.get_default()
filters.get_all_distraction_type = True
filters.get_inactive_distraction_type = not active_only
filters.ids_distraction_type = ''
filters.names_distraction_type = form.search.data if has_filter_search_text else ''
filters.notes_distraction_type = form.search.data if has_filter_search_text else ''
return filters
"""
def to_json(self):
return {
'a_get_all_distraction_type': self.get_all_distraction_type
, 'a_get_inactive_distraction_type': self.get_inactive_distraction_type
, 'a_ids_distraction_type': self.ids_distraction_type
, 'a_names_distraction_type': self.names_distraction_type
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,224 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Unit Measurement Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Unit_Measurement(SQLAlchemy_ABC, Base):
ATTR_ID_UNIT_MEASUREMENT: ClassVar[str] = "id_unit_measurement"
FLAG_IS_BASE_UNIT: ClassVar[str] = "is-base-unit"
FLAG_IS_UNIT_OF_DISTANCE: ClassVar[str] = "is-unit-of-distance"
FLAG_IS_UNIT_OF_MASS: ClassVar[str] = "is-unit-of-mass"
FLAG_IS_UNIT_OF_TIME: ClassVar[str] = "is-unit-of-time"
FLAG_IS_UNIT_OF_VOLUME: ClassVar[str] = "is-unit-of-volume"
FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX: ClassVar[str] = "symbol-is-suffix-not-prefix"
FLAG_UNIT_MEASUREMENT: ClassVar[str] = 'unit-measurement'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = FLAG_UNIT_MEASUREMENT
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_SYMBOL
__tablename__ = 'DOG_Unit_Measurement'
__table_args__ = { 'extend_existing': True }
id_unit_measurement = db.Column(db.Integer, primary_key=True)
name_singular = db.Column(db.String(250))
name_plural = db.Column(db.String(250))
symbol = db.Column(db.String(50))
symbol_is_suffix_not_prefix = db.Column(db.Boolean)
is_base_unit = db.Column(db.Boolean)
is_unit_of_distance = db.Column(db.Boolean)
is_unit_of_mass = db.Column(db.Boolean)
is_unit_of_time = db.Column(db.Boolean)
is_unit_of_volume = db.Column(db.Boolean)
active = db.Column(db.Boolean)
def __init__(self):
self.id_unit_measurement = 0
self.is_new = False
super().__init__()
@classmethod
def from_db_unit_measurement(cls, query_row):
_m = f'{cls.__qualname__}.from_db_unit_measurement'
level = cls()
level.id_unit_measurement = query_row[0]
level.name_singular = query_row[1]
level.name_plural = query_row[2]
level.symbol = query_row[3]
level.symbol_is_suffix_not_prefix = query_row[4]
level.is_base_unit = query_row[5]
level.is_unit_of_distance = query_row[6]
level.is_unit_of_mass = query_row[7]
level.is_unit_of_time = query_row[8]
level.is_unit_of_volume = query_row[9]
level.active = True
return level
@classmethod
def from_db_response_quality_metric(cls, query_row):
_m = f'{cls.__qualname__}.from_db_response_quality_metric'
level = cls()
level.id_unit_measurement = query_row[1]
level.name_singular = query_row[2]
level.name_plural = query_row[3]
level.symbol = query_row[4]
level.active = True
return level
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
unit_measurement = cls()
if json is None: return Unit_Measurement
Helper_App.console_log(f'{_m}\njson: {json}')
unit_measurement.id_unit_measurement = json.get(Unit_Measurement.ATTR_ID_UNIT_MEASUREMENT, -1)
unit_measurement.name_singular = json[cls.FLAG_NAME_SINGULAR]
unit_measurement.name_plural = json[cls.FLAG_NAME_PLURAL]
unit_measurement.symbol = json[cls.FLAG_SYMBOL]
unit_measurement.symbol_is_suffix_not_prefix = json[cls.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX]
unit_measurement.is_base_unit = json[cls.FLAG_IS_BASE_UNIT]
unit_measurement.is_unit_of_distance = json[cls.FLAG_IS_UNIT_OF_DISTANCE]
unit_measurement.is_unit_of_mass = json[cls.FLAG_IS_UNIT_OF_MASS]
unit_measurement.is_unit_of_time = json[cls.FLAG_IS_UNIT_OF_TIME]
unit_measurement.is_unit_of_volume = json[cls.FLAG_IS_UNIT_OF_VOLUME]
unit_measurement.active = json[cls.FLAG_ACTIVE]
Helper_App.console_log(f'Unit_Measurement: {unit_measurement}')
return unit_measurement
def to_json(self):
as_json = {
**self.get_shared_json_attributes(self)
, self.ATTR_ID_UNIT_MEASUREMENT: self.id_unit_measurement
, self.FLAG_NAME_SINGULAR: self.name_singular
, self.FLAG_NAME_PLURAL: self.name_plural
, self.FLAG_SYMBOL: self.symbol
, self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX: self.symbol_is_suffix_not_prefix
, self.FLAG_IS_BASE_UNIT: self.is_base_unit
, self.FLAG_IS_UNIT_OF_DISTANCE: self.is_unit_of_distance
, self.FLAG_IS_UNIT_OF_MASS: self.is_unit_of_mass
, self.FLAG_IS_UNIT_OF_TIME: self.is_unit_of_time
, self.FLAG_IS_UNIT_OF_VOLUME: self.is_unit_of_volume
, self.FLAG_ACTIVE: self.active
}
Helper_App.console_log(f'as_json: {as_json}')
return as_json
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_UNIT_MEASUREMENT}: {self.id_unit_measurement}
{self.FLAG_NAME_SINGULAR}: {self.name_singular}
{self.FLAG_NAME_PLURAL}: {self.name_plural}
{self.FLAG_SYMBOL}: {self.symbol}
{self.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX}: {self.symbol_is_suffix_not_prefix}
{self.FLAG_IS_BASE_UNIT}: {self.is_base_unit}
{self.FLAG_IS_UNIT_OF_DISTANCE}: {self.is_unit_of_distance}
{self.FLAG_IS_UNIT_OF_MASS}: {self.is_unit_of_mass}
{self.FLAG_IS_UNIT_OF_TIME}: {self.is_unit_of_time}
{self.FLAG_IS_UNIT_OF_VOLUME}: {self.is_unit_of_volume}
{self.FLAG_ACTIVE}: {self.active}
)
'''
class Unit_Measurement_Temp(db.Model, Base):
__tablename__ = 'DOG_Unit_Measurement_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_unit_measurement = db.Column(db.Integer)
code = db.Column(db.String(250))
name = db.Column(db.String(250))
active = db.Column(db.Boolean)
guid: str = db.Column(db.String(36))
def __init__(self):
super().__init__()
@classmethod
def from_unit_measurement(cls, unit_measurement):
_m = 'Unit_Measurement_Temp.from_Unit_Measurement'
temp = cls()
temp.id_unit_measurement = unit_measurement.id_unit_measurement
temp.code = unit_measurement.code
temp.name = unit_measurement.name
temp.active = unit_measurement.active
return temp
"""
class Parameters_Unit_Measurement(Get_Many_Parameters_Base):
get_all_unit_measurement: bool
get_inactive_unit_measurement: bool
ids_unit_measurement: str
names_unit_measurement: str
require_all_id_search_filters_met: bool
require_any_id_search_filters_met: bool
require_all_non_id_search_filters_met: bool
require_any_non_id_search_filters_met: bool
@classmethod
def get_default(cls):
return cls(
get_all_unit_measurement = True
, get_inactive_unit_measurement = False
, ids_unit_measurement = ''
, names_unit_measurement = ''
, require_all_id_search_filters_met = True
, require_any_id_search_filters_met = True
, require_all_non_id_search_filters_met = False
, require_any_non_id_search_filters_met = True
)
@classmethod
def from_json(cls, json):
return cls(
get_all_unit_measurement = json.get('a_get_all_unit_measurement', False)
, get_inactive_unit_measurement = json.get('a_get_inactive_unit_measurement', False)
, ids_unit_measurement = json.get('a_ids_unit_measurement', '')
, names_unit_measurement = json.get('a_names_unit_measurement', '')
, require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True)
, require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True)
, require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False)
, require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True)
)
"" "
@classmethod
def from_form_filters_unit_measurement(cls, form):
av.val_instance(form, 'form', 'Parameters_Unit_Measurement.from_form_filters_unit_measurement', Filters_Unit_Measurement)
has_filter_search_text = not (form.search.data == '' or form.search.data is None)
active_only = av.input_bool(form.active_only.data, "active", "Parameters_Unit_Measurement.from_form_filters_unit_measurement")
filters = cls.get_default()
filters.get_all_unit_measurement = True
filters.get_inactive_unit_measurement = not active_only
filters.ids_unit_measurement = ''
filters.names_unit_measurement = form.search.data if has_filter_search_text else ''
filters.notes_unit_measurement = form.search.data if has_filter_search_text else ''
return filters
"" "
def to_json(self):
return {
'a_get_all_unit_measurement': self.get_all_unit_measurement
, 'a_get_inactive_unit_measurement': self.get_inactive_unit_measurement
, 'a_ids_unit_measurement': self.ids_unit_measurement
, 'a_names_unit_measurement': self.names_unit_measurement
, 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met
, 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met
, 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met
, 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met
}
"""

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,118 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: App Routing
Feature: Dog - Assessment Routes
Description:
Dog Assessments Page Controller.
"""
# IMPORTS
# internal
from business_objects.api import API
from business_objects.dog.command import Command
from business_objects.dog.assessment import Assessment
from datastores.datastore_dog import DataStore_Dog
from forms.dog.assessment import Filters_Assessment
from helpers.helper_app import Helper_App
from models.model_view_dog_assessment import Model_View_Dog_Assessment
from models.model_view_home import Model_View_Home
import lib.argument_validation as av
# external
from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app, flash
from flask_mail import Mail, Message
from extensions import db, oauth, mail
from urllib.parse import quote_plus, urlencode
from authlib.integrations.flask_client import OAuth
from authlib.integrations.base_client import OAuthError
from urllib.parse import quote, urlparse, parse_qs
import json
import base64
import hmac
import hashlib
import datetime
from altcha import ChallengeOptions, create_challenge, verify_solution
routes_dog_assessment = Blueprint('routes_dog_assessment', __name__)
@routes_dog_assessment.route(Model_View_Dog_Assessment.HASH_PAGE_DOG_ASSESSMENTS, methods=['GET'])
def assessments():
Helper_App.console_log('assessments')
Helper_App.console_log(f'request_args: {request.args}')
try:
form_filters = Filters_Assessment.from_json(request.args)
except Exception as e:
Helper_App.console_log(f'Error: {e}')
form_filters = Filters_Assessment()
Helper_App.console_log(f'form_filters={form_filters}')
model = Model_View_Dog_Assessment(form_filters_old = form_filters)
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_assessments.html', model = model)
@routes_dog_assessment.route(Model_View_Dog_Assessment.HASH_SAVE_DOG_ASSESSMENT, methods=['POST'])
def save_assessment():
data = Helper_App.get_request_data(request)
try:
form_filters = Filters_Assessment.from_json(data[Model_View_Dog_Assessment.FLAG_FORM_FILTERS])
if not form_filters.validate_on_submit():
return jsonify({
Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE,
Model_View_Dog_Assessment.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}'
})
model_return = Model_View_Dog_Assessment(form_filters_old=form_filters)
if not model_return.is_user_logged_in:
raise Exception('User not logged in')
assessments = data[Model_View_Dog_Assessment.FLAG_ASSESSMENT]
if len(assessments) == 0:
return jsonify({
Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE,
Model_View_Dog_Assessment.FLAG_MESSAGE: f'No assessments.'
})
objs_assessment = []
for assessment in assessments:
objs_assessment.append(Assessment.from_json(assessment))
Helper_App.console_log(f'objs_assessment={objs_assessment}')
errors = DataStore_Dog.save_assessments(data.get('comment', 'No comment'), objs_assessment)
if (len(errors) > 0):
return jsonify({
Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE,
Model_View_Dog_Assessment.FLAG_MESSAGE: f'Error saving assessments.\n{model_return.convert_list_objects_to_json(errors)}'
})
return jsonify({
Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_SUCCESS,
Model_View_Dog_Assessment.FLAG_DATA: Model_View_Dog_Assessment.convert_list_objects_to_json(model_return.assessments)
})
except Exception as e:
return jsonify({
Model_View_Dog_Assessment.FLAG_STATUS: Model_View_Dog_Assessment.FLAG_FAILURE,
Model_View_Dog_Assessment.FLAG_MESSAGE: f'Bad data received by controller.\n{e}'
})
@routes_dog_assessment.route(Model_View_Dog_Assessment.HASH_PAGE_DOG_ASSESSMENT, methods=['GET'])
def assessment():
Helper_App.console_log('assessment:')
Helper_App.console_log(f'request_args: {request.args}')
try:
form_filters = Filters_Assessment.from_json(request.args)
except Exception as e:
Helper_App.console_log(f'Error: {e}')
form_filters = Filters_Assessment()
Helper_App.console_log(f'form_filters={form_filters}')
id_assessment = request.args.get(Model_View_Dog_Assessment.ATTR_ID_ASSESSMENT, None)
model = Model_View_Dog_Assessment(form_filters_old = form_filters, id_assessment = id_assessment, hash_page_current = Model_View_Dog_Assessment.HASH_PAGE_DOG_ASSESSMENT)
model._title = 'Assessment'
if model.assessments is None or len(model.assessments) == 0:
return assessments()
if not model.is_user_logged_in:
return redirect(url_for('routes_core_home.home'))
Helper_App.console_log(f'form_filters={form_filters}')
return render_template('pages/dog/_assessment.html', model = model)

View File

@@ -13,16 +13,27 @@ Datastore for Users
# internal # internal
# from routes import bp_home # from routes import bp_home
import lib.argument_validation as av import lib.argument_validation as av
from business_objects.dog.assessment import Assessment, Assessment_Temp
from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link, Assessment_Command_Modality_Link_Temp
from business_objects.dog.assessment_response import Assessment_Response, Assessment_Response_Temp
from business_objects.dog.bribe import Bribe, Bribe_Temp
from business_objects.dog.button_icon import Button_Icon, Button_Icon_Temp from business_objects.dog.button_icon import Button_Icon, Button_Icon_Temp
from business_objects.dog.button_shape import Button_Shape, Button_Shape_Temp from business_objects.dog.button_shape import Button_Shape, Button_Shape_Temp
from business_objects.dog.colour import Colour, Colour_Temp from business_objects.dog.colour import Colour, Colour_Temp
from business_objects.dog.command import Command, Command_Temp from business_objects.dog.command import Command, Command_Temp
from business_objects.dog.command_button_link import Command_Button_Link, Command_Button_Link_Temp from business_objects.dog.command_button_link import Command_Button_Link, Command_Button_Link_Temp
from business_objects.dog.command_category import Command_Category, Command_Category_Temp from business_objects.dog.command_category import Command_Category, Command_Category_Temp
from business_objects.dog.command_modality import Command_Modality, Command_Modality_Temp
from business_objects.dog.distraction import Distraction, Distraction_Temp
from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level, Distraction_Intensity_Level_Temp
from business_objects.dog.distraction_type import Distraction_Type, Distraction_Type_Temp
from business_objects.dog.dog import Dog from business_objects.dog.dog import Dog
from business_objects.dog.dog_command_link import Dog_Command_Link, Dog_Command_Link_Temp from business_objects.dog.dog_command_link import Dog_Command_Link, Dog_Command_Link_Temp
from business_objects.dog.command_button_link import Command_Button_Link, Command_Button_Link_Temp from business_objects.dog.lighting_level import Lighting_Level, Lighting_Level_Temp
from business_objects.dog.location import Location, Location_Temp from business_objects.dog.location import Location, Location_Temp
from business_objects.dog.obedience_level import Obedience_Level, Obedience_Level_Temp
from business_objects.dog.response_quality_metric import Response_Quality_Metric, Response_Quality_Metric_Temp
from business_objects.dog.weather import Weather, Weather_Temp
from business_objects.sql_error import SQL_Error from business_objects.sql_error import SQL_Error
from datastores.datastore_base import DataStore_Base from datastores.datastore_base import DataStore_Base
from helpers.helper_app import Helper_App from helpers.helper_app import Helper_App
@@ -632,3 +643,460 @@ class DataStore_Dog(DataStore_Base):
cls.db_cursor_clear(cursor) cls.db_cursor_clear(cursor)
return errors return errors
@classmethod
def get_many_assessment(cls, filters_assessment):
_m = f'{cls.__qualname__}.get_many_assessment'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_assessment.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_assessment', argument_dict)
cursor = result.cursor
# Assessments
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw assessments: {result_set_1}')
assessments = []
assessment_indexes = {}
for row in result_set_1:
new_assessment = Assessment.from_db_assessment(row)
assessment_indexes[new_assessment.id_assessment] = len(assessments)
assessments.append(new_assessment)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return assessments, errors
@classmethod
def get_many_weather(cls, filters_weather):
_m = f'{cls.__qualname__}.get_many_weather'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_weather.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_weather', argument_dict)
cursor = result.cursor
# Weathers
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw weathers: {result_set_1}')
weathers = []
weather_indexes = {}
for row in result_set_1:
new_weather = Weather.from_db_weather(row)
weather_indexes[new_weather.id_weather] = len(weathers)
weathers.append(new_weather)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return weathers, errors
@classmethod
def get_many_lighting_level(cls, filters_lighting_level):
_m = f'{cls.__qualname__}.get_many_lighting_level'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_lighting_level.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_lighting_level', argument_dict)
cursor = result.cursor
# Lighting_Levels
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw lighting_levels: {result_set_1}')
lighting_levels = []
lighting_level_indexes = {}
for row in result_set_1:
new_lighting_level = Lighting_Level.from_db_lighting_level(row)
lighting_level_indexes[new_lighting_level.id_lighting_level] = len(lighting_levels)
lighting_levels.append(new_lighting_level)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return lighting_levels, errors
@classmethod
def get_many_distraction_type(cls, filters_distraction_type):
_m = f'{cls.__qualname__}.get_many_distraction_type'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_distraction_type.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_distraction_type', argument_dict)
cursor = result.cursor
# Distraction_Types
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw distraction_types: {result_set_1}')
distraction_types = []
distraction_type_indexes = {}
for row in result_set_1:
new_distraction_type = Distraction_Type.from_db_distraction_type(row)
distraction_type_indexes[new_distraction_type.id_distraction_type] = len(distraction_types)
distraction_types.append(new_distraction_type)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return distraction_types, errors
@classmethod
def get_many_distraction_intensity_level(cls, filters_distraction_intensity_level):
_m = f'{cls.__qualname__}.get_many_distraction_intensity_level'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_distraction_intensity_level.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_distraction_intensity_level', argument_dict)
cursor = result.cursor
# Distraction_Intensity_Levels
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw distraction_intensity_levels: {result_set_1}')
distraction_intensity_levels = []
distraction_intensity_level_indexes = {}
for row in result_set_1:
new_distraction_intensity_level = Distraction_Intensity_Level.from_db_distraction_intensity_level(row)
distraction_intensity_level_indexes[new_distraction_intensity_level.id_intensity_level] = len(distraction_intensity_levels)
distraction_intensity_levels.append(new_distraction_intensity_level)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return distraction_intensity_levels, errors
@classmethod
def get_many_distraction(cls, filters_distraction):
_m = f'{cls.__qualname__}.get_many_distraction'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_distraction.to_json()
, 'a_show_errors': 1
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_distraction', argument_dict)
cursor = result.cursor
# Distractions
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw distractions: {result_set_1}')
distractions = []
distraction_indexes = {}
for row in result_set_1:
new_distraction = Distraction.from_db_distraction(row)
distraction_indexes[new_distraction.id_distraction] = len(distractions)
distractions.append(new_distraction)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return distractions, errors
@classmethod
def get_many_command_modality(cls, filters_command_modality):
_m = f'{cls.__qualname__}.get_many_command_modality'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_command_modality.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_command_modality', argument_dict)
cursor = result.cursor
# Command_Modalities
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw command_modalities: {result_set_1}')
command_modalities = []
command_modality_indexes = {}
for row in result_set_1:
new_command_modality = Command_Modality.from_db_command_modality(row)
command_modality_indexes[new_command_modality.id_command_modality] = len(command_modalities)
command_modalities.append(new_command_modality)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return command_modalities, errors
@classmethod
def get_many_bribe(cls, filters_bribe):
_m = f'{cls.__qualname__}.get_many_bribe'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_bribe.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_bribe', argument_dict)
cursor = result.cursor
# Bribes
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw bribes: {result_set_1}')
bribes = []
bribe_indexes = {}
for row in result_set_1:
new_bribe = Bribe.from_db_bribe(row)
bribe_indexes[new_bribe.id_bribe] = len(bribes)
bribes.append(new_bribe)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return bribes, errors
@classmethod
def get_many_assessment_command_modality_link(cls, filters_assessment_command_modality_link):
_m = f'{cls.__qualname__}.get_many_assessment_command_modality_link'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_assessment_command_modality_link.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_assessment_command_modality_link', argument_dict)
cursor = result.cursor
# Assessment_Command_Modality_Links
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw assessment_command_modality_links: {result_set_1}')
assessment_command_modality_links = []
assessment_command_modality_link_indexes = {}
for row in result_set_1:
new_assessment_command_modality_link = Assessment_Command_Modality_Link.from_db_assessment_command_modality_link(row)
assessment_command_modality_link_indexes[new_assessment_command_modality_link.id_link] = len(assessment_command_modality_links)
assessment_command_modality_links.append(new_assessment_command_modality_link)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return assessment_command_modality_links, errors
@classmethod
def get_many_response_quality_metric(cls, filters_response_quality_metric):
_m = f'{cls.__qualname__}.get_many_response_quality_metric'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_response_quality_metric.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_response_quality_metric', argument_dict)
cursor = result.cursor
# Command_Modalities
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw command_modalities: {result_set_1}')
command_modalities = []
response_quality_metric_indexes = {}
for row in result_set_1:
new_response_quality_metric = Response_Quality_Metric.from_db_response_quality_metric(row)
response_quality_metric_indexes[new_response_quality_metric.id_response_quality_metric] = len(command_modalities)
command_modalities.append(new_response_quality_metric)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return command_modalities, errors
@classmethod
def get_many_obedience_level(cls, filters_obedience_level):
_m = f'{cls.__qualname__}.get_many_obedience_level'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_obedience_level.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_obedience_level', argument_dict)
cursor = result.cursor
# Command_Modalities
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw command_modalities: {result_set_1}')
command_modalities = []
obedience_level_indexes = {}
for row in result_set_1:
new_obedience_level = Obedience_Level.from_db_obedience_level(row)
obedience_level_indexes[new_obedience_level.id_obedience_level] = len(command_modalities)
command_modalities.append(new_obedience_level)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return command_modalities, errors
@classmethod
def get_many_assessment_response(cls, filters_assessment_response):
_m = f'{cls.__qualname__}.get_many_assessment_response'
user = cls.get_user_session()
argument_dict = {
'a_id_user': user.id_user
, **filters_assessment_response.to_json()
, 'a_debug': 0
}
Helper_App.console_log(f'argument_dict: {argument_dict}')
result = cls.db_procedure_execute('p_dog_get_many_assessment_response', argument_dict)
cursor = result.cursor
# Assessment_Responses
result_set_1 = cursor.fetchall()
Helper_App.console_log(f'raw assessment_responses: {result_set_1}')
assessment_responses = []
assessment_response_indexes = {}
for row in result_set_1:
new_assessment_response = Assessment_Response.from_db_assessment_response(row)
assessment_response_indexes[new_assessment_response.id_response] = len(assessment_responses)
assessment_responses.append(new_assessment_response)
# Errors
cursor.nextset()
result_set_e = cursor.fetchall()
Helper_App.console_log(f'raw errors: {result_set_e}')
errors = []
if len(result_set_e) > 0:
errors = [SQL_Error.from_db_record(row) for row in result_set_e]
for error in errors:
Helper_App.console_log(f"Error [{error.code}]: {error.msg}")
cls.db_cursor_clear(cursor)
return assessment_responses, errors

View File

@@ -96,7 +96,7 @@ class DataStore_User(DataStore_Base):
if len(result_set) > 0: if len(result_set) > 0:
for row in result_set: for row in result_set:
Helper_App.console_log(f'row: {row}') Helper_App.console_log(f'row: {row}')
user = User.from_DB_user(row) user = User.from_db_user(row)
users.append(user) users.append(user)
Helper_App.console_log(f'user {str(type(user))}: {user}') Helper_App.console_log(f'user {str(type(user))}: {user}')

151
forms/dog/assessment.py Normal file
View File

@@ -0,0 +1,151 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Backend
Feature: Assessment Form
Description:
Defines Flask-WTF form for handling user input on Assessments page.
"""
# IMPORTS
# internal
from business_objects.base import Base
"""
from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level
from business_objects.dog.distraction_type import Distraction_Type
from business_objects.dog.command import Lighting_Level
from business_objects.dog.command_category import Lighting_Level
from business_objects.dog.lighting_level import Lighting_Level
from business_objects.dog.lighting_level import Lighting_Level
"""
from business_objects.dog.lighting_level import Lighting_Level
from business_objects.dog.location import Location
from business_objects.dog.weather import Weather
from helpers.helper_app import Helper_App
# from models.model_view_store import Model_View_Store # circular
# from models.model_view_base import Model_View_Base
from forms.base import Form_Base
import lib.argument_validation as av
# external
from flask import Flask, render_template, request, flash, redirect, url_for, current_app
from flask_wtf import FlaskForm
from wtforms import SelectField, BooleanField, StringField, SubmitField
from wtforms.validators import DataRequired, Email, ValidationError
import markupsafe
from flask_wtf.recaptcha import RecaptchaField
from abc import ABCMeta, abstractmethod
import json
from typing import ClassVar
class Filters_Assessment(Form_Base):
ATTR_ID_ASSESSMENT: ClassVar[str] = 'id_assessment'
FLAG_USER_HANDLER: ClassVar[str] = 'id_user_handler'
search = StringField(
'Search'
)
id_assessment = SelectField(
'Assessment'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_weather = SelectField(
'Weather'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_lighting_level = SelectField(
'Lighting Level'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_location = SelectField(
'Location'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_user_handler = SelectField(
'Handler'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
"""
id_distraction_type = SelectField(
'Distraction Type'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_intensity_level_emotional = SelectField(
'Intensity Level Emotional'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_intensity_level_scent = SelectField(
'Intensity Level Scent'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_intensity_level_sight = SelectField(
'Intensity Level Sight'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_intensity_level_sound = SelectField(
'Intensity Level Sound'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_intensity_level_touch = SelectField(
'Intensity Level Touch'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_command_category = SelectField(
'Command Category'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_command = SelectField(
'Command'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_command_modality = SelectField(
'Command Modality'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
id_bribe = SelectField(
'Bribe'
, choices = [Form_Base.get_select_option_all()]
, default = Form_Base.get_select_option_default_value()
)
"""
active_only = BooleanField(
'Active'
, default = True
)
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
Helper_App.console_log(f'{_m}\njson: {json}')
filters = cls()
filters.search.data = json[Base.FLAG_SEARCH]
filters.id_assessment.data = json[cls.ATTR_ID_ASSESSMENT]
filters.id_weather.data = json[Weather.ATTR_ID_WEATHER]
filters.id_lighting_level.data = json[Lighting_Level.ATTR_ID_LIGHTING_LEVEL]
filters.id_location.data = json[Location.ATTR_ID_LOCATION]
filters.id_user_handler.data = json[cls.FLAG_USER_HANDLER]
# filters.id_distraction_type = json[Distraction_Type.ATTR_ID_DISTRACTION_TYPE]
filters.active_only.data = av.input_bool(json[Base.FLAG_ACTIVE_ONLY], Base.FLAG_ACTIVE_ONLY, f'{cls.__name__}.from_json')
return filters
def to_json(self):
return {
Base.FLAG_SEARCH: self.search.data
, Base.FLAG_ACTIVE_ONLY: self.active_only.data
}

View File

@@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base
# external # external
class Model_View_Accessibility_Report(Model_View_Base): class Model_View_Accessibility_Report(Model_View_Base):
@property
def title(self):
return 'Accessibility Report'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_ACCESSIBILITY_REPORT): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_ACCESSIBILITY_REPORT):
super().__init__(hash_page_current=hash_page_current) super().__init__(hash_page_current=hash_page_current)
self._title = 'Accessibility Report'

View File

@@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base
# external # external
class Model_View_Accessibility_Statement(Model_View_Base): class Model_View_Accessibility_Statement(Model_View_Base):
@property
def title(self):
return 'Accessibility Statement'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_ACCESSIBILITY_STATEMENT): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_ACCESSIBILITY_STATEMENT):
super().__init__(hash_page_current=hash_page_current) super().__init__(hash_page_current=hash_page_current)
self._title = 'Accessibility Statement'

View File

@@ -19,17 +19,29 @@ Base data model for views
# from routes import bp_home # from routes import bp_home
from business_objects.base import Base from business_objects.base import Base
from business_objects.file_type import File_Type from business_objects.file_type import File_Type
from business_objects.dog.assessment import Assessment
from business_objects.dog.assessment_command_modality_link import Assessment_Command_Modality_Link
from business_objects.dog.assessment_response import Assessment_Response
from business_objects.dog.bribe import Bribe
from business_objects.dog.button_icon import Button_Icon from business_objects.dog.button_icon import Button_Icon
from business_objects.dog.button_shape import Button_Shape from business_objects.dog.button_shape import Button_Shape
from business_objects.dog.colour import Colour from business_objects.dog.colour import Colour
from business_objects.dog.command import Command from business_objects.dog.command import Command
from business_objects.dog.command_button_link import Command_Button_Link from business_objects.dog.command_button_link import Command_Button_Link
from business_objects.dog.command_category import Command_Category from business_objects.dog.command_category import Command_Category
from business_objects.dog.command_modality import Command_Modality
from business_objects.dog.distraction import Distraction
from business_objects.dog.distraction_intensity_level import Distraction_Intensity_Level
from business_objects.dog.distraction_type import Distraction_Type
from business_objects.dog.dog import Dog from business_objects.dog.dog import Dog
from business_objects.dog.dog_command_link import Dog_Command_Link from business_objects.dog.dog_command_link import Dog_Command_Link
from business_objects.dog.image import Image from business_objects.dog.image import Image
from business_objects.dog.lighting_level import Lighting_Level
from business_objects.dog.location import Location from business_objects.dog.location import Location
from business_objects.dog.obedience_level import Obedience_Level
from business_objects.dog.response_quality_metric import Response_Quality_Metric
from business_objects.dog.user import User from business_objects.dog.user import User
from business_objects.dog.weather import Weather
from datastores.datastore_base import DataStore_Base from datastores.datastore_base import DataStore_Base
from datastores.datastore_dog import DataStore_Dog from datastores.datastore_dog import DataStore_Dog
from datastores.datastore_user import DataStore_User from datastores.datastore_user import DataStore_User
@@ -44,17 +56,27 @@ from typing import ClassVar
class Model_View_Base(BaseModel, ABC): class Model_View_Base(BaseModel, ABC):
ATTR_ID_ASSESSMENT: ClassVar[str] = Assessment.ATTR_ID_ASSESSMENT
ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment_Command_Modality_Link.ATTR_ID_ASSESSMENT_COMMAND_MODALITY_LINK
ATTR_ID_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Response.ATTR_ID_ASSESSMENT_RESPONSE
ATTR_ID_BRIBE: ClassVar[str] = Bribe.ATTR_ID_BRIBE
ATTR_ID_BUTTON_ICON: ClassVar[str] = Button_Icon.ATTR_ID_BUTTON_ICON ATTR_ID_BUTTON_ICON: ClassVar[str] = Button_Icon.ATTR_ID_BUTTON_ICON
ATTR_ID_BUTTON_SHAPE: ClassVar[str] = Button_Shape.ATTR_ID_BUTTON_SHAPE ATTR_ID_BUTTON_SHAPE: ClassVar[str] = Button_Shape.ATTR_ID_BUTTON_SHAPE
ATTR_ID_COLOUR: ClassVar[str] = Colour.ATTR_ID_COLOUR ATTR_ID_COLOUR: ClassVar[str] = Colour.ATTR_ID_COLOUR
ATTR_ID_COMMAND: ClassVar[str] = Command.ATTR_ID_COMMAND ATTR_ID_COMMAND: ClassVar[str] = Command.ATTR_ID_COMMAND
ATTR_ID_COMMAND_BUTTON_LINK: ClassVar[str] = Command_Button_Link.ATTR_ID_COMMAND_BUTTON_LINK ATTR_ID_COMMAND_BUTTON_LINK: ClassVar[str] = Command_Button_Link.ATTR_ID_COMMAND_BUTTON_LINK
ATTR_ID_COMMAND_CATEGORY: ClassVar[str] = Command_Category.ATTR_ID_COMMAND_CATEGORY ATTR_ID_COMMAND_CATEGORY: ClassVar[str] = Command_Category.ATTR_ID_COMMAND_CATEGORY
ATTR_ID_COMMAND_MODALITY: ClassVar[str] = Command_Modality.ATTR_ID_COMMAND_MODALITY
ATTR_ID_DISTRACTION: ClassVar[str] = Distraction.ATTR_ID_DISTRACTION
ATTR_ID_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = Distraction_Intensity_Level.ATTR_ID_DISTRACTION_INTENSITY_LEVEL
ATTR_ID_DISTRACTION_TYPE: ClassVar[str] = Distraction_Type.ATTR_ID_DISTRACTION_TYPE
ATTR_ID_DOG: ClassVar[str] = Dog.ATTR_ID_DOG ATTR_ID_DOG: ClassVar[str] = Dog.ATTR_ID_DOG
ATTR_ID_DOG_COMMAND_LINK: ClassVar[str] = Dog_Command_Link.ATTR_ID_DOG_COMMAND_LINK ATTR_ID_DOG_COMMAND_LINK: ClassVar[str] = Dog_Command_Link.ATTR_ID_DOG_COMMAND_LINK
ATTR_ID_FILE_TYPE: ClassVar[str] = File_Type.ATTR_ID_FILE_TYPE ATTR_ID_FILE_TYPE: ClassVar[str] = File_Type.ATTR_ID_FILE_TYPE
ATTR_ID_IMAGE: ClassVar[str] = Image.ATTR_ID_IMAGE ATTR_ID_IMAGE: ClassVar[str] = Image.ATTR_ID_IMAGE
ATTR_ID_LIGHTING_LEVEL: ClassVar[str] = Lighting_Level.ATTR_ID_LIGHTING_LEVEL
ATTR_ID_LOCATION: ClassVar[str] = Location.ATTR_ID_LOCATION ATTR_ID_LOCATION: ClassVar[str] = Location.ATTR_ID_LOCATION
ATTR_ID_WEATHER: ClassVar[str] = Weather.ATTR_ID_WEATHER
ATTR_TEXT_COLLAPSED: ClassVar[str] = 'textCollapsed' ATTR_TEXT_COLLAPSED: ClassVar[str] = 'textCollapsed'
ATTR_TEXT_EXPANDED: ClassVar[str] = 'textExpanded' ATTR_TEXT_EXPANDED: ClassVar[str] = 'textExpanded'
ATTR_VALUE_CURRENT: ClassVar[str] = 'current-value' ATTR_VALUE_CURRENT: ClassVar[str] = 'current-value'
@@ -87,8 +109,12 @@ class Model_View_Base(BaseModel, ABC):
FLAG_ACTIVE_ONLY: ClassVar[str] = Base.FLAG_ACTIVE_ONLY FLAG_ACTIVE_ONLY: ClassVar[str] = Base.FLAG_ACTIVE_ONLY
FLAG_ADD: ClassVar[str] = 'add' FLAG_ADD: ClassVar[str] = 'add'
# FLAG_ADD_DELETE: ClassVar[str] = 'add-delete' # FLAG_ADD_DELETE: ClassVar[str] = 'add-delete'
FLAG_ASSESSMENT: ClassVar[str] = Assessment.FLAG_ASSESSMENT
FLAG_ASSESSMENT_COMMAND_MODALITY_LINK: ClassVar[str] = Assessment_Command_Modality_Link.FLAG_ASSESSMENT_COMMAND_MODALITY_LINK
FLAG_ASSESSMENT_RESPONSE: ClassVar[str] = Assessment_Response.FLAG_ASSESSMENT_RESPONSE
FLAG_BOOL_FALSE: ClassVar[str] = 'false' FLAG_BOOL_FALSE: ClassVar[str] = 'false'
FLAG_BOOL_TRUE: ClassVar[str] = 'true' FLAG_BOOL_TRUE: ClassVar[str] = 'true'
FLAG_BRIBE: ClassVar[str] = Bribe.FLAG_BRIBE
FLAG_BUTTON: ClassVar[str] = 'button' FLAG_BUTTON: ClassVar[str] = 'button'
FLAG_BUTTON_ICON: ClassVar[str] = Button_Icon.FLAG_BUTTON_ICON FLAG_BUTTON_ICON: ClassVar[str] = Button_Icon.FLAG_BUTTON_ICON
FLAG_BUTTON_LIGHT: ClassVar[str] = 'button-light' FLAG_BUTTON_LIGHT: ClassVar[str] = 'button-light'
@@ -106,6 +132,7 @@ class Model_View_Base(BaseModel, ABC):
FLAG_COMMAND: ClassVar[str] = Command.FLAG_COMMAND FLAG_COMMAND: ClassVar[str] = Command.FLAG_COMMAND
FLAG_COMMAND_BUTTON_LINK: ClassVar[str] = Command_Button_Link.FLAG_COMMAND_BUTTON_LINK FLAG_COMMAND_BUTTON_LINK: ClassVar[str] = Command_Button_Link.FLAG_COMMAND_BUTTON_LINK
FLAG_COMMAND_CATEGORY: ClassVar[str] = Command_Category.FLAG_COMMAND_CATEGORY FLAG_COMMAND_CATEGORY: ClassVar[str] = Command_Category.FLAG_COMMAND_CATEGORY
FLAG_COMMAND_MODALITY: ClassVar[str] = Command_Modality.FLAG_COMMAND_MODALITY
FLAG_COLUMN: ClassVar[str] = 'column' FLAG_COLUMN: ClassVar[str] = 'column'
FLAG_COMMENT: ClassVar[str] = 'comment' FLAG_COMMENT: ClassVar[str] = 'comment'
FLAG_CONTAINER: ClassVar[str] = 'container' FLAG_CONTAINER: ClassVar[str] = 'container'
@@ -118,6 +145,9 @@ class Model_View_Base(BaseModel, ABC):
FLAG_DDL_PREVIEW: ClassVar[str] = "ddl-preview" FLAG_DDL_PREVIEW: ClassVar[str] = "ddl-preview"
FLAG_DELETE: ClassVar[str] = 'delete' FLAG_DELETE: ClassVar[str] = 'delete'
FLAG_DESCRIPTION: ClassVar[str] = Base.FLAG_DESCRIPTION FLAG_DESCRIPTION: ClassVar[str] = Base.FLAG_DESCRIPTION
FLAG_DISTRACTION: ClassVar[str] = Distraction.FLAG_DISTRACTION
FLAG_DISTRACTION_INTENSITY_LEVEL: ClassVar[str] = Distraction_Intensity_Level.FLAG_DISTRACTION_INTENSITY_LEVEL
FLAG_DISTRACTION_TYPE: ClassVar[str] = Distraction_Type.FLAG_DISTRACTION_TYPE
FLAG_DETAIL: ClassVar[str] = 'detail' FLAG_DETAIL: ClassVar[str] = 'detail'
FLAG_DIALOG: ClassVar[str] = 'dialog' FLAG_DIALOG: ClassVar[str] = 'dialog'
FLAG_DIRTY: ClassVar[str] = 'dirty' FLAG_DIRTY: ClassVar[str] = 'dirty'
@@ -139,6 +169,7 @@ class Model_View_Base(BaseModel, ABC):
FLAG_IS_CHECKED: ClassVar[str] = 'is_checked' FLAG_IS_CHECKED: ClassVar[str] = 'is_checked'
FLAG_IS_COLLAPSED: ClassVar[str] = 'is_collapsed' FLAG_IS_COLLAPSED: ClassVar[str] = 'is_collapsed'
FLAG_LEFT_HAND_STUB: ClassVar[str] = 'lhs' FLAG_LEFT_HAND_STUB: ClassVar[str] = 'lhs'
FLAG_LIGHTING_LEVEL: ClassVar[str] = Lighting_Level.FLAG_LIGHTING_LEVEL
FLAG_LOCATION: ClassVar[str] = Location.FLAG_LOCATION FLAG_LOCATION: ClassVar[str] = Location.FLAG_LOCATION
FLAG_LOCATION_PARENT: ClassVar[str] = Location.FLAG_LOCATION_PARENT FLAG_LOCATION_PARENT: ClassVar[str] = Location.FLAG_LOCATION_PARENT
FLAG_LOGO: ClassVar[str] = 'logo' FLAG_LOGO: ClassVar[str] = 'logo'
@@ -151,6 +182,8 @@ class Model_View_Base(BaseModel, ABC):
# FLAG_NAME_SINGULAR: ClassVar[str] = Base.FLAG_NAME_SINGULAR # FLAG_NAME_SINGULAR: ClassVar[str] = Base.FLAG_NAME_SINGULAR
FLAG_NAV_ADMIN_HOME: ClassVar[str] = 'navAdminHome' FLAG_NAV_ADMIN_HOME: ClassVar[str] = 'navAdminHome'
FLAG_NAV_CONTACT: ClassVar[str] = 'navContact' FLAG_NAV_CONTACT: ClassVar[str] = 'navContact'
FLAG_NAV_DOG_ASSESSMENT: ClassVar[str] = 'navDogAssessment'
FLAG_NAV_DOG_ASSESSMENTS: ClassVar[str] = 'navDogAssessments'
FLAG_NAV_DOG_BUTTON_ICONS: ClassVar[str] = 'navDogButtonIcons' FLAG_NAV_DOG_BUTTON_ICONS: ClassVar[str] = 'navDogButtonIcons'
FLAG_NAV_DOG_COLOURS: ClassVar[str] = 'navDogColours' FLAG_NAV_DOG_COLOURS: ClassVar[str] = 'navDogColours'
FLAG_NAV_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = 'navDogCommandButtonLinks' FLAG_NAV_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = 'navDogCommandButtonLinks'
@@ -166,8 +199,11 @@ class Model_View_Base(BaseModel, ABC):
FLAG_NAV_USER_LOGIN: ClassVar[str] = 'navUserLogin' FLAG_NAV_USER_LOGIN: ClassVar[str] = 'navUserLogin'
FLAG_NAV_USER_LOGOUT: ClassVar[str] = 'navUserLogout' FLAG_NAV_USER_LOGOUT: ClassVar[str] = 'navUserLogout'
FLAG_NOTES: ClassVar[str] = "notes" FLAG_NOTES: ClassVar[str] = "notes"
FLAG_OBEDIENCE_LEVEL: ClassVar[str] = Obedience_Level.FLAG_OBEDIENCE_LEVEL
FLAG_OVERLAY: ClassVar[str] = 'overlay' FLAG_OVERLAY: ClassVar[str] = 'overlay'
FLAG_PAGE_BODY: ClassVar[str] = 'page-body' FLAG_PAGE_BODY: ClassVar[str] = 'page-body'
FLAG_QUANTITY: ClassVar[str] = 'quantity'
FLAG_RESPONSE_QUALITY_METRIC: ClassVar[str] = Response_Quality_Metric.FLAG_RESPONSE_QUALITY_METRIC
FLAG_RIGHT_HAND_SIDE: ClassVar[str] = 'rhs' FLAG_RIGHT_HAND_SIDE: ClassVar[str] = 'rhs'
FLAG_ROW: ClassVar[str] = 'row' FLAG_ROW: ClassVar[str] = 'row'
FLAG_ROW_NEW: ClassVar[str] = 'row-new' FLAG_ROW_NEW: ClassVar[str] = 'row-new'
@@ -179,8 +215,10 @@ class Model_View_Base(BaseModel, ABC):
FLAG_STATUS: ClassVar[str] = 'status' FLAG_STATUS: ClassVar[str] = 'status'
FLAG_SUBMIT: ClassVar[str] = 'submit' FLAG_SUBMIT: ClassVar[str] = 'submit'
FLAG_SUCCESS: ClassVar[str] = 'success' FLAG_SUCCESS: ClassVar[str] = 'success'
FLAG_TABLE_MAIN: ClassVar[str] = 'table-main'
FLAG_TEMPORARY_ELEMENT: ClassVar[str] = 'temporary-element' FLAG_TEMPORARY_ELEMENT: ClassVar[str] = 'temporary-element'
FLAG_USER: ClassVar[str] = User.FLAG_USER FLAG_USER: ClassVar[str] = User.FLAG_USER
FLAG_WEATHER: ClassVar[str] = Weather.FLAG_WEATHER
FLAG_WEBSITE: ClassVar[str] = Base.FLAG_WEBSITE FLAG_WEBSITE: ClassVar[str] = Base.FLAG_WEBSITE
HASH_GET_ALTCHA_CHALLENGE: ClassVar[str] = '/altcha/create-challenge' HASH_GET_ALTCHA_CHALLENGE: ClassVar[str] = '/altcha/create-challenge'
HASH_GET_DOG_SCRIPTS_SHARED: ClassVar[str] = '/dog/scripts-shared' HASH_GET_DOG_SCRIPTS_SHARED: ClassVar[str] = '/dog/scripts-shared'
@@ -190,6 +228,8 @@ class Model_View_Base(BaseModel, ABC):
HASH_PAGE_CONTACT: ClassVar[str] = '/contact' HASH_PAGE_CONTACT: ClassVar[str] = '/contact'
HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success' HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success'
HASH_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = '/retention-schedule' HASH_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = '/retention-schedule'
HASH_PAGE_DOG_ASSESSMENT: ClassVar[str] = '/dog/assessment'
HASH_PAGE_DOG_ASSESSMENTS: ClassVar[str] = '/dog/assessments'
HASH_PAGE_DOG_BUTTON_ICONS: ClassVar[str] = '/dog/button-icons' HASH_PAGE_DOG_BUTTON_ICONS: ClassVar[str] = '/dog/button-icons'
HASH_PAGE_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = '/dog/command-button-links' HASH_PAGE_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = '/dog/command-button-links'
HASH_PAGE_DOG_COMMAND_CATEGORIES: ClassVar[str] = '/dog/command-categories' HASH_PAGE_DOG_COMMAND_CATEGORIES: ClassVar[str] = '/dog/command-categories'
@@ -205,6 +245,7 @@ class Model_View_Base(BaseModel, ABC):
HASH_PAGE_USER_ACCOUNT: ClassVar[str] = '/user' HASH_PAGE_USER_ACCOUNT: ClassVar[str] = '/user'
HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login' HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login'
HASH_PAGE_USER_LOGOUT: ClassVar[str] = '/logout' HASH_PAGE_USER_LOGOUT: ClassVar[str] = '/logout'
HASH_SAVE_DOG_ASSESSMENT: ClassVar[str] = '/dog/save-assessment'
HASH_SAVE_DOG_BUTTON_ICON: ClassVar[str] = '/dog/save-button-icon' HASH_SAVE_DOG_BUTTON_ICON: ClassVar[str] = '/dog/save-button-icon'
HASH_SAVE_DOG_COLOUR: ClassVar[str] = '/dog/save-colour' HASH_SAVE_DOG_COLOUR: ClassVar[str] = '/dog/save-colour'
HASH_SAVE_DOG_COMMAND: ClassVar[str] = '/dog/save-command' HASH_SAVE_DOG_COMMAND: ClassVar[str] = '/dog/save-command'
@@ -234,6 +275,7 @@ class Model_View_Base(BaseModel, ABC):
URL_GITHUB: ClassVar[str] = 'https://github.com/Teddy-1024' URL_GITHUB: ClassVar[str] = 'https://github.com/Teddy-1024'
URL_LINKEDIN: ClassVar[str] = 'https://uk.linkedin.com/in/teddyms' URL_LINKEDIN: ClassVar[str] = 'https://uk.linkedin.com/in/teddyms'
_title: str
hash_page_current: str hash_page_current: str
app: Flask = None app: Flask = None
session: None = None session: None = None
@@ -245,10 +287,12 @@ class Model_View_Base(BaseModel, ABC):
model_config = ConfigDict(arbitrary_types_allowed=True) model_config = ConfigDict(arbitrary_types_allowed=True)
@property @property
@abstractmethod # @abstractmethod
def title(self): def title(self):
pass if self._title is None:
raise NotImplementedError("Model Title required.")
return self._title
def __init__(self, hash_page_current, **kwargs): def __init__(self, hash_page_current, **kwargs):
BaseModel.__init__(self, hash_page_current=hash_page_current, **kwargs) BaseModel.__init__(self, hash_page_current=hash_page_current, **kwargs)
self.app = current_app self.app = current_app

View File

@@ -0,0 +1,205 @@
"""
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}')

View File

@@ -37,23 +37,10 @@ class Model_View_Dog_Base(Model_View_Base):
# HASH_GET_STORE_CUSTOMER_SALES_ORDER: ClassVar[str] = '/store/customer_sales_order_get' # HASH_GET_STORE_CUSTOMER_SALES_ORDER: ClassVar[str] = '/store/customer_sales_order_get'
# HASH_GET_STORE_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = '/store/manufacturing_purchase_order_get' # HASH_GET_STORE_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = '/store/manufacturing_purchase_order_get'
@property
def title(self):
if self.hash_page_current == Model_View_Base.HASH_PAGE_DOG_HOME:
return 'Dog Home'
raise NotImplementedError('title must be implemented in child class')
def __init__(self, hash_page_current, **kwargs): def __init__(self, hash_page_current, **kwargs):
_m = 'Model_View_Dog_Base.__init__' _m = 'Model_View_Dog_Base.__init__'
Helper_App.console_log(f'{_m}\nstarting') Helper_App.console_log(f'{_m}\nstarting')
super().__init__(hash_page_current=hash_page_current, **kwargs) super().__init__(hash_page_current=hash_page_current, **kwargs)
self.is_page_dog = True self.is_page_dog = True
if self.hash_page_current == Model_View_Base.HASH_PAGE_DOG_HOME:
""" self._title = 'Dog Home'
def get_many_dog(self, dog_filters):
_m = 'Model_View_Dog_Base.get_many_dog'
av.val_instance(dog_filters, 'dog_filters', _m, Parameters_Dog)
return DataStore_Dog().get_many_dog(dog_filters)
"""

View File

@@ -27,15 +27,12 @@ class Model_View_Dog_Button_Icon(Model_View_Dog_Base):
button_icons: list = None button_icons: list = None
form_filters: Filters_Button_Icon = None form_filters: Filters_Button_Icon = None
form_filters_old: Filters_Button_Icon form_filters_old: Filters_Button_Icon
@property
def title(self):
return 'Button Icon'
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_BUTTON_ICONS): def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_BUTTON_ICONS):
_m = 'Model_View_Dog_Button_Icon.__init__' _m = 'Model_View_Dog_Button_Icon.__init__'
Helper_App.console_log(f'{_m}\nstarting...') Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Button Icon'
self.form_filters = form_filters_old self.form_filters = form_filters_old
datastore = DataStore_Dog() datastore = DataStore_Dog()
@@ -43,11 +40,3 @@ class Model_View_Dog_Button_Icon(Model_View_Dog_Base):
parameters_filter_button_icon = Parameters_Button_Icon.from_form_filters_button_icon(self.form_filters) parameters_filter_button_icon = Parameters_Button_Icon.from_form_filters_button_icon(self.form_filters)
Helper_App.console_log(f'Query args: {parameters_filter_button_icon}') Helper_App.console_log(f'Query args: {parameters_filter_button_icon}')
self.button_icons, errors = datastore.get_many_button_icon(parameters_filter_button_icon) self.button_icons, errors = datastore.get_many_button_icon(parameters_filter_button_icon)
"""
@classmethod
def save_categories(cls, comment, list_categories):
_m = f'{cls.__name__}.save_categories'
return DataStore_Store_Product_Category().save_categories(comment, list_categories)
"""

View File

@@ -31,14 +31,11 @@ class Model_View_Dog_Command(Model_View_Dog_Base):
form_filters: Filters_Command = None form_filters: Filters_Command = None
form_filters_old: Filters_Command form_filters_old: Filters_Command
@property
def title(self):
return 'Command'
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMANDS): def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMANDS):
_m = 'Model_View_Dog_Command.__init__' _m = 'Model_View_Dog_Command.__init__'
Helper_App.console_log(f'{_m}\nstarting...') Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Command'
self.form_filters = form_filters_old self.form_filters = form_filters_old
datastore = DataStore_Dog() datastore = DataStore_Dog()
@@ -50,11 +47,3 @@ class Model_View_Dog_Command(Model_View_Dog_Base):
parameters_filter_command = Parameters_Command.from_form_filters_command(self.form_filters) parameters_filter_command = Parameters_Command.from_form_filters_command(self.form_filters)
Helper_App.console_log(f'Query args: {parameters_filter_command}') Helper_App.console_log(f'Query args: {parameters_filter_command}')
command_categories, self.commands, errors = datastore.get_many_command(parameters_filter_command) command_categories, self.commands, errors = datastore.get_many_command(parameters_filter_command)
"""
@classmethod
def save_categories(cls, comment, list_categories):
_m = f'{cls.__name__}.save_categories'
return DataStore_Store_Product_Category().save_categories(comment, list_categories)
"""

View File

@@ -41,15 +41,12 @@ class Model_View_Dog_Command_Button_Link(Model_View_Dog_Base):
command_button_links: list = None command_button_links: list = None
form_filters: Filters_Command_Button_Link = None form_filters: Filters_Command_Button_Link = None
form_filters_old: Filters_Command_Button_Link form_filters_old: Filters_Command_Button_Link
@property
def title(self):
return 'Command Button Link'
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS): def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMAND_BUTTON_LINKS):
_m = 'Model_View_Dog_Command_Button_Link.__init__' _m = 'Model_View_Dog_Command_Button_Link.__init__'
Helper_App.console_log(f'{_m}\nstarting...') Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Command Button Link'
self.form_filters = form_filters_old self.form_filters = form_filters_old
datastore = DataStore_Dog() datastore = DataStore_Dog()

View File

@@ -28,15 +28,12 @@ class Model_View_Dog_Command_Category(Model_View_Dog_Base):
command_categories: list = None command_categories: list = None
form_filters: Filters_Command_Category = None form_filters: Filters_Command_Category = None
form_filters_old: Filters_Command_Category form_filters_old: Filters_Command_Category
@property
def title(self):
return 'Command Category'
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMAND_CATEGORIES): def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_COMMAND_CATEGORIES):
_m = 'Model_View_Dog_Command_Category.__init__' _m = 'Model_View_Dog_Command_Category.__init__'
Helper_App.console_log(f'{_m}\nstarting...') Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Command Category'
self.form_filters = form_filters_old self.form_filters = form_filters_old
datastore = DataStore_Dog() datastore = DataStore_Dog()
@@ -45,10 +42,3 @@ class Model_View_Dog_Command_Category(Model_View_Dog_Base):
Helper_App.console_log(f'Query args: {parameters_filter_command}') Helper_App.console_log(f'Query args: {parameters_filter_command}')
self.command_categories, commands, errors = datastore.get_many_command(parameters_filter_command) self.command_categories, commands, errors = datastore.get_many_command(parameters_filter_command)
"""
@classmethod
def save_categories(cls, comment, list_categories):
_m = f'{cls.__name__}.save_categories'
return DataStore_Store_Product_Category().save_categories(comment, list_categories)
"""

View File

@@ -35,15 +35,12 @@ class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base):
dog_command_links: list = None dog_command_links: list = None
form_filters: Filters_Dog_Command_Link = None form_filters: Filters_Dog_Command_Link = None
form_filters_old: Filters_Dog_Command_Link form_filters_old: Filters_Dog_Command_Link
@property
def title(self):
return 'Dog Command Link'
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_DOG_COMMAND_LINKS): def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_DOG_COMMAND_LINKS):
_m = 'Model_View_Dog_Dog_Command_Link.__init__' _m = 'Model_View_Dog_Dog_Command_Link.__init__'
Helper_App.console_log(f'{_m}\nstarting...') Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Dog Command Link'
self.form_filters = form_filters_old self.form_filters = form_filters_old
datastore = DataStore_Dog() datastore = DataStore_Dog()
parameters_filter_dog = Parameters_Dog.get_default() parameters_filter_dog = Parameters_Dog.get_default()

View File

@@ -27,15 +27,12 @@ class Model_View_Dog_Location(Model_View_Dog_Base):
locations: list = None locations: list = None
form_filters: Filters_Location = None form_filters: Filters_Location = None
form_filters_old: Filters_Location form_filters_old: Filters_Location
@property
def title(self):
return 'Location'
def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_LOCATIONS): def __init__(self, form_filters_old, hash_page_current=Model_View_Dog_Base.HASH_PAGE_DOG_LOCATIONS):
_m = 'Model_View_Dog_Location.__init__' _m = 'Model_View_Dog_Location.__init__'
Helper_App.console_log(f'{_m}\nstarting...') Helper_App.console_log(f'{_m}\nstarting...')
super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old) super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
self._title = 'Location'
self.form_filters = form_filters_old self.form_filters = form_filters_old
datastore = DataStore_Dog() datastore = DataStore_Dog()
@@ -44,10 +41,3 @@ class Model_View_Dog_Location(Model_View_Dog_Base):
Helper_App.console_log(f'Query args: {parameters_filter_location}') Helper_App.console_log(f'Query args: {parameters_filter_location}')
self.locations, errors = datastore.get_many_location(parameters_filter_location) self.locations, errors = datastore.get_many_location(parameters_filter_location)
"""
@classmethod
def save_categories(cls, comment, list_categories):
_m = f'{cls.__name__}.save_categories'
return DataStore_Store_Product_Category().save_categories(comment, list_categories)
"""

View File

@@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base
# external # external
class Model_View_Home(Model_View_Base): class Model_View_Home(Model_View_Base):
@property
def title(self):
return 'Home'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_HOME): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_HOME):
super().__init__(hash_page_current=hash_page_current) super().__init__(hash_page_current=hash_page_current)
self._title = 'Home'

View File

@@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base
# external # external
class Model_View_License(Model_View_Base): class Model_View_License(Model_View_Base):
@property
def title(self):
return 'License'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_LICENSE): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_LICENSE):
super().__init__(hash_page_current=hash_page_current) super().__init__(hash_page_current=hash_page_current)
self._title = 'License'

View File

@@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base
# external # external
class Model_View_Privacy_Policy(Model_View_Base): class Model_View_Privacy_Policy(Model_View_Base):
@property
def title(self):
return 'Privacy Policy'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_PRIVACY_POLICY): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_PRIVACY_POLICY):
super().__init__(hash_page_current=hash_page_current) super().__init__(hash_page_current=hash_page_current)
self._title = 'Privacy Policy'

View File

@@ -16,9 +16,7 @@ from models.model_view_base import Model_View_Base
# external # external
class Model_View_Retention_Schedule(Model_View_Base): class Model_View_Retention_Schedule(Model_View_Base):
@property
def title(self):
return 'Retention Schedule'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_DATA_RETENTION_SCHEDULE): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_DATA_RETENTION_SCHEDULE):
super().__init__(hash_page_current=hash_page_current) super().__init__(hash_page_current=hash_page_current)
self._title = 'Retention Schedule'

View File

@@ -26,12 +26,10 @@ class Model_View_User(Model_View_Base):
currencies: list = None currencies: list = None
regions: list = None regions: list = None
users: list = None users: list = None
@property
def title(self):
return 'User'
def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_USER_ACCOUNT): def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_USER_ACCOUNT):
super().__init__(hash_page_current=hash_page_current, form_filters_old = None) super().__init__(hash_page_current=hash_page_current, form_filters_old = None)
self._title = 'User'
datastore_user = DataStore_User() datastore_user = DataStore_User()
self.currencies = datastore_user.get_many_currency() self.currencies = datastore_user.get_many_currency()
self.regions = datastore_user.get_many_region() self.regions = datastore_user.get_many_region()

View File

@@ -1,15 +1,389 @@
https://www.molly.teddy.org.uk/login_callback, http://www.molly.teddy.org.uk/login_callback
, https://molly.teddy.org.uk/login_callback, http://molly.teddy.org.uk/login_callback USE demo;
, https://www.fetch-metrics.co.uk/login_callback, http://www.fetch-metrics.co.uk/login_callback
, https://fetch-metrics.co.uk/login_callback, http://fetch-metrics.co.uk/login_callback
, https://www.fetch-metrics.com/login_callback, http://www.fetch-metrics.com/login_callback
, https://fetch-metrics.com/login_callback, http://fetch-metrics.com/login_callback
, http://127.0.0.1:5000/login_callback
http://www.molly.teddy.org.uk/, https://www.molly.teddy.org.uk/, DROP PROCEDURE IF EXISTS demo.p_dog_get_many_response_quality_metric;
http://molly.teddy.org.uk/, https://molly.teddy.org.uk/,
http://www.molly.teddy.org.uk/logout, https://www.molly.teddy.org.uk/logout, DELIMITER //
http://molly.teddy.org.uk/logout, https://molly.teddy.org.uk/logout, CREATE PROCEDURE demo.p_dog_get_many_response_quality_metric (
http://www.molly.teddy.org.uk/logout_callback, https://www.molly.teddy.org.uk/logout_callback, IN a_id_user INT
http://molly.teddy.org.uk/logout_callback, https://molly.teddy.org.uk/logout_callback, , IN a_get_all_response_quality_metric BIT
http://127.0.0.1:5000/logout, http://127.0.0.1:5000/logout_callback , IN a_get_inactive_response_quality_metric BIT
, IN a_ids_response_quality_metric TEXT
, IN a_names_response_quality_metric TEXT
, IN a_require_all_id_search_filters_met BIT
, IN a_require_any_id_search_filters_met BIT
, IN a_require_all_non_id_search_filters_met BIT
, IN a_require_any_non_id_search_filters_met BIT
, IN a_debug BIT
)
BEGIN
DECLARE v_can_view BIT;
DECLARE v_code_type_error_bad_data VARCHAR(100);
DECLARE v_code_type_error_no_permission VARCHAR(100);
DECLARE v_guid BINARY(36);
DECLARE v_id_access_level_view INT;
DECLARE v_id_minimum INT;
DECLARE v_id_permission_dog_view INT;
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
ROLLBACK;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(250) NOT NULL
, msg TEXT NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM demo.CORE_Msg_Error_Type MET
WHERE MET.code = 'MYSQL_ERROR'
;
SELECT
t_ERROR.id_error
, t_ERROR.id_type
, t_ERROR.code
, ERROR_TYPE.name
, ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_colour
, ERROR_TYPE.text_colour
, t_ERROR.msg
FROM tmp_Msg_Error t_ERROR
INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_code_type_error_bad_data := 'BAD_DATA';
SET v_code_type_error_no_permission := 'NO_PERMISSION';
SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM demo.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1);
SET v_id_type_error_no_permission := (SELECT ERROR_TYPE.id_type FROM demo.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_no_permission LIMIT 1);
SET v_id_permission_dog_view := (SELECT PERMISSION.id_permission FROM demo.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1);
SET v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM demo.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1);
SET a_id_user := IFNULL(a_id_user, 0);
/*
SET a_get_all_response_quality_metric := IFNULL(a_get_all_response_quality_metric, 0);
SET a_get_inactive_response_quality_metric := IFNULL(a_get_inactive_response_quality_metric, 0);
SET a_ids_response_quality_metric := TRIM(IFNULL(a_ids_response_quality_metric, ''));
SET a_names_response_quality_metric := TRIM(IFNULL(a_names_response_quality_metric, ''));
SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1);
SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1);
SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0);
SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1);
*/
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_id_user
, a_get_all_response_quality_metric
, a_get_inactive_response_quality_metric
, a_ids_response_quality_metric
, a_names_response_quality_metric
, a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met
, a_require_any_non_id_search_filters_met
, a_debug
;
SELECT
v_id_type_error_bad_data
, v_id_type_error_no_permission
, v_guid
, v_id_permission_dog_view
, v_time_start
;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric;
CREATE TEMPORARY TABLE tmp_Response_Quality_Metric (
id_metric INT NOT NULL
, id_unit_measurement INT
, code VARCHAR(250)
, name VARCHAR(250)
, value_min DOUBLE
, value_max DOUBLE
, active BIT
, does_meet_id_filters BIT NOT NULL
, does_meet_non_id_filters BIT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(250) NOT NULL
, msg TEXT NOT NULL
);
-- Permissions
IF a_debug = 1 THEN
SELECT
v_guid
, 0 -- get_all_user
, 0 -- get_inactive_user
, a_id_user -- ids_user
, '' -- a_auth0_ids_user
, '' -- a_names_user
, '' -- a_emails_user
, 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met
, 0 -- a_require_any_non_id_search_filters_met
, v_id_permission_dog_view -- ids_permission
, v_id_access_level_view -- ids_access_level
, 0 -- a_show_errors
, 0 -- a_debug
;
END IF;
CALL demo.p_dog_calc_user(
v_guid
, 0 -- get_all_user
, 0 -- get_inactive_user
, a_id_user -- ids_user
, '' -- a_auth0_ids_user
, '' -- a_names_user
, '' -- a_emails_user
, 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met
, 0 -- a_require_any_non_id_search_filters_met
, v_id_permission_dog_view -- ids_permission
, v_id_access_level_view -- ids_access_level
, 0 -- a_show_errors
, 0 -- a_debug
);
SELECT
IFNULL(CALC_USER_T.has_access, 0)
INTO
v_can_view
FROM demo.DOG_Calc_User_Temp CALC_USER_T
WHERE CALC_USER_T.GUID = v_guid
LIMIT 1
;
IF a_debug = 1 THEN
SELECT v_can_view;
SELECT COUNT(*) AS Count_Errors FROM tmp_Msg_Error t_ERROR;
SELECT * FROM tmp_Msg_Error t_ERROR;
END IF;
IF (v_can_view = 0) THEN
DELETE t_ME
FROM tmp_Msg_Error t_ME
WHERE t_ME.id_type <> v_id_type_error_no_permission
;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, 'You do not have permission to view RESPONSE_QUALITY_METRIC.'
)
;
END IF;
CALL demo.p_dog_clear_calc_user(
v_guid
, 0 -- a_debug
);
-- Call Response_Quality_Metric Calc
IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT
v_guid -- a_guid
, a_id_user -- a_id_user
, a_get_all_response_quality_metric -- a_get_all_response_quality_metric
, a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric
, a_ids_response_quality_metric -- a_ids_response_quality_metric
, a_names_response_quality_metric -- a_names_response_quality_metric
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
, a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met
, 0 -- a_show_errors
, 0 -- a_debug
;
END IF;
CALL demo.p_dog_calc_response_quality_metric (
v_guid -- a_guid
, a_id_user -- a_id_user
, a_get_all_response_quality_metric -- a_get_all_response_quality_metric
, a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric
, a_ids_response_quality_metric -- a_ids_response_quality_metric
, a_names_response_quality_metric -- a_names_response_quality_metric
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
, a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met
, 0 -- a_show_errors
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT COUNT(*) FROM demo.DOG_Response_Quality_Metric_Temp;
SELECT * FROM demo.DOG_Response_Quality_Metric_Temp;
END IF;
INSERT INTO tmp_Response_Quality_Metric (
id_metric
, id_unit_measurement
, code
, name
, value_min
, value_max
, active
, does_meet_id_filters
, does_meet_non_id_filters
)
SELECT
RESPONSE_QUALITY_METRIC_T.id_metric
, RESPONSE_QUALITY_METRIC_T.id_unit_measurement
, RESPONSE_QUALITY_METRIC_T.code
, RESPONSE_QUALITY_METRIC_T.name
, RESPONSE_QUALITY_METRIC_T.value_min
, RESPONSE_QUALITY_METRIC_T.value_max
, RESPONSE_QUALITY_METRIC_T.active
, RESPONSE_QUALITY_METRIC_T.does_meet_id_filters
, RESPONSE_QUALITY_METRIC_T.does_meet_non_id_filters
FROM demo.DOG_Response_Quality_Metric_Temp RESPONSE_QUALITY_METRIC_T
WHERE RESPONSE_QUALITY_METRIC_T.GUID = v_guid
;
IF a_debug = 1 THEN
SELECT COUNT(*) FROM tmp_Response_Quality_Metric;
SELECT * FROM tmp_Response_Quality_Metric;
END IF;
END IF;
-- Filter outputs
IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT * FROM tmp_Response_Quality_Metric;
END IF;
DELETE FROM tmp_Response_Quality_Metric;
END IF;
-- Outputs
-- RESPONSE_QUALITY_METRIC
SELECT
t_RESPONSE_QUALITY_METRIC.id_metric
, t_RESPONSE_QUALITY_METRIC.id_unit_measurement
, UNIT_MEASUREMENT.name_singular AS name_singular_unit_measurement
, UNIT_MEASUREMENT.name_plural AS name_plural_unit_measurement
, UNIT_MEASUREMENT.symbol AS symbol_unit_measurement
, t_RESPONSE_QUALITY_METRIC.code
, t_RESPONSE_QUALITY_METRIC.name
, t_RESPONSE_QUALITY_METRIC.value_min
, t_RESPONSE_QUALITY_METRIC.value_max
, t_RESPONSE_QUALITY_METRIC.active
, t_RESPONSE_QUALITY_METRIC.does_meet_id_filters
, t_RESPONSE_QUALITY_METRIC.does_meet_non_id_filters
FROM tmp_Response_Quality_Metric t_RESPONSE_QUALITY_METRIC
LEFT JOIN demo.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_RESPONSE_QUALITY_METRIC.id_metric = RESPONSE_QUALITY_METRIC.id_metric
LEFT JOIN demo.DOG_Unit_Measurement UNIT_MEASUREMENT ON t_RESPONSE_QUALITY_METRIC.id_unit_measurement = UNIT_MEASUREMENT.id_unit_measurement
ORDER BY t_RESPONSE_QUALITY_METRIC.name
;
-- Errors
SELECT
t_ERROR.id_error
, t_ERROR.id_type
, t_ERROR.code
, ERROR_TYPE.name
, ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_colour
, ERROR_TYPE.text_colour
, t_ERROR.msg
FROM tmp_Msg_Error t_ERROR
INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
;
IF a_debug = 1 AND v_can_view = 1 THEN
SELECT * FROM tmp_Response_Quality_Metric;
END IF;
CALL demo.p_dog_clear_calc_response_quality_metric(
v_guid -- a_guid
, 0 -- a_debug
);
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric;
IF a_debug = 1 THEN
CALL demo.p_core_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;
/*
CALL demo.p_dog_get_many_response_quality_metric (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_response_quality_metric
, 0 -- a_get_inactive_response_quality_metric
, '' -- a_ids_response_quality_metric
, '' -- a_names_response_quality_metric
, 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met
, 1 -- a_require_any_non_id_search_filters_met
, 1 -- a_debug
);
CALL demo.p_dog_get_many_response_quality_metric (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_response_quality_metric
, 0 -- a_get_inactive_response_quality_metric
, '' -- a_ids_response_quality_metric
, 'pat,point' -- a_names_response_quality_metric
, 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met
, 1 -- a_require_any_non_id_search_filters_met
, 1 -- a_debug
);
*/

View File

@@ -12,8 +12,8 @@ WHERE
CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement ( CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement (
id_unit_measurement INT NOT NULL AUTO_INCREMENT PRIMARY KEY id_unit_measurement INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, name_singular VARCHAR(255) NOT NULL , name_singular VARCHAR(250) NOT NULL
, name_plural VARCHAR(256) NOT NULL , name_plural VARCHAR(250) NOT NULL
, symbol VARCHAR(50) NOT NULL , symbol VARCHAR(50) NOT NULL
, symbol_is_suffix_not_prefix BIT NOT NULL DEFAULT 1 , symbol_is_suffix_not_prefix BIT NOT NULL DEFAULT 1
, is_base_unit BIT NOT NULL DEFAULT 0 , is_base_unit BIT NOT NULL DEFAULT 0

View File

@@ -1,6 +1,8 @@
USE parts; USE parts;
DROP TABLE IF EXISTS parts.DOG_Distraction_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
FROM INFORMATION_SCHEMA.TABLES FROM INFORMATION_SCHEMA.TABLES
WHERE WHERE
@@ -14,6 +16,7 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Temp (
, id_assessment INT , id_assessment INT
, id_distraction_type INT , id_distraction_type INT
, id_intensity_level_emotional INT , id_intensity_level_emotional INT
, id_intensity_level_scent INT
, id_intensity_level_sight INT , id_intensity_level_sight INT
, id_intensity_level_sound INT , id_intensity_level_sound INT
, id_intensity_level_touch INT , id_intensity_level_touch INT

View File

@@ -1,6 +1,8 @@
USE parts; USE parts;
-- DROP TABLE IF EXISTS parts.DOG_Assessment_Response_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
FROM INFORMATION_SCHEMA.TABLES FROM INFORMATION_SCHEMA.TABLES
WHERE WHERE
@@ -10,6 +12,7 @@ WHERE
CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Response_Temp ( CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Response_Temp (
id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_response INT
, id_assessment_command_modality_link INT , id_assessment_command_modality_link INT
, id_response_quality_metric INT , id_response_quality_metric INT
, id_obedience_level INT , id_obedience_level INT

View File

@@ -68,8 +68,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_lighting_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_lighting_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error_Calc_Lighting_Level t_ERROR FROM tmp_Msg_Error_Calc_Lighting_Level t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
@@ -481,8 +481,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_lighting_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_lighting_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error_Calc_Lighting_Level t_ERROR FROM tmp_Msg_Error_Calc_Lighting_Level t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type

View File

@@ -65,8 +65,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_lighting_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_lighting_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error t_ERROR FROM tmp_Msg_Error t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
@@ -317,8 +317,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_lighting_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_lighting_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error t_ERROR FROM tmp_Msg_Error t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type

View File

@@ -163,6 +163,7 @@ BEGIN
, id_user_handler INT , id_user_handler INT
, notes TEXT , notes TEXT
, temperature_celcius DECIMAL(5, 2) , temperature_celcius DECIMAL(5, 2)
-- , difficulty_level FLOAT
, active BIT , active BIT
, does_meet_id_filters BIT NOT NULL , does_meet_id_filters BIT NOT NULL
, does_meet_non_id_filters BIT NOT NULL , does_meet_non_id_filters BIT NOT NULL
@@ -340,6 +341,7 @@ BEGIN
, id_user_handler , id_user_handler
, notes , notes
, temperature_celcius , temperature_celcius
-- , difficulty_level
, active , active
, does_meet_id_filters , does_meet_id_filters
, does_meet_non_id_filters , does_meet_non_id_filters
@@ -352,6 +354,7 @@ BEGIN
, ASSESSMENT_T.id_user_handler , ASSESSMENT_T.id_user_handler
, ASSESSMENT_T.notes , ASSESSMENT_T.notes
, ASSESSMENT_T.temperature_celcius , ASSESSMENT_T.temperature_celcius
-- , ASSESSMENT_T.difficulty_level
, ASSESSMENT_T.active , ASSESSMENT_T.active
, ASSESSMENT_T.does_meet_id_filters , ASSESSMENT_T.does_meet_id_filters
@@ -391,6 +394,7 @@ BEGIN
, USER.surname AS surname_user_handler , USER.surname AS surname_user_handler
, t_ASSESSMENT.notes , t_ASSESSMENT.notes
, t_ASSESSMENT.temperature_celcius , t_ASSESSMENT.temperature_celcius
-- , t_ASSESSMENT.difficulty_level
, t_ASSESSMENT.active , t_ASSESSMENT.active
, t_ASSESSMENT.does_meet_id_filters , t_ASSESSMENT.does_meet_id_filters

View File

@@ -0,0 +1,693 @@
USE parts;
DROP PROCEDURE IF EXISTS parts.p_dog_save_dog_command_link;
DELIMITER //
CREATE PROCEDURE parts.p_dog_save_dog_command_link (
IN a_comment VARCHAR(500),
IN a_guid BINARY(36),
IN a_id_user INT,
IN a_debug BIT
)
BEGIN
DECLARE v_can_admin BIT;
DECLARE v_can_create BIT;
DECLARE v_code_type_error_bad_data VARCHAR(100);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_change_set INT;
DECLARE v_id_permission_dog_new INT;
DECLARE v_id_type_error_bad_data INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
ROLLBACK;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(250)
, msg TEXT NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM parts.CORE_Msg_Error_Type MET
WHERE MET.code = 'MYSQL_ERROR'
;
SELECT
t_ERROR.id_error
, t_ERROR.id_type
, t_ERROR.code
, ERROR_TYPE.name
, ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_colour
, ERROR_TYPE.text_colour
, t_ERROR.msg
FROM tmp_Msg_Error t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET SESSION group_concat_max_len=15000;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := 'BAD_DATA';
SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM parts.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1);
SET v_id_permission_dog_new := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_CREATE' LIMIT 1);
SET v_id_access_level_edit := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'EDIT' LIMIT 1);
CALL parts.p_core_validate_guid ( a_guid );
DROP TABLE IF EXISTS tmp_Dog_Command_Link_Copy;
DROP TABLE IF EXISTS tmp_Dog_Command_Link;
CREATE TEMPORARY TABLE tmp_Dog_Command_Link (
id_temp INT
, id_link INT
, id_dog INT
, id_command INT
, hand_signal_description TEXT
, notes TEXT
, active BIT
, is_new BIT
, name_error VARCHAR(250)
);
CREATE TEMPORARY TABLE tmp_Dog_Command_Link_Copy (
id_temp INT
, id_link INT
, id_dog INT
, id_command INT
, hand_signal_description TEXT
, notes TEXT
, active BIT
, is_new BIT
, name_error VARCHAR(250)
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(250)
, msg TEXT NOT NULL
);
-- Get data from Temp table
INSERT INTO tmp_Dog_Command_Link (
id_temp
, id_link
, id_dog
, id_command
, hand_signal_description
, notes
, active
, is_new
)
SELECT
DOG_COMMAND_LINK_T.id_temp
, COALESCE(DOG_COMMAND_LINK.id_link, DOG_COMMAND_LINK_T.id_link)
, COALESCE(
DOG_COMMAND_LINK_T.id_dog
, DOG_COMMAND_LINK.id_dog
) AS id_dog
, COALESCE(
DOG_COMMAND_LINK_T.id_command
, DOG_COMMAND_LINK.id_command
) AS id_command
/*
, NULLIF(
COALESCE(
DOG_COMMAND_LINK_T.hand_signal_description
, DOG_COMMAND_LINK.hand_signal_description
)
, ''
) AS hand_signal_description
, NULLIF(
COALESCE(
DOG_COMMAND_LINK_T.notes
, DOG_COMMAND_LINK.notes
)
, ''
) AS notes
*/
, COALESCE(
DOG_COMMAND_LINK_T.hand_signal_description
, DOG_COMMAND_LINK.hand_signal_description
) AS hand_signal_description
, COALESCE(
DOG_COMMAND_LINK_T.notes
, DOG_COMMAND_LINK.notes
) AS notes
, COALESCE(DOG_COMMAND_LINK_T.active, 1) AS active
, CASE WHEN COALESCE(DOG_COMMAND_LINK.id_link, DOG_COMMAND_LINK_T.id_link, 0) < 1 THEN 1 ELSE 0 END AS is_new
FROM parts.DOG_Dog_Command_Link_Temp DOG_COMMAND_LINK_T
LEFT JOIN parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
ON DOG_COMMAND_LINK_T.id_link = DOG_COMMAND_LINK.id_link
OR (
DOG_COMMAND_LINK_T.id_dog = DOG_COMMAND_LINK.id_dog
AND DOG_COMMAND_LINK_T.id_command = DOG_COMMAND_LINK.id_command
AND (
DOG_COMMAND_LINK.hand_signal_description IS NULL
OR DOG_COMMAND_LINK_T.hand_signal_description <=> DOG_COMMAND_LINK.hand_signal_description
)
AND (
DOG_COMMAND_LINK.notes IS NULL
OR DOG_COMMAND_LINK_T.notes <=> DOG_COMMAND_LINK.notes
)
)
WHERE DOG_COMMAND_LINK_T.guid = a_guid
;
IF a_debug = 1 THEN
SELECT 'Dog_Command_Link_Temp records';
SELECT * FROM tmp_Dog_Command_Link;
SELECT COUNT(*) FROM tmp_Dog_Command_Link;
END IF;
-- Error names
UPDATE tmp_Dog_Command_Link t_DOG_COMMAND_LINK
LEFT JOIN parts.DOG_Dog DOG ON t_DOG_COMMAND_LINK.id_dog = DOG.id_dog
LEFT JOIN parts.DOG_Command COMMAND ON t_DOG_COMMAND_LINK.id_command = COMMAND.id_command
SET t_DOG_COMMAND_LINK.name_error = CASE WHEN
ISNULL(DOG.id_dog)
AND ISNULL(COMMAND.id_command)
THEN COALESCE(t_DOG_COMMAND_LINK.hand_signal_description, t_DOG_COMMAND_LINK.notes, '(No Dog Command Link)')
ELSE CONCAT(
COALESCE(DOG.name, t_DOG_COMMAND_LINK.id_dog, '(No Dog)')
, ' - '
, COALESCE(COMMAND.name, t_DOG_COMMAND_LINK.id_command, '(No Command)')
) END
;
IF a_debug = 1 THEN
SELECT 'After set name_error';
SELECT * FROM tmp_Dog_Command_Link;
SELECT COUNT(*) FROM tmp_Dog_Command_Link;
END IF;
/*
-- Missing Dog Command Link Ids
UPDATE tmp_Dog_Command_Link t_DOG_COMMAND_LINK
LEFT JOIN parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
-- ON t_DOG_COMMAND_LINK.id_link = DOG_COMMAND_LINK.id_link
ON t_DOG_COMMAND_LINK.id_dog = DOG_COMMAND_LINK.id_dog
AND t_DOG_COMMAND_LINK.id_command = DOG_COMMAND_LINK.id_command
SET
t_DOG_COMMAND_LINK.id_link = DOG_COMMAND_LINK.id_link
, t_DOG_COMMAND_LINK.is_new = 0
WHERE
IFNULL(t_DOG_COMMAND_LINK.id_link, 0) < 1
AND NOT ISNULL(DOG_COMMAND_LINK.id_link)
;
IF a_debug = 1 THEN
SELECT 'After set missing id_link';
SELECT * FROM tmp_Dog_Command_Link;
SELECT COUNT(*) FROM tmp_Dog_Command_Link;
END IF;
*/
-- Validation
-- Missing mandatory fields
-- id_dog
IF EXISTS (
SELECT *
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
LEFT JOIN demo.DOG_Dog DOG ON t_DOG_COMMAND_LINK.id_dog = DOG.id_dog
WHERE
ISNULL(t_DOG_COMMAND_LINK.id_dog)
OR ISNULL(DOG.id_dog)
OR DOG.active = 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following Dog Command Link(s) do not have a valid Dog: ', GROUP_CONCAT(t_DOG_COMMAND_LINK.name_error SEPARATOR ', ')) AS msg
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
LEFT JOIN parts.DOG_Dog DOG ON t_DOG_COMMAND_LINK.id_dog = DOG.id_dog
WHERE
ISNULL(t_DOG_COMMAND_LINK.id_dog)
OR ISNULL(DOG.id_dog)
OR DOG.active = 0
;
END IF;
-- id_command
IF EXISTS (
SELECT *
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
LEFT JOIN demo.DOG_Command COMMAND ON t_DOG_COMMAND_LINK.id_command = COMMAND.id_command
WHERE
ISNULL(t_DOG_COMMAND_LINK.id_command)
OR ISNULL(COMMAND.id_command)
OR COMMAND.active = 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following Dog Command Link(s) do not have a valid Command: ', GROUP_CONCAT(t_DOG_COMMAND_LINK.name_error SEPARATOR ', ')) AS msg
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
LEFT JOIN parts.DOG_Command COMMAND ON t_DOG_COMMAND_LINK.id_command = COMMAND.id_command
WHERE
ISNULL(t_DOG_COMMAND_LINK.id_command)
OR ISNULL(COMMAND.id_command)
OR COMMAND.active = 0
;
END IF;
-- Duplicates
INSERT INTO tmp_Dog_Command_Link_Copy (
id_temp
, id_link
, id_dog
, id_command
, hand_signal_description
, notes
, active
, is_new
, name_error
)
SELECT
t_DOG_COMMAND_LINK.id_temp
, t_DOG_COMMAND_LINK.id_link
, t_DOG_COMMAND_LINK.id_dog
, t_DOG_COMMAND_LINK.id_command
, t_DOG_COMMAND_LINK.hand_signal_description
, t_DOG_COMMAND_LINK.notes
, t_DOG_COMMAND_LINK.active
, t_DOG_COMMAND_LINK.is_new
, t_DOG_COMMAND_LINK.name_error
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
;
IF a_debug = 1 THEN
SELECT COUNT(*) AS Count_Temp_Link FROM tmp_Dog_Command_Link;
SELECT COUNT(*) AS Count_Temp_Link_Copy FROM tmp_Dog_Command_Link_Copy;
WITH
Combined_Links AS (
SELECT
DOG_COMMAND_LINK.id_link
, DOG_COMMAND_LINK.id_dog
, DOG_COMMAND_LINK.id_command
, IFNULL(
t_DOG_COMMAND_LINK_COPY.name_error
, CONCAT(
COALESCE(DOG.name, t_DOG_COMMAND_LINK_COPY.id_dog, '(No Dog)')
, ' - '
, COALESCE(COMMAND.name, t_DOG_COMMAND_LINK_COPY.id_command, '(No Command)')
)
) AS name_error
FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
LEFT JOIN tmp_Dog_Command_Link_Copy t_DOG_COMMAND_LINK_COPY
ON DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK_COPY.id_dog
AND DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK_COPY.id_command
INNER JOIN parts.DOG_Dog DOG ON DOG_COMMAND_LINK.id_dog = DOG.id_dog
INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command
WHERE t_DOG_COMMAND_LINK_COPY.is_new = 1
UNION
SELECT
t_DOG_COMMAND_LINK.id_link
, t_DOG_COMMAND_LINK.id_dog
, t_DOG_COMMAND_LINK.id_command
, t_DOG_COMMAND_LINK.name_error
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
)
, Duplicate_Link_Row_Numbers AS (
SELECT
COMBINED_LINK.id_link
, COMBINED_LINK.id_dog
, COMBINED_LINK.id_command
, COMBINED_LINK.name_error
, ROW_NUMBER() OVER (PARTITION BY COMBINED_LINK.id_dog, COMBINED_LINK.id_command ORDER BY COMBINED_LINK.name_error ASC) AS index_link_as_duplicate
FROM Combined_Links COMBINED_LINK
)
SELECT *
FROM Duplicate_Link_Row_Numbers;
END IF;
IF EXISTS (
WITH
Combined_Links AS (
SELECT
DOG_COMMAND_LINK.id_link
, DOG_COMMAND_LINK.id_dog
, DOG_COMMAND_LINK.id_command
, IFNULL(
t_DOG_COMMAND_LINK_COPY.name_error
, CONCAT(
COALESCE(DOG.name, t_DOG_COMMAND_LINK_COPY.id_dog, '(No Dog)')
, ' - '
, COALESCE(COMMAND.name, t_DOG_COMMAND_LINK_COPY.id_command, '(No Command)')
)
) AS name_error
FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
LEFT JOIN tmp_Dog_Command_Link_Copy t_DOG_COMMAND_LINK_COPY
ON DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK_COPY.id_dog
AND DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK_COPY.id_command
INNER JOIN parts.DOG_Dog DOG ON DOG_COMMAND_LINK.id_dog = DOG.id_dog
INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command
WHERE t_DOG_COMMAND_LINK_COPY.is_new = 1
UNION
SELECT
t_DOG_COMMAND_LINK.id_link
, t_DOG_COMMAND_LINK.id_dog
, t_DOG_COMMAND_LINK.id_command
, t_DOG_COMMAND_LINK.name_error
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
)
, Duplicate_Link_Row_Numbers AS (
SELECT
COMBINED_LINK.id_link
, COMBINED_LINK.id_dog
, COMBINED_LINK.id_command
, COMBINED_LINK.name_error
, ROW_NUMBER() OVER (PARTITION BY COMBINED_LINK.id_dog, COMBINED_LINK.id_command ORDER BY COMBINED_LINK.name_error ASC) AS index_link_as_duplicate
FROM Combined_Links COMBINED_LINK
)
SELECT *
FROM Duplicate_Link_Row_Numbers DUPLICATE_LINK
WHERE DUPLICATE_LINK.index_link_as_duplicate > 1
GROUP BY DUPLICATE_LINK.id_dog, DUPLICATE_LINK.id_command
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
WITH
Combined_Links AS (
SELECT
DOG_COMMAND_LINK.id_link
, DOG_COMMAND_LINK.id_dog
, DOG_COMMAND_LINK.id_command
, IFNULL(
t_DOG_COMMAND_LINK_COPY.name_error
, CONCAT(
COALESCE(DOG.name, t_DOG_COMMAND_LINK_COPY.id_dog, '(No Dog)')
, ' - '
, COALESCE(COMMAND.name, t_DOG_COMMAND_LINK_COPY.id_command, '(No Command)')
)
) AS name_error
FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
LEFT JOIN tmp_Dog_Command_Link_Copy t_DOG_COMMAND_LINK_COPY
ON DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK_COPY.id_dog
AND DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK_COPY.id_command
INNER JOIN parts.DOG_Dog DOG ON DOG_COMMAND_LINK.id_dog = DOG.id_dog
INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command
WHERE t_DOG_COMMAND_LINK_COPY.is_new = 1
UNION
SELECT
t_DOG_COMMAND_LINK.id_link
, t_DOG_COMMAND_LINK.id_dog
, t_DOG_COMMAND_LINK.id_command
, t_DOG_COMMAND_LINK.name_error
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
)
, Duplicate_Link_Row_Numbers AS (
SELECT
COMBINED_LINK.id_link
, COMBINED_LINK.id_dog
, COMBINED_LINK.id_command
, COMBINED_LINK.name_error
, ROW_NUMBER() OVER (PARTITION BY COMBINED_LINK.id_dog, COMBINED_LINK.id_command ORDER BY COMBINED_LINK.name_error ASC) AS index_link_as_duplicate
FROM Combined_Links COMBINED_LINK
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('Attempt to create duplicate or overwrite existing Dog Command Links on: ', GROUP_CONCAT(DUPLICATE_LINK.name_error SEPARATOR ', ')) AS msg
FROM Duplicate_Link_Row_Numbers DUPLICATE_LINK
WHERE DUPLICATE_LINK.index_link_as_duplicate > 1
GROUP BY
DUPLICATE_LINK.id_dog
, DUPLICATE_LINK.id_command
;
END IF;
-- Permissions
-- Can Create
CALL parts.p_dog_calc_user(
a_guid
, 0 -- get_all_user
, 0 -- get_inactive_user
, a_id_user -- ids_user
, '' -- a_auth0_ids_user
, '' -- a_names_user
, '' -- a_emails_user
, 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met
, 0 -- a_require_any_non_id_search_filters_met
, v_id_permission_dog_new -- ids_permission
, v_id_access_level_edit -- ids_access_level
, 0 -- a_show_errors
, 0 -- a_debug
);
SELECT
IFNULL(CU_T.has_access, 0)
INTO
v_can_create
FROM parts.DOG_Calc_User_Temp CU_T
WHERE CU_T.GUID = a_guid
LIMIT 1
;
CALL parts.p_dog_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF v_can_create = 0 THEN
DELETE t_ME
FROM tmp_Msg_Error t_ME
WHERE t_ME.id_type <> v_id_type_error_no_permission
;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, 'You do not have permission to edit Commands.'
)
;
END IF;
IF EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT * from tmp_Dog_Command_Link;
END IF;
DELETE FROM tmp_Dog_Command_Link;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
START TRANSACTION;
INSERT INTO parts.DOG_Dog_Change_Set (
comment
, id_user_updated_last_by
, updated_last_on
)
VALUES (
a_comment
, a_id_user
, v_time_start
)
;
SET v_id_change_set := LAST_INSERT_ID();
UPDATE parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
INNER JOIN tmp_Dog_Command_Link t_DOG_COMMAND_LINK
ON DOG_COMMAND_LINK.id_link = t_DOG_COMMAND_LINK.id_link
AND t_DOG_COMMAND_LINK.is_new = 0
SET
DOG_COMMAND_LINK.id_dog = t_DOG_COMMAND_LINK.id_dog
, DOG_COMMAND_LINK.id_command = t_DOG_COMMAND_LINK.id_command
, DOG_COMMAND_LINK.hand_signal_description = t_DOG_COMMAND_LINK.hand_signal_description
, DOG_COMMAND_LINK.notes = t_DOG_COMMAND_LINK.notes
, DOG_COMMAND_LINK.active = t_DOG_COMMAND_LINK.active
, DOG_COMMAND_LINK.id_change_set = v_id_change_set
;
INSERT INTO parts.DOG_Dog_Command_Link (
id_dog
, id_command
, hand_signal_description
, notes
, active
, id_user_created_by
, created_on
)
SELECT
t_DOG_COMMAND_LINK.id_dog AS id_dog
, t_DOG_COMMAND_LINK.id_command AS id_command
, t_DOG_COMMAND_LINK.hand_signal_description AS hand_signal_description
, t_DOG_COMMAND_LINK.notes AS notes
, t_DOG_COMMAND_LINK.active AS active
, a_id_user AS created_by
, v_time_start AS created_on
FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK
WHERE
t_DOG_COMMAND_LINK.is_new = 1
AND t_DOG_COMMAND_LINK.active = 1
;
COMMIT;
END IF;
START TRANSACTION;
DELETE FROM parts.DOG_Dog_Command_Link_Temp
WHERE GUID = a_guid
;
COMMIT;
-- Errors
SELECT
t_ERROR.id_error
, t_ERROR.id_type
, t_ERROR.code
, ERROR_TYPE.name
, ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_colour
, ERROR_TYPE.text_colour
, t_ERROR.msg
FROM tmp_Msg_Error t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
;
IF a_debug = 1 THEN
SELECT * FROM tmp_Dog_Command_Link;
END IF;
DROP TEMPORARY TABLE tmp_Dog_Command_Link;
DROP TEMPORARY TABLE tmp_Msg_Error;
IF a_debug = 1 THEN
CALL parts.p_core_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;
/*
'ripplesipplenippletippledipplekipple'
DELETE FROM parts.DOG_Dog_Command_Link WHERE id_link > 740;
* /
delete
from parts.DOG_Dog_Command_Link_Audit
where id_link > 768
;
delete
from parts.DOG_Dog_Command_Link
where id_link > 768
;
delete
from parts.DOG_Dog_Command_Link_Temp
;
select
*
-- COUNT(*)
-- delete
from parts.DOG_Dog_Command_Link_Temp
;
select COUNT(*)
from parts.DOG_Dog_Command_Link_Temp
;
select
*
-- COUNT(*)
-- delete
from parts.DOG_Dog_Command_Link
;
select COUNT(*)
from parts.DOG_Dog_Command_Link
;
INSERT INTO parts.DOG_Dog_Command_Link_Temp (
id_link
, id_dog
, id_command
, hand_signal_description
, notes
, active
, guid
)
VALUES (
-1 -- id_link
, 1 -- id_dog
, 1 -- id_command
, 'Test deez noots' -- hand_signal_description
, NULL -- notes
, 1 -- active
, 'ripplesipplenippletippledipplekipple'
);
CALL parts.p_dog_save_dog_command_link (
'nipples'
, 'ripplesipplenippletippledipplekipple'
, 1
, 1
);
select
*
-- COUNT(*)
-- delete
from parts.DOG_Dog_Command_Link_Temp
;
select COUNT(*)
from parts.DOG_Dog_Command_Link_Temp
;
select
*
-- COUNT(*)
-- delete
from parts.DOG_Dog_Command_Link
;
select COUNT(*)
from parts.DOG_Dog_Command_Link
;
*/

View File

@@ -23,6 +23,10 @@ CREATE PROCEDURE parts.p_dog_calc_distraction (
, IN a_get_inactive_intensity_level_emotional BIT , IN a_get_inactive_intensity_level_emotional BIT
, IN a_ids_intensity_level_emotional TEXT , IN a_ids_intensity_level_emotional TEXT
, IN a_names_intensity_level_emotional TEXT , IN a_names_intensity_level_emotional TEXT
, IN a_get_all_intensity_level_scent BIT
, IN a_get_inactive_intensity_level_scent BIT
, IN a_ids_intensity_level_scent TEXT
, IN a_names_intensity_level_scent TEXT
, IN a_get_all_intensity_level_sight BIT , IN a_get_all_intensity_level_sight BIT
, IN a_get_inactive_intensity_level_sight BIT , IN a_get_inactive_intensity_level_sight BIT
, IN a_ids_intensity_level_sight TEXT , IN a_ids_intensity_level_sight TEXT
@@ -180,6 +184,10 @@ BEGIN
, a_get_inactive_intensity_level_emotional , a_get_inactive_intensity_level_emotional
, a_ids_intensity_level_emotional , a_ids_intensity_level_emotional
, a_names_intensity_level_emotional , a_names_intensity_level_emotional
, a_get_all_intensity_level_scent
, a_get_inactive_intensity_level_scent
, a_ids_intensity_level_scent
, a_names_intensity_level_scent
, a_get_all_intensity_level_sight , a_get_all_intensity_level_sight
, a_get_inactive_intensity_level_sight , a_get_inactive_intensity_level_sight
, a_ids_intensity_level_sight , a_ids_intensity_level_sight
@@ -239,6 +247,7 @@ BEGIN
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Touch_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Touch_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sound_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sound_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sight_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sight_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Scent_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Emotional_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Emotional_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Distraction_Type_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Distraction_Type_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Calc_Distraction;
@@ -274,6 +283,15 @@ BEGIN
, does_meet_non_id_filters BIT NOT NULL , does_meet_non_id_filters BIT NOT NULL
); );
CREATE TEMPORARY TABLE tmp_Intensity_Level_Scent_Calc_Distraction (
id_intensity_level INT NOT NULL
, code VARCHAR(250)
, name VARCHAR(250)
, active BIT
, does_meet_id_filters BIT NOT NULL
, does_meet_non_id_filters BIT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Intensity_Level_Sight_Calc_Distraction ( CREATE TEMPORARY TABLE tmp_Intensity_Level_Sight_Calc_Distraction (
id_intensity_level INT NOT NULL id_intensity_level INT NOT NULL
, code VARCHAR(250) , code VARCHAR(250)
@@ -306,6 +324,7 @@ BEGIN
, id_assessment INT , id_assessment INT
, id_distraction_type INT , id_distraction_type INT
, id_intensity_level_emotional INT , id_intensity_level_emotional INT
, id_intensity_level_scent INT
, id_intensity_level_sight INT , id_intensity_level_sight INT
, id_intensity_level_sound INT , id_intensity_level_sound INT
, id_intensity_level_touch INT , id_intensity_level_touch INT
@@ -576,6 +595,71 @@ BEGIN
); );
END IF; END IF;
-- Call Calc Intensity Level Scent
IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Distraction t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT
a_guid -- a_guid
, a_id_user -- a_id_user
, a_get_all_intensity_level_scent -- a_get_all_intensity_level_scent
, a_get_inactive_intensity_level_scent -- a_get_inactive_intensity_level_scent
, a_ids_intensity_level_scent -- a_ids_intensity_level_scent
, a_names_intensity_level_scent -- a_names_intensity_level_scent
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, 0 -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
, 0 -- a_require_any_non_id_search_filters_met
, 0 -- a_show_errors
, 0 -- a_debug
;
END IF;
CALL parts.p_dog_calc_distraction_intensity_level (
a_guid -- a_guid
, a_id_user -- a_id_user
, a_get_all_intensity_level_scent -- a_get_all_intensity_level_scent
, a_get_inactive_intensity_level_scent -- a_get_inactive_intensity_level_scent
, a_ids_intensity_level_scent -- a_ids_intensity_level_scent
, a_names_intensity_level_scent -- a_names_intensity_level_scent
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
, 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met
, 0 -- a_show_errors
, 0 -- a_debug
);
INSERT INTO tmp_Intensity_Level_Scent_Calc_Distraction (
id_intensity_level
, code
, name
, active
, does_meet_id_filters
, does_meet_non_id_filters
)
SELECT
INTENSITY_LEVEL_SCENT_T.id_intensity_level
, INTENSITY_LEVEL_SCENT_T.code
, INTENSITY_LEVEL_SCENT_T.name
, INTENSITY_LEVEL_SCENT_T.active
, INTENSITY_LEVEL_SCENT_T.does_meet_id_filters
, INTENSITY_LEVEL_SCENT_T.does_meet_non_id_filters
FROM parts.DOG_Distraction_Intensity_Level_Temp INTENSITY_LEVEL_SCENT_T
WHERE INTENSITY_LEVEL_SCENT_T.GUID = a_guid
;
IF a_debug = 1 THEN
SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction;
END IF;
CALL parts.p_dog_clear_calc_distraction_intensity_level (
a_guid
, 0 -- a_debug
);
END IF;
-- Call Calc Intensity Level Sight -- Call Calc Intensity Level Sight
IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Distraction t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF NOT EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Distraction t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN IF a_debug = 1 THEN
@@ -889,6 +973,7 @@ BEGIN
, DISTRACTION.id_assessment , DISTRACTION.id_assessment
, DISTRACTION.id_distraction_type , DISTRACTION.id_distraction_type
, DISTRACTION.id_intensity_level_emotional , DISTRACTION.id_intensity_level_emotional
, DISTRACTION.id_intensity_level_scent
, DISTRACTION.id_intensity_level_sight , DISTRACTION.id_intensity_level_sight
, DISTRACTION.id_intensity_level_sound , DISTRACTION.id_intensity_level_sound
, DISTRACTION.id_intensity_level_touch , DISTRACTION.id_intensity_level_touch
@@ -979,6 +1064,7 @@ BEGIN
, id_assessment , id_assessment
, id_distraction_type , id_distraction_type
, id_intensity_level_emotional , id_intensity_level_emotional
, id_intensity_level_scent
, id_intensity_level_sight , id_intensity_level_sight
, id_intensity_level_sound , id_intensity_level_sound
, id_intensity_level_touch , id_intensity_level_touch
@@ -1028,6 +1114,7 @@ BEGIN
, DISTRACTION.id_assessment , DISTRACTION.id_assessment
, DISTRACTION.id_distraction_type , DISTRACTION.id_distraction_type
, DISTRACTION.id_intensity_level_emotional , DISTRACTION.id_intensity_level_emotional
, DISTRACTION.id_intensity_level_scent
, DISTRACTION.id_intensity_level_sight , DISTRACTION.id_intensity_level_sight
, DISTRACTION.id_intensity_level_sound , DISTRACTION.id_intensity_level_sound
, DISTRACTION.id_intensity_level_touch , DISTRACTION.id_intensity_level_touch
@@ -1130,6 +1217,7 @@ BEGIN
LEFT JOIN tmp_Assessment_Calc_Distraction t_ASSESSMENT ON t_DISTRACTION.id_assessment = t_ASSESSMENT.id_assessment LEFT JOIN tmp_Assessment_Calc_Distraction t_ASSESSMENT ON t_DISTRACTION.id_assessment = t_ASSESSMENT.id_assessment
LEFT JOIN tmp_Distraction_Type_Calc_Distraction t_DISTRACTION_TYPE ON t_DISTRACTION.id_distraction_type = t_DISTRACTION_TYPE.id_type LEFT JOIN tmp_Distraction_Type_Calc_Distraction t_DISTRACTION_TYPE ON t_DISTRACTION.id_distraction_type = t_DISTRACTION_TYPE.id_type
LEFT JOIN tmp_Intensity_Level_Emotional_Calc_Distraction t_INTENSITY_LEVEL_EMOTIONAL ON t_DISTRACTION.id_intensity_level_emotional = t_INTENSITY_LEVEL_EMOTIONAL.id_intensity_level LEFT JOIN tmp_Intensity_Level_Emotional_Calc_Distraction t_INTENSITY_LEVEL_EMOTIONAL ON t_DISTRACTION.id_intensity_level_emotional = t_INTENSITY_LEVEL_EMOTIONAL.id_intensity_level
LEFT JOIN tmp_Intensity_Level_Scent_Calc_Distraction t_INTENSITY_LEVEL_SCENT ON t_DISTRACTION.id_intensity_level_scent = t_INTENSITY_LEVEL_SCENT.id_intensity_level
LEFT JOIN tmp_Intensity_Level_Sight_Calc_Distraction t_INTENSITY_LEVEL_SIGHT ON t_DISTRACTION.id_intensity_level_sight = t_INTENSITY_LEVEL_SIGHT.id_intensity_level LEFT JOIN tmp_Intensity_Level_Sight_Calc_Distraction t_INTENSITY_LEVEL_SIGHT ON t_DISTRACTION.id_intensity_level_sight = t_INTENSITY_LEVEL_SIGHT.id_intensity_level
LEFT JOIN tmp_Intensity_Level_Sound_Calc_Distraction t_INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = t_INTENSITY_LEVEL_SOUND.id_intensity_level LEFT JOIN tmp_Intensity_Level_Sound_Calc_Distraction t_INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = t_INTENSITY_LEVEL_SOUND.id_intensity_level
LEFT JOIN tmp_Intensity_Level_Touch_Calc_Distraction t_INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = t_INTENSITY_LEVEL_TOUCH.id_intensity_level LEFT JOIN tmp_Intensity_Level_Touch_Calc_Distraction t_INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = t_INTENSITY_LEVEL_TOUCH.id_intensity_level
@@ -1141,6 +1229,7 @@ BEGIN
OR IFNULL(t_ASSESSMENT.does_meet_id_filters, 1) = 0 OR IFNULL(t_ASSESSMENT.does_meet_id_filters, 1) = 0
OR IFNULL(t_DISTRACTION_TYPE.does_meet_id_filters, 1) = 0 OR IFNULL(t_DISTRACTION_TYPE.does_meet_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_id_filters, 1) = 0
@@ -1153,6 +1242,7 @@ BEGIN
OR IFNULL(t_ASSESSMENT.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_ASSESSMENT.does_meet_non_id_filters, 1) = 0
OR IFNULL(t_DISTRACTION_TYPE.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_DISTRACTION_TYPE.does_meet_non_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_non_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_non_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_non_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_non_id_filters, 1) = 0
OR IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_non_id_filters, 1) = 0 OR IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_non_id_filters, 1) = 0
@@ -1164,6 +1254,7 @@ BEGIN
AND IFNULL(t_ASSESSMENT.does_meet_id_filters, 1) = 0 AND IFNULL(t_ASSESSMENT.does_meet_id_filters, 1) = 0
AND IFNULL(t_DISTRACTION_TYPE.does_meet_id_filters, 1) = 0 AND IFNULL(t_DISTRACTION_TYPE.does_meet_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_id_filters, 1) = 0
@@ -1174,6 +1265,7 @@ BEGIN
AND IFNULL(t_ASSESSMENT.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_ASSESSMENT.does_meet_non_id_filters, 1) = 0
AND IFNULL(t_DISTRACTION_TYPE.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_DISTRACTION_TYPE.does_meet_non_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_EMOTIONAL.does_meet_non_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_SCENT.does_meet_non_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SIGHT.does_meet_non_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_SOUND.does_meet_non_id_filters, 1) = 0
AND IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_non_id_filters, 1) = 0 AND IFNULL(t_INTENSITY_LEVEL_TOUCH.does_meet_non_id_filters, 1) = 0
@@ -1186,6 +1278,7 @@ BEGIN
SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Assessment_Calc_Distraction;
SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction;
@@ -1273,6 +1366,7 @@ BEGIN
SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Assessment_Calc_Distraction;
SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction;
@@ -1283,19 +1377,21 @@ BEGIN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Assessment_Calc_Distraction;
SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction;
SELECT * FROM tmp_Distraction_Calc_Distraction; SELECT * FROM tmp_Distraction_Calc_Distraction;
END IF; END IF;
DELETE FROM tmp_Assessment_Calc_Distraction;
DELETE FROM tmp_Distraction_Type_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Emotional_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Sight_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Sound_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Touch_Calc_Distraction; DELETE FROM tmp_Intensity_Level_Touch_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Sound_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Sight_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Scent_Calc_Distraction;
DELETE FROM tmp_Intensity_Level_Emotional_Calc_Distraction;
DELETE FROM tmp_Distraction_Type_Calc_Distraction;
DELETE FROM tmp_Assessment_Calc_Distraction;
DELETE FROM tmp_Distraction_Calc_Distraction; DELETE FROM tmp_Distraction_Calc_Distraction;
END IF; END IF;
@@ -1312,6 +1408,7 @@ BEGIN
, id_assessment , id_assessment
, id_distraction_type , id_distraction_type
, id_intensity_level_emotional , id_intensity_level_emotional
, id_intensity_level_scent
, id_intensity_level_sight , id_intensity_level_sight
, id_intensity_level_sound , id_intensity_level_sound
, id_intensity_level_touch , id_intensity_level_touch
@@ -1329,6 +1426,7 @@ BEGIN
, t_DISTRACTION.id_assessment , t_DISTRACTION.id_assessment
, t_DISTRACTION.id_distraction_type , t_DISTRACTION.id_distraction_type
, t_DISTRACTION.id_intensity_level_emotional , t_DISTRACTION.id_intensity_level_emotional
, t_DISTRACTION.id_intensity_level_scent
, t_DISTRACTION.id_intensity_level_sight , t_DISTRACTION.id_intensity_level_sight
, t_DISTRACTION.id_intensity_level_sound , t_DISTRACTION.id_intensity_level_sound
, t_DISTRACTION.id_intensity_level_touch , t_DISTRACTION.id_intensity_level_touch
@@ -1365,6 +1463,7 @@ BEGIN
SELECT * FROM tmp_Assessment_Calc_Distraction; SELECT * FROM tmp_Assessment_Calc_Distraction;
SELECT * FROM tmp_Distraction_Type_Calc_Distraction; SELECT * FROM tmp_Distraction_Type_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Emotional_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Scent_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sight_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Sound_Calc_Distraction;
SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction; SELECT * FROM tmp_Intensity_Level_Touch_Calc_Distraction;
@@ -1388,6 +1487,7 @@ BEGIN
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Touch_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Touch_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sound_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sound_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sight_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Sight_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Scent_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Emotional_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Intensity_Level_Emotional_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Distraction_Type_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Distraction_Type_Calc_Distraction;
DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Calc_Distraction; DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Calc_Distraction;
@@ -1423,6 +1523,11 @@ CALL parts.p_dog_calc_distraction (
, '' -- a_ids_intensity_level_emotional , '' -- a_ids_intensity_level_emotional
, '' -- a_names_intensity_level_emotional , '' -- a_names_intensity_level_emotional
, 1 -- a_get_all_intensity_level_scent
, 0 -- a_get_inactive_intensity_level_scent
, '' -- a_ids_intensity_level_scent
, '' -- a_names_intensity_level_scent
, 1 -- a_get_all_intensity_level_sight , 1 -- a_get_all_intensity_level_sight
, 0 -- a_get_inactive_intensity_level_sight , 0 -- a_get_inactive_intensity_level_sight
, '' -- a_ids_intensity_level_sight , '' -- a_ids_intensity_level_sight

View File

@@ -22,6 +22,10 @@ CREATE PROCEDURE parts.p_dog_get_many_distraction (
, IN a_get_inactive_intensity_level_emotional BIT , IN a_get_inactive_intensity_level_emotional BIT
, IN a_ids_intensity_level_emotional TEXT , IN a_ids_intensity_level_emotional TEXT
, IN a_names_intensity_level_emotional TEXT , IN a_names_intensity_level_emotional TEXT
, IN a_get_all_intensity_level_scent BIT
, IN a_get_inactive_intensity_level_scent BIT
, IN a_ids_intensity_level_scent TEXT
, IN a_names_intensity_level_scent TEXT
, IN a_get_all_intensity_level_sight BIT , IN a_get_all_intensity_level_sight BIT
, IN a_get_inactive_intensity_level_sight BIT , IN a_get_inactive_intensity_level_sight BIT
, IN a_ids_intensity_level_sight TEXT , IN a_ids_intensity_level_sight TEXT
@@ -159,6 +163,10 @@ BEGIN
, a_get_inactive_intensity_level_emotional , a_get_inactive_intensity_level_emotional
, a_ids_intensity_level_emotional , a_ids_intensity_level_emotional
, a_names_intensity_level_emotional , a_names_intensity_level_emotional
, a_get_all_intensity_level_scent
, a_get_inactive_intensity_level_scent
, a_ids_intensity_level_scent
, a_names_intensity_level_scent
, a_get_all_intensity_level_sight , a_get_all_intensity_level_sight
, a_get_inactive_intensity_level_sight , a_get_inactive_intensity_level_sight
, a_ids_intensity_level_sight , a_ids_intensity_level_sight
@@ -220,6 +228,7 @@ BEGIN
, id_assessment INT , id_assessment INT
, id_distraction_type INT , id_distraction_type INT
, id_intensity_level_emotional INT , id_intensity_level_emotional INT
, id_intensity_level_scent INT
, id_intensity_level_sight INT , id_intensity_level_sight INT
, id_intensity_level_sound INT , id_intensity_level_sound INT
, id_intensity_level_touch INT , id_intensity_level_touch INT
@@ -339,6 +348,10 @@ BEGIN
, a_get_inactive_intensity_level_emotional , a_get_inactive_intensity_level_emotional
, a_ids_intensity_level_emotional , a_ids_intensity_level_emotional
, a_names_intensity_level_emotional , a_names_intensity_level_emotional
, a_get_all_intensity_level_scent
, a_get_inactive_intensity_level_scent
, a_ids_intensity_level_scent
, a_names_intensity_level_scent
, a_get_all_intensity_level_sight , a_get_all_intensity_level_sight
, a_get_inactive_intensity_level_sight , a_get_inactive_intensity_level_sight
, a_ids_intensity_level_sight , a_ids_intensity_level_sight
@@ -403,6 +416,10 @@ BEGIN
, a_get_inactive_intensity_level_emotional , a_get_inactive_intensity_level_emotional
, a_ids_intensity_level_emotional , a_ids_intensity_level_emotional
, a_names_intensity_level_emotional , a_names_intensity_level_emotional
, a_get_all_intensity_level_scent
, a_get_inactive_intensity_level_scent
, a_ids_intensity_level_scent
, a_names_intensity_level_scent
, a_get_all_intensity_level_sight , a_get_all_intensity_level_sight
, a_get_inactive_intensity_level_sight , a_get_inactive_intensity_level_sight
, a_ids_intensity_level_sight , a_ids_intensity_level_sight
@@ -457,6 +474,7 @@ BEGIN
, id_assessment , id_assessment
, id_distraction_type , id_distraction_type
, id_intensity_level_emotional , id_intensity_level_emotional
, id_intensity_level_scent
, id_intensity_level_sight , id_intensity_level_sight
, id_intensity_level_sound , id_intensity_level_sound
, id_intensity_level_touch , id_intensity_level_touch
@@ -472,6 +490,7 @@ BEGIN
, DISTRACTION_T.id_assessment , DISTRACTION_T.id_assessment
, DISTRACTION_T.id_distraction_type , DISTRACTION_T.id_distraction_type
, DISTRACTION_T.id_intensity_level_emotional , DISTRACTION_T.id_intensity_level_emotional
, DISTRACTION_T.id_intensity_level_scent
, DISTRACTION_T.id_intensity_level_sight , DISTRACTION_T.id_intensity_level_sight
, DISTRACTION_T.id_intensity_level_sound , DISTRACTION_T.id_intensity_level_sound
, DISTRACTION_T.id_intensity_level_touch , DISTRACTION_T.id_intensity_level_touch
@@ -511,6 +530,8 @@ BEGIN
, DISTRACTION_TYPE.name AS name_distraction_type , DISTRACTION_TYPE.name AS name_distraction_type
, t_DISTRACTION.id_intensity_level_emotional , t_DISTRACTION.id_intensity_level_emotional
, INTENSITY_LEVEL_EMOTIONAL.name AS name_intensity_level_emotional , INTENSITY_LEVEL_EMOTIONAL.name AS name_intensity_level_emotional
, t_DISTRACTION.id_intensity_level_scent
, INTENSITY_LEVEL_SCENT.name AS name_intensity_level_scent
, t_DISTRACTION.id_intensity_level_sight , t_DISTRACTION.id_intensity_level_sight
, INTENSITY_LEVEL_SIGHT.name AS name_intensity_level_sight , INTENSITY_LEVEL_SIGHT.name AS name_intensity_level_sight
, t_DISTRACTION.id_intensity_level_sound , t_DISTRACTION.id_intensity_level_sound
@@ -527,6 +548,7 @@ BEGIN
FROM tmp_Distraction t_DISTRACTION FROM tmp_Distraction t_DISTRACTION
LEFT JOIN parts.DOG_Distraction_Type DISTRACTION_TYPE ON t_DISTRACTION.id_distraction_type = DISTRACTION_TYPE.id_type LEFT JOIN parts.DOG_Distraction_Type DISTRACTION_TYPE ON t_DISTRACTION.id_distraction_type = DISTRACTION_TYPE.id_type
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_EMOTIONAL ON t_DISTRACTION.id_intensity_level_emotional = INTENSITY_LEVEL_EMOTIONAL.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_EMOTIONAL ON t_DISTRACTION.id_intensity_level_emotional = INTENSITY_LEVEL_EMOTIONAL.id_intensity_level
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SCENT ON t_DISTRACTION.id_intensity_level_scent = INTENSITY_LEVEL_SCENT.id_intensity_level
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SIGHT ON t_DISTRACTION.id_intensity_level_sight = INTENSITY_LEVEL_SIGHT.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SIGHT ON t_DISTRACTION.id_intensity_level_sight = INTENSITY_LEVEL_SIGHT.id_intensity_level
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = INTENSITY_LEVEL_SOUND.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_SOUND ON t_DISTRACTION.id_intensity_level_sound = INTENSITY_LEVEL_SOUND.id_intensity_level
LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = INTENSITY_LEVEL_TOUCH.id_intensity_level LEFT JOIN parts.DOG_Distraction_Intensity_Level INTENSITY_LEVEL_TOUCH ON t_DISTRACTION.id_intensity_level_touch = INTENSITY_LEVEL_TOUCH.id_intensity_level
@@ -590,6 +612,11 @@ CALL parts.p_dog_get_many_distraction (
, '' -- a_ids_intensity_level_emotional , '' -- a_ids_intensity_level_emotional
, '' -- a_names_intensity_level_emotional , '' -- a_names_intensity_level_emotional
, 1 -- a_get_all_intensity_level_scent
, 0 -- a_get_inactive_intensity_level_scent
, '' -- a_ids_intensity_level_scent
, '' -- a_names_intensity_level_scent
, 1 -- a_get_all_intensity_level_sight , 1 -- a_get_all_intensity_level_sight
, 0 -- a_get_inactive_intensity_level_sight , 0 -- a_get_inactive_intensity_level_sight
, '' -- a_ids_intensity_level_sight , '' -- a_ids_intensity_level_sight

View File

@@ -12,10 +12,10 @@ CREATE PROCEDURE parts.p_dog_calc_assessment_command_modality_link (
, IN a_ids_link TEXT , IN a_ids_link TEXT
, IN a_min_distance_from_handler_link FLOAT , IN a_min_distance_from_handler_link FLOAT
, IN a_max_distance_from_handler_link FLOAT , IN a_max_distance_from_handler_link FLOAT
, IN a_value_is_in_sight_of_handler_link INT , IN a_value_is_in_sight_of_handler_link BIT
, IN a_value_is_in_scent_range_of_handler_link INT , IN a_value_is_in_scent_range_of_handler_link BIT
, IN a_value_is_in_hearing_range_of_handler_link INT , IN a_value_is_in_hearing_range_of_handler_link BIT
, IN a_value_is_on_lead_link INT , IN a_value_is_on_lead_link BIT
, IN a_min_trial_count_link FLOAT , IN a_min_trial_count_link FLOAT
, IN a_max_trial_count_link FLOAT , IN a_max_trial_count_link FLOAT

View File

@@ -11,10 +11,10 @@ CREATE PROCEDURE parts.p_dog_get_many_assessment_command_modality_link (
, IN a_ids_link TEXT , IN a_ids_link TEXT
, IN a_min_distance_from_handler_link FLOAT , IN a_min_distance_from_handler_link FLOAT
, IN a_max_distance_from_handler_link FLOAT , IN a_max_distance_from_handler_link FLOAT
, IN a_value_is_in_sight_of_handler_link INT , IN a_value_is_in_sight_of_handler_link BIT
, IN a_value_is_in_scent_range_of_handler_link INT , IN a_value_is_in_scent_range_of_handler_link BIT
, IN a_value_is_in_hearing_range_of_handler_link INT , IN a_value_is_in_hearing_range_of_handler_link BIT
, IN a_value_is_on_lead_link INT , IN a_value_is_on_lead_link BIT
, IN a_min_trial_count_link FLOAT , IN a_min_trial_count_link FLOAT
, IN a_max_trial_count_link FLOAT , IN a_max_trial_count_link FLOAT
@@ -63,6 +63,7 @@ CREATE PROCEDURE parts.p_dog_get_many_assessment_command_modality_link (
, IN a_get_inactive_bribe BIT , IN a_get_inactive_bribe BIT
, IN a_ids_bribe TEXT , IN a_ids_bribe TEXT
, IN a_names_bribe TEXT , IN a_names_bribe TEXT
, IN a_require_all_id_search_filters_met BIT , IN a_require_all_id_search_filters_met BIT
, IN a_require_any_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT
, IN a_require_all_non_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT

View File

@@ -1,15 +1,15 @@
USE parts; USE parts;
DROP PROCEDURE IF EXISTS parts.p_dog_get_many_colour; DROP PROCEDURE IF EXISTS parts.p_dog_get_many_response_quality_metric;
DELIMITER // DELIMITER //
CREATE PROCEDURE parts.p_dog_get_many_colour ( CREATE PROCEDURE parts.p_dog_get_many_response_quality_metric (
IN a_id_user INT IN a_id_user INT
, IN a_get_all_colour BIT , IN a_get_all_response_quality_metric BIT
, IN a_get_inactive_colour BIT , IN a_get_inactive_response_quality_metric BIT
, IN a_ids_colour TEXT , IN a_ids_response_quality_metric TEXT
, IN a_names_colour TEXT , IN a_names_response_quality_metric TEXT
, IN a_require_all_id_search_filters_met BIT , IN a_require_all_id_search_filters_met BIT
, IN a_require_any_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT
, IN a_require_all_non_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT
@@ -86,10 +86,10 @@ BEGIN
SET a_id_user := IFNULL(a_id_user, 0); SET a_id_user := IFNULL(a_id_user, 0);
/* /*
SET a_get_all_colour := IFNULL(a_get_all_colour, 0); SET a_get_all_response_quality_metric := IFNULL(a_get_all_response_quality_metric, 0);
SET a_get_inactive_colour := IFNULL(a_get_inactive_colour, 0); SET a_get_inactive_response_quality_metric := IFNULL(a_get_inactive_response_quality_metric, 0);
SET a_ids_colour := TRIM(IFNULL(a_ids_colour, '')); SET a_ids_response_quality_metric := TRIM(IFNULL(a_ids_response_quality_metric, ''));
SET a_names_colour := TRIM(IFNULL(a_names_colour, '')); SET a_names_response_quality_metric := TRIM(IFNULL(a_names_response_quality_metric, ''));
SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1);
SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1);
SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0);
@@ -100,10 +100,10 @@ BEGIN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT SELECT
a_id_user a_id_user
, a_get_all_colour , a_get_all_response_quality_metric
, a_get_inactive_colour , a_get_inactive_response_quality_metric
, a_ids_colour , a_ids_response_quality_metric
, a_names_colour , a_names_response_quality_metric
, a_require_all_id_search_filters_met , a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met , a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met , a_require_all_non_id_search_filters_met
@@ -121,16 +121,18 @@ BEGIN
END IF; END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Colour; DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric;
CREATE TEMPORARY TABLE tmp_Colour ( CREATE TEMPORARY TABLE tmp_Response_Quality_Metric (
id_colour INT NOT NULL id_metric INT NOT NULL
, code VARCHAR(250) , id_unit_measurement INT
, code VARCHAR(250)
, name VARCHAR(250) , name VARCHAR(250)
, value_min DOUBLE
, value_max DOUBLE
, active BIT , active BIT
, does_meet_id_filters BIT NOT NULL
, does_meet_id_filters BIT , does_meet_non_id_filters BIT NOT NULL
, does_meet_non_id_filters BIT
); );
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
@@ -207,7 +209,7 @@ BEGIN
VALUES ( VALUES (
v_id_type_error_no_permission v_id_type_error_no_permission
, v_code_type_error_no_permission , v_code_type_error_no_permission
, 'You do not have permission to view Colours.' , 'You do not have permission to view RESPONSE_QUALITY_METRIC.'
) )
; ;
END IF; END IF;
@@ -218,16 +220,16 @@ BEGIN
); );
-- Call Colour Calc -- Call Response_Quality_Metric Calc
IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT SELECT
v_guid -- a_guid v_guid -- a_guid
, a_id_user -- a_id_user , a_id_user -- a_id_user
, a_get_all_colour -- a_get_all_colour , a_get_all_response_quality_metric -- a_get_all_response_quality_metric
, a_get_inactive_colour -- a_get_inactive_colour , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric
, a_ids_colour -- a_ids_colour , a_ids_response_quality_metric -- a_ids_response_quality_metric
, a_names_colour -- a_names_colour , a_names_response_quality_metric -- a_names_response_quality_metric
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
@@ -237,13 +239,13 @@ BEGIN
; ;
END IF; END IF;
CALL parts.p_dog_calc_colour ( CALL parts.p_dog_calc_response_quality_metric (
v_guid -- a_guid v_guid -- a_guid
, a_id_user -- a_id_user , a_id_user -- a_id_user
, a_get_all_colour -- a_get_all_colour , a_get_all_response_quality_metric -- a_get_all_response_quality_metric
, a_get_inactive_colour -- a_get_inactive_colour , a_get_inactive_response_quality_metric -- a_get_inactive_response_quality_metric
, a_ids_colour -- a_ids_colour , a_ids_response_quality_metric -- a_ids_response_quality_metric
, a_names_colour -- a_names_colour , a_names_response_quality_metric -- a_names_response_quality_metric
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
@@ -253,60 +255,72 @@ BEGIN
); );
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT COUNT(*) FROM parts.DOG_Colour_Temp; SELECT COUNT(*) FROM parts.DOG_Response_Quality_Metric_Temp;
SELECT * FROM parts.DOG_Colour_Temp; SELECT * FROM parts.DOG_Response_Quality_Metric_Temp;
END IF; END IF;
INSERT INTO tmp_Colour ( INSERT INTO tmp_Response_Quality_Metric (
id_colour id_metric
, id_unit_measurement
, code , code
, name , name
, value_min
, value_max
, active , active
, does_meet_id_filters , does_meet_id_filters
, does_meet_non_id_filters , does_meet_non_id_filters
) )
SELECT SELECT
COLOUR_T.id_colour RESPONSE_QUALITY_METRIC_T.id_metric
, COLOUR_T.code , RESPONSE_QUALITY_METRIC_T.id_unit_measurement
, COLOUR_T.name , RESPONSE_QUALITY_METRIC_T.code
, COLOUR_T.active , RESPONSE_QUALITY_METRIC_T.name
, RESPONSE_QUALITY_METRIC_T.value_min
, RESPONSE_QUALITY_METRIC_T.value_max
, RESPONSE_QUALITY_METRIC_T.active
, COLOUR_T.does_meet_id_filters , RESPONSE_QUALITY_METRIC_T.does_meet_id_filters
, COLOUR_T.does_meet_non_id_filters , RESPONSE_QUALITY_METRIC_T.does_meet_non_id_filters
FROM parts.DOG_Colour_Temp COLOUR_T FROM parts.DOG_Response_Quality_Metric_Temp RESPONSE_QUALITY_METRIC_T
WHERE COLOUR_T.GUID = v_guid WHERE RESPONSE_QUALITY_METRIC_T.GUID = v_guid
; ;
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT COUNT(*) FROM tmp_Colour; SELECT COUNT(*) FROM tmp_Response_Quality_Metric;
SELECT * FROM tmp_Colour; SELECT * FROM tmp_Response_Quality_Metric;
END IF; END IF;
END IF; END IF;
-- Filter outputs -- Filter outputs
IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT * FROM tmp_Colour; SELECT * FROM tmp_Response_Quality_Metric;
END IF; END IF;
DELETE FROM tmp_Colour; DELETE FROM tmp_Response_Quality_Metric;
END IF; END IF;
-- Outputs -- Outputs
-- Colours -- RESPONSE_QUALITY_METRIC
SELECT SELECT
t_COLOURS.id_colour t_RESPONSE_QUALITY_METRIC.id_metric
, t_COLOURS.code , t_RESPONSE_QUALITY_METRIC.id_unit_measurement
, t_COLOURS.name , UNIT_MEASUREMENT.name_singular AS name_singular_unit_measurement
, t_COLOURS.active , UNIT_MEASUREMENT.name_plural AS name_plural_unit_measurement
, UNIT_MEASUREMENT.symbol AS symbol_unit_measurement
, t_RESPONSE_QUALITY_METRIC.code
, t_RESPONSE_QUALITY_METRIC.name
, t_RESPONSE_QUALITY_METRIC.value_min
, t_RESPONSE_QUALITY_METRIC.value_max
, t_RESPONSE_QUALITY_METRIC.active
, t_COLOURS.does_meet_id_filters , t_RESPONSE_QUALITY_METRIC.does_meet_id_filters
, t_COLOURS.does_meet_non_id_filters , t_RESPONSE_QUALITY_METRIC.does_meet_non_id_filters
FROM tmp_Colour t_COLOURS FROM tmp_Response_Quality_Metric t_RESPONSE_QUALITY_METRIC
LEFT JOIN parts.DOG_Colour COLOURS ON t_COLOURS.id_colour = COLOURS.id_colour LEFT JOIN parts.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_RESPONSE_QUALITY_METRIC.id_metric = RESPONSE_QUALITY_METRIC.id_metric
ORDER BY t_COLOURS.name LEFT JOIN parts.DOG_Unit_Measurement UNIT_MEASUREMENT ON t_RESPONSE_QUALITY_METRIC.id_unit_measurement = UNIT_MEASUREMENT.id_unit_measurement
ORDER BY t_RESPONSE_QUALITY_METRIC.name
; ;
-- Errors -- Errors
@@ -325,16 +339,16 @@ BEGIN
; ;
IF a_debug = 1 AND v_can_view = 1 THEN IF a_debug = 1 AND v_can_view = 1 THEN
SELECT * FROM tmp_Colour; SELECT * FROM tmp_Response_Quality_Metric;
END IF; END IF;
CALL parts.p_dog_clear_calc_colour( CALL parts.p_dog_clear_calc_response_quality_metric(
v_guid -- a_guid v_guid -- a_guid
, 0 -- a_debug , 0 -- a_debug
); );
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Colour; DROP TEMPORARY TABLE IF EXISTS tmp_Response_Quality_Metric;
IF a_debug = 1 THEN IF a_debug = 1 THEN
CALL parts.p_core_debug_timing_reporting ( v_time_start ); CALL parts.p_core_debug_timing_reporting ( v_time_start );
@@ -345,12 +359,12 @@ DELIMITER ;
/* /*
CALL parts.p_dog_get_many_colour ( CALL parts.p_dog_get_many_response_quality_metric (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_colour , 1 -- a_get_all_response_quality_metric
, 0 -- a_get_inactive_colour , 0 -- a_get_inactive_response_quality_metric
, '' -- a_ids_colour , '' -- a_ids_response_quality_metric
, '' -- a_names_colour , '' -- a_names_response_quality_metric
, 1 -- a_require_all_id_search_filters_met , 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met , 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met
@@ -359,12 +373,12 @@ CALL parts.p_dog_get_many_colour (
); );
CALL demo.p_dog_get_many_colour ( CALL demo.p_dog_get_many_response_quality_metric (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_colour , 1 -- a_get_all_response_quality_metric
, 0 -- a_get_inactive_colour , 0 -- a_get_inactive_response_quality_metric
, '' -- a_ids_colour , '' -- a_ids_response_quality_metric
, 'pat,point' -- a_names_colour , 'pat,point' -- a_names_response_quality_metric
, 1 -- a_require_all_id_search_filters_met , 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met , 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met

View File

@@ -68,8 +68,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_obedience_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_obedience_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error_Calc_Obedience_Level t_ERROR FROM tmp_Msg_Error_Calc_Obedience_Level t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
@@ -481,8 +481,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_obedience_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_obedience_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error_Calc_Obedience_Level t_ERROR FROM tmp_Msg_Error_Calc_Obedience_Level t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type

View File

@@ -65,8 +65,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_obedience_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_obedience_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error t_ERROR FROM tmp_Msg_Error t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type
@@ -317,8 +317,8 @@ BEGIN
, ERROR_TYPE.name , ERROR_TYPE.name
, ERROR_TYPE.description , ERROR_TYPE.description
, ERROR_TYPE.is_breaking_error , ERROR_TYPE.is_breaking_error
, ERROR_TYPE.background_obedience_level , ERROR_TYPE.background_colour
, ERROR_TYPE.text_obedience_level , ERROR_TYPE.text_colour
, t_ERROR.msg , t_ERROR.msg
FROM tmp_Msg_Error t_ERROR FROM tmp_Msg_Error t_ERROR
INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,11 @@
USE parts; USE parts;
DROP PROCEDURE IF EXISTS parts.p_dog_clear_calc_colour; DROP PROCEDURE IF EXISTS parts.p_dog_clear_calc_assessment_response;
DROP PROCEDURE IF EXISTS parts.p_colour_clear_calc_colour; DROP PROCEDURE IF EXISTS parts.p_assessment_response_clear_calc_assessment_response;
DELIMITER // DELIMITER //
CREATE PROCEDURE parts.p_dog_clear_calc_colour ( CREATE PROCEDURE parts.p_dog_clear_calc_assessment_response (
IN a_guid BINARY(36) IN a_guid BINARY(36)
, IN a_debug BIT , IN a_debug BIT
) )
@@ -17,9 +17,9 @@ BEGIN
START TRANSACTION; START TRANSACTION;
DELETE COLOURS_T DELETE ASSESSMENT_RESPONSES_T
FROM parts.DOG_Colour_Temp COLOURS_T FROM parts.DOG_Assessment_Response_Temp ASSESSMENT_RESPONSES_T
WHERE COLOURS_T.GUID = a_guid WHERE ASSESSMENT_RESPONSES_T.GUID = a_guid
; ;
COMMIT; COMMIT;
@@ -32,7 +32,7 @@ DELIMITER ;
/* /*
CALL parts.p_dog_clear_calc_colour ( CALL parts.p_dog_clear_calc_assessment_response (
'crips ' -- a_guid 'crips ' -- a_guid
, 1 -- debug , 1 -- debug
); );

View File

@@ -1,15 +1,82 @@
USE parts; USE parts;
DROP PROCEDURE IF EXISTS parts.p_dog_get_many_colour; DROP PROCEDURE IF EXISTS parts.p_dog_get_many_assessment_response;
DELIMITER // DELIMITER //
CREATE PROCEDURE parts.p_dog_get_many_colour ( CREATE PROCEDURE parts.p_dog_get_many_assessment_response (
IN a_id_user INT IN a_id_user INT
, IN a_get_all_colour BIT , IN a_get_all_assessment_response BIT
, IN a_get_inactive_colour BIT , IN a_get_inactive_assessment_response BIT
, IN a_ids_colour TEXT , IN a_ids_assessment_response TEXT
, IN a_names_colour TEXT , IN a_notes_assessment_response TEXT
, IN a_min_value_measured_assessment_response INT
, IN a_max_value_measured_assessment_response INT
, IN a_get_all_ACM_link BIT
, IN a_get_inactive_ACM_link BIT
, IN a_ids_ACM_link TEXT
, IN a_min_distance_from_handler_ACM_link FLOAT
, IN a_max_distance_from_handler_ACM_link FLOAT
, IN a_value_is_in_sight_of_handler_ACM_link INT
, IN a_value_is_in_scent_range_of_handler_ACM_link INT
, IN a_value_is_in_hearing_range_of_handler_ACM_link INT
, IN a_value_is_on_lead_ACM_link INT
, IN a_min_trial_count_ACM_link FLOAT
, IN a_max_trial_count_ACM_link FLOAT
, IN a_get_all_assessment BIT
, IN a_get_inactive_assessment BIT
, IN a_ids_assessment TEXT
, IN a_notes_assessment TEXT
, IN a_min_temperature_assessment DECIMAL(5, 2)
, IN a_max_temperature_assessment DECIMAL(5, 2)
, IN a_get_all_weather BIT
, IN a_get_inactive_weather BIT
, IN a_ids_weather TEXT
, IN a_names_weather TEXT
, IN a_get_all_lighting_level BIT
, IN a_get_inactive_lighting_level BIT
, IN a_ids_lighting_level TEXT
, IN a_names_lighting_level TEXT
, IN a_get_all_location BIT
, IN a_get_inactive_location BIT
, IN a_ids_location TEXT
, IN a_names_location TEXT
, IN a_get_all_user_handler BIT
, IN a_get_inactive_user_handler BIT
, IN a_ids_user_handler TEXT
-- , IN a_auth0_ids_user_handler TEXT
, IN a_names_user_handler TEXT
, IN a_emails_user_handler TEXT
, IN a_get_all_command_category BIT
, IN a_get_inactive_command_category BIT
, IN a_ids_command_category TEXT
, IN a_names_command_category TEXT
, IN a_get_all_command BIT
, IN a_get_inactive_command BIT
, IN a_ids_command TEXT
, IN a_names_command TEXT
, IN a_hand_signal_default_descriptions_command TEXT
, IN a_notes_command TEXT
, IN a_get_all_command_modality BIT
, IN a_get_inactive_command_modality BIT
, IN a_ids_command_modality TEXT
, IN a_names_command_modality TEXT
, IN a_get_all_bribe BIT
, IN a_get_inactive_bribe BIT
, IN a_ids_bribe TEXT
, IN a_names_bribe TEXT
, IN a_get_all_response_quality_metric BIT
, IN a_get_inactive_response_quality_metric BIT
, IN a_ids_response_quality_metric TEXT
, IN a_names_response_quality_metric TEXT
, IN a_get_all_obedience_level BIT
, IN a_get_inactive_obedience_level BIT
, IN a_ids_obedience_level TEXT
, IN a_names_obedience_level TEXT
, IN a_require_all_id_search_filters_met BIT , IN a_require_all_id_search_filters_met BIT
, IN a_require_any_id_search_filters_met BIT , IN a_require_any_id_search_filters_met BIT
, IN a_require_all_non_id_search_filters_met BIT , IN a_require_all_non_id_search_filters_met BIT
@@ -86,24 +153,85 @@ BEGIN
SET a_id_user := IFNULL(a_id_user, 0); SET a_id_user := IFNULL(a_id_user, 0);
/* /*
SET a_get_all_colour := IFNULL(a_get_all_colour, 0); Filters handled by Calc
SET a_get_inactive_colour := IFNULL(a_get_inactive_colour, 0);
SET a_ids_colour := TRIM(IFNULL(a_ids_colour, ''));
SET a_names_colour := TRIM(IFNULL(a_names_colour, ''));
SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1);
SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1);
SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0);
SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1);
*/ */
SET a_debug := IFNULL(a_debug, 0); SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT SELECT
a_id_user a_id_user
, a_get_all_colour
, a_get_inactive_colour , a_get_all_assessment_response
, a_ids_colour , a_get_inactive_assessment_response
, a_names_colour , a_ids_assessment_response
, a_notes_assessment_response
, a_min_value_measured_assessment_response
, a_max_value_measured_assessment_response
, a_get_all_ACM_link
, a_get_inactive_ACM_link
, a_ids_ACM_link
, a_min_distance_from_handler_ACM_link
, a_max_distance_from_handler_ACM_link
, a_value_is_in_sight_of_handler_ACM_link
, a_value_is_in_scent_range_of_handler_ACM_link
, a_value_is_in_hearing_range_of_handler_ACM_link
, a_value_is_on_lead_ACM_link
, a_min_trial_count_ACM_link
, a_max_trial_count_ACM_link
, a_get_all_assessment
, a_get_inactive_assessment
, a_ids_assessment
, a_notes_assessment
, a_min_temperature_assessment
, a_max_temperature_assessment
, a_get_all_weather
, a_get_inactive_weather
, a_ids_weather
, a_names_weather
, a_get_all_lighting_level
, a_get_inactive_lighting_level
, a_ids_lighting_level
, a_names_lighting_level
, a_get_all_location
, a_get_inactive_location
, a_ids_location
, a_names_location
, a_get_all_user_handler
, a_get_inactive_user_handler
, a_ids_user_handler
-- , a_auth0_ids_user_handler
, a_names_user_handler
, a_emails_user_handler
, a_get_all_command_category
, a_get_inactive_command_category
, a_ids_command_category
, a_names_command_category
, a_get_all_command
, a_get_inactive_command
, a_ids_command
, a_names_command
, a_hand_signal_default_descriptions_command
, a_notes_command
, a_get_all_command_modality
, a_get_inactive_command_modality
, a_ids_command_modality
, a_names_command_modality
, a_get_all_bribe
, a_get_inactive_bribe
, a_ids_bribe
, a_names_bribe
, a_get_all_response_quality_metric
, a_get_inactive_response_quality_metric
, a_ids_response_quality_metric
, a_names_response_quality_metric
, a_get_all_obedience_level
, a_get_inactive_obedience_level
, a_ids_obedience_level
, a_names_obedience_level
, a_require_all_id_search_filters_met , a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met , a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met , a_require_all_non_id_search_filters_met
@@ -121,12 +249,15 @@ BEGIN
END IF; END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Colour; DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Response;
CREATE TEMPORARY TABLE tmp_Colour ( CREATE TEMPORARY TABLE tmp_Assessment_Response (
id_colour INT NOT NULL id_response INT NOT NULL
, code VARCHAR(250) , id_assessment_command_modality_link INT
, name VARCHAR(250) , id_response_quality_metric INT
, id_obedience_level INT
, value_measured DOUBLE
, notes TEXT
, active BIT , active BIT
, does_meet_id_filters BIT , does_meet_id_filters BIT
@@ -207,7 +338,7 @@ BEGIN
VALUES ( VALUES (
v_id_type_error_no_permission v_id_type_error_no_permission
, v_code_type_error_no_permission , v_code_type_error_no_permission
, 'You do not have permission to view Colours.' , 'You do not have permission to view Assessment_Responses.'
) )
; ;
END IF; END IF;
@@ -218,16 +349,84 @@ BEGIN
); );
-- Call Colour Calc -- Call Assessment_Response Calc
IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT SELECT
v_guid -- a_guid v_guid -- a_guid
, a_id_user -- a_id_user , a_id_user -- a_id_user
, a_get_all_colour -- a_get_all_colour
, a_get_inactive_colour -- a_get_inactive_colour , a_get_all_assessment_response
, a_ids_colour -- a_ids_colour , a_get_inactive_assessment_response
, a_names_colour -- a_names_colour , a_ids_assessment_response
, a_notes_assessment_response
, a_min_value_measured_assessment_response
, a_max_value_measured_assessment_response
, a_get_all_ACM_link
, a_get_inactive_ACM_link
, a_ids_ACM_link
, a_min_distance_from_handler_ACM_link
, a_max_distance_from_handler_ACM_link
, a_value_is_in_sight_of_handler_ACM_link
, a_value_is_in_scent_range_of_handler_ACM_link
, a_value_is_in_hearing_range_of_handler_ACM_link
, a_value_is_on_lead_ACM_link
, a_min_trial_count_ACM_link
, a_max_trial_count_ACM_link
, a_get_all_assessment
, a_get_inactive_assessment
, a_ids_assessment
, a_notes_assessment
, a_min_temperature_assessment
, a_max_temperature_assessment
, a_get_all_weather
, a_get_inactive_weather
, a_ids_weather
, a_names_weather
, a_get_all_lighting_level
, a_get_inactive_lighting_level
, a_ids_lighting_level
, a_names_lighting_level
, a_get_all_location
, a_get_inactive_location
, a_ids_location
, a_names_location
, a_get_all_user_handler
, a_get_inactive_user_handler
, a_ids_user_handler
-- , a_auth0_ids_user_handler
, a_names_user_handler
, a_emails_user_handler
, a_get_all_command_category
, a_get_inactive_command_category
, a_ids_command_category
, a_names_command_category
, a_get_all_command
, a_get_inactive_command
, a_ids_command
, a_names_command
, a_hand_signal_default_descriptions_command
, a_notes_command
, a_get_all_command_modality
, a_get_inactive_command_modality
, a_ids_command_modality
, a_names_command_modality
, a_get_all_bribe
, a_get_inactive_bribe
, a_ids_bribe
, a_names_bribe
, a_get_all_response_quality_metric
, a_get_inactive_response_quality_metric
, a_ids_response_quality_metric
, a_names_response_quality_metric
, a_get_all_obedience_level
, a_get_inactive_obedience_level
, a_ids_obedience_level
, a_names_obedience_level
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
@@ -237,13 +436,81 @@ BEGIN
; ;
END IF; END IF;
CALL parts.p_dog_calc_colour ( CALL parts.p_dog_calc_assessment_response (
v_guid -- a_guid v_guid -- a_guid
, a_id_user -- a_id_user , a_id_user -- a_id_user
, a_get_all_colour -- a_get_all_colour
, a_get_inactive_colour -- a_get_inactive_colour , a_get_all_assessment_response
, a_ids_colour -- a_ids_colour , a_get_inactive_assessment_response
, a_names_colour -- a_names_colour , a_ids_assessment_response
, a_notes_assessment_response
, a_min_value_measured_assessment_response
, a_max_value_measured_assessment_response
, a_get_all_ACM_link
, a_get_inactive_ACM_link
, a_ids_ACM_link
, a_min_distance_from_handler_ACM_link
, a_max_distance_from_handler_ACM_link
, a_value_is_in_sight_of_handler_ACM_link
, a_value_is_in_scent_range_of_handler_ACM_link
, a_value_is_in_hearing_range_of_handler_ACM_link
, a_value_is_on_lead_ACM_link
, a_min_trial_count_ACM_link
, a_max_trial_count_ACM_link
, a_get_all_assessment
, a_get_inactive_assessment
, a_ids_assessment
, a_notes_assessment
, a_min_temperature_assessment
, a_max_temperature_assessment
, a_get_all_weather
, a_get_inactive_weather
, a_ids_weather
, a_names_weather
, a_get_all_lighting_level
, a_get_inactive_lighting_level
, a_ids_lighting_level
, a_names_lighting_level
, a_get_all_location
, a_get_inactive_location
, a_ids_location
, a_names_location
, a_get_all_user_handler
, a_get_inactive_user_handler
, a_ids_user_handler
-- , a_auth0_ids_user_handler
, a_names_user_handler
, a_emails_user_handler
, a_get_all_command_category
, a_get_inactive_command_category
, a_ids_command_category
, a_names_command_category
, a_get_all_command
, a_get_inactive_command
, a_ids_command
, a_names_command
, a_hand_signal_default_descriptions_command
, a_notes_command
, a_get_all_command_modality
, a_get_inactive_command_modality
, a_ids_command_modality
, a_names_command_modality
, a_get_all_bribe
, a_get_inactive_bribe
, a_ids_bribe
, a_names_bribe
, a_get_all_response_quality_metric
, a_get_inactive_response_quality_metric
, a_ids_response_quality_metric
, a_names_response_quality_metric
, a_get_all_obedience_level
, a_get_inactive_obedience_level
, a_ids_obedience_level
, a_names_obedience_level
, a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met
, a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met
, a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met
@@ -253,60 +520,73 @@ BEGIN
); );
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT COUNT(*) FROM parts.DOG_Colour_Temp; SELECT COUNT(*) FROM parts.DOG_Assessment_Response_Temp;
SELECT * FROM parts.DOG_Colour_Temp; SELECT * FROM parts.DOG_Assessment_Response_Temp;
END IF; END IF;
INSERT INTO tmp_Colour ( INSERT INTO tmp_Assessment_Response (
id_colour id_response
, code , id_assessment_command_modality_link
, name , id_response_quality_metric
, id_obedience_level
, value_measured
, notes
, active , active
, does_meet_id_filters , does_meet_id_filters
, does_meet_non_id_filters , does_meet_non_id_filters
) )
SELECT SELECT
COLOUR_T.id_colour ASSESSMENT_RESPONSE_T.id_response
, COLOUR_T.code , ASSESSMENT_RESPONSE_T.id_assessment_command_modality_link
, COLOUR_T.name , ASSESSMENT_RESPONSE_T.id_response_quality_metric
, COLOUR_T.active , ASSESSMENT_RESPONSE_T.id_obedience_level
, ASSESSMENT_RESPONSE_T.value_measured
, ASSESSMENT_RESPONSE_T.notes
, ASSESSMENT_RESPONSE_T.active
, COLOUR_T.does_meet_id_filters , ASSESSMENT_RESPONSE_T.does_meet_id_filters
, COLOUR_T.does_meet_non_id_filters , ASSESSMENT_RESPONSE_T.does_meet_non_id_filters
FROM parts.DOG_Colour_Temp COLOUR_T FROM parts.DOG_Assessment_Response_Temp ASSESSMENT_RESPONSE_T
WHERE COLOUR_T.GUID = v_guid WHERE ASSESSMENT_RESPONSE_T.GUID = v_guid
; ;
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT COUNT(*) FROM tmp_Colour; SELECT COUNT(*) FROM tmp_Assessment_Response;
SELECT * FROM tmp_Colour; SELECT * FROM tmp_Assessment_Response;
END IF; END IF;
END IF; END IF;
-- Filter outputs -- Filter outputs
IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT * FROM tmp_Colour; SELECT * FROM tmp_Assessment_Response;
END IF; END IF;
DELETE FROM tmp_Colour; DELETE FROM tmp_Assessment_Response;
END IF; END IF;
-- Outputs -- Outputs
-- Colours -- Assessment_Responses
SELECT SELECT
t_COLOURS.id_colour t_ASSESSMENT_RESPONSE.id_response
, t_COLOURS.code , t_ASSESSMENT_RESPONSE.id_assessment_command_modality_link
, t_COLOURS.name , t_ASSESSMENT_RESPONSE.id_response_quality_metric
, t_COLOURS.active , RESPONSE_QUALITY_METRIC.name AS name_response_quality_metric
, t_ASSESSMENT_RESPONSE.id_obedience_level
, OBEDIENCE_LEVEL.name AS name_obedience_level
, t_ASSESSMENT_RESPONSE.value_measured
, t_ASSESSMENT_RESPONSE.notes
, t_ASSESSMENT_RESPONSE.active
, t_COLOURS.does_meet_id_filters , t_ASSESSMENT_RESPONSE.does_meet_id_filters
, t_COLOURS.does_meet_non_id_filters , t_ASSESSMENT_RESPONSE.does_meet_non_id_filters
FROM tmp_Colour t_COLOURS FROM tmp_Assessment_Response t_ASSESSMENT_RESPONSE
LEFT JOIN parts.DOG_Colour COLOURS ON t_COLOURS.id_colour = COLOURS.id_colour LEFT JOIN parts.DOG_Assessment_Response ASSESSMENT_RESPONSE ON t_ASSESSMENT_RESPONSE.id_response = ASSESSMENT_RESPONSE.id_response
ORDER BY t_COLOURS.name LEFT JOIN parts.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_ASSESSMENT_RESPONSE.id_obedience_level = OBEDIENCE_LEVEL.id_obedience_level
LEFT JOIN parts.DOG_Response_Quality_Metric RESPONSE_QUALITY_METRIC ON t_ASSESSMENT_RESPONSE.id_response_quality_metric = RESPONSE_QUALITY_METRIC.id_metric
ORDER BY ASSESSMENT_RESPONSE.created_on DESC
; ;
-- Errors -- Errors
@@ -325,16 +605,16 @@ BEGIN
; ;
IF a_debug = 1 AND v_can_view = 1 THEN IF a_debug = 1 AND v_can_view = 1 THEN
SELECT * FROM tmp_Colour; SELECT * FROM tmp_Assessment_Response;
END IF; END IF;
CALL parts.p_dog_clear_calc_colour( CALL parts.p_dog_clear_calc_assessment_response(
v_guid -- a_guid v_guid -- a_guid
, 0 -- a_debug , 0 -- a_debug
); );
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Colour; DROP TEMPORARY TABLE IF EXISTS tmp_Assessment_Response;
IF a_debug = 1 THEN IF a_debug = 1 THEN
CALL parts.p_core_debug_timing_reporting ( v_time_start ); CALL parts.p_core_debug_timing_reporting ( v_time_start );
@@ -345,26 +625,81 @@ DELIMITER ;
/* /*
CALL parts.p_dog_get_many_colour ( CALL parts.p_dog_get_many_assessment_response (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_colour
, 0 -- a_get_inactive_colour , 1 -- a_get_all_assessment_response
, '' -- a_ids_colour , 0 -- a_get_inactive_assessment_response
, '' -- a_names_colour , '' -- a_ids_assessment_response
, 1 -- a_require_all_id_search_filters_met , '' -- a_notes_assessment_response
, 1 -- a_require_any_id_search_filters_met , NULL -- a_min_value_measured_assessment_response
, 0 -- a_require_all_non_id_search_filters_met , NULL -- a_max_value_measured_assessment_response
, 1 -- a_require_any_non_id_search_filters_met
, 1 -- a_debug , 1 -- a_get_all_ACM_link
); , 0 -- a_get_inactive_ACM_link
, '' -- a_ids_ACM_link
, NULL -- a_min_distance_from_handler_ACM_link
, NULL -- a_max_distance_from_handler_ACM_link
, NULL -- a_value_is_in_sight_of_handler_ACM_link
, NULL -- a_value_is_in_scent_range_of_handler_ACM_link
, NULL -- a_value_is_in_hearing_range_of_handler_ACM_link
, NULL -- a_value_is_on_lead_ACM_link
, NULL -- a_min_trial_count_ACM_link
, NULL -- a_max_trial_count_ACM_link
, 1 -- a_get_all_assessment
, 0 -- a_get_inactive_assessment
, '' -- a_ids_assessment
, '' -- a_notes_assessment
, NULL -- a_min_temperature_assessment
, NULL -- a_max_temperature_assessment
, 1 -- a_get_all_weather
, 0 -- a_get_inactive_weather
, '' -- a_ids_weather
, '' -- a_names_weather
, 1 -- a_get_all_lighting_level
, 0 -- a_get_inactive_lighting_level
, '' -- a_ids_lighting_level
, '' -- a_names_lighting_level
, 1 -- a_get_all_location
, 0 -- a_get_inactive_location
, '' -- a_ids_location
, '' -- a_names_location
, 1 -- a_get_all_user_handler
, 0 -- a_get_inactive_user_handler
, '' -- a_ids_user_handler
-- , IN a_auth0_ids_user_handler TEXT
, '' -- a_names_user_handler
, '' -- a_emails_user_handler
, 1 -- a_get_all_command_category
, 0 -- a_get_inactive_command_category
, '' -- a_ids_command_category
, '' -- a_names_command_category
, 1 -- a_get_all_command
, 0 -- a_get_inactive_command
, '' -- a_ids_command
, '' -- a_names_command
, '' -- a_hand_signal_default_descriptions_command
, '' -- a_notes_command
, 1 -- a_get_all_command_modality
, 0 -- a_get_inactive_command_modality
, '' -- a_ids_command_modality
, '' -- a_names_command_modality
, 1 -- a_get_all_bribe
, 0 -- a_get_inactive_bribe
, '' -- a_ids_bribe
, '' -- a_names_bribe
, 1 -- a_get_all_response_quality_metric
, 0 -- a_get_inactive_response_quality_metric
, '' -- a_ids_response_quality_metric
, '' -- a_names_response_quality_metric
, 1 -- a_get_all_obedience_level
, 0 -- a_get_inactive_obedience_level
, '' -- a_ids_obedience_level
, '' -- a_names_obedience_level
CALL demo.p_dog_get_many_colour (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_colour
, 0 -- a_get_inactive_colour
, '' -- a_ids_colour
, 'pat,point' -- a_names_colour
, 1 -- a_require_all_id_search_filters_met , 1 -- a_require_all_id_search_filters_met
, 1 -- a_require_any_id_search_filters_met , 1 -- a_require_any_id_search_filters_met
, 0 -- a_require_all_non_id_search_filters_met , 0 -- a_require_all_non_id_search_filters_met

View File

@@ -4,7 +4,7 @@
margin-top: 1vh; margin-top: 1vh;
} }
#tableMain { table.table-main {
overflow-x: auto; overflow-x: auto;
padding: 1vh 1vw; padding: 1vh 1vw;
max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */ max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */
@@ -13,28 +13,29 @@
justify-content: normal; justify-content: normal;
} }
#tableMain * { table.table-main * {
padding: 0.25vh 0.5vh; padding: 0.25vh 0.5vh;
} }
#tableMain thead { table.table-main thead {
max-height: 4vh; max-height: 4vh;
overflow-y: visible; overflow-y: visible;
background-color: var(--colour-text-background);
} }
#tableMain tbody { table.table-main tbody {
max-height: 60vh; max-height: 60vh;
overflow-y: auto; overflow-y: auto;
min-width: fit-content; min-width: fit-content;
max-width: fit-content; max-width: fit-content;
overflow-x: visible; overflow-x: visible;
} }
#tableMain tbody.is_collapsed { table.table-main tbody.is_collapsed {
display: block; display: block;
} }
#tableMain:has(tbody > div) tbody { table.table-main:has(tbody > div) tbody {
} }
#tableMain tbody > div { table.table-main tbody > div {
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
text-align: center; text-align: center;
@@ -49,62 +50,75 @@
width: 100%; /* min(calc(90vh), calc(70vw)); */ width: 100%; /* min(calc(90vh), calc(70vw)); */
} }
#tableMain select, table.table-main select,
#tableMain input:not([type="checkbox"]), table.table-main input:not([type="checkbox"]),
#tableMain textarea, table.table-main textarea,
#tableMain div { table.table-main div {
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
max-width: 100%;
height: 100%; height: 100%;
border: 1px solid var(--colour-accent); border: 1px solid var(--colour-accent);
border-radius: 0.5vh; border-radius: 0.5vh;
text-align: center; text-align: center;
background-color: var(--colour-text-background);
} }
#tableMain thead tr th, #tableMain tbody tr td { table.table-main thead tr th,
width: 20vh; table.table-main tbody tr td {
max-width: 20vh;
min-width: 20vh; min-width: 20vh;
padding: 0 0.5vh; padding: 0 0.5vh;
} }
#tableMain tbody tr td { table.table-main tbody tr td {
height: 5vh; height: 5vh;
/* padding-top: 0.5vh; */ /* padding-top: 0.5vh; */
} }
#tableMain tbody tr td:has(.dirty) { table.table-main thead tr th.notes,
table.table-main tbody tr td.notes {
max-width: fit-content;
}
table.table-main tbody tr td:has(.dirty) {
background-color: var(--colour-primary); background-color: var(--colour-primary);
} }
#tableMain tbody tr:not(:last-of-type) td { table.table-main tbody tr td:has(.dirty) table tr:not(:has(.dirty)) {
background-color: var(--colour-text-background);
}
table.table-main tbody tr:not(:last-of-type) td {
padding-bottom: 0.25vh; padding-bottom: 0.25vh;
} }
#tableMain tbody tr td.ddl-preview div, table.table-main tbody tr td.ddl-preview div {
#tableMain tbody tr td.ddl-preview select { cursor: pointer;
}
table.table-main tbody tr td.ddl-preview div,
table.table-main tbody tr td.ddl-preview select {
padding-left: 2vh; padding-left: 2vh;
padding-right: 2vh; padding-right: 2vh;
} }
#tableMain tbody tr td.ddl-preview select { table.table-main tbody tr td.ddl-preview select {
font-size: 12px; font-size: 12px;
} }
#tableMain thead tr th.active, table.table-main thead tr th.active,
#tableMain tbody tr td.active { table.table-main tbody tr td.active {
width: 6vh; max-width: 6vh;
min-width: 6vh; min-width: 6vh;
} }
#tableMain thead tr th.active svg.active.add { table.table-main thead tr th.active svg.active.add {
fill: var(--colour-primary); fill: var(--colour-primary);
background-color: var(--colour-accent); background-color: var(--colour-accent);
border: 2px solid var(--colour-accent); border: 2px solid var(--colour-accent);
padding: 0; padding: 0;
border-radius: 1vh; border-radius: 1vh;
} }
#tableMain tbody tr td.active svg.active.add { table.table-main tbody tr td.active svg.active.add {
fill: var(--colour-primary); fill: var(--colour-primary);
} }
#tableMain tbody tr td.active svg.active.delete { table.table-main tbody tr td.active svg.active.delete {
fill: var(--colour-error); fill: var(--colour-error);
} }
#tableMain tbody tr td.display_order, table.table-main tbody tr td.display_order,
#tableMain thead tr th.display_order { table.table-main thead tr th.display_order {
width: 5vh; max-width: 5vh;
min-width: 5vh; min-width: 5vh;
} }
@@ -121,10 +135,10 @@
width: 15vh; width: 15vh;
/* height: 3vh; */ /* height: 3vh; */
} }
#tableMain { table.table-main {
max-height: 60vh; max-height: 60vh;
} }
#tableMain tbody { table.table-main tbody {
max-height: 53vh; max-height: 53vh;
} }
} }

View File

@@ -0,0 +1,66 @@
.container.save.button-cancel {
position: fixed;
top: 10vh;
right: 10vh;
}
table.table-main.assessment thead tr th.active,
table.table-main.assessment tbody tr td.active,
table.table-main.distraction thead tr th.active,
table.table-main.distraction tbody tr td.active,
table.table-main.assessment_command_modality_link thead tr th.active,
table.table-main.assessment_command_modality_link tbody tr td.active,
table.table-main.assessment_response thead tr th.active,
table.table-main.assessment_response tbody tr td.active {
max-width: 6vh;
min-width: 6vh;
}
table.table-main.assessment thead tr th,
table.table-main.assessment tbody tr td {
max-width: 15vh;
min-width: 15vh;
}
table.table-main.distraction thead tr th,
table.table-main.distraction tbody tr td {
max-width: 12vh;
min-width: 12vh;
}
table.table-main.assessment_command_modality_link thead tr th,
table.table-main.assessment_command_modality_link tbody tr td {
max-width: 6vh;
min-width: 6vh;
}
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview div,
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview select {
padding-left: 0;
padding-right: 0;
}
table.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler,
table.table-main.assessment_command_modality_link thead tr th.is-in-scent-range-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-scent-range-of-handler,
table.table-main.assessment_command_modality_link thead tr th.is-in-sight-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-sight-of-handler,
table.table-main.assessment_command_modality_link thead tr th.is-on-lead,
table.table-main.assessment_command_modality_link tbody tr td.is-on-lead {
max-width: 4vh;
min-width: 4vh;
}
table.table-main.assessment_command_modality_link thead tr th.notes,
table.table-main.assessment_command_modality_link tbody tr td.notes {
max-width: 12vh;
min-width: 12vh;
}
table.table-main.assessment_command_modality_link thead tr th.assessment_response,
table.table-main.assessment_command_modality_link tbody tr td.assessment_response {
max-width: 43vh;
min-width: 43vh;
}

View File

@@ -1,90 +0,0 @@
#formFilters .container-input.filter.active {
width: 8vh;
}
#formFilters .container-input.filter.date_from,
#formFilters .container-input.filter.date_to {
width: 8vh;
}
#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl,
#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl {
width: 10vh;
min-width: 10vh;
}
#tableMain thead tr th.order_items.is_collapsed,
#tableMain tbody tr td.order_items.is_collapsed {
width: 15vh;
min-width: 15vh;
}
#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.is_collapsed) thead tr th.order_items,
#tableMain:has(tbody tr td.order_items table thead tr th.product_variations.is_collapsed) tbody tr td.order_items {
width: 100vh; /* 95vh */
min-width: 100vh;
}
#tableMain thead tr th.order_items,
#tableMain tbody tr td.order_items {
width: 110vh;
min-width: 110vh;
}
#tableMain tbody tr td.order_items table thead tr th, #tableMain tbody tr td.order_items table tbody tr td {
width: 12vh;
min-width: 12vh;
}
#tableMain tbody tr td.order_items table thead tr th.display_order, #tableMain tbody tr td.order_items table tbody tr td.display_order {
width: 5vh;
min-width: 5vh;
}
#tableMain tbody tr td.order_items table thead tr th.id_unit_measurement_quantity, #tableMain tbody tr td.order_items table tbody tr td.id_unit_measurement_quantity,
#tableMain tbody tr td.order_items table thead tr th.unit_measurement_latency_manufacture, #tableMain tbody tr td.order_items table tbody tr td.unit_measurement_latency_manufacture {
width: 6vh;
min-width: 6vh;
}
#tableMain tbody tr td.order_items table thead tr th.product_variations.is_collapsed, #tableMain tbody tr td.order_items table tbody tr td.product_variations.is_collapsed {
width: 10vh;
min-width: 10vh;
}
#tableMain tbody tr td.order_items table thead tr th.product_variations, #tableMain tbody tr td.order_items table tbody tr td.product_variations {
width: 20vh;
min-width: 20vh;
}
#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td {
width: 8vh;
min-width: 8vh;
}
#tableMain tbody tr td.order_items table tbody tr td.product_variations table thead tr th:last-of-type, #tableMain tbody tr td.order_items table tbody tr td.product_variations table tbody tr td:last-of-type {
width: 4vh;
min-width: 4vh;
}
#tableMain tbody tr td.order_items table thead tr th.quantity_used, #tableMain tbody tr td.order_items table tbody tr td.quantity_used,
#tableMain tbody tr td.order_items table thead tr th.quantity_produced, #tableMain tbody tr td.order_items table tbody tr td.quantity_produced,
#tableMain tbody tr td.order_items table thead tr th.latency_manufacture, #tableMain tbody tr td.order_items table tbody tr td.latency_manufacture {
width: 8vh;
min-width: 8vh;
}
#tableMain tbody tr td.order_items table thead tr th.active, #tableMain tbody tr td.order_items table tbody tr td.active,
#tableMain tbody tr td.order_items table thead tr th.add, #tableMain tbody tr td.order_items table tbody tr td.delete {
width: 4vh;
min-width: 4vh;
}
#tableMain thead tr th.currency.is_collapsed, #tableMain tbody tr td.currency.is_collapsed {
width: 9vh;
min-width: 9vh;
}
#tableMain thead tr th.currency, #tableMain tbody tr td.currency {
width: 11vh;
min-width: 11vh;
}
#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl,
#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl,
#tableMain tbody tr td.price_total_local_vat_excl, #tableMain thead tr th.price_total_local_vat_excl,
#tableMain tbody tr td.price_total_local_vat_incl, #tableMain thead tr th.price_total_local_vat_incl {
width: 5vh;
min-width: 5vh;
}

View File

@@ -23,7 +23,7 @@
#tableMain tbody tr td table tbody tr td.colour, #tableMain tbody tr td table tbody tr td.colour,
#tableMain tbody tr td table thead tr th.button_icon, #tableMain tbody tr td table thead tr th.button_icon,
#tableMain tbody tr td table tbody tr td.button_icon { #tableMain tbody tr td table tbody tr td.button_icon {
width: 12vh; max-width: 12vh;
max-width: 12vh; max-width: 12vh;
} }
@@ -36,7 +36,7 @@ select.id_variation, select.id_variation_type {
@media screen and (max-width: 850px) { @media screen and (max-width: 850px) {
#formFilters input, #formFilters input,
#formFilters select { #formFilters select {
width: 12vh; max-width: 12vh;
min-width: 12vh; min-width: 12vh;
} }
} }

View File

@@ -1,11 +1,11 @@
#formFilters #search { #formFilters #search {
width: 20vh; max-width: 20vh;
min-width: 20vh; min-width: 20vh;
} }
#tableMain tbody > div { #tableMain tbody > div {
width: 58vh; max-width: 58vh;
} }
#tableMain thead tr th, #tableMain thead tr th,
#tableMain tbody tr td { #tableMain tbody tr td {
@@ -20,19 +20,19 @@
*/ */
#tableMain thead tr th.name , #tableMain thead tr th.name ,
#tableMain tbody tr td.name { #tableMain tbody tr td.name {
width: 50vh; max-width: 50vh;
min-width: 50vh; min-width: 50vh;
} }
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
#tableMain thead tr th.name , #tableMain thead tr th.name ,
#tableMain tbody tr td.name { #tableMain tbody tr td.name {
width: 63vw; max-width: 63vw;
min-width: 63vw; min-width: 63vw;
} }
#tableMain thead tr th.active , #tableMain thead tr th.active ,
#tableMain tbody tr td.active { #tableMain tbody tr td.active {
width: 3vw; max-width: 3vw;
min-width: 3vw; min-width: 3vw;
} }
} }

View File

@@ -10,7 +10,7 @@
} }
#tableMain thead tr th.can-have-button, #tableMain thead tr th.can-have-button,
#tableMain tbody tr td.can-have-button { #tableMain tbody tr td.can-have-button {
width: 6vh; max-width: 6vh;
min-width: 6vh; min-width: 6vh;
} }

View File

@@ -38,7 +38,7 @@ select.id_variation, select.id_variation_type {
@media screen and (max-width: 850px) { @media screen and (max-width: 850px) {
#formFilters input, #formFilters input,
#formFilters select { #formFilters select {
width: 12vh; max-width: 12vh;
min-width: 12vh; min-width: 12vh;
} }
} }

View File

@@ -1,48 +0,0 @@
#formFilters .container {
max-width: fit-content;
}
#formFilters .container-input.filter.is_not_empty {
width: 10vh;
}
#formFilters .container-input.filter.active {
width: 8vh;
}
#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order {
width: 5vh;
min-width: 5vh;
}
#tableMain tbody tr td.code, #tableMain thead tr th.code {
width: 10vh;
min-width: 10vh;
}
#tableMain tbody tr td.name, #tableMain thead tr th.name {
width: 15vh;
min-width: 15vh;
}
#tableMain tbody tr td.description, #tableMain thead tr th.description {
width: 25vh;
min-width: 25vh;
}
#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level {
width: 7vh;
min-width: 7vh;
}
#tableMain tbody tr td.active, #tableMain thead tr th.active {
width: 5vh;
min-width: 5vh;
}
td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea {
border: 2px solid var(--border-colour);
border-radius: 0.5vh;
}
#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation {
width: 47.5%;
}

View File

@@ -0,0 +1,124 @@
.img-product {
max-width: 20vh;
max-height: 20vh;
border-radius: 3vh;
justify-self: left;
}
.img-thumbnail {
max-width: 10vh;
max-height: 10vh;
border-radius: 3vh;
justify-self: left;
}
.buttonAddToBasket {
background-color: var(--colour-page-background);
border-color: var(--colour-primary);
}
#buttonCheckout, .buttonBuyNow {
background-color: var(--colour-page-background);
/* color: var(--c_purple_dark); */
border-color: var(--colour-primary);
}
.button-increment, .button-decrement {
border: 2px solid darkgrey;
background-color: lightgray;
margin: 1vh 1vh;
width: 2.5vh;
height: 2.5vh;
border-radius: 1.25vh;
font-size: 2vh;
}
.container-input > input {
padding: 0vh 1vh;
border-radius: 0.5vh;
max-width: 7vh;
}
#basket {
max-width: 100%;
}
/* Right column */
.rightcolumn {
min-width: fit-content;
}
/* Main Table */
.container.save.button-cancel {
position: fixed;
top: 10vh;
right: 10vh;
}
table.table-main.assessment thead tr th.active,
table.table-main.assessment tbody tr td.active,
table.table-main.distraction thead tr th.active,
table.table-main.distraction tbody tr td.active,
table.table-main.assessment_command_modality_link thead tr th.active,
table.table-main.assessment_command_modality_link tbody tr td.active,
table.table-main.assessment_response thead tr th.active,
table.table-main.assessment_response tbody tr td.active {
max-width: 6vh;
min-width: 6vh;
}
table.table-main.assessment thead tr th,
table.table-main.assessment tbody tr td {
max-width: 15vh;
min-width: 15vh;
}
table.table-main.distraction thead tr th,
table.table-main.distraction tbody tr td {
max-width: 12vh;
min-width: 12vh;
}
table.table-main.assessment_command_modality_link thead tr th,
table.table-main.assessment_command_modality_link tbody tr td {
max-width: 6vh;
min-width: 6vh;
}
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview div,
table.table-main.assessment_command_modality_link tbody tr td.ddl-preview select {
padding-left: 0;
padding-right: 0;
}
table.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler,
table.table-main.assessment_command_modality_link thead tr th.is-in-scent-range-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-scent-range-of-handler,
table.table-main.assessment_command_modality_link thead tr th.is-in-sight-of-handler,
table.table-main.assessment_command_modality_link tbody tr td.is-in-sight-of-handler,
table.table-main.assessment_command_modality_link thead tr th.is-on-lead,
table.table-main.assessment_command_modality_link tbody tr td.is-on-lead {
max-width: 4vh;
min-width: 4vh;
}
table.table-main.assessment_command_modality_link thead tr th.notes,
table.table-main.assessment_command_modality_link tbody tr td.notes {
max-width: 12vh;
min-width: 12vh;
}
table.table-main.assessment_command_modality_link thead tr th.assessment_response,
table.table-main.assessment_command_modality_link tbody tr td.assessment_response {
max-width: 40vh;
min-width: 40vh;
}
/*# sourceMappingURL=dog_assessment.bundle.css.map*/

View File

@@ -0,0 +1 @@
{"version":3,"file":"css/dog_assessment.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;;ACnDf;IACI,eAAe;IACf,SAAS;IACT,WAAW;AACf;;;AAGA;;;;;;;;IAQI,cAAc;IACd,cAAc;AAClB;;AAEA;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;;IAEI,cAAc;IACd,cAAc;AAClB;AACA;;IAEI,eAAe;IACf,gBAAgB;AACpB;AACA;;;;;;;;IAQI,cAAc;IACd,cAAc;AAClB;AACA;;IAEI,eAAe;IACf,eAAe;AACnB;;;AAGA;;IAEI,eAAe;IACf,eAAe;AACnB,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/assessment.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n\n.container.save.button-cancel {\n position: fixed;\n top: 10vh;\n right: 10vh;\n}\n\n\ntable.table-main.assessment thead tr th.active,\ntable.table-main.assessment tbody tr td.active,\ntable.table-main.distraction thead tr th.active,\ntable.table-main.distraction tbody tr td.active,\ntable.table-main.assessment_command_modality_link thead tr th.active,\ntable.table-main.assessment_command_modality_link tbody tr td.active,\ntable.table-main.assessment_response thead tr th.active,\ntable.table-main.assessment_response tbody tr td.active {\n max-width: 6vh;\n min-width: 6vh;\n}\n\ntable.table-main.assessment thead tr th,\ntable.table-main.assessment tbody tr td {\n max-width: 15vh;\n min-width: 15vh;\n}\n\ntable.table-main.distraction thead tr th,\ntable.table-main.distraction tbody tr td {\n max-width: 12vh;\n min-width: 12vh;\n}\n\ntable.table-main.assessment_command_modality_link thead tr th,\ntable.table-main.assessment_command_modality_link tbody tr td {\n max-width: 6vh;\n min-width: 6vh;\n}\ntable.table-main.assessment_command_modality_link tbody tr td.ddl-preview div, \ntable.table-main.assessment_command_modality_link tbody tr td.ddl-preview select {\n padding-left: 0;\n padding-right: 0;\n}\ntable.table-main.assessment_command_modality_link thead tr th.is-in-hearing-range-of-handler,\ntable.table-main.assessment_command_modality_link tbody tr td.is-in-hearing-range-of-handler,\ntable.table-main.assessment_command_modality_link thead tr th.is-in-scent-range-of-handler,\ntable.table-main.assessment_command_modality_link tbody tr td.is-in-scent-range-of-handler,\ntable.table-main.assessment_command_modality_link thead tr th.is-in-sight-of-handler,\ntable.table-main.assessment_command_modality_link tbody tr td.is-in-sight-of-handler,\ntable.table-main.assessment_command_modality_link thead tr th.is-on-lead,\ntable.table-main.assessment_command_modality_link tbody tr td.is-on-lead {\n max-width: 4vh;\n min-width: 4vh;\n}\ntable.table-main.assessment_command_modality_link thead tr th.notes,\ntable.table-main.assessment_command_modality_link tbody tr td.notes {\n max-width: 12vh;\n min-width: 12vh;\n}\n\n\ntable.table-main.assessment_command_modality_link thead tr th.assessment_response,\ntable.table-main.assessment_command_modality_link tbody tr td.assessment_response {\n max-width: 40vh;\n min-width: 40vh;\n}"],"names":[],"sourceRoot":""}

View File

@@ -0,0 +1,59 @@
.img-product {
max-width: 20vh;
max-height: 20vh;
border-radius: 3vh;
justify-self: left;
}
.img-thumbnail {
max-width: 10vh;
max-height: 10vh;
border-radius: 3vh;
justify-self: left;
}
.buttonAddToBasket {
background-color: var(--colour-page-background);
border-color: var(--colour-primary);
}
#buttonCheckout, .buttonBuyNow {
background-color: var(--colour-page-background);
/* color: var(--c_purple_dark); */
border-color: var(--colour-primary);
}
.button-increment, .button-decrement {
border: 2px solid darkgrey;
background-color: lightgray;
margin: 1vh 1vh;
width: 2.5vh;
height: 2.5vh;
border-radius: 1.25vh;
font-size: 2vh;
}
.container-input > input {
padding: 0vh 1vh;
border-radius: 0.5vh;
max-width: 7vh;
}
#basket {
max-width: 100%;
}
/* Right column */
.rightcolumn {
min-width: fit-content;
}
/* Main Table */
/*# sourceMappingURL=dog_assessments.bundle.css.map*/

View File

@@ -0,0 +1 @@
{"version":3,"file":"css/dog_assessments.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n"],"names":[],"sourceRoot":""}

View File

@@ -79,7 +79,7 @@
#tableMain tbody tr td table tbody tr td.colour, #tableMain tbody tr td table tbody tr td.colour,
#tableMain tbody tr td table thead tr th.button_icon, #tableMain tbody tr td table thead tr th.button_icon,
#tableMain tbody tr td table tbody tr td.button_icon { #tableMain tbody tr td table tbody tr td.button_icon {
width: 12vh; max-width: 12vh;
max-width: 12vh; max-width: 12vh;
} }
@@ -92,7 +92,7 @@ select.id_variation, select.id_variation_type {
@media screen and (max-width: 850px) { @media screen and (max-width: 850px) {
#formFilters input, #formFilters input,
#formFilters select { #formFilters select {
width: 12vh; max-width: 12vh;
min-width: 12vh; min-width: 12vh;
} }
} }

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_command_button_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;CAGC;;;AAGD;IACI,YAAY;AAChB;;AAEA;;;;;;;CAOC;AACD;;;;;;IAMI,WAAW;IACX,eAAe;AACnB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,WAAW;QACX,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_button_links.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n\n/*\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n*/\n#tableMain tbody tr td table thead tr th.button_shape, \n#tableMain tbody tr td table tbody tr td.button_shape,\n#tableMain tbody tr td table thead tr th.colour, \n#tableMain tbody tr td table tbody tr td.colour,\n#tableMain tbody tr td table thead tr th.button_icon, \n#tableMain tbody tr td table tbody tr td.button_icon {\n width: 12vh;\n max-width: 12vh;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""} {"version":3,"file":"css/dog_command_button_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;CAGC;;;AAGD;IACI,YAAY;AAChB;;AAEA;;;;;;;CAOC;AACD;;;;;;IAMI,eAAe;IACf,eAAe;AACnB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_button_links.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n\n/*\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n*/\n#tableMain tbody tr td table thead tr th.button_shape, \n#tableMain tbody tr td table tbody tr td.button_shape,\n#tableMain tbody tr td table thead tr th.colour, \n#tableMain tbody tr td table tbody tr td.colour,\n#tableMain tbody tr td table thead tr th.button_icon, \n#tableMain tbody tr td table tbody tr td.button_icon {\n max-width: 12vh;\n max-width: 12vh;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n max-width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -56,12 +56,12 @@
#formFilters #search { #formFilters #search {
width: 20vh; max-width: 20vh;
min-width: 20vh; min-width: 20vh;
} }
#tableMain tbody > div { #tableMain tbody > div {
width: 58vh; max-width: 58vh;
} }
#tableMain thead tr th, #tableMain thead tr th,
#tableMain tbody tr td { #tableMain tbody tr td {
@@ -76,19 +76,19 @@
*/ */
#tableMain thead tr th.name , #tableMain thead tr th.name ,
#tableMain tbody tr td.name { #tableMain tbody tr td.name {
width: 50vh; max-width: 50vh;
min-width: 50vh; min-width: 50vh;
} }
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
#tableMain thead tr th.name , #tableMain thead tr th.name ,
#tableMain tbody tr td.name { #tableMain tbody tr td.name {
width: 63vw; max-width: 63vw;
min-width: 63vw; min-width: 63vw;
} }
#tableMain thead tr th.active , #tableMain thead tr th.active ,
#tableMain tbody tr td.active { #tableMain tbody tr td.active {
width: 3vw; max-width: 3vw;
min-width: 3vw; min-width: 3vw;
} }
} }

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_command_categories.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;IACI,WAAW;IACX,eAAe;AACnB;;AAEA;IACI,WAAW;AACf;AACA;;IAEI,WAAW;AACf;AACA;IACI,sCAAsC;AAC1C;AACA;;;CAGC;AACD;;IAEI,WAAW;IACX,eAAe;AACnB;;AAEA;IACI;;QAEI,WAAW;QACX,eAAe;IACnB;IACA;;QAEI,UAAU;QACV,cAAc;IAClB;AACJ,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_categories.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n#formFilters #search {\n width: 20vh;\n min-width: 20vh;\n}\n\n#tableMain tbody > div {\n width: 58vh;\n}\n#tableMain thead tr th,\n#tableMain tbody tr td {\n height: 3vh;\n}\n#tableMain tbody tr td.name .name {\n border: 1px solid var(--colour-accent);\n}\n/*\n#tableMain thead tr th.code,\n#tableMain tbody tr td.code,\n*/\n#tableMain thead tr th.name ,\n#tableMain tbody tr td.name {\n width: 50vh;\n min-width: 50vh;\n}\n\n@media screen and (max-width: 800px) {\n #tableMain thead tr th.name ,\n #tableMain tbody tr td.name {\n width: 63vw;\n min-width: 63vw;\n }\n #tableMain thead tr th.active ,\n #tableMain tbody tr td.active {\n width: 3vw;\n min-width: 3vw;\n }\n}"],"names":[],"sourceRoot":""} {"version":3,"file":"css/dog_command_categories.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;IACI,eAAe;IACf,eAAe;AACnB;;AAEA;IACI,eAAe;AACnB;AACA;;IAEI,WAAW;AACf;AACA;IACI,sCAAsC;AAC1C;AACA;;;CAGC;AACD;;IAEI,eAAe;IACf,eAAe;AACnB;;AAEA;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;IACA;;QAEI,cAAc;QACd,cAAc;IAClB;AACJ,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/command_categories.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n#formFilters #search {\n max-width: 20vh;\n min-width: 20vh;\n}\n\n#tableMain tbody > div {\n max-width: 58vh;\n}\n#tableMain thead tr th,\n#tableMain tbody tr td {\n height: 3vh;\n}\n#tableMain tbody tr td.name .name {\n border: 1px solid var(--colour-accent);\n}\n/*\n#tableMain thead tr th.code,\n#tableMain tbody tr td.code,\n*/\n#tableMain thead tr th.name ,\n#tableMain tbody tr td.name {\n max-width: 50vh;\n min-width: 50vh;\n}\n\n@media screen and (max-width: 800px) {\n #tableMain thead tr th.name ,\n #tableMain tbody tr td.name {\n max-width: 63vw;\n min-width: 63vw;\n }\n #tableMain thead tr th.active ,\n #tableMain tbody tr td.active {\n max-width: 3vw;\n min-width: 3vw;\n }\n}"],"names":[],"sourceRoot":""}

View File

@@ -66,7 +66,7 @@
} }
#tableMain thead tr th.can-have-button, #tableMain thead tr th.can-have-button,
#tableMain tbody tr td.can-have-button { #tableMain tbody tr td.can-have-button {
width: 6vh; max-width: 6vh;
min-width: 6vh; min-width: 6vh;
} }

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_commands.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;;CAIC;;AAED;IACI,WAAW;AACf;AACA;;IAEI,UAAU;IACV,cAAc;AAClB;;AAEA;;;;;;;;CAQC,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/commands.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n/*\n#formFilters .container {\n max-width: fit-content;\n}\n*/\n\n#tableMain tbody > div {\n width: 99vh;\n}\n#tableMain thead tr th.can-have-button, \n#tableMain tbody tr td.can-have-button {\n width: 6vh;\n min-width: 6vh;\n}\n\n/*\n@media screen and (max-width: 600px) {\n #formFilters input,\n #formFilters select {\n width: 12vh;\n min-width: 12vh;\n }\n}\n*/"],"names":[],"sourceRoot":""} {"version":3,"file":"css/dog_commands.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;;CAIC;;AAED;IACI,WAAW;AACf;AACA;;IAEI,cAAc;IACd,cAAc;AAClB;;AAEA;;;;;;;;CAQC,C","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/commands.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n/*\n#formFilters .container {\n max-width: fit-content;\n}\n*/\n\n#tableMain tbody > div {\n width: 99vh;\n}\n#tableMain thead tr th.can-have-button, \n#tableMain tbody tr td.can-have-button {\n max-width: 6vh;\n min-width: 6vh;\n}\n\n/*\n@media screen and (max-width: 600px) {\n #formFilters input,\n #formFilters select {\n width: 12vh;\n min-width: 12vh;\n }\n}\n*/"],"names":[],"sourceRoot":""}

View File

@@ -94,7 +94,7 @@ select.id_variation, select.id_variation_type {
@media screen and (max-width: 850px) { @media screen and (max-width: 850px) {
#formFilters input, #formFilters input,
#formFilters select { #formFilters select {
width: 12vh; max-width: 12vh;
min-width: 12vh; min-width: 12vh;
} }
} }

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_dog_command_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;CAGC;;;AAGD;IACI,YAAY;AAChB;AACA;IACI,eAAe;AACnB;;AAEA;;;;;;IAMI,uCAAuC;IACvC,oBAAoB;AACxB;;AAEA;;;;IAII,YAAY;AAChB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,WAAW;QACX,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dog_command_links.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n#tableMain {\n max-width: 90vw;\n}\n\ntd > input,\ntd > select,\ntd > textarea,\n.container-input > input,\n.container-input > select,\n.container-input > textarea {\n border: 2px solid var(--colour-primary);\n border-radius: 0.5vh;\n}\n\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""} {"version":3,"file":"css/dog_dog_command_links.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;;;CAGC;;;AAGD;IACI,YAAY;AAChB;AACA;IACI,eAAe;AACnB;;AAEA;;;;;;IAMI,uCAAuC;IACvC,oBAAoB;AACxB;;AAEA;;;;IAII,YAAY;AAChB;;AAEA;;;;CAIC;;AAED;IACI;;QAEI,eAAe;QACf,eAAe;IACnB;AACJ","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dog_command_links.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n/*\n#formFilters .container-input.filter.active_only {\n}\n*/\n\n\n#tableMain tbody > div {\n width: 113vh;\n}\n#tableMain {\n max-width: 90vw;\n}\n\ntd > input,\ntd > select,\ntd > textarea,\n.container-input > input,\n.container-input > select,\n.container-input > textarea {\n border: 2px solid var(--colour-primary);\n border-radius: 0.5vh;\n}\n\n#tableMain tbody tr td table thead tr th.id_variation_type,\n#tableMain tbody tr td table tbody tr td.id_variation_type,\n#tableMain tbody tr td table thead tr th.id_variation, \n#tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n\n/*\nselect.id_variation, select.id_variation_type {\n max-width: 40% !important;\n}\n*/\n\n@media screen and (max-width: 850px) {\n #formFilters input,\n #formFilters select {\n max-width: 12vh;\n min-width: 12vh;\n }\n}\n"],"names":[],"sourceRoot":""}

View File

@@ -55,53 +55,5 @@
#formFilters .container {
max-width: fit-content;
}
#formFilters .container-input.filter.is_not_empty {
width: 10vh;
}
#formFilters .container-input.filter.active {
width: 8vh;
}
#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order {
width: 5vh;
min-width: 5vh;
}
#tableMain tbody tr td.code, #tableMain thead tr th.code {
width: 10vh;
min-width: 10vh;
}
#tableMain tbody tr td.name, #tableMain thead tr th.name {
width: 15vh;
min-width: 15vh;
}
#tableMain tbody tr td.description, #tableMain thead tr th.description {
width: 25vh;
min-width: 25vh;
}
#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level {
width: 7vh;
min-width: 7vh;
}
#tableMain tbody tr td.active, #tableMain thead tr th.active {
width: 5vh;
min-width: 5vh;
}
td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea {
border: 2px solid var(--border-colour);
border-radius: 0.5vh;
}
#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation {
width: 47.5%;
}
/*# sourceMappingURL=dog_dogs.bundle.css.map*/ /*# sourceMappingURL=dog_dogs.bundle.css.map*/

View File

@@ -1 +1 @@
{"version":3,"file":"css/dog_dogs.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe;;;;ACpDf;IACI,sBAAsB;AAC1B;;AAEA;IACI,WAAW;AACf;;AAEA;IACI,UAAU;AACd;;;AAGA;IACI,UAAU;IACV,cAAc;AAClB;AACA;IACI,WAAW;IACX,eAAe;AACnB;AACA;IACI,WAAW;IACX,eAAe;AACnB;AACA;IACI,WAAW;IACX,eAAe;AACnB;AACA;IACI,UAAU;IACV,cAAc;AAClB;AACA;IACI,UAAU;IACV,cAAc;AAClB;;AAEA;IACI,sCAAsC;IACtC,oBAAoB;AACxB;;AAEA;IACI,YAAY;AAChB","sources":["webpack://app/./static/css/sections/dog.css","webpack://app/./static/css/pages/dog/dogs.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n","\n#formFilters .container {\n max-width: fit-content;\n}\n\n#formFilters .container-input.filter.is_not_empty {\n width: 10vh;\n} \n\n#formFilters .container-input.filter.active {\n width: 8vh;\n}\n\n\n#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order {\n width: 5vh;\n min-width: 5vh;\n}\n#tableMain tbody tr td.code, #tableMain thead tr th.code {\n width: 10vh;\n min-width: 10vh;\n}\n#tableMain tbody tr td.name, #tableMain thead tr th.name {\n width: 15vh;\n min-width: 15vh;\n}\n#tableMain tbody tr td.description, #tableMain thead tr th.description {\n width: 25vh;\n min-width: 25vh;\n}\n#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level {\n width: 7vh;\n min-width: 7vh;\n}\n#tableMain tbody tr td.active, #tableMain thead tr th.active {\n width: 5vh;\n min-width: 5vh;\n}\n\ntd > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea {\n border: 2px solid var(--border-colour);\n border-radius: 0.5vh;\n}\n\n#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation {\n width: 47.5%;\n}\n\n"],"names":[],"sourceRoot":""} {"version":3,"file":"css/dog_dogs.bundle.css","mappings":";AACA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,eAAe;IACf,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;AACtB;;AAEA;IACI,+CAA+C;IAC/C,mCAAmC;AACvC;;AAEA;IACI,+CAA+C;IAC/C,iCAAiC;IACjC,mCAAmC;AACvC;;AAEA;IACI,0BAA0B;IAC1B,2BAA2B;IAC3B,eAAe;IACf,YAAY;IACZ,aAAa;IACb,qBAAqB;IACrB,cAAc;AAClB;;AAEA;IACI,gBAAgB;IAChB,oBAAoB;IACpB,cAAc;AAClB;;AAEA;IACI,eAAe;AACnB;;;;AAIA,iBAAiB;AACjB;IACI,sBAAsB;AAC1B;;AAEA,eAAe","sources":["webpack://app/./static/css/sections/dog.css"],"sourcesContent":["\n.img-product {\n max-width: 20vh;\n max-height: 20vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.img-thumbnail {\n max-width: 10vh;\n max-height: 10vh;\n border-radius: 3vh;\n justify-self: left;\n}\n\n.buttonAddToBasket {\n background-color: var(--colour-page-background);\n border-color: var(--colour-primary);\n}\n\n#buttonCheckout, .buttonBuyNow {\n background-color: var(--colour-page-background);\n /* color: var(--c_purple_dark); */\n border-color: var(--colour-primary);\n}\n\n.button-increment, .button-decrement {\n border: 2px solid darkgrey;\n background-color: lightgray;\n margin: 1vh 1vh;\n width: 2.5vh;\n height: 2.5vh;\n border-radius: 1.25vh;\n font-size: 2vh;\n}\n\n.container-input > input {\n padding: 0vh 1vh;\n border-radius: 0.5vh;\n max-width: 7vh;\n}\n\n#basket {\n max-width: 100%;\n}\n\n\n\n/* Right column */\n.rightcolumn {\n min-width: fit-content;\n}\n\n/* Main Table */\n\n"],"names":[],"sourceRoot":""}

View File

@@ -757,7 +757,7 @@ form.filter button.save, form.filter button.button-cancel {
margin-top: 1vh; margin-top: 1vh;
} }
#tableMain { table.table-main {
overflow-x: auto; overflow-x: auto;
padding: 1vh 1vw; padding: 1vh 1vw;
max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */ max-width: 88vw; /* min(calc(1vh * 80), calc(1vw * 90)); */
@@ -766,28 +766,29 @@ form.filter button.save, form.filter button.button-cancel {
justify-content: normal; justify-content: normal;
} }
#tableMain * { table.table-main * {
padding: 0.25vh 0.5vh; padding: 0.25vh 0.5vh;
} }
#tableMain thead { table.table-main thead {
max-height: 4vh; max-height: 4vh;
overflow-y: visible; overflow-y: visible;
background-color: var(--colour-text-background);
} }
#tableMain tbody { table.table-main tbody {
max-height: 60vh; max-height: 60vh;
overflow-y: auto; overflow-y: auto;
min-width: fit-content; min-width: fit-content;
max-width: fit-content; max-width: fit-content;
overflow-x: visible; overflow-x: visible;
} }
#tableMain tbody.is_collapsed { table.table-main tbody.is_collapsed {
display: block; display: block;
} }
#tableMain:has(tbody > div) tbody { table.table-main:has(tbody > div) tbody {
} }
#tableMain tbody > div { table.table-main tbody > div {
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
text-align: center; text-align: center;
@@ -802,62 +803,75 @@ form.filter button.save, form.filter button.button-cancel {
width: 100%; /* min(calc(90vh), calc(70vw)); */ width: 100%; /* min(calc(90vh), calc(70vw)); */
} }
#tableMain select, table.table-main select,
#tableMain input:not([type="checkbox"]), table.table-main input:not([type="checkbox"]),
#tableMain textarea, table.table-main textarea,
#tableMain div { table.table-main div {
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
max-width: 100%;
height: 100%; height: 100%;
border: 1px solid var(--colour-accent); border: 1px solid var(--colour-accent);
border-radius: 0.5vh; border-radius: 0.5vh;
text-align: center; text-align: center;
background-color: var(--colour-text-background);
} }
#tableMain thead tr th, #tableMain tbody tr td { table.table-main thead tr th,
width: 20vh; table.table-main tbody tr td {
max-width: 20vh;
min-width: 20vh; min-width: 20vh;
padding: 0 0.5vh; padding: 0 0.5vh;
} }
#tableMain tbody tr td { table.table-main tbody tr td {
height: 5vh; height: 5vh;
/* padding-top: 0.5vh; */ /* padding-top: 0.5vh; */
} }
#tableMain tbody tr td:has(.dirty) { table.table-main thead tr th.notes,
table.table-main tbody tr td.notes {
max-width: fit-content;
}
table.table-main tbody tr td:has(.dirty) {
background-color: var(--colour-primary); background-color: var(--colour-primary);
} }
#tableMain tbody tr:not(:last-of-type) td { table.table-main tbody tr td:has(.dirty) table {
background-color: var(--colour-text-background);
}
table.table-main tbody tr:not(:last-of-type) td {
padding-bottom: 0.25vh; padding-bottom: 0.25vh;
} }
#tableMain tbody tr td.ddl-preview div, table.table-main tbody tr td.ddl-preview div {
#tableMain tbody tr td.ddl-preview select { cursor: pointer;
}
table.table-main tbody tr td.ddl-preview div,
table.table-main tbody tr td.ddl-preview select {
padding-left: 2vh; padding-left: 2vh;
padding-right: 2vh; padding-right: 2vh;
} }
#tableMain tbody tr td.ddl-preview select { table.table-main tbody tr td.ddl-preview select {
font-size: 12px; font-size: 12px;
} }
#tableMain thead tr th.active, table.table-main thead tr th.active,
#tableMain tbody tr td.active { table.table-main tbody tr td.active {
width: 6vh; max-width: 6vh;
min-width: 6vh; min-width: 6vh;
} }
#tableMain thead tr th.active svg.active.add { table.table-main thead tr th.active svg.active.add {
fill: var(--colour-primary); fill: var(--colour-primary);
background-color: var(--colour-accent); background-color: var(--colour-accent);
border: 2px solid var(--colour-accent); border: 2px solid var(--colour-accent);
padding: 0; padding: 0;
border-radius: 1vh; border-radius: 1vh;
} }
#tableMain tbody tr td.active svg.active.add { table.table-main tbody tr td.active svg.active.add {
fill: var(--colour-primary); fill: var(--colour-primary);
} }
#tableMain tbody tr td.active svg.active.delete { table.table-main tbody tr td.active svg.active.delete {
fill: var(--colour-error); fill: var(--colour-error);
} }
#tableMain tbody tr td.display_order, table.table-main tbody tr td.display_order,
#tableMain thead tr th.display_order { table.table-main thead tr th.display_order {
width: 5vh; max-width: 5vh;
min-width: 5vh; min-width: 5vh;
} }
@@ -874,10 +888,10 @@ form.filter button.save, form.filter button.button-cancel {
width: 15vh; width: 15vh;
/* height: 3vh; */ /* height: 3vh; */
} }
#tableMain { table.table-main {
max-height: 60vh; max-height: 60vh;
} }
#tableMain tbody { table.table-main tbody {
max-height: 53vh; max-height: 53vh;
} }
} }

File diff suppressed because one or more lines are too long

17
static/dist/js/dog_assessment.bundle.js vendored Normal file
View File

@@ -0,0 +1,17 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
/******/ })()
;
//# sourceMappingURL=dog_assessment.bundle.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"js/dog_assessment.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/assessment.css?3808"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}

View File

@@ -0,0 +1,17 @@
/******/ (() => { // webpackBootstrap
/******/ "use strict";
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.
(() => {
// extracted by mini-css-extract-plugin
})();
/******/ })()
;
//# sourceMappingURL=dog_assessments.bundle.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"js/dog_assessments.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/assessments.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}

View File

@@ -1 +1 @@
{"version":3,"file":"js/dog_dogs.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/dogs.css?c51b"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""} {"version":3,"file":"js/dog_dogs.bundle.js","mappings":";;;;AAAA;;;;;;ACAA","sources":["webpack://app/./static/css/sections/dog.css?a9d0","webpack://app/./static/css/pages/dog/dogs.css"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};"],"names":[],"sourceRoot":""}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -12,7 +12,7 @@ export default class BusinessObjects {
static getOptionJsonFromObjectJson(objectJson, valueSelected = null) { static getOptionJsonFromObjectJson(objectJson, valueSelected = null) {
let keyText = objectJson[flagNameAttrOptionText]; let keyText = objectJson[flagNameAttrOptionText];
let keyValue = objectJson[flagNameAttrOptionValue]; let keyValue = objectJson[flagNameAttrOptionValue];
Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue}); // Utils.consoleLogIfNotProductionEnvironment({objectJson, keyText, keyValue});
return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected); return BusinessObjects.getOptionJsonFromObjectJsonAndKeys(objectJson, keyText, keyValue, valueSelected);
} }
static getObjectText(objectJson) { static getObjectText(objectJson) {

View File

@@ -7,4 +7,12 @@ export default class Events {
element.classList.add(classInitialised); element.classList.add(classInitialised);
}); });
} }
static hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, (element) => {
element.addEventListener(eventType, (event) => {
event.stopPropagation();
callback(event, element);
});
});
}
} }

View File

@@ -48,17 +48,8 @@ export default class BasePage {
this.hookupOverlays(); this.hookupOverlays();
} }
hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, (element) => {
element.addEventListener(eventType, (event) => {
event.stopPropagation();
callback(event, element);
});
});
}
hookupNavigation() { hookupNavigation() {
this.hookupEventHandler("click", idButtonHamburger, (event, element) => { Events.hookupEventHandler("click", idButtonHamburger, (event, element) => {
let overlayHamburger = document.querySelector(idOverlayHamburger); let overlayHamburger = document.querySelector(idOverlayHamburger);
if (overlayHamburger.classList.contains(flagIsCollapsed)) { if (overlayHamburger.classList.contains(flagIsCollapsed)) {
overlayHamburger.classList.remove(flagIsCollapsed); overlayHamburger.classList.remove(flagIsCollapsed);
@@ -85,6 +76,7 @@ export default class BasePage {
this.hookupButtonsNavDogLocations(); this.hookupButtonsNavDogLocations();
this.hookupButtonsNavDogButtonIcons(); this.hookupButtonsNavDogButtonIcons();
this.hookupButtonsNavDogCommandButtonLinks(); this.hookupButtonsNavDogCommandButtonLinks();
this.hookupButtonsNavDogAssessments();
} }
hookupEventHandler(eventType, selector, callback) { hookupEventHandler(eventType, selector, callback) {
Events.initialiseEventHandler(selector, flagInitialised, (element) => { Events.initialiseEventHandler(selector, flagInitialised, (element) => {
@@ -98,7 +90,7 @@ export default class BasePage {
this.hookupButtonsNav('.' + flagNavHome, hashPageHome); this.hookupButtonsNav('.' + flagNavHome, hashPageHome);
} }
hookupButtonsNav(buttonSelector, hashPageNav) { hookupButtonsNav(buttonSelector, hashPageNav) {
this.hookupEventHandler("click", buttonSelector, (event, button) => { Events.hookupEventHandler("click", buttonSelector, (event, button) => {
this.router.navigateToHash(hashPageNav); this.router.navigateToHash(hashPageNav);
}); });
} }
@@ -117,7 +109,7 @@ export default class BasePage {
this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout); this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout);
} }
hookupButtonsNavUserLogin() { hookupButtonsNavUserLogin() {
this.hookupEventHandler("click", '.' + flagNavUserLogin, (event, navigator) => { Events.hookupEventHandler("click", '.' + flagNavUserLogin, (event, navigator) => {
event.stopPropagation(); event.stopPropagation();
this.leave(); this.leave();
API.loginUser() API.loginUser()
@@ -154,9 +146,12 @@ export default class BasePage {
hookupButtonsNavDogCommandButtonLinks() { hookupButtonsNavDogCommandButtonLinks() {
this.hookupButtonsNav('.' + flagNavDogCommandButtonLinks, hashPageDogCommandButtonLinks); this.hookupButtonsNav('.' + flagNavDogCommandButtonLinks, hashPageDogCommandButtonLinks);
} }
hookupButtonsNavDogAssessments() {
this.hookupButtonsNav('.' + flagNavDogAssessments, hashPageDogAssessments);
}
hookupLogos() { hookupLogos() {
this.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => { Events.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => {
Utils.consoleLogIfNotProductionEnvironment('clicking logo'); Utils.consoleLogIfNotProductionEnvironment('clicking logo');
this.router.navigateToHash(hashPageHome); this.router.navigateToHash(hashPageHome);
}); });
@@ -201,9 +196,9 @@ export default class BasePage {
return LocalStorage.getLocalStorage(this.hash); return LocalStorage.getLocalStorage(this.hash);
} }
toggleShowButtonsSaveCancel(show) { // , buttonSave = null, buttonCancel = null toggleShowButtonsSaveCancel(show, buttonContainerSelector = '.' + flagContainer + '.' + flagSave + '.' + flagCancel) { // , buttonSave = null, buttonCancel = null
let buttonSave = document.querySelector('form.' + flagFilter + ' button.' + flagSave); let buttonSave = document.querySelector(buttonContainerSelector + ' button.' + flagSave);
let buttonCancel = document.querySelector('form.' + flagFilter + ' button.' + flagCancel); let buttonCancel = document.querySelector(buttonContainerSelector + ' button.' + flagCancel);
if (show) { if (show) {
buttonCancel.classList.remove(flagIsCollapsed); buttonCancel.classList.remove(flagIsCollapsed);
buttonSave.classList.remove(flagIsCollapsed); buttonSave.classList.remove(flagIsCollapsed);

View File

@@ -73,7 +73,7 @@ export default class TableBasePage extends BasePage {
filterActiveNew.setAttribute('id', flagActiveOnly); filterActiveNew.setAttribute('id', flagActiveOnly);
if (isChecked) filterActiveNew.classList.add(flagIsChecked); if (isChecked) filterActiveNew.classList.add(flagIsChecked);
this.hookupEventHandler("click", filterSelector, (event, filterActive) => { Events.hookupEventHandler("click", filterSelector, (event, filterActive) => {
Utils.consoleLogIfNotProductionEnvironment({ filterActive }); Utils.consoleLogIfNotProductionEnvironment({ filterActive });
Utils.consoleLogIfNotProductionEnvironment({ [filterActive.tagName]: filterActive.tagName }); Utils.consoleLogIfNotProductionEnvironment({ [filterActive.tagName]: filterActive.tagName });
let svgElement = (filterActive.tagName.toUpperCase() == 'SVG') ? filterActive : filterActive.parentElement; let svgElement = (filterActive.tagName.toUpperCase() == 'SVG') ? filterActive : filterActive.parentElement;
@@ -93,7 +93,7 @@ export default class TableBasePage extends BasePage {
} }
hookupFilter(filterFlag, handler = (event, filter) => { return this.handleChangeFilter(event, filter); }) { hookupFilter(filterFlag, handler = (event, filter) => { return this.handleChangeFilter(event, filter); }) {
let filterSelector = idFormFilters + ' #' + filterFlag; let filterSelector = idFormFilters + ' #' + filterFlag;
this.hookupEventHandler("change", filterSelector, handler); Events.hookupEventHandler("change", filterSelector, handler);
let filter = document.querySelector(filterSelector); let filter = document.querySelector(filterSelector);
let filterValuePrevious = DOM.getElementValueCurrent(filter); let filterValuePrevious = DOM.getElementValueCurrent(filter);
filter.setAttribute(attrValueCurrent, filterValuePrevious); filter.setAttribute(attrValueCurrent, filterValuePrevious);
@@ -140,7 +140,7 @@ export default class TableBasePage extends BasePage {
this.hookupFilter(flagIsNotEmpty); this.hookupFilter(flagIsNotEmpty);
} }
hookupButtonApplyFilters() { hookupButtonApplyFilters() {
this.hookupEventHandler("click", idButtonApplyFilters, (event, button) => { Events.hookupEventHandler("click", idButtonApplyFilters, (event, button) => {
event.stopPropagation(); event.stopPropagation();
this.callFilterTableContent(); this.callFilterTableContent();
}); });
@@ -178,6 +178,9 @@ export default class TableBasePage extends BasePage {
hookupFilterCommand() { hookupFilterCommand() {
this.hookupFilter(attrIdCommand); this.hookupFilter(attrIdCommand);
} }
hookupFilterLocation() {
this.hookupFilter(attrIdLocation);
}
/* /*
getAndLoadFilteredTableContent = () => { getAndLoadFilteredTableContent = () => {
this.callFilterTableContent() this.callFilterTableContent()
@@ -334,11 +337,9 @@ export default class TableBasePage extends BasePage {
if (this.constructor === TableBasePage) { if (this.constructor === TableBasePage) {
throw new Error("Must implement hookupTableMain() method."); throw new Error("Must implement hookupTableMain() method.");
} }
if (true) { // _rowBlank == null) { Events.initialiseEventHandler(idTableMain, flagInitialised, (table) => {
Events.initialiseEventHandler(idTableMain, flagInitialised, (table) => { this.cacheRowBlank();
this.cacheRowBlank(); });
});
}
} }
cacheRowBlank() { cacheRowBlank() {
let selectorRowNew = idTableMain + ' tbody tr.' + flagRowNew; let selectorRowNew = idTableMain + ' tbody tr.' + flagRowNew;
@@ -379,79 +380,6 @@ export default class TableBasePage extends BasePage {
handler(null, input); handler(null, input);
}); });
} }
/*
handleChangeElementCellTable(event, element) {
let row = DOM.getRowFromElement(element);
let td = DOM.getCellFromElement(element);
let wasDirtyRow = DOM.hasDirtyChildrenContainer(row);
let wasDirtyElement = element.classList.contains(flagDirty);
let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);
if (isDirtyElement != wasDirtyElement) {
DOM.handleDirtyElement(td, isDirtyElement);
let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row);
if (isNowDirtyRow != wasDirtyRow) {
DOM.handleDirtyElement(row, isNowDirtyRow);
let rows = this.getTableRecords(true);
let existsDirtyRecord = rows.length > 0;
this.toggleShowButtonsSaveCancel(existsDirtyRecord);
}
}
}
handleChangeElementNestedCellTable(event, element, flagColumnList = [], orderNesting = 1) {
let orderNestingTemp = orderNesting;
let row, td, nestedRowSelector;
while (orderNestingTemp > 0) {
nestedRowSelector = idTableMain;
for (let indexOrderNesting = 0; indexOrderNesting < orderNestingTemp; indexOrderNesting++) {
nestedRowSelector += ' tbody tr';
}
row = DOM.getClosestParent(element, nestedRowSelector);
td = row.querySelector('td.' + flag);
}
let row = DOM.getRowFromElement(element);
let td = DOM.getCellFromElement(element);
let wasDirtyRow = DOM.hasDirtyChildrenContainer(row);
let wasDirtyElement = element.classList.contains(flagDirty);
let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);
if (isDirtyElement != wasDirtyElement) {
DOM.handleDirtyElement(td, isDirtyElement);
let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row);
if (isNowDirtyRow != wasDirtyRow) {
DOM.handleDirtyElement(row, isNowDirtyRow);
let rows = this.getTableRecords(true);
let existsDirtyRecord = rows.length > 0;
this.toggleShowButtonsSaveCancel(existsDirtyRecord);
}
}
}
handleChangeElementSubtableCell(event, element, flagFieldSubtable) {
let rowSubtable = element.closest(idTableMain + ' td.' + flagFieldSubtable + ' tbody tr');
let rowTable = rowSubtable.closest(idTableMain + ' > tbody > tr');
let td = DOM.getCellFromElement(element);
// let tdSubtable = td.closest('td.' + flagFieldSubtable);
let wasDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable);
let wasDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable);
let wasDirtyElement = element.classList.contains(flagDirty);
let isDirtyElement = DOM.updateAndCheckIsElementDirty(element);
Utils.consoleLogIfNotProductionEnvironment({isDirtyElement, wasDirtyElement});
if (isDirtyElement != wasDirtyElement) {
DOM.handleDirtyElement(td, isDirtyElement);
let isNowDirtyRowSubtable = DOM.hasDirtyChildrenContainer(rowSubtable);
Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowSubtable, wasDirtyRowSubtable});
if (isNowDirtyRowSubtable != wasDirtyRowSubtable) {
DOM.handleDirtyElement(rowSubtable, isNowDirtyRowSubtable);
let isNowDirtyRowTable = DOM.hasDirtyChildrenContainer(rowTable);
Utils.consoleLogIfNotProductionEnvironment({isNowDirtyRowTable, wasDirtyRowTable});
if (isNowDirtyRowTable != wasDirtyRowTable) {
DOM.handleDirtyElement(rowTable, isNowDirtyRowTable);
let rows = this.getTableRecords(true);
let existsDirtyRecord = rows.length > 0;
this.toggleShowButtonsSaveCancel(existsDirtyRecord);
}
}
}
}
*/
handleChangeNestedElementCellTable(event, element) { handleChangeNestedElementCellTable(event, element) {
let wasDirtyParentRows = this.getAllIsDirtyRowsInParentTree(element); let wasDirtyParentRows = this.getAllIsDirtyRowsInParentTree(element);
let wasDirtyElement = element.classList.contains(flagDirty); let wasDirtyElement = element.classList.contains(flagDirty);
@@ -493,7 +421,7 @@ export default class TableBasePage extends BasePage {
hookupChangeHandlerTableCellsWhenNotCollapsed(inputSelector, handler = (event, element) => { hookupChangeHandlerTableCellsWhenNotCollapsed(inputSelector, handler = (event, element) => {
if (!element.classList.contains(flagIsCollapsed)) this.handleChangeNestedElementCellTable(event, element); if (!element.classList.contains(flagIsCollapsed)) this.handleChangeNestedElementCellTable(event, element);
}) { }) {
this.hookupEventHandler("change", inputSelector, handler); Events.hookupEventHandler("change", inputSelector, handler);
} }
hookupFieldsCodeTable() { hookupFieldsCodeTable() {
this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagCode + ' > .' + flagCode); this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagCode + ' > .' + flagCode);
@@ -508,20 +436,20 @@ export default class TableBasePage extends BasePage {
this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagNotes + ' > .' + flagNotes); this.hookupChangeHandlerTableCells(idTableMain + ' > tbody > tr > td.' + flagNotes + ' > .' + flagNotes);
} }
hookupFieldsActive(flagTable = '', handleClickRowNew = (event, element) => { this.handleClickAddRowTable(event, element); }) { hookupFieldsActive(flagTable = '', handleClickRowNew = (event, element) => { this.handleClickAddRowTable(event, element); }) {
let selectorButton = 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive; let selectorButton = 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody > tr > td.' + flagActive + ' .' + flagButton + '.' + flagActive;
let selectorButtonDelete = selectorButton + '.' + flagDelete; let selectorButtonDelete = selectorButton + '.' + flagDelete;
let selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')'; let selectorButtonUndelete = selectorButton + ':not(.' + flagDelete + ')';
Utils.consoleLogIfNotProductionEnvironment("hookupFieldsActive: ", selectorButtonDelete, selectorButtonUndelete); Utils.consoleLogIfNotProductionEnvironment("hookupFieldsActive: ", selectorButtonDelete, selectorButtonUndelete);
this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete);
this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete); this.hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete);
this.hookupEventHandler( Events.hookupEventHandler(
"click" "click"
, 'table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive , 'table.table-main' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > thead > tr > th.' + flagActive + ' .' + flagButton + '.' + flagActive
, (event, button) => { handleClickRowNew(event, button); } , (event, button) => { handleClickRowNew(event, button); }
); );
} }
hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { hookupButtonsRowDelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {
this.hookupEventHandler("click", selectorButtonDelete, (event, element) => { Events.hookupEventHandler("click", selectorButtonDelete, (event, element) => {
this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); this.handleClickButtonRowDelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });
}); });
} }
@@ -546,7 +474,7 @@ export default class TableBasePage extends BasePage {
this.updateAndToggleShowButtonsSaveCancel(); this.updateAndToggleShowButtonsSaveCancel();
} }
hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) { hookupButtonsRowUndelete(selectorButtonDelete, selectorButtonUndelete, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }) {
this.hookupEventHandler("click", selectorButtonUndelete, (event, element) => { Events.hookupEventHandler("click", selectorButtonUndelete, (event, element) => {
this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); }); this.handleClickButtonRowUndelete(event, element, selectorButtonDelete, selectorButtonUndelete, (changeEvent, changeElement) => { changeHandler(changeEvent, changeElement); });
}); });
} }
@@ -575,7 +503,7 @@ export default class TableBasePage extends BasePage {
, changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); } , changeHandler = (event, element) => { this.handleChangeNestedElementCellTable(event, element); }
) { ) {
if (cellSelector == null) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag; if (cellSelector == null) cellSelector = idTableMain + ' > tbody > tr > td.' + fieldFlag;
this.hookupEventHandler("click", cellSelector + ' div.' + fieldFlag, (event, div) => { Events.hookupEventHandler("click", cellSelector + ' div.' + fieldFlag, (event, div) => {
this.handleClickTableCellDdlPreview( this.handleClickTableCellDdlPreview(
event event
, div , div
@@ -619,7 +547,7 @@ export default class TableBasePage extends BasePage {
} }
/* /*
hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList, ddlHookup = (event, element) => { this.hookupTableCellDdls(event, element); }) { hookupTableCellDDlPreviewsWhenNotCollapsed(cellSelector, optionList, ddlHookup = (event, element) => { this.hookupTableCellDdls(event, element); }) {
this.hookupEventHandler("click", cellSelector + ' div', (event, div) => { Events.hookupEventHandler("click", cellSelector + ' div', (event, div) => {
this.handleClickTableCellDdlPreview(event, div, optionList, cellSelector, (event, element) => { ddlHookup(event, element); }); this.handleClickTableCellDdlPreview(event, div, optionList, cellSelector, (event, element) => { ddlHookup(event, element); });
}); });
} }
@@ -631,11 +559,12 @@ export default class TableBasePage extends BasePage {
this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed); this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagIsCollapsed);
} }
hookupFieldsCommandCategory() { hookupFieldsCommandCategory(idTable = null) {
if (idTable == null) idTable = idTableMain;
this.hookupTableCellDdlPreviews( this.hookupTableCellDdlPreviews(
flagCommandCategory flagCommandCategory
, Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName])) , Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName]))
, null , idTable + ' > tbody > tr > td.' + flagCommandCategory // + ' .' + flagCommandCategory
, (cellSelector) => { this.hookupCommandCategoryDdls(cellSelector); } , (cellSelector) => { this.hookupCommandCategoryDdls(cellSelector); }
); );
} }
@@ -647,7 +576,11 @@ export default class TableBasePage extends BasePage {
let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);
this.handleChangeNestedElementCellTable(event, ddlCategory); this.handleChangeNestedElementCellTable(event, ddlCategory);
let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory); let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);
if (idCommandCategoryRowOld == idCommandCategoryRowNew) return; if (
idCommandCategoryRowOld == idCommandCategoryRowNew
|| idCommandCategoryRowNew == 0
) return;
console.log({ idCommandCategoryRowNew, idCommandCategoryRowOld });
let idCommandCategoryFilter = this.getIdCommandCategoryFilter(); let idCommandCategoryFilter = this.getIdCommandCategoryFilter();
let tdCommand = row.querySelector('td.' + flagCommand); let tdCommand = row.querySelector('td.' + flagCommand);
tdCommand.dispatchEvent(new Event('click')); tdCommand.dispatchEvent(new Event('click'));
@@ -673,8 +606,9 @@ export default class TableBasePage extends BasePage {
}); });
this.handleChangeNestedElementCellTable(event, ddlCommand); this.handleChangeNestedElementCellTable(event, ddlCommand);
} }
hookupFieldsCommand() { hookupFieldsCommand(idTable = null) {
this.hookupEventHandler("click", idTableMain + ' td.' + flagCommand + ' .' + flagCommand, (event, div) => { if (idTable == null) idTable = idTableMain;
Events.hookupEventHandler("click", idTable + ' > tbody > tr > td.' + flagCommand + ' div.' + flagCommand, (event, div) => {
Utils.consoleLogIfNotProductionEnvironment(div); Utils.consoleLogIfNotProductionEnvironment(div);
let parentTr = DOM.getRowFromElement(div); let parentTr = DOM.getRowFromElement(div);
Utils.consoleLogIfNotProductionEnvironment({ div, parentTr }); Utils.consoleLogIfNotProductionEnvironment({ div, parentTr });
@@ -698,16 +632,35 @@ export default class TableBasePage extends BasePage {
this.handleClickTableCellDdlPreview( this.handleClickTableCellDdlPreview(
event event
, div , div
, flagCommand , flagCommand // fieldFlag
, sortedCommands , sortedCommands // optionList
, null , idTable + ' > tbody > tr > td.' + flagCommand // cellSelector
, (cellSelector) => { this.hookupTableCellDdls( , (cellSelector) => { this.hookupTableCellDdls(
cellSelector cellSelector
, (event, element) => { this.handleChangeNestedElementCellTable(event, element); } , (event, element) => { this.handleChangeCommandDdl(event, element); }
); } ); }
); );
}); });
this.hookupTableCellDdls(idTableMain + ' td.' + flagCommand + ' select.' + flagCommand); this.hookupTableCellDdls(
idTable + ' > tbody > tr > td.' + flagCommand + ' select.' + flagCommand
, (event, element) => { this.handleChangeCommandDdl(event, element); }
);
}
handleChangeCommandDdl(event, ddlCommand) {
// console.log("handle change command ddl");
let row = DOM.getRowFromElement(ddlCommand);
this.handleChangeNestedElementCellTable(event, ddlCommand);
let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row);
let idCommandNew = this.getIdCommandRow(row);
let commandNew = filterCommands[idCommandNew];
// console.log({ idCommandCategoryRowOld, commandNew });
if (commandNew == null || idCommandCategoryRowOld == commandNew[attrIdCommandCategory]) return;
let divCommandCategory = row.querySelector('td.' + flagCommandCategory + ' div');
if (divCommandCategory) divCommandCategory.dispatchEvent(new Event('click'));
let ddlCommandCategory = row.querySelector('td.' + flagCommandCategory + ' select.' + flagCommandCategory);
DOM.setElementValueCurrent(ddlCommandCategory, commandNew[attrIdCommandCategory]);
// console.log({ ddlCommandCategory, commandNew });
this.handleChangeNestedElementCellTable(event, ddlCommandCategory);
} }
getIdCommandCategoryRow(tr) { getIdCommandCategoryRow(tr) {
let elementCommandCategory = tr.querySelector('td.' + flagCommandCategory + ' .' + flagCommandCategory); let elementCommandCategory = tr.querySelector('td.' + flagCommandCategory + ' .' + flagCommandCategory);
@@ -715,9 +668,10 @@ export default class TableBasePage extends BasePage {
} }
getIdCommandCategoryFilter() { getIdCommandCategoryFilter() {
let formFilters = TableBasePage.getFormFilters(); let formFilters = TableBasePage.getFormFilters();
let idCommandCategory = 0;
if (formFilters == null) return idCommandCategory;
let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory); let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory);
let commandFilter = formFilters.querySelector('#' + attrIdCommand); let commandFilter = formFilters.querySelector('#' + attrIdCommand);
let idCommandCategory = 0;
let valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter); let valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter);
Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandCategoryFilter }); Utils.consoleLogIfNotProductionEnvironment({ valueCurrentCommandCategoryFilter });
if (valueCurrentCommandCategoryFilter == "") { if (valueCurrentCommandCategoryFilter == "") {
@@ -758,7 +712,7 @@ export default class TableBasePage extends BasePage {
let elementDog = tr.querySelector('td.' + flagDog + ' .' + flagDog); let elementDog = tr.querySelector('td.' + flagDog + ' .' + flagDog);
return DOM.getElementAttributeValueCurrent(elementDog); return DOM.getElementAttributeValueCurrent(elementDog);
} }
/*
createTdActive(isActive) { createTdActive(isActive) {
let tdActive = document.createElement("td"); let tdActive = document.createElement("td");
tdActive.classList.add(flagActive); tdActive.classList.add(flagActive);
@@ -770,7 +724,7 @@ export default class TableBasePage extends BasePage {
tdActive.appendChild(buttonActive); tdActive.appendChild(buttonActive);
return tdActive; return tdActive;
} }
*/
leave() { leave() {
if (this.constructor === TableBasePage) { if (this.constructor === TableBasePage) {
throw new Error("Must implement leave() method."); throw new Error("Must implement leave() method.");

View File

@@ -0,0 +1,603 @@
import API from "../../api.js";
import BusinessObjects from "../../lib/business_objects/business_objects.js";
import DOM from "../../dom.js";
import Events from "../../lib/events.js";
import TableBasePage from "../base_table.js";
import Utils from "../../lib/utils.js";
import Validation from "../../lib/validation.js";
import DogTableMixinPage from "./mixin_table.js";
var _rowBlankDistraction;
var _rowBlankAssessmentCommandModalityLink;
export default class PageDogAssessment extends TableBasePage {
static hash = hashPageDogAssessment;
static attrIdRowObject = attrIdAssessment;
callSaveTableContent = API.saveAssessments;
constructor(router) {
super(router);
this.dogMixin = new DogTableMixinPage(this);
}
initialize() {
this.sharedInitialize();
}
hookupFilters() {
}
loadRowTable(rowJson) {
if (rowJson == null) return;
if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); }
}
getJsonRow(row) {
if (row == null) return;
/*
let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input');
let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
*/
let jsonRow = {};
jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment);
return jsonRow;
}
initialiseRowNew(tbody, row) {
}
postInitialiseRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[0];
let clickableElementsSelector = [
'td.' + flagWeather + ' div.' + flagWeather
, ',td.' + flagLightingLevel + ' div.' + flagLightingLevel
, ',td.' + flagLocation + ' div.' + flagLocation
, ',td.' + flagUserHandler + ' div.' + flagUserHandler
].join('');
newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {
clickableElement.click();
});
}
hookupTableMain() {
super.hookupTableMain();
this.hookupTableAssessmentHeader();
this.hookupTableDistractions();
this.hookupTableAssessmentCommandModalityLinks();
}
hookupTableAssessmentHeader() {
this.hookupTableAssessmentFieldWeather();
this.hookupTableAssessmentFieldLightingLevel();
this.hookupTableAssessmentFieldTemperature();
this.hookupTableAssessmentFieldLocation();
this.hookupTableAssessmentFieldUserHandler();
this.hookupTableAssessmentFieldNotes();
}
hookupTableAssessmentFieldWeather() {
let fieldFlag = flagWeather;
let optionList = Utils.getListFromDict(filterWeathers); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessment + ' td.' + flagWeather;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentFieldLightingLevel() {
let fieldFlag = flagLightingLevel;
let optionList = Utils.getListFromDict(filterLightingLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessment + ' td.' + flagLightingLevel;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentFieldTemperature() {
this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagTemperatureCelcius + ' .' + flagTemperatureCelcius);
}
hookupTableAssessmentFieldLocation() {
let fieldFlag = flagLocation;
let optionList = Utils.getListFromDict(filterLocations); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessment + ' td.' + flagLocation;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentFieldUserHandler() {
let fieldFlag = flagUserHandler;
let optionList = Utils.getListFromDict(filterUserHandlers); // .sort((a, b) => a[flagName].localeCompare(b[flagName]));
let cellSelector = idTableAssessment + ' td.' + flagUserHandler;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentFieldNotes() {
this.hookupChangeHandlerTableCells(idTableAssessment + ' td.' + flagNotes + ' .' + flagNotes);
}
hookupTableDistractions() {
Events.initialiseEventHandler(idTableDistractions, flagInitialised, (table) => {
let selectorRowNew = idTableDistractions + ' tbody tr.' + flagRowNew;
let rowBlankTemp = document.querySelector(selectorRowNew);
Utils.consoleLogIfNotProductionEnvironment("row blank temp: ", rowBlankTemp);
let countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length;
_rowBlankDistraction = rowBlankTemp.cloneNode(true);
document.querySelectorAll(selectorRowNew).forEach(function(row) {
row.remove();
});
_rowBlankDistraction.setAttribute(attrIdDistraction, -1 - countRows);
});
this.hookupTableDistractionsFieldsDistractionType();
this.hookupTableDistractionsFieldsIntensityLevelEmotional();
this.hookupTableDistractionsFieldsIntensityLevelScent();
this.hookupTableDistractionsFieldsIntensityLevelSight();
this.hookupTableDistractionsFieldsIntensityLevelSound();
this.hookupTableDistractionsFieldsIntensityLevelTouch();
this.hookupTableDistractionsFieldsQuantity();
this.hookupTableDistractionsFieldsProximityMetres();
this.hookupTableDistractionsFieldsNotes();
this.hookupTableDistractionsFieldsActive();
}
hookupTableDistractionsFieldsDistractionType() {
let fieldFlag = flagDistractionType;
let optionList = Utils.getListFromDict(filterDistractionTypes); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableDistractions + ' td.' + flagDistractionType;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableDistractionsFieldsIntensityLevelEmotional() {
let fieldFlag = flagDistractionIntensityLevelEmotional;
let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelEmotional;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableDistractionsFieldsIntensityLevelScent() {
let fieldFlag = flagDistractionIntensityLevelScent;
let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelScent;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableDistractionsFieldsIntensityLevelSight() {
let fieldFlag = flagDistractionIntensityLevelSight;
let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSight;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableDistractionsFieldsIntensityLevelSound() {
let fieldFlag = flagDistractionIntensityLevelSound;
let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelSound;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableDistractionsFieldsIntensityLevelTouch() {
let fieldFlag = flagDistractionIntensityLevelTouch;
let optionList = Utils.getListFromDict(filterDistractionIntensityLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableDistractions + ' td.' + flagDistractionIntensityLevelTouch;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableDistractionsFieldsQuantity() {
this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagQuantity + ' .' + flagQuantity);
}
hookupTableDistractionsFieldsProximityMetres() {
this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagProximityMetres + ' .' + flagProximityMetres);
}
hookupTableDistractionsFieldsNotes() {
this.hookupChangeHandlerTableCells(idTableDistractions + ' td.' + flagNotes + ' .' + flagNotes);
}
hookupTableDistractionsFieldsActive() {
this.hookupFieldsActive(flagDistraction, (event, element) => { this.handleClickAddRowTableDistractions(event, element); });
}
handleClickAddRowTableDistractions(event, button) {
event.stopPropagation();
_rowBlankDistraction.setAttribute(attrIdDistraction, -1 - _rowBlankDistraction.getAttribute(attrIdDistraction));
let tbody = document.querySelector(idTableDistractions + ' tbody');
if (tbody.classList.contains(flagIsCollapsed)) return;
let row = _rowBlankDistraction.cloneNode(true);
row.classList.remove(flagInitialised);
row.querySelectorAll('.' + flagInitialised).forEach(function(element) {
element.classList.remove(flagInitialised);
});
let countRows = document.querySelectorAll(idTableDistractions + ' > tbody > tr').length;
row.setAttribute(attrIdDistraction, -1 - countRows);
tbody.prepend(row);
tbody.scrollTop = 0;
this.hookupTableDistractions();
this.postInitialiseDistractionRowNewCallback(tbody);
}
postInitialiseDistractionRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[0];
let clickableElementsSelector = [
'td.' + flagDistractionType + ' div.' + flagDistractionType
, ',td.' + flagDistractionIntensityLevelEmotional + ' div.' + flagDistractionIntensityLevelEmotional
, ',td.' + flagDistractionIntensityLevelScent + ' div.' + flagDistractionIntensityLevelScent
, ',td.' + flagDistractionIntensityLevelSight + ' div.' + flagDistractionIntensityLevelSight
, ',td.' + flagDistractionIntensityLevelSound + ' div.' + flagDistractionIntensityLevelSound
, ',td.' + flagDistractionIntensityLevelTouch + ' div.' + flagDistractionIntensityLevelTouch
].join('');
newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {
clickableElement.click();
});
}
hookupTableAssessmentCommandModalityLinks() {
Events.initialiseEventHandler(idTableAssessmentCommandModalityLinks, flagInitialised, (table) => {
let selectorRowNew = idTableAssessmentCommandModalityLinks + ' tbody tr.' + flagRowNew;
let rowBlankTemp = document.querySelector(selectorRowNew);
Utils.consoleLogIfNotProductionEnvironment("row blank temp: ", rowBlankTemp);
let countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length;
_rowBlankAssessmentCommandModalityLink = rowBlankTemp.cloneNode(true);
document.querySelectorAll(selectorRowNew).forEach(function(row) {
row.remove();
});
_rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows);
});
this.hookupTableAssessmentCommandModalityLinksFieldsCommandCategory();
this.hookupTableAssessmentCommandModalityLinksFieldsCommand();
this.hookupTableAssessmentCommandModalityLinksFieldsCommandModality();
this.hookupTableAssessmentCommandModalityLinksFieldsBribe();
this.hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler();
this.hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler();
this.hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler();
this.hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler();
this.hookupTableAssessmentCommandModalityLinksFieldsIsOnLead();
this.hookupTableAssessmentCommandModalityLinksFieldsTrialCount();
this.hookupTableAssessmentCommandModalityLinksFieldsNotes();
this.hookupTableAssessmentCommandModalityLinksFieldsResponses();
this.hookupTableAssessmentCommandModalityLinksFieldsActive();
}
hookupTableAssessmentCommandModalityLinksFieldsCommandCategory() {
this.hookupFieldsCommandCategory(idTableAssessmentCommandModalityLinks);
/*
let fieldFlag = flagCommandCategory;
let optionList = Utils.getListFromDict(filterCommandCategories).sort((a, b) => a[flagName].localeCompare(b[flagName]));
let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandCategory;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
, (tdSelector) => { this.hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(tdSelector); }
, (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); }
);
*/
}
/*
hookupTableAssessmentCommandModalityLinksDdlsCommandCategory(ddlSelector) {
this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, element); });
}
handleChangeTableAssessmentCommandModalityLinksDdlCommandCategory(event, ddlCategory) {
let row = DOM.getRowFromElement(ddlCategory);
let idCommandCategoryRowOld = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);
this.handleChangeNestedElementCellTable(event, ddlCategory);
let idCommandCategoryRowNew = this.getIdCommandCategoryRow(row); // DOM.getElementAttributeValueCurrent(ddlCategory);
if (idCommandCategoryRowOld == idCommandCategoryRowNew) return;
let divCommand = row.querySelector('td.' + flagCommand + ' div');
if (divCommand) divCommand.dispatchEvent(new Event('click'));
let ddlCommand = row.querySelector('td.' + flagCommand + ' select.' + flagCommand);
ddlCommand.innerHTML = '';
ddlCommand.appendChild(DOM.createOption(null));
let optionJson, option;
let commandsInCategory = Utils.getListFromDict(filterCommands).filter(command =>
(
command[attrIdCommandCategory] == idCommandCategoryRowNew
|| idCommandCategoryRowNew == 0
)
);
let sortedCommands = commandsInCategory.sort((a, b) => a[flagName].localeCompare(b[flagName]));
sortedCommands.forEach((command) => {
optionJson = BusinessObjects.getOptionJsonFromObjectJson(command);
option = DOM.createOption(optionJson);
ddlCommand.appendChild(option);
});
this.handleChangeNestedElementCellTable(event, ddlCommand);
}
*/
hookupTableAssessmentCommandModalityLinksFieldsCommand() {
this.hookupFieldsCommand(idTableAssessmentCommandModalityLinks);
}
hookupTableAssessmentCommandModalityLinksFieldsCommandModality() {
let fieldFlag = flagCommandModality;
let optionList = Utils.getListFromDict(filterCommandModalities); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagCommandModality;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentCommandModalityLinksFieldsBribe() {
let fieldFlag = flagBribe;
let optionList = Utils.getListFromDict(filterBribes); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessmentCommandModalityLinks + ' td.' + flagBribe;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentCommandModalityLinksFieldsDistanceFromHandler() {
this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagDistanceFromHandler + ' .' + flagDistanceFromHandler);
}
hookupTableAssessmentCommandModalityLinksFieldsIsInHearingRangeOfHandler() {
this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInHearingRangeOfHandler + ' .' + flagIsInHearingRangeOfHandler);
}
hookupTableAssessmentCommandModalityLinksFieldsIsInScentRangeOfHandler() {
this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInScentRangeOfHandler + ' .' + flagIsInScentRangeOfHandler);
}
hookupTableAssessmentCommandModalityLinksFieldsIsInSightOfHandler() {
this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsInSightOfHandler + ' .' + flagIsInSightOfHandler);
}
hookupTableAssessmentCommandModalityLinksFieldsIsOnLead() {
this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagIsOnLead + ' .' + flagIsOnLead);
}
hookupTableAssessmentCommandModalityLinksFieldsTrialCount() {
// this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' td.' + flagTrialCount + ' .' + flagTrialCount);
}
hookupTableAssessmentCommandModalityLinksFieldsNotes() {
this.hookupChangeHandlerTableCells(idTableAssessmentCommandModalityLinks + ' > tbody > tr > td.' + flagNotes + ' .' + flagNotes);
}
hookupTableAssessmentCommandModalityLinksFieldsResponses() {
let eventType = "click";
let selector = idTableAssessmentCommandModalityLinks + ' td.' + flagAssessmentResponse + ' div.' + flagAssessmentResponse;
let handler = (event, element) => {
let parentTd = DOM.getCellFromElement(element);
let responsesTable = document.createElement("table");
responsesTable.id = idTableAssessmentResponses.replace("#", "");
responsesTable.classList.add(flagTableMain, flagAssessmentResponse);
let head = document.createElement("thead");
let headRow = document.createElement("tr");
let thResponseQualityMetric = document.createElement("th");
thResponseQualityMetric.classList.add(flagResponseQualityMetric);
thResponseQualityMetric.innerText = 'Response Quality Metric';
headRow.appendChild(thResponseQualityMetric);
let thObedienceLevel = document.createElement("th");
thObedienceLevel.classList.add(flagObedienceLevel);
thObedienceLevel.innerText = 'Obedience Level';
headRow.appendChild(thObedienceLevel);
let thValueMeasured = document.createElement("th");
thValueMeasured.classList.add(flagValueMeasured);
thValueMeasured.innerText = 'Value Measured';
headRow.appendChild(thValueMeasured);
let thNotes = document.createElement("th");
thNotes.classList.add(flagNotes);
thNotes.innerText = 'Notes';
headRow.appendChild(thNotes);
let thActive = document.createElement("th");
thActive.classList.add(flagActive);
let templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd);
thActive.appendChild(templateAddIcon.cloneNode(true));
headRow.appendChild(thActive);
head.appendChild(headRow);
responsesTable.appendChild(head);
let body = document.createElement("tbody");
let assessmentCommandModalityLink = assessment[flagAssessmentCommandModalityLink];
let responses = (assessmentCommandModalityLink == null) ? null : assessmentCommandModalityLink[flagAssessmentResponse];
if (responses != null && responses.length > 0) {
for (let response in responses) {
let row = PageDogAssessment.createNewRowTableAssessmentResponses(response);
body.appendChild(row);
}
}
responsesTable.appendChild(body);
parentTd.innerHTML = responsesTable.outerHTML;
this.hookupTablesAssessmentResponses();
};
Events.hookupEventHandler(
eventType
, selector
, handler
);
this.hookupTablesAssessmentResponses();
}
static createNewRowTableAssessmentResponses(response) {
if (response == null) response = {
[attrIdAssessmentResponse]: null
, [flagResponseQualityMetric]: 0
, [flagObedienceLevel]: 0
, [flagValueMeasured]: ''
, [flagNotes]: ''
, [flagActive]: true
};
let isNew = (response[attrIdAssessmentResponse] == null || response[attrIdAssessmentResponse] < 1);
let row = document.createElement("tr");
row.classList.add(flagAssessmentResponse);
if (isNew) row.classList.add(flagRowNew);
row.setAttribute(attrIdAssessmentResponse, response[attrIdAssessmentResponse]);
let tdResponseQualityMetric = document.createElement("td");
tdResponseQualityMetric.classList.add(flagResponseQualityMetric, flagDdlPreview);
let divResponseQualityMetric = document.createElement("div");
divResponseQualityMetric.classList.add(flagResponseQualityMetric);
DOM.setElementAttributesValuesCurrentAndPrevious(divResponseQualityMetric, response[flagResponseQualityMetric]);
divResponseQualityMetric.innerText = response[flagResponseQualityMetric];
tdResponseQualityMetric.appendChild(divResponseQualityMetric);
row.appendChild(tdResponseQualityMetric);
let tdObedienceLevel = document.createElement("td");
tdObedienceLevel.classList.add(flagObedienceLevel, flagDdlPreview);
let divObedienceLevel = document.createElement("div");
divObedienceLevel.classList.add(flagObedienceLevel);
DOM.setElementAttributesValuesCurrentAndPrevious(divObedienceLevel, response[flagObedienceLevel]);
divObedienceLevel.innerText = response[flagObedienceLevel];
tdObedienceLevel.appendChild(divObedienceLevel);
row.appendChild(tdObedienceLevel);
let tdValueMeasured = document.createElement("td");
tdValueMeasured.classList.add(flagValueMeasured, flagDdlPreview);
let inputValueMeasured = document.createElement("input");
inputValueMeasured.type = "number";
inputValueMeasured.classList.add(flagValueMeasured);
DOM.setElementAttributesValuesCurrentAndPrevious(inputValueMeasured, response[flagValueMeasured]);
inputValueMeasured.value = response[flagValueMeasured];
tdValueMeasured.appendChild(inputValueMeasured);
row.appendChild(tdValueMeasured);
let tdNotes = document.createElement("td");
tdNotes.classList.add(flagNotes, flagDdlPreview);
let inputNotes = document.createElement("textarea");
inputNotes.classList.add(flagNotes);
DOM.setElementAttributesValuesCurrentAndPrevious(inputNotes, response[flagNotes]);
inputNotes.value = response[flagNotes];
tdNotes.appendChild(inputNotes);
row.appendChild(tdNotes);
let tdActive = document.createElement("td");
tdActive.classList.add(flagActive, flagDdlPreview);
let templateAddIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagAdd);
let templateDeleteIcon = document.querySelector(idContainerTemplateElements + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete);
let buttonActive = (response[flagActive]) ? templateDeleteIcon.cloneNode(true) : templateAddIcon.cloneNode(true);
tdActive.appendChild(buttonActive);
row.appendChild(tdActive);
return row;
}
hookupTablesAssessmentResponses() {
this.hookupTableAssessmentResponsesFieldsResponseQualityMetric();
this.hookupTableAssessmentResponsesFieldsObedienceLevel();
this.hookupTableAssessmentResponsesFieldsValueMeasured();
this.hookupTableAssessmentResponsesFieldsNotes();
this.hookupTableAssessmentResponsesFieldsActive();
}
hookupTableAssessmentResponsesFieldsResponseQualityMetric() {
let fieldFlag = flagResponseQualityMetric;
let optionList = Utils.getListFromDict(filterResponseQualityMetrics); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessmentResponses + ' td.' + flagResponseQualityMetric;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentResponsesFieldsObedienceLevel() {
let fieldFlag = flagObedienceLevel;
let optionList = Utils.getListFromDict(filterObedienceLevels); // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
let cellSelector = idTableAssessmentResponses + ' td.' + flagObedienceLevel;
this.hookupTableCellDdlPreviews(
fieldFlag
, optionList
, cellSelector
);
}
hookupTableAssessmentResponsesFieldsValueMeasured() {
this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagValueMeasured + ' .' + flagValueMeasured);
}
hookupTableAssessmentResponsesFieldsNotes() {
this.hookupChangeHandlerTableCells(idTableAssessmentResponses + ' td.' + flagNotes + ' .' + flagNotes);
}
hookupTableAssessmentResponsesFieldsActive() {
this.hookupFieldsActive(flagAssessmentResponse, (event, element) => { this.handleClickAddRowTableAssessmentResponses(event, element); });
}
handleClickAddRowTableAssessmentResponses(event, button) {
event.stopPropagation();
let tableResponses = DOM.getClosestParent(button, "table");
let tbody = tableResponses.querySelector(":scope > tbody");
let row = PageDogAssessment.createNewRowTableAssessmentResponses(null);
if (tbody.classList.contains(flagIsCollapsed)) return;
row.classList.remove(flagInitialised);
row.querySelectorAll('.' + flagInitialised).forEach(function(element) {
element.classList.remove(flagInitialised);
});
let countRows = document.querySelectorAll(attrIdAssessmentResponse + ' > tbody > tr').length;
row.setAttribute(attrIdAssessmentResponse, -1 - countRows);
tbody.prepend(row);
tbody.scrollTop = 0;
this.hookupTablesAssessmentResponses();
this.postInitialiseAssessmentResponseRowNewCallback(tbody);
}
postInitialiseAssessmentResponseRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[0];
let clickableElementsSelector = [
'td.' + flagResponseQualityMetric + ' div.' + flagResponseQualityMetric
, ',td.' + flagObedienceLevel + ' div.' + flagObedienceLevel
, ',td.' + flagValueMeasured + ' div.' + flagValueMeasured
, ',td.' + flagNotes + ' div.' + flagNotes
].join('');
newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {
clickableElement.click();
});
let countActiveRows = tbody.querySelectorAll('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive + '.' + flagDelete).length;
/*
newRows.filter(row => {
let activeButton = row.querySelector('td.' + flagActive + ' .' + flagButton + '.' + flagIcon + '.' + flagActive);
return activeButton.classList.contains(flagDelete);
}).length;
*/
let rowAssessmentCommandModalityLink = DOM.getRowFromElement(tbody);
let divTrialCount = rowAssessmentCommandModalityLink.querySelector('td.' + flagTrialCount + ' div.' + flagTrialCount);
divTrialCount.innerText = countActiveRows;
}
hookupTableAssessmentCommandModalityLinksFieldsActive() {
this.hookupFieldsActive(flagAssessmentCommandModalityLink, (event, element) => { this.handleClickAddRowTableAssessmentCommandModalityLinks(event, element); });
}
handleClickAddRowTableAssessmentCommandModalityLinks(event, button) {
event.stopPropagation();
_rowBlankAssessmentCommandModalityLink.setAttribute(attrIdAssessmentCommandModalityLink, -1 - _rowBlankAssessmentCommandModalityLink.getAttribute(attrIdAssessmentCommandModalityLink));
let tbody = document.querySelector(idTableAssessmentCommandModalityLinks + ' tbody');
if (tbody.classList.contains(flagIsCollapsed)) return;
let row = _rowBlankAssessmentCommandModalityLink.cloneNode(true);
row.classList.remove(flagInitialised);
row.querySelectorAll('.' + flagInitialised).forEach(function(element) {
element.classList.remove(flagInitialised);
});
let countRows = document.querySelectorAll(idTableAssessmentCommandModalityLinks + ' > tbody > tr').length;
row.setAttribute(attrIdAssessmentCommandModalityLink, -1 - countRows);
tbody.prepend(row);
tbody.scrollTop = 0;
this.hookupTableAssessmentCommandModalityLinks();
this.postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody);
}
postInitialiseAssessmentCommandModalityLinkRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[0];
let clickableElementsSelector = [
'td.' + flagCommandCategory + ' div.' + flagCommandCategory
, ',td.' + flagCommand + ' div.' + flagCommand
, ',td.' + flagCommandModality + ' div.' + flagCommandModality
, ',td.' + flagBribe + ' div.' + flagBribe
].join('');
newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {
clickableElement.click();
});
}
leave() {
super.leave();
}
}

View File

@@ -0,0 +1,169 @@
import API from "../../api.js";
import BusinessObjects from "../../lib/business_objects/business_objects.js";
import DOM from "../../dom.js";
import Events from "../../lib/events.js";
import TableBasePage from "../base_table.js";
import Utils from "../../lib/utils.js";
import Validation from "../../lib/validation.js";
import DogTableMixinPage from "./mixin_table.js";
export default class PageDogAssessments extends TableBasePage {
static hash = hashPageDogAssessments;
static attrIdRowObject = attrIdAssessment;
callSaveTableContent = API.saveAssessments;
constructor(router) {
super(router);
this.dogMixin = new DogTableMixinPage(this);
}
initialize() {
this.sharedInitialize();
}
hookupFilters() {
this.sharedHookupFilters();
this.hookupFilterWeather();
this.hookupFilterLightingLevel();
this.hookupFilterLocation();
this.hookupFilterHandler();
this.hookupFilterActive();
}
hookupFilterWeather() {
this.hookupFilter(attrIdWeather);
}
hookupFilterLightingLevel() {
this.hookupFilter(attrIdLightingLevel);
}
hookupFilterHandler() {
this.hookupFilter(flagUserHandler);
}
loadRowTable(rowJson) {
if (rowJson == null) return;
if (_verbose) { Utils.consoleLogIfNotProductionEnvironment("applying data row: ", rowJson); }
}
getJsonRow(row) {
if (row == null) return;
let inputTemperatureCelcius = row.querySelector('td.' + flagTemperatureCelcius + ' input');
let inputNotes = row.querySelector('td.' + flagNotes + ' textarea');
let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive);
let jsonRow = {};
jsonRow[attrIdAssessment] = row.getAttribute(attrIdAssessment);
jsonRow[attrIdWeather] = this.getIdWeatherRow(row);
jsonRow[attrIdLightingLevel] = this.getIdLightingLevelRow(row);
jsonRow[flagTemperatureCelcius] = DOM.getElementAttributeValueCurrent(inputTemperatureCelcius);
jsonRow[attrIdLocation] = this.getIdLocationRow(row);
jsonRow[flagUserHandler] = this.getIdUserHandlerRow(row);
jsonRow[flagNotes] = DOM.getElementAttributeValueCurrent(inputNotes);
jsonRow[flagActive] = buttonActive.classList.contains(flagDelete);
return jsonRow;
}
getIdWeatherRow(tr) {
let elementWeather = tr.querySelector('td.' + flagWeather + ' .' + flagWeather);
return DOM.getElementAttributeValueCurrent(elementWeather);
}
getIdLightingLevelRow(tr) {
let elementLightingLevel = tr.querySelector('td.' + flagLightingLevel + ' .' + flagLightingLevel);
return DOM.getElementAttributeValueCurrent(elementLightingLevel);
}
getIdLocationRow(tr) {
let elementLocation = tr.querySelector('td.' + flagLocation + ' .' + flagLocation);
return DOM.getElementAttributeValueCurrent(elementLocation);
}
getIdUserHandlerRow(tr) {
let elementUserHandler = tr.querySelector('td.' + flagUserHandler + ' .' + flagUserHandler);
return DOM.getElementAttributeValueCurrent(elementUserHandler);
}
initialiseRowNew(tbody, row) {
}
postInitialiseRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[0];
let clickableElementsSelector = [
'td.' + flagWeather + ' div.' + flagWeather
, ',td.' + flagLightingLevel + ' div.' + flagLightingLevel
, ',td.' + flagLocation + ' div.' + flagLocation
, ',td.' + flagUserHandler + ' div.' + flagUserHandler
].join('');
newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => {
clickableElement.click();
});
}
hookupTableMain() {
super.hookupTableMain();
this.hookupFieldsDetail();
this.hookupFieldsWeather();
this.hookupFieldsLightingLevel();
this.hookupFieldsTemperature();
this.dogMixin.hookupFieldsLocation();
this.hookupFieldsHandler();
this.hookupFieldsNotesTable();
this.hookupFieldsActive();
}
hookupFieldsDetail() {
Events.hookupEventHandler(
"click" // eventType
, idTableMain + ' td.' + flagDetail + ' button.' + flagDetail // selector
, (event, element) => {
let parentTr = DOM.getRowFromElement(element);
let idAssessment = parentTr.getAttribute(attrIdAssessment);
/*
console.log("click detail");
console.log({ element, parentTr, idAssessment });
const data = {};
const params = {
[attrIdAssessment]: idAssessment
};
API.request(
hashPageDogAssessment // hashEndpoint
, 'GET' // method
, data
, params
);
*/
let formFilters = TableBasePage.getFormFilters();
let filtersJson = DOM.convertForm2JSON(formFilters);
filtersJson[attrIdAssessment] = idAssessment;
Utils.consoleLogIfNotProductionEnvironment("hookupFieldsDetail");
Utils.consoleLogIfNotProductionEnvironment("formFilters");
Utils.consoleLogIfNotProductionEnvironment(formFilters);
Utils.consoleLogIfNotProductionEnvironment("filtersJson");
Utils.consoleLogIfNotProductionEnvironment(filtersJson);
this.leave();
API.goToHash(hashPageDogAssessment, filtersJson);
}
);
}
hookupFieldsWeather() {
this.hookupTableCellDdlPreviews(
flagWeather
, Utils.getListFromDict(filterWeathers) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
);
}
hookupFieldsLightingLevel() {
this.hookupTableCellDdlPreviews(
flagLightingLevel
, Utils.getListFromDict(filterLightingLevels) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
);
}
hookupFieldsTemperature() {
this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagTemperatureCelcius + ' input.' + flagTemperatureCelcius);
}
hookupFieldsHandler() {
this.hookupTableCellDdlPreviews(
flagUserHandler
, Utils.getListFromDict(filterUserHandlers) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
);
}
leave() {
super.leave();
}
}

View File

@@ -41,9 +41,6 @@ export default class PageDogCommandButtonLinks extends TableBasePage {
hookupFilterButtonIcon() { hookupFilterButtonIcon() {
this.hookupFilter(attrIdButtonIcon); this.hookupFilter(attrIdButtonIcon);
} }
hookupFilterLocation() {
this.hookupFilter(attrIdLocation);
}
loadRowTable(rowJson) { loadRowTable(rowJson) {
if (rowJson == null) return; if (rowJson == null) return;
@@ -69,7 +66,7 @@ export default class PageDogCommandButtonLinks extends TableBasePage {
} }
postInitialiseRowNewCallback(tbody) { postInitialiseRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew); let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[newRows.length - 1]; let newestRow = newRows[0];
let clickableElementsSelector = [ let clickableElementsSelector = [
'td.' + flagDog + ' div.' + flagDog 'td.' + flagDog + ' div.' + flagDog
, ',td.' + flagCommandCategory + ' div.' + flagCommandCategory , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory
@@ -87,7 +84,7 @@ export default class PageDogCommandButtonLinks extends TableBasePage {
this.hookupFieldsButtonShape(); this.hookupFieldsButtonShape();
this.hookupFieldsColour(); this.hookupFieldsColour();
this.hookupFieldsButtonIcon(); this.hookupFieldsButtonIcon();
this.hookupFieldsLocation(); this.dogMixin.hookupFieldsLocation();
this.hookupFieldsActive(); this.hookupFieldsActive();
} }
hookupFieldsButtonShape() { hookupFieldsButtonShape() {
@@ -108,12 +105,6 @@ export default class PageDogCommandButtonLinks extends TableBasePage {
, Utils.getListFromDict(filterButtonIcons) // .sort((a, b) => a[flagName].localeCompare(b[flagName])) , Utils.getListFromDict(filterButtonIcons) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
); );
} }
hookupFieldsLocation() {
this.hookupTableCellDdlPreviews(
flagLocation
, Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
);
}
leave() { leave() {
super.leave(); super.leave();

View File

@@ -54,7 +54,7 @@ export default class PageDogDogCommandLinks extends TableBasePage {
} }
postInitialiseRowNewCallback(tbody) { postInitialiseRowNewCallback(tbody) {
let newRows = tbody.querySelectorAll('tr.' + flagRowNew); let newRows = tbody.querySelectorAll('tr.' + flagRowNew);
let newestRow = newRows[newRows.length - 1]; let newestRow = newRows[0];
let clickableElementsSelector = [ let clickableElementsSelector = [
'td.' + flagDog + ' div.' + flagDog 'td.' + flagDog + ' div.' + flagDog
, ',td.' + flagCommandCategory + ' div.' + flagCommandCategory , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory

View File

@@ -95,7 +95,7 @@ export default class PageDogLocations extends TableBasePage {
*/ */
let cellSelector = idTableMain + ' > tbody > tr > td.' + flagLocationParent; let cellSelector = idTableMain + ' > tbody > tr > td.' + flagLocationParent;
this.hookupEventHandler("click", cellSelector + ' div.' + flagLocationParent, (event, div) => { Events.hookupEventHandler("click", cellSelector + ' div.' + flagLocationParent, (event, div) => {
let row = DOM.getRowFromElement(div); let row = DOM.getRowFromElement(div);
let idLocationRow = Number(row.getAttribute(attrIdLocation)); let idLocationRow = Number(row.getAttribute(attrIdLocation));
Utils.consoleLogIfNotProductionEnvironment({ idLocationRow }); Utils.consoleLogIfNotProductionEnvironment({ idLocationRow });

View File

@@ -6,6 +6,7 @@ import Validation from "../../lib/validation.js";
import DOM from "../../dom.js"; import DOM from "../../dom.js";
import { isEmpty } from "../../lib/utils.js"; import { isEmpty } from "../../lib/utils.js";
import DogMixinPage from "./mixin.js"; import DogMixinPage from "./mixin.js";
import Utils from "../../lib/utils.js";
export default class DogTableMixinPage extends DogMixinPage { export default class DogTableMixinPage extends DogMixinPage {
constructor(pageCurrent) { constructor(pageCurrent) {
@@ -22,4 +23,10 @@ export default class DogTableMixinPage extends DogMixinPage {
hookupTable() { hookupTable() {
// Implement table-specific functionality here // Implement table-specific functionality here
} }
hookupFieldsLocation() {
this.page.hookupTableCellDdlPreviews(
flagLocation
, Utils.getListFromDict(filterLocations) // .sort((a, b) => a[flagName].localeCompare(b[flagName]))
);
}
} }

View File

@@ -11,6 +11,8 @@ import PageDogDogCommandLinks from './pages/dog/dog_command_links.js';
import PageDogLocations from './pages/dog/locations.js'; import PageDogLocations from './pages/dog/locations.js';
import PageDogButtonIcons from './pages/dog/button_icons.js'; import PageDogButtonIcons from './pages/dog/button_icons.js';
import PageDogCommandButtonLinks from './pages/dog/command_button_links.js'; import PageDogCommandButtonLinks from './pages/dog/command_button_links.js';
import PageDogAssessment from './pages/dog/assessment.js';
import PageDogAssessments from './pages/dog/assessments.js';
// Legal // Legal
import PageAccessibilityReport from './pages/legal/accessibility_report.js'; import PageAccessibilityReport from './pages/legal/accessibility_report.js';
import PageAccessibilityStatement from './pages/legal/accessibility_statement.js'; import PageAccessibilityStatement from './pages/legal/accessibility_statement.js';
@@ -42,6 +44,8 @@ export default class Router {
this.pages[hashPageDogLocations] = { name: 'PageDogLocations', module: PageDogLocations }; this.pages[hashPageDogLocations] = { name: 'PageDogLocations', module: PageDogLocations };
this.pages[hashPageDogButtonIcons] = { name: 'PageDogButtonIcons', module: PageDogButtonIcons }; this.pages[hashPageDogButtonIcons] = { name: 'PageDogButtonIcons', module: PageDogButtonIcons };
this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks }; this.pages[hashPageDogCommandButtonLinks] = { name: 'PageDogCommandButtonLinks', module: PageDogCommandButtonLinks };
this.pages[hashPageDogAssessment] = { name: 'PageDogAssessment', module: PageDogAssessment };
this.pages[hashPageDogAssessments] = { name: 'PageDogAssessments', module: PageDogAssessments };
// Legal // Legal
this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement }; this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement };
this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule }; this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule };
@@ -64,6 +68,8 @@ export default class Router {
this.routes[hashPageDogLocations] = (isPopState = false) => this.navigateToHash(hashPageDogLocations, isPopState); this.routes[hashPageDogLocations] = (isPopState = false) => this.navigateToHash(hashPageDogLocations, isPopState);
this.routes[hashPageDogButtonIcons] = (isPopState = false) => this.navigateToHash(hashPageDogButtonIcons, isPopState); this.routes[hashPageDogButtonIcons] = (isPopState = false) => this.navigateToHash(hashPageDogButtonIcons, isPopState);
this.routes[hashPageDogCommandButtonLinks] = (isPopState = false) => this.navigateToHash(hashPageDogCommandButtonLinks, isPopState); this.routes[hashPageDogCommandButtonLinks] = (isPopState = false) => this.navigateToHash(hashPageDogCommandButtonLinks, isPopState);
this.routes[hashPageDogAssessment] = (isPopState = false) => this.navigateToHash(hashPageDogAssessment, isPopState);
this.routes[hashPageDogAssessments] = (isPopState = false) => this.navigateToHash(hashPageDogAssessments, isPopState);
// Legal // Legal
this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState); this.routes[hashPageAccessibilityStatement] = (isPopState = false) => this.navigateToHash(hashPageAccessibilityStatement, isPopState);
this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState); this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);

Some files were not shown because too many files have changed in this diff Show More