Files
dog_training/models/model_view_base.py

476 lines
26 KiB
Python

"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: View Models
Feature: Base View Model
Description:
Base data model for views
"""
# IMPORTS
# VARIABLE INSTANTIATION
# METHODS
# IMPORTS
# internal
# from routes import bp_home
from business_objects.base import Base
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_shape import Button_Shape
from business_objects.dog.calendar_entry import Calendar_Entry
from business_objects.dog.calendar_entry_type import Calendar_Entry_Type
from business_objects.dog.colour import Colour
from business_objects.dog.command import Command
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_modality import Command_Modality
from business_objects.dog.company import Company
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_command_link import Dog_Command_Link
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.obedience_level import Obedience_Level
from business_objects.dog.response_quality_metric import Response_Quality_Metric
from business_objects.dog.role import Role
from business_objects.dog.user import User
from business_objects.dog.weather import Weather
from datastores.datastore_base import DataStore_Base
from datastores.datastore_dog import DataStore_Dog
from datastores.datastore_user import DataStore_User
from helpers.helper_app import Helper_App
import lib.argument_validation as av
# external
from abc import ABC, abstractmethod
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, session, current_app, jsonify
from pydantic import BaseModel, ConfigDict
from typing import ClassVar
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_SHAPE: ClassVar[str] = Button_Shape.ATTR_ID_BUTTON_SHAPE
ATTR_ID_CALENDAR_ENTRY: ClassVar[str] = Calendar_Entry.ATTR_ID_CALENDAR_ENTRY
ATTR_ID_CALENDAR_ENTRY_TYPE: ClassVar[str] = Calendar_Entry_Type.ATTR_ID_CALENDAR_ENTRY_TYPE
ATTR_ID_COLOUR: ClassVar[str] = Colour.ATTR_ID_COLOUR
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_CATEGORY: ClassVar[str] = Command_Category.ATTR_ID_COMMAND_CATEGORY
ATTR_ID_COMMAND_MODALITY: ClassVar[str] = Command_Modality.ATTR_ID_COMMAND_MODALITY
ATTR_ID_COMPANY: ClassVar[str] = Company.ATTR_ID_COMPANY
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_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_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_OBEDIENCE_LEVEL: ClassVar[str] = Obedience_Level.ATTR_ID_OBEDIENCE_LEVEL
ATTR_ID_RESPONSE_QUALITY_METRIC: ClassVar[str] = Response_Quality_Metric.ATTR_ID_RESPONSE_QUALITY_METRIC
ATTR_ID_ROLE: ClassVar[str] = Role.ATTR_ID_ROLE
ATTR_ID_USER: ClassVar[str] = User.ATTR_ID_USER
ATTR_ID_USER_AUTH0: ClassVar[str] = User.ATTR_ID_USER_AUTH0
ATTR_ID_WEATHER: ClassVar[str] = Weather.ATTR_ID_WEATHER
ATTR_TEXT_COLLAPSED: ClassVar[str] = 'textCollapsed'
ATTR_TEXT_EXPANDED: ClassVar[str] = 'textExpanded'
ATTR_VALUE_CURRENT: ClassVar[str] = 'current-value'
ATTR_VALUE_PREVIOUS: ClassVar[str] = 'previous-value'
COLOUR_ACCENT: ClassVar[str] = '#C77DFF'
COLOUR_ERROR: ClassVar[str] = 'red'
COLOUR_PAGE_BACKGROUND: ClassVar[str] = '#E0AAFF'
COLOUR_PAGE_BACKGROUND_1: ClassVar[str] = '#F5ECFE'
COLOUR_PAGE_BACKGROUND_2: ClassVar[str] = '#FAE0E2'
COLOUR_PRIMARY: ClassVar[str] = '#240046'
COLOUR_SECONDARY: ClassVar[str] = '#3C096C'
COLOUR_TEXT: ClassVar[str] = '#10002B'
COLOUR_TEXT_BACKGROUND: ClassVar[str] = 'white'
COLOUR_TEXT_LINK_UNVISITED: ClassVar[str] = '#0000EE'
COLOUR_TEXT_LINK_VISITED: ClassVar[str] = '#551A8B'
COMPANY_ADDRESS_SHORT: ClassVar[str] = '53 Alfred Green Close, Rugby, United Kingdom, CV22 6DN'
COMPANY_NUMBER: ClassVar[str] = '13587499'
ENDPOINT_GET_ALTCHA_CHALLENGE: ClassVar[str] = 'routes_core_contact.create_altcha_challenge'
ENDPOINT_PAGE_ACCESSIBILITY_REPORT: ClassVar[str] = 'routes_legal.accessibility_report'
ENDPOINT_PAGE_ACCESSIBILITY_STATEMENT: ClassVar[str] = 'routes_legal.accessibility_statement'
ENDPOINT_PAGE_APPLY_FOUNDING_PARTNER: ClassVar[str] = 'routes_core_apply_founding_partner.apply_founding_partner'
ENDPOINT_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS: ClassVar[str] = 'routes_core_apply_founding_partner.apply_founding_partner_success'
ENDPOINT_PAGE_CONTACT: ClassVar[str] = 'routes_core_contact.contact'
ENDPOINT_PAGE_CONTACT_SUCCESS: ClassVar[str] = 'routes_core_contact.contact_success'
ENDPOINT_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = 'routes_legal.retention_schedule'
ENDPOINT_PAGE_ERROR_NO_PERMISSION: ClassVar[str] = 'routes_core.error_no_permission'
ENDPOINT_PAGE_HOME: ClassVar[str] = 'routes_core_home.home'
ENDPOINT_PAGE_LICENSE: ClassVar[str] = 'routes_legal.license'
ENDPOINT_PAGE_PRIVACY_POLICY: ClassVar[str] = 'routes_legal.privacy_policy'
ENDPOINT_POST_COMMAND: ClassVar[str] = 'routes_core_contact.contact_post'
FLAG_ACTIVE: ClassVar[str] = Base.FLAG_ACTIVE
FLAG_ACTIVE_ONLY: ClassVar[str] = Base.FLAG_ACTIVE_ONLY
FLAG_ADD: ClassVar[str] = 'add'
# FLAG_ADD_DELETE: ClassVar[str] = 'add-delete'
FLAG_APPEARANCE: ClassVar[str] = Dog.FLAG_APPEARANCE
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_BENEFITS: ClassVar[str] = 'benefits'
FLAG_BOOL_FALSE: ClassVar[str] = 'false'
FLAG_BOOL_TRUE: ClassVar[str] = 'true'
FLAG_BRIBE: ClassVar[str] = Bribe.FLAG_BRIBE
FLAG_BUTTON: ClassVar[str] = 'button'
FLAG_BUTTON_ICON: ClassVar[str] = Button_Icon.FLAG_BUTTON_ICON
FLAG_BUTTON_LIGHT: ClassVar[str] = 'button-light'
FLAG_BUTTON_PRIMARY: ClassVar[str] = 'button-primary'
FLAG_BUTTON_SHAPE: ClassVar[str] = Button_Shape.FLAG_BUTTON_SHAPE
FLAG_BUTTON_SUCCESS: ClassVar[str] = 'button-success'
FLAG_CANCEL: ClassVar[str] = 'button-cancel'
FLAG_CALENDAR_ENTRY: ClassVar[str] = Calendar_Entry.FLAG_CALENDAR_ENTRY
FLAG_CALENDAR_ENTRY_TYPE: ClassVar[str] = Calendar_Entry_Type.FLAG_CALENDAR_ENTRY_TYPE
FLAG_CALLBACK: ClassVar[str] = 'callback'
FLAG_CAN_ADMIN_DOG: ClassVar[str] = User.FLAG_CAN_ADMIN_DOG
FLAG_CAN_ADMIN_USER: ClassVar[str] = User.FLAG_CAN_ADMIN_USER
FLAG_CAN_EDIT_COMPANY: ClassVar[str] = User.FLAG_CAN_EDIT_COMPANY
FLAG_CAPTCHA: ClassVar[str] = 'captcha'
FLAG_CARD: ClassVar[str] = 'card'
FLAG_CHECKBOX: ClassVar[str] = 'checkbox'
FLAG_CLOSE_TEMPORARY_ELEMENT: ClassVar[str] = 'button-temporary-element-close'
FLAG_CODE: ClassVar[str] = Base.FLAG_CODE
FLAG_COLLAPSIBLE: ClassVar[str] = 'collapsible'
FLAG_COLOUR: ClassVar[str] = Colour.FLAG_COLOUR
FLAG_COLUMN: ClassVar[str] = 'column'
FLAG_COMMAND: ClassVar[str] = Command.FLAG_COMMAND
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_MODALITY: ClassVar[str] = Command_Modality.FLAG_COMMAND_MODALITY
FLAG_COMMENT: ClassVar[str] = 'comment'
FLAG_COMPANY: ClassVar[str] = Company.FLAG_COMPANY
FLAG_CONTAINER: ClassVar[str] = 'container'
FLAG_CONTAINER_ICON_AND_LABEL: ClassVar[str] = 'container-icon-label'
FLAG_CONTAINER_INPUT: ClassVar[str] = 'container-input'
FLAG_CSRF_TOKEN: ClassVar[str] = 'X-CSRFToken'
FLAG_CTA_1: ClassVar[str] = 'cta-1'
FLAG_CTA_2: ClassVar[str] = 'cta-2'
FLAG_DATA: ClassVar[str] = 'data'
FLAG_DATE_FROM: ClassVar[str] = Base.FLAG_DATE_FROM
FLAG_DATE_TO: ClassVar[str] = Base.FLAG_DATE_TO
FLAG_DDL_PREVIEW: ClassVar[str] = "ddl-preview"
FLAG_DELETE: ClassVar[str] = 'delete'
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_DIALOG: ClassVar[str] = 'dialog'
FLAG_DIRTY: ClassVar[str] = 'dirty'
FLAG_DISPLAY_ORDER: ClassVar[str] = Base.FLAG_DISPLAY_ORDER
FLAG_DOG: ClassVar[str] = Dog.FLAG_DOG
FLAG_DOG_COMMAND_LINK: ClassVar[str] = Dog_Command_Link.FLAG_DOG_COMMAND_LINK
FLAG_EDIT: ClassVar[str] = 'edit'
FLAG_EMAIL: ClassVar[str] = Base.FLAG_EMAIL
FLAG_ERROR: ClassVar[str] = 'error'
FLAG_EXPANDED: ClassVar[str] = 'expanded'
FLAG_FAILURE: ClassVar[str] = 'failure'
FLAG_FAQ: ClassVar[str] = 'faq'
FLAG_FEATURES: ClassVar[str] = 'features'
FLAG_FILTER: ClassVar[str] = 'filter'
FLAG_FIRSTNAME: ClassVar[str] = Base.FLAG_FIRSTNAME
FLAG_FORM: ClassVar[str] = 'form'
FLAG_FORM_FILTERS: ClassVar[str] = 'form-filters'
FLAG_HAMBURGER: ClassVar[str] = 'hamburger'
FLAG_ICON: ClassVar[str] = "icon"
FLAG_IMAGE_LOGO: ClassVar[str] = 'image-logo'
FLAG_INITIALISED: ClassVar[str] = 'initialised'
FLAG_INPUT_ANSWER: ClassVar[str] = 'input-answer'
FLAG_IS_CHECKED: ClassVar[str] = 'is_checked'
FLAG_IS_COLLAPSED: ClassVar[str] = 'is_collapsed'
FLAG_LABEL_QUESTION: ClassVar[str] = 'label-question'
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_PARENT: ClassVar[str] = Location.FLAG_LOCATION_PARENT
FLAG_LOGO: ClassVar[str] = 'logo'
FLAG_MASS_KG: ClassVar[str] = Dog.FLAG_MASS_KG
FLAG_MESSAGE: ClassVar[str] = Command.FLAG_MESSAGE
FLAG_MODAL: ClassVar[str] = 'modal'
FLAG_NAME: ClassVar[str] = Base.FLAG_NAME
FLAG_NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME_ATTR_OPTION_TEXT
FLAG_NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.FLAG_NAME_ATTR_OPTION_VALUE
FLAG_NAME_PLURAL: ClassVar[str] = Base.FLAG_NAME_PLURAL
# FLAG_NAME_SINGULAR: ClassVar[str] = Base.FLAG_NAME_SINGULAR
FLAG_NAV_ADMIN_HOME: ClassVar[str] = 'navAdminHome'
FLAG_NAV_APPLY_FOUNDING_PARTNER: ClassVar[str] = 'navApplyFoundingPartner'
FLAG_NAV_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS: ClassVar[str] = 'navBlogArticleHowToScaleYourDogTrainingBusiness'
FLAG_NAV_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS: ClassVar[str] = 'navBlogArticleTheScienceBehindDogTrainingAssessments'
FLAG_NAV_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY: ClassVar[str] = 'navBlogArticleWhyEveryTrainerNeedsACommandDictionary'
FLAG_NAV_BLOG_CATEGORY_MARKETING_AND_GROWTH: ClassVar[str] = 'navBlogCategoryMarketingAndGrowth'
FLAG_NAV_BLOG_CATEGORY_TRAINING_TECHNIQUES: ClassVar[str] = 'navBlogCategoryTrainingTechniques'
FLAG_NAV_BLOG_HOME: ClassVar[str] = 'navBlogHome'
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_CALENDAR_ENTRIES: ClassVar[str] = 'navDogCalendarEntries'
FLAG_NAV_DOG_COLOURS: ClassVar[str] = 'navDogColours'
FLAG_NAV_DOG_COMMAND_BUTTON_LINKS: ClassVar[str] = 'navDogCommandButtonLinks'
FLAG_NAV_DOG_COMMAND_CATEGORIES: ClassVar[str] = 'navDogCommandCategories'
FLAG_NAV_DOG_COMMANDS: ClassVar[str] = 'navDogCommands'
FLAG_NAV_DOG_DOGS: ClassVar[str] = 'navDogDogs'
FLAG_NAV_DOG_DOG_COMMAND_LINKS: ClassVar[str] = 'navDogDogCommandLinks'
FLAG_NAV_DOG_HOME: ClassVar[str] = 'navDogHome'
FLAG_NAV_DOG_LOCATIONS: ClassVar[str] = 'navDogLocations'
FLAG_NAV_HOME: ClassVar[str] = 'navHome'
FLAG_NAV_USER_ACCOUNT: ClassVar[str] = 'navUserAccount'
FLAG_NAV_USER_ACCOUNT: ClassVar[str] = 'navUserAccounts'
FLAG_NAV_USER_COMPANY: ClassVar[str] = 'navUserCompany'
FLAG_NAV_USER_LOGIN: ClassVar[str] = 'navUserLogin'
FLAG_NAV_USER_LOGOUT: ClassVar[str] = 'navUserLogout'
FLAG_NOTES: ClassVar[str] = "notes"
FLAG_OBEDIENCE_LEVEL: ClassVar[str] = Obedience_Level.FLAG_OBEDIENCE_LEVEL
FLAG_OVERLAY: ClassVar[str] = 'overlay'
FLAG_PAGE_BODY: ClassVar[str] = 'page-body'
FLAG_PRICE: ClassVar[str] = Base.FLAG_PRICE
FLAG_PRICING: ClassVar[str] = 'pricing'
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_ROLE: ClassVar[str] = Role.FLAG_ROLE
FLAG_ROW: ClassVar[str] = 'row'
FLAG_ROW_NEW: ClassVar[str] = 'row-new'
FLAG_ROWS: ClassVar[str] = Base.FLAG_ROWS
FLAG_SAVE: ClassVar[str] = 'save'
FLAG_SCROLLABLE: ClassVar[str] = 'scrollable'
FLAG_SEARCH: ClassVar[str] = Base.FLAG_SEARCH
FLAG_SLIDER: ClassVar[str] = 'slider'
FLAG_STATUS: ClassVar[str] = 'status'
FLAG_SUBMIT: ClassVar[str] = 'submit'
FLAG_SUCCESS: ClassVar[str] = 'success'
FLAG_SURNAME: ClassVar[str] = Base.FLAG_SURNAME
FLAG_TABLE_MAIN: ClassVar[str] = 'table-main'
FLAG_TEMPORARY_ELEMENT: ClassVar[str] = 'temporary-element'
FLAG_TESTIMONIAL: ClassVar[str] = 'testimonial'
FLAG_USER: ClassVar[str] = User.FLAG_USER
# FLAG_VALUE_PROPOSITION: ClassVar[str] = 'value-proposition'
FLAG_WEATHER: ClassVar[str] = Weather.FLAG_WEATHER
FLAG_WEBSITE: ClassVar[str] = Base.FLAG_WEBSITE
HASH_GET_ALTCHA_CHALLENGE: ClassVar[str] = '/altcha/create-challenge'
HASH_GET_DOG_SCRIPTS_SHARED: ClassVar[str] = '/dog/scripts-shared'
HASH_PAGE_ACCESSIBILITY_REPORT: ClassVar[str] = '/accessibility-report'
HASH_PAGE_ACCESSIBILITY_STATEMENT: ClassVar[str] = '/accessibility-statement'
HASH_PAGE_ADMIN_HOME: ClassVar[str] = '/admin'
HASH_PAGE_APPLY_FOUNDING_PARTNER: ClassVar[str] = '/apply-founding-partner'
HASH_PAGE_APPLY_FOUNDING_PARTNER_SUCCESS: ClassVar[str] = '/apply-founding-partner-success'#
HASH_PAGE_BLOG_ARTICLE_HOW_TO_SCALE_YOUR_DOG_TRAINING_BUSINESS: ClassVar[str] = '/blog/article/how-to-scale-your-dog-training-business-from-solo-to-multi-trainer-success'
HASH_PAGE_BLOG_ARTICLE_THE_SCIENCE_BEHIND_DOG_TRAINING_ASSESSMENTS: ClassVar[str] = '/blog/article/the-science-behind-dog-training-assessments-how-to-track-real-progress'
HASH_PAGE_BLOG_ARTICLE_WHY_EVERY_TRAINER_NEEDS_A_COMMAND_DICTIONARY: ClassVar[str] = '/blog/article/why-every-professional-trainer-needs-a-command-dictionary-in-2025'
HASH_PAGE_BLOG_CATEGORY_MARKETING_AND_GROWTH: ClassVar[str] = '/blog/category/marketing-and-growth'
HASH_PAGE_BLOG_CATEGORY_TRAINING_TECHNIQUES: ClassVar[str] = '/blog/category/training-techniques'
HASH_PAGE_BLOG_HOME: ClassVar[str] = '/blog/home'
HASH_PAGE_CONTACT: ClassVar[str] = '/contact'
HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success'
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_CALENDAR_ENTRIES: ClassVar[str] = '/dog/calendar-entries'
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_COMMANDS: ClassVar[str] = '/dog/commands'
HASH_PAGE_DOG_DOG_COMMAND_LINKS: ClassVar[str] = '/dog/dog-command-links'
HASH_PAGE_DOG_DOGS: ClassVar[str] = '/dog/dogs'
HASH_PAGE_DOG_HOME: ClassVar[str] = '/dog/'
HASH_PAGE_DOG_LOCATIONS: ClassVar[str] = '/dog/locations'
HASH_PAGE_ERROR_NO_PERMISSION: ClassVar[str] = '/error'
HASH_PAGE_HOME: ClassVar[str] = '/'
HASH_PAGE_LICENSE: ClassVar[str] = '/license'
HASH_PAGE_PRIVACY_POLICY: ClassVar[str] = '/privacy-policy'
HASH_PAGE_USER_ACCOUNT: ClassVar[str] = '/user/user'
HASH_PAGE_USER_ACCOUNTS: ClassVar[str] = '/user/users'
HASH_PAGE_USER_COMPANY: ClassVar[str] = '/user/company'
HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login'
HASH_PAGE_USER_LOGOUT: ClassVar[str] = '/logout'
# HASH_SAVE_DOG_ASSESSMENT: ClassVar[str] = '/dog/save-assessment'
HASH_SAVE_DOG_ASSESSMENT_DISTRACTION_AND_RESPONSE: ClassVar[str] = '/dog/save-assessment-distraction-and-response'
HASH_SAVE_DOG_BUTTON_ICON: ClassVar[str] = '/dog/save-button-icon'
HASH_SAVE_DOG_COLOUR: ClassVar[str] = '/dog/save-colour'
HASH_SAVE_DOG_COMMAND: ClassVar[str] = '/dog/save-command'
HASH_SAVE_DOG_COMMAND_BUTTON_LINK: ClassVar[str] = '/dog/save-command-button-link'
HASH_SAVE_DOG_COMMAND_CATEGORY: ClassVar[str] = '/dog/save-command-category'
HASH_SAVE_DOG_DOG_COMMAND_LINK: ClassVar[str] = '/dog/save-dog-command-link'
HASH_SAVE_DOG_DOG: ClassVar[str] = '/dog/dogs'
HASH_SAVE_DOG_LOCATION: ClassVar[str] = '/dog/save-location'
HASH_SAVE_USER_COMPANY: ClassVar[str] = '/user/save-company'
HASH_SAVE_USER_USER: ClassVar[str] = '/user/save-user'
ID_BUTTON_ADD: ClassVar[str] = 'buttonAdd'
ID_BUTTON_APPLY_FILTERS: ClassVar[str] = 'buttonApplyFilters'
ID_BUTTON_CANCEL: ClassVar[str] = 'buttonCancel'
ID_BUTTON_HAMBURGER: ClassVar[str] = 'buttonHamburger'
ID_BUTTON_SAVE: ClassVar[str] = 'buttonSave'
ID_CONTAINER_TEMPLATE_ELEMENTS: ClassVar[str] = 'container-template-elements'
ID_CSRF_TOKEN: ClassVar[str] = 'X-CSRFToken'
ID_FORM_CONTACT: ClassVar[str] = 'formContact'
ID_FORM_FILTERS: ClassVar[str] = 'formFilters'
ID_LABEL_ERROR: ClassVar[str] = 'labelError'
ID_OVERLAY_CONFIRM: ClassVar[str] = 'overlayConfirm'
ID_OVERLAY_ERROR: ClassVar[str] = 'overlayError'
ID_OVERLAY_HAMBURGER: ClassVar[str] = 'overlayHamburger'
ID_PAGE_BODY: ClassVar[str] = 'pageBody'
ID_TABLE_MAIN: ClassVar[str] = 'tableMain'
ID_TEXTAREA_CONFIRM: ClassVar[str] = 'textareaConfirm'
NAME_COMPANY: ClassVar[str] = 'Precision And Research Technology Systems Limited - Fetch Metrics'
NAME_COMPANY_SHORT: ClassVar[str] = 'Fetch Metrics'
NAME_CSRF_TOKEN: ClassVar[str] = 'csrf-token'
USERNAME_DISCORD: ClassVar[str] = 'Fetch Metrics'
USERNAME_FACEBOOK: ClassVar[str] = 'Fetch Metrics'
USERNAME_GITHUB: ClassVar[str] = 'Teddy-1024'
USERNAME_INSTAGRAM: ClassVar[str] = 'fetchmetrics'
USERNAME_LINKEDIN: ClassVar[str] = 'fetchmetrics'
USERNAME_REDDIT: ClassVar[str] = 'Fetch-Metrics'
USERNAME_TIKTOK: ClassVar[str] = 'fetchmetrics'
USERNAME_TWITTER: ClassVar[str] = 'FetchMetrics'
URL_DISCORD: ClassVar[str] = f'https://discord.gg/HBSvutXSZf'
URL_FACEBOOK: ClassVar[str] = 'https://www.facebook.com/profile.php?id=61579039227559'
URL_GITHUB: ClassVar[str] = f'https://github.com/{USERNAME_GITHUB}'
URL_INSTAGRAM: ClassVar[str] = f'https://www.instagram.com/{USERNAME_INSTAGRAM}/'
URL_LINKEDIN: ClassVar[str] = f'https://www.linkedin.com/company/{USERNAME_LINKEDIN}'
URL_LINKEDIN_PERSONAL: ClassVar[str] = f'https://www.linkedin.com/in/teddyms'
URL_REDDIT: ClassVar[str] = f'https://www.reddit.com/u/{USERNAME_REDDIT}/s/gZKEz2ZwHN'
URL_TIKTOK: ClassVar[str] = f'https://www.tiktok.com/@{USERNAME_TIKTOK}'
URL_TWITTER: ClassVar[str] = f'https://x.com/{USERNAME_TWITTER}'
_title: str
hash_page_current: str
app: Flask = None
session: None = None
is_page_dog: bool = None
is_user_logged_in: bool = None
user: User = None
access_levels: list = None
model_config = ConfigDict(arbitrary_types_allowed=True)
@property
# @abstractmethod
def title(self):
if self._title is None:
raise NotImplementedError("Model Title required.")
return self._title
def __init__(self, hash_page_current, **kwargs):
BaseModel.__init__(self, hash_page_current=hash_page_current, **kwargs)
self.app = current_app
with self.app.app_context():
self.session = session
self.is_page_dog = False
Helper_App.console_log(f'session: {self.session}')
datastore_base = DataStore_Base()
self.user = datastore_base.get_user_session()
self.is_user_logged_in = self.user.get_is_logged_in()
# Helper_App.console_log(f'model_view_base init end - model.user: {self.user}')
def get_url_host(self):
return self.app.config['URL_HOST']
@staticmethod
def output_bool(boolean):
return str(boolean).lower()
@staticmethod
def get_user_session():
datastore_user = DataStore_User()
return datastore_user.get_user_session()
@staticmethod
def get_many_access_level(filters=None):
_m = 'Model_View_Store.get_many_access_level'
# av.val_instance(filters, 'filters', _m, Filters_Access_Level)
access_levels, errors = DataStore_Base.get_many_access_level(filters)
return access_levels
@staticmethod
def get_many_unit_measurement(filters=None):
_m = 'Model_View_Store.get_many_unit_measurement'
# av.val_instance(filters, 'filters', _m, Filters_Unit_Measurement)
units_measurement, errors = DataStore_Base.get_many_unit_measurement(filters)
return units_measurement
@staticmethod
def convert_list_objects_to_json(list_objects):
return [obj.to_json() for obj in list_objects]
@staticmethod
def convert_list_objects_to_list_options(list_objects):
return Base.convert_list_objects_to_list_options(list_objects)
@staticmethod
def convert_list_objects_to_dict_by_attribute_key(list_objects, key):
return {getattr(obj, key): obj for obj in list_objects}
@staticmethod
def convert_list_objects_to_dict_json_by_attribute_key(list_objects, key):
return {getattr(obj, key): obj.to_json() for obj in list_objects}
@staticmethod
def convert_list_objects_to_dict_by_attribute_key_default(list_objects):
if list_objects is None or len(list_objects) == 0:
return {}
obj_class = list_objects[0].__class__
return Model_View_Base.convert_list_objects_to_dict_by_attribute_key(list_objects, getattr(obj_class, obj_class.FLAG_NAME_ATTR_OPTION_VALUE))
@staticmethod
def convert_list_objects_to_dict_json_by_attribute_key_default(list_objects):
if list_objects is None or len(list_objects) == 0:
return {}
obj_class = list_objects[0].__class__
return Model_View_Base.convert_list_objects_to_dict_json_by_attribute_key(list_objects, getattr(obj_class, obj_class.FLAG_NAME_ATTR_OPTION_VALUE))
@staticmethod
def convert_dict_values_to_json(dict):
return {key: dict[key].to_json() for key in dict.keys()}
@staticmethod
def convert_list_objects_to_preview_str(list_objects):
preview_str = ''
for obj in list_objects:
if preview_str != '':
preview_str += '\n'
obj_json = obj.to_json()
preview_str += obj_json[obj_json[Base.FLAG_NAME_ATTR_OPTION_TEXT]]
return preview_str
@staticmethod
def join_with_linebreaks(strs):
str_multiline = ''
for str in strs:
if str_multiline != '':
str_multiline += '\n'
str_multiline += str
return str_multiline
@staticmethod
def format_date(date):
if date is None:
return ''
return date.strftime('%Y-%m-%d')
@staticmethod
def format_datetime(date_time):
if date_time is None:
return ''
return date_time.strftime('%Y-%m-%dT%H:%M')
@staticmethod
def format_datetime_text(date_time):
if date_time is None:
return ''
return date_time.strftime('%d/%m/%Y %H:%M')
@staticmethod
def jsonify(data):
return jsonify(data)
def get_mail_contact_public(self):
return self.app.config['MAIL_CONTACT_PUBLIC']
@staticmethod
def format_null_string_as_blank(string):
return '' if string is None else string