Feat(SQL, UI): Redesign database with much more detailed command response quality analysis and created successfully loading Dog Command Links page

This commit is contained in:
2025-06-28 20:48:37 +01:00
parent ab50a81a0e
commit caeb13429a
245 changed files with 7244 additions and 2035 deletions

View File

@@ -11,8 +11,8 @@ Abstract business object
"""
# internal
from extensions import db
import lib.argument_validation as av
from dog_training.extensions import db
import dog_training.lib.argument_validation as av
# external
from typing import ClassVar
from flask import jsonify

View File

@@ -11,8 +11,8 @@ Abstract base class for all business objects in app
"""
# internal
from extensions import db
import lib.argument_validation as av
from dog_training.extensions import db
import dog_training.lib.argument_validation as av
# external
from typing import ClassVar

View File

@@ -11,9 +11,9 @@ Abstract base class for database objects
"""
# internal
# from helpers.DEPRECATED.helper_abc import Interface_ABC
from extensions import db
import lib.argument_validation as av
# from dog_training.helpers.DEPRECATED.helper_abc import Interface_ABC
from dog_training.extensions import db
import dog_training.lib.argument_validation as av
# external
from typing import ClassVar
from abc import abstractmethod, ABCMeta
@@ -45,4 +45,21 @@ class SQLAlchemy_ABC(db.Model, metaclass=SQLAlchemy_ABCMeta):
column.name: getattr(self, column.name)
for column in self.__table__.columns
if column.name not in excluded_attributes
}
}
class Get_Many_Parameters_Base(BaseModel, metaclass=ABCMeta):
# a_id_user: int
def __init__(self, **kwargs): # , a_id_user
super().__init__(**kwargs) # a_id_user=a_id_user,
@classmethod
@abstractmethod
def get_default(cls): # , id_user
pass
@classmethod
@abstractmethod
def from_json(self):
pass
@abstractmethod
def to_json(self):
pass # return self.dict()

View File

@@ -11,10 +11,10 @@ Business object for product
"""
# internal
import lib.argument_validation as av
from business_objects.base import Base
from extensions import db
from helpers.helper_app import Helper_App
import dog_training.lib.argument_validation as av
from dog_training.business_objects.base import Base
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from pydantic import BaseModel
from typing import ClassVar
@@ -23,7 +23,7 @@ from typing import ClassVar
class Access_Level(db.Model, Base):
NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_ACCESS_LEVEL
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'PH_Access_Level_Temp'
__tablename__ = 'DOG_Access_Level_Temp'
id_access_level = db.Column(db.Integer, primary_key=True)
code = db.Column(db.String(50))
name = db.Column(db.String(250))

View File

@@ -0,0 +1,136 @@
"""
Project: PARTS Website
Author: Edward Middleton-Smith
Precision And Research Technology Systems Limited
Technology: Business Objects
Feature: Dog Command Link Container Business Object
Description:
Business object for dog command link container
DEPRECATED AS NOT REQUIRED - USE A LIST
"""
# internal
import dog_training.lib.argument_validation as av
from dog_training.business_objects.base import Base
from dog_training.business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from dog_training.business_objects.dog.dog_command_link import Dog_Command_Link
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from pydantic import BaseModel
from typing import ClassVar
class Dog_Command_Link_Container(Base):
NAME_ATTR_OPTION_TEXT: ClassVar[str] = ''
NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.FLAG_ROWS
categories: list
def __init__(self):
self.categories = []
def add_dog_command_link(self, dog_command_link):
av.val_instance(dog_command_link, 'dog_command_link', 'Dog_Command_Link_Container.add_dog_command_link', Dog_Command_Link)
self.categories.append(dog_command_link)
def get_index_category_from_id(self, id_category):
for index_category in range(len(self.categories)):
category = self.categories[index_category]
if category.id_category == id_category:
return index_category
raise ValueError(f"{av.error_msg_str(id_category, 'id_category', 'Dog_Command_Link_Container.get_index_category_from_id', int)}\nID not in list")
def get_index_category_from_id_permutation(self, id_permutation):
for index_category in range(len(self.categories)):
category = self.categories[index_category]
try:
index_product = category.get_index_product_from_id_permutation(id_permutation)
return index_category
except:
pass
raise ValueError(f"{av.error_msg_str(id_permutation, 'id_permutation', 'Dog_Command_Link_Container.get_index_category_from_id_permutation', int)}. Permutation ID not in list")
def add_product(self, product):
av.val_instance(product, 'product', 'Dog_Command_Link_Container.add_product', Product)
index_category = self.get_index_category_from_id(product.id_category)
self.categories[index_category].add_product(product)
def add_product_permutation(self, permutation):
av.val_instance(permutation, 'permutation', 'Dog_Command_Link_Container.add_product_permutation', Product_Permutation)
index_category = self.get_index_category_from_id(permutation.id_category)
self.categories[index_category].add_product_permutation(permutation)
def add_product_variation_type(self, variation_type):
av.val_instance(variation_type, 'variation_type', 'Dog_Command_Link_Container.add_product_variation_type', Product_Variation_Type)
variation = variation_type.variations[0]
index_category = self.get_index_category_from_id(variation.id_category)
self.categories[index_category].add_product_variation_type(variation_type)
def add_product_price(self, price):
av.val_instance(price, 'price', 'Dog_Command_Link_Container.add_product_price', Product_Price)
index_category = self.get_index_category_from_id(price.id_category)
self.categories[index_category].add_product_price(price)
def add_product_image(self, image):
av.val_instance(image, 'image', 'Dog_Command_Link_Container.add_product_image', Image)
index_category = self.get_index_category_from_id(image.id_category)
self.categories[index_category].add_product_image(image)
def add_delivery_option(self, delivery_option):
av.val_instance(delivery_option, 'delivery_option', 'Dog_Command_Link_Container.add_delivery_option', Delivery_Option)
index_category = self.get_index_category_from_id(delivery_option.id_category)
self.categories[index_category].add_delivery_option(delivery_option)
def add_product_price_discount(self, discount):
av.val_instance(discount, 'discount', 'Dog_Command_Link_Container.add_product_price_discount', Discount)
index_category = self.get_index_category_from_id(discount.id_category)
self.categories[index_category].add_product_price_discount(discount)
def add_stock_item(self, stock_item):
av.val_instance(stock_item, 'stock_item', 'Dog_Command_Link_Container.add_stock_item', Stock_Item)
index_category = self.get_index_category_from_id(stock_item.id_category)
self.categories[index_category].add_stock_item(stock_item)
def get_all_product_variation_trees(self):
for category in self.categories:
category.get_all_product_variation_trees()
def __repr__(self):
return f'categories: {self.categories}'
def get_category_count(self):
return len(self.categories)
def to_permutation_row_list(self):
list_rows = []
for category in self.categories:
list_rows += category.to_permutation_row_list()
return list_rows
def to_category_option_list(self):
list_categories = []
for category in self.categories:
list_categories.append({'value': category.id_category, 'text': category.name})
return list_categories
def get_list_products(self):
list_products = []
for category in self.categories:
list_products += category.products
return list_products
def to_product_option_list(self):
list_products = self.get_list_products()
return [{'value': product.id_product, 'text': product.name, Product.ATTR_ID_Dog_Command_Link: product.id_category} for product in list_products]
def get_product_option_lists_by_category(self):
dict_lists_products = {}
for category in self.categories:
dict_lists_products[category.id_category] = category.to_product_option_list()
return dict_lists_products
def to_json(self):
return {
**self.get_shared_json_attributes(self),
f'{self.FLAG_ROWS}': [category.to_json() for category in self.categories]
}
@classmethod
def from_json(cls, json):
return None
def to_json_option(self):
return None
def to_temporary_record(self):
excluded_attributes = {
column.name: getattr(self, column.name)
for column in self.__table__.columns
if column.name not in ['created_on', 'created_by']
}
return self.to_object_with_missing_attributes(excluded_attributes)
def get_csv_ids_permutation(self):
list_ids = []
for category in self.categories:
list_ids += category.get_csv_ids_permutation()
return ','.join(list_ids)

View File

@@ -8,11 +8,11 @@ Feature: Understanding Level Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.db_base import SQLAlchemy_ABC
import dog_training.lib.argument_validation as av
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
@@ -36,8 +36,8 @@ class Understanding_Level(SQLAlchemy_ABC, Base):
self.is_new = False
super().__init__()
def from_DB_Dog_Understanding_Level(query_row):
_m = 'Understanding_Level.from_DB_Dog_Understanding_Level'
def from_db_dog_command_link(query_row):
_m = 'Understanding_Level.from_db_dog_command_link'
level = Understanding_Level()
level.id_understanding_level = query_row[5]
level.code = query_row[6]

View File

@@ -8,18 +8,19 @@ Feature: Command Business Object
"""
# internal
from business_objects.base import Base
from business_objects.dog.command_category import Command_Category
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.dog.command_category import Command_Category
from dog_training.business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import dog_training.lib.argument_validation as av
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Command(SQLAlchemy_ABC, Base):
ATTR_ID_COMMAND: ClassVar[str] = 'id_command'
FLAG_COMMAND: ClassVar[str] = 'command'
FLAG_HAND_SIGNAL_DEFAULT_DESCRIPTION: ClassVar[str] = 'hand-signal-default-description'
FLAG_CAN_HAVE_BUTTON: ClassVar[str] = 'can-have-button'
@@ -44,12 +45,26 @@ class Command(SQLAlchemy_ABC, Base):
self.has_button = False
super().__init__()
def from_DB_Dog_Command(query_row):
_m = 'Command.from_DB_Dog_Command'
def from_db_command(query_row):
_m = 'Command.from_db_command'
command = Command()
command.id_command = query_row[0]
command.id_command_category = query_row[1]
command.name = query_row[2]
command.hand_signal_default_description = query_row[3]
command.can_have_button = av.input_bool(query_row[4], 'can_have_button', _m)
# command.has_button = av.input_bool(query_row[7], 'has_button', _m)
command.notes = query_row[5]
command.active = av.input_bool(query_row[6], 'active', _m)
# command.created_on = query_row[7]
return command
def from_db_dog_command_link(query_row):
_m = 'Command.from_db_dog_command_link'
command = Command()
command.id_command = query_row[5]
command.id_command_category = query_row[3]
command.name = query_row[7]
command.name = query_row[6]
# command.hand_signal_default_description = query_row[2]
# command.can_have_button = av.input_bool(query_row[5], 'can_have_button', _m)
command.has_button = av.input_bool(query_row[7], 'has_button', _m)
@@ -132,4 +147,52 @@ class Command_Temp(db.Model, Base):
temp.notes = command.notes
temp.active = command.active
temp.created_on = command.created_on
return temp
return temp
class Parameters_Command(Get_Many_Parameters_Base):
get_all_command: bool
get_inactive_command: bool
ids_command: str
names_command: str
@classmethod
def get_default(cls):
return cls(
get_all_command = True
, get_inactive_command = False
, ids_command = ''
, names_command = ''
)
@classmethod
def from_json(cls, json):
return cls(
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', '')
)
"""
@classmethod
def from_form_filters_command(cls, form):
av.val_instance(form, 'form', 'Parameters_Command.from_form_filters_command', Filters_Command)
has_filter_command = not (form.id_command.data == '0' or form.id_command.data == '' or form.id_command.data is None)
active_only = av.input_bool(form.active.data, "active", "Parameters_Command.from_form_filters_command")
return cls(
get_all_command = not has_filter_command
, get_inactive_command = not active_only
, ids_command = form.id_command.data if has_filter_id else ''
, names_command = form.name_command.data if has_filter_name else ''
)
"""
def to_json(self):
return {
'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
}

View File

@@ -8,11 +8,11 @@ Feature: Command Category Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.db_base import SQLAlchemy_ABC
import dog_training.lib.argument_validation as av
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
@@ -36,12 +36,12 @@ class Command_Category(SQLAlchemy_ABC, Base):
self.is_new = False
super().__init__()
def from_DB_Dog_Command(query_row):
_m = 'Command_Category.from_DB_Dog_Command'
def from_db_dog_command_link(query_row):
_m = 'Command_Category.from_db_dog_command_link'
level = Command_Category()
level.id_command_category = query_row[5]
level.code = query_row[6]
level.name = query_row[7]
level.id_command_category = query_row[3]
# level.code = query_row[6]
level.name = query_row[4]
level.active = True
return level

View File

@@ -8,17 +8,18 @@ Feature: Dog Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import dog_training.lib.argument_validation as av
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
class Dog(SQLAlchemy_ABC, Base):
ATTR_ID_DOG: ClassVar[str] = 'id_dog'
FLAG_DOG: ClassVar[str] = 'dog'
FLAG_APPEARANCE: ClassVar[str] = 'appearance'
FLAG_MASS_KG: ClassVar[str] = 'mass-kg'
@@ -41,8 +42,19 @@ class Dog(SQLAlchemy_ABC, Base):
self.is_new = False
super().__init__()
def from_DB_Dog_Command(query_row):
_m = 'Dog.from_DB_Dog'
def from_db_dog(query_row):
_m = 'Dog.from_db_dog'
dog = Dog()
dog.id_dog = query_row[0]
dog.name = query_row[1]
dog.appearance = query_row[2]
dog.mass_kg = query_row[3]
dog.notes = query_row[4]
dog.active = av.input_bool(query_row[5], 'active', _m)
return dog
def from_db_dog_command_link(query_row):
_m = 'Dog.from_db_dog_command_link'
dog = Dog()
dog.id_dog = query_row[1]
dog.name = query_row[2]
@@ -122,3 +134,53 @@ class Dog_Temp(db.Model, Base):
temp.active = dog.active
temp.created_on = dog.created_on
return temp
class Parameters_Dog(Get_Many_Parameters_Base):
get_all_dog: bool
get_inactive_dog: bool
ids_dog: str
names_dog: str
@classmethod
def get_default(cls):
return cls(
get_all_dog = True
, get_inactive_dog = False
, ids_dog = ''
, names_dog = ''
)
@classmethod
def from_json(cls, json):
return cls(
get_all_dog = json.get('a_get_all_dog', False)
, get_inactive_dog = json.get('a_get_inactive_dog', False)
, ids_dog = json.get('a_ids_dog', '')
, names_dog = json.get('names_dog', '')
)
"""
@classmethod
def from_form_filters_dog(cls, form):
av.val_instance(form, 'form', 'Parameters_Dog.from_form_filters_dog', Filters_Dog)
has_filter_id = not (form.id_dog.data == '0' or form.id_dog.data == '' or form.id_dog.data is None)
has_filter_name = not (form.name_dog.data == '0' or form.name_dog.data == '' or form.name_dog.data is None)
has_filter_dog = has_filter_id or has_filter_name
active_only = av.input_bool(form.active.data, "active", "Parameters_Dog.from_form_filters_dog")
return cls(
get_all_dog = not has_filter_dog
, get_inactive_dog = not active_only
, ids_dog = form.id_dog.data if has_filter_id else ''
, names_dog = form.name_dog.data if has_filter_name else ''
)
"""
def to_json(self):
return {
'a_get_all_dog': self.get_all_dog
, 'a_get_inactive_dog': self.get_inactive_dog
, 'a_ids_dog': self.ids_dog
, 'a_names_dog': self.names_dog
}

View File

@@ -8,16 +8,16 @@ Feature: Dog Command Link 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
from business_objects.dog.dog import Dog
from business_objects.dog.obedience_level import Obedience_Level
from business_objects.dog.understanding_level import Understanding_Level
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.dog.command import Command
# from dog_training.business_objects.dog.command_category import Command_Category
from dog_training.business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from dog_training.business_objects.dog.dog import Dog
from dog_training.business_objects.dog.obedience_level import Obedience_Level
from dog_training.extensions import db
from dog_training.forms.dog.dog_command_link import Filters_Dog_Command_Link
from dog_training.helpers.helper_app import Helper_App
import dog_training.lib.argument_validation as av
# external
from dataclasses import dataclass
from typing import ClassVar
@@ -26,42 +26,40 @@ from typing import ClassVar
class Dog_Command_Link(SQLAlchemy_ABC, Base):
FLAG_DOG_COMMAND_LINK: ClassVar[str] = 'dog_command_link'
FLAG_HAND_SIGNAL_DESCRIPTION: ClassVar[str] = 'hand-signal-description'
FLAG_CAN_HAVE_BUTTON: ClassVar[str] = 'can-have-button'
NAME_ATTR_OPTION_VALUE: ClassVar[str] = FLAG_DOG_COMMAND_LINK
NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME
__tablename__ = 'DOG_Dog_Command_Link'
__table_args__ = { 'extend_existing': True }
id_dog_command_link = db.Column(db.Integer, primary_key=True)
id_link = db.Column(db.Integer, primary_key=True)
id_dog = db.Column(db.Integer)
id_command = db.Column(db.Integer)
id_understanding_level = db.Column(db.Integer)
id_obedience_level = db.Column(db.Integer)
hand_signal_description = db.Column(db.Text)
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
created_on = db.Column(db.DateTime)
def __init__(self):
self.id_dog_command_link = 0
self.id_link = 0
self.is_new = False
#self.id_command_category = None
self.dog = None
self.command = None
super().__init__()
def from_DB_Dog_Command(query_row):
_m = 'Dog_Command_Link.from_DB_Dog_Command'
def from_db_dog_command_link(query_row):
_m = 'Dog_Command_Link.from_db_dog_command_link'
dog_command_link = Dog_Command_Link()
dog_command_link.id_dog_command_link = query_row[0]
dog_command_link.id_link = query_row[0]
dog_command_link.id_dog = query_row[1]
#dog_command_link.id_command_category = query_row[3]
dog_command_link.id_command = query_row[5]
dog_command_link.id_understanding_level = query_row[8]
dog_command_link.id_obedience_level = query_row[11]
dog_command_link.hand_signal_description = query_row[14]
dog_command_link.notes = query_row[15]
dog_command_link.active = av.input_bool(query_row[16], 'active', _m)
dog_command_link.hand_signal_description = query_row[8]
dog_command_link.notes = query_row[9]
dog_command_link.active = av.input_bool(query_row[10], 'active', _m)
# dog_command_link.created_on = query_row[7]
dog_command_link.dog = Dog.from_db_dog_command_link(query_row)
dog_command_link.command = Command.from_db_dog_command_link(query_row)
return dog_command_link
@classmethod
@@ -70,11 +68,9 @@ class Dog_Command_Link(SQLAlchemy_ABC, Base):
dog_command_link = cls()
if json is None: return dog_command_link
Helper_App.console_log(f'{_m}\njson: {json}')
dog_command_link.id_dog_command_link = -1
dog_command_link.id_link = -1
dog_command_link.id_dog = json[Dog.FLAG_DOG]
dog_command_link.id_command = json[Command.FLAG_COMMAND]
dog_command_link.id_understanding_level = json[Understanding_Level.FLAG_UNDERSTANDING_LEVEL]
dog_command_link.id_obedience_level = json[Obedience_Level.FLAG_OBEDIENCE_LEVEL]
dog_command_link.hand_signal_description = json[cls.FLAG_HAND_SIGNAL_DESCRIPTION]
dog_command_link.notes = json[cls.FLAG_NOTES]
dog_command_link.active = json[cls.FLAG_ACTIVE]
@@ -85,11 +81,9 @@ class Dog_Command_Link(SQLAlchemy_ABC, Base):
def to_json(self):
as_json = {
self.FLAG_DOG_COMMAND_LINK: self.id_dog_command_link
self.FLAG_DOG_COMMAND_LINK: self.id_link
, Dog.FLAG_DOG: self.id_dog
, Command.FLAG_COMMAND: self.id_command
, Understanding_Level.FLAG_UNDERSTANDING_LEVEL: self.id_understanding_level
, Obedience_Level.FLAG_OBEDIENCE_LEVEL: self.id_obedience_level
, self.FLAG_HAND_SIGNAL_DESCRIPTION: self.hand_signal_description
, self.FLAG_NOTES: self.notes
, self.FLAG_ACTIVE: self.active
@@ -102,11 +96,9 @@ class Dog_Command_Link(SQLAlchemy_ABC, Base):
def __repr__(self):
return f'''
{self.__class__.__name__}(
{self.FLAG_DOG_COMMAND_LINK}: {self.id_dog_command_link}
{Dog.FLAG_DOG}: {self.id_dog}
{Command.FLAG_COMMAND}: {self.id_command}
{Understanding_Level.FLAG_UNDERSTANDING_LEVEL}: {self.id_understanding_level}
{Obedience_Level.FLAG_OBEDIENCE_LEVEL}: {self.id_obedience_level}
{self.FLAG_DOG_COMMAND_LINK}: {self.id_link}
{Dog.FLAG_DOG}: {self.dog}
{Command.FLAG_COMMAND}: {self.command}
{self.FLAG_HAND_SIGNAL_DESCRIPTION}: {self.hand_signal_description}
{self.FLAG_NOTES}: {self.notes}
{self.FLAG_ACTIVE}: {self.active}
@@ -119,11 +111,9 @@ class Dog_Command_Link_Temp(db.Model, Base):
__tablename__ = 'DOG_Dog_Command_Link_Temp'
__table_args__ = { 'extend_existing': True }
id_temp = db.Column(db.Integer, primary_key=True)
id_dog_command_link = db.Column(db.Integer)
id_link = db.Column(db.Integer)
id_dog = db.Column(db.Integer)
id_command = db.Column(db.Integer)
id_understanding_level = db.Column(db.Integer)
id_obedience_level = db.Column(db.Integer)
hand_signal_description = db.Column(db.Text)
notes = db.Column(db.Text)
active = db.Column(db.Boolean)
@@ -137,13 +127,68 @@ class Dog_Command_Link_Temp(db.Model, Base):
def from_Dog_Command_Link(cls, dog_command_link):
_m = 'Dog_Command_Link_Temp.from_Dog_Command_Link'
temp = cls()
temp.id_dog_command_link = dog_command_link.id_dog_command_link
temp.id_link = dog_command_link.id_link
temp.id_dog = dog_command_link.id_dog
temp.id_command = dog_command_link.id_command
temp.id_understanding_level = dog_command_link.id_understanding_level
temp.id_obedience_level = dog_command_link.id_obedience_level
temp.hand_signal_description = dog_command_link.hand_signal_description
temp.notes = dog_command_link.notes
temp.active = dog_command_link.active
temp.created_on = dog_command_link.created_on
return temp
return temp
class Parameters_Dog_Command_Link(Get_Many_Parameters_Base):
get_all_dog: bool
get_inactive_dog: bool
ids_dog: str
get_all_command: bool
get_inactive_command: bool
ids_command: str
@classmethod
def get_default(cls):
return cls(
get_all_dog = True
, get_inactive_dog = False
, ids_dog = ''
, get_all_command = True
, get_inactive_command = False
, ids_command = ''
)
@classmethod
def from_json(cls, json):
return cls(
get_all_dog = json.get('a_get_all_dog', False)
, get_inactive_dog = json.get('a_get_inactive_dog', False)
, ids_dog = json.get('a_ids_dog', '')
, 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', '')
)
@classmethod
def from_form_filters_dog_command_link(cls, form):
av.val_instance(form, 'form', 'Parameters_Dog_Command_Link.from_form_filters_dog_command_link', Filters_Dog_Command_Link)
has_filter_dog = not (form.id_dog.data == '0' or form.id_dog.data == '' or form.id_dog.data is None)
has_filter_command = not (form.id_command.data == '0' or form.id_command.data == '' or form.id_command.data is None)
active_only = av.input_bool(form.active.data, "active", "Parameters_Dog_Command_Link.from_form_filters_dog_command_link")
return cls(
get_all_dog = not has_filter_dog
, get_inactive_dog = not active_only
, ids_dog = form.id_dog.data if has_filter_dog else ''
, get_all_command = not has_filter_command
, get_inactive_command = not active_only
, ids_command = form.id_command.data if has_filter_command else ''
)
def to_json(self):
return {
'a_get_all_dog': self.get_all_dog
, 'a_get_inactive_dog': self.get_inactive_dog
, 'a_ids_dog': self.ids_dog
, 'a_get_all_command': self.get_all_command
, 'a_get_inactive_command': self.get_inactive_command
, 'a_ids_command': self.ids_command
}

View File

@@ -8,11 +8,11 @@ Feature: Obedience Level Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.db_base import SQLAlchemy_ABC
import dog_training.lib.argument_validation as av
from dog_training.extensions import db
from dog_training.helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
@@ -35,16 +35,16 @@ class Obedience_Level(SQLAlchemy_ABC, Base):
self.id_obedience_level = 0
self.is_new = False
super().__init__()
def from_DB_Dog_Command(query_row):
_m = 'Obedience_Level.from_DB_Dog_Command'
"""
def from_db_dog_command_link(query_row):
_m = 'Obedience_Level.from_db_dog_command_link'
level = Obedience_Level()
level.id_obedience_level = query_row[5]
level.code = query_row[6]
level.name = query_row[7]
level.active = True
return level
"""
@classmethod
def from_json(cls, json):
_m = 'Obedience_Level.from_json'

View File

@@ -8,12 +8,12 @@ Feature: User Business Object
"""
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC
import lib.argument_validation as av
from forms.forms import Form_Contact
from extensions import db
from helpers.helper_app import Helper_App
from dog_training.business_objects.base import Base
from dog_training.business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
import dog_training.lib.argument_validation as av
from dog_training.extensions import db
from dog_training.forms.base import Form_Filters_User
from dog_training.helpers.helper_app import Helper_App
# external
from dataclasses import dataclass
from typing import ClassVar
@@ -23,7 +23,7 @@ class User(SQLAlchemy_ABC, Base):
NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_USER
NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'email'
__tablename__ = 'PH_User'
__tablename__ = 'DOG_User'
__table_args__ = { 'extend_existing': True }
id_user = db.Column(db.Integer, primary_key=True)
@@ -114,7 +114,7 @@ class User(SQLAlchemy_ABC, Base):
return (self.id_user > 0 and self.id_user != Base.ID_USER_GUEST)
class User_Temp(db.Model, Base):
__tablename__ = 'Shop_User_Temp'
__tablename__ = 'DOG_User_Temp'
__table_args__ = { 'extend_existing': True }
id_user = db.Column(db.Integer, primary_key=True)
id_user_auth0 = db.Column(db.String(250))
@@ -130,4 +130,100 @@ class User_Temp(db.Model, Base):
def __init__(self):
self.id_user = 0
super().__init__()
super().__init__()
class Parameters_User(Get_Many_Parameters_Base):
get_all_user: bool
get_inactive_user: bool
ids_user: str
ids_user_auth0: str
@staticmethod
def from_form(form):
av.val_instance(form, 'form', 'Parameters_User.from_form', Form_Filters_User)
get_inactive = av.input_bool(form.active.data, "active", "Parameters_User.from_form")
id_user = '' if form.id_user.data is None else form.id_user.data
return Parameters_User(
get_all_user = (id_user == ''),
get_inactive_user = get_inactive,
ids_user = id_user,
ids_user_auth0 = '',
)
@staticmethod
def from_user(user):
av.val_instance(user, 'user', 'Parameters_User.from_user', User)
return Parameters_User(
get_all_user = ((user.id_user is None or user.id_user == 0) and user.id_user_auth0 is None),
get_inactive_user = False,
ids_user = '' if user.id_user is None else str(user.id_user),
ids_user_auth0 = user.id_user_auth0,
)
@staticmethod
def get_default():
return Parameters_User(
get_all_user = False,
get_inactive_user = False,
ids_user = '',
ids_user_auth0 = ''
)
@classmethod
def from_json(self):
pass
def to_json(self):
return {
'a_get_all_user': self.get_all_user
, 'a_get_inactive_user': self.get_inactive_user
, 'a_ids_user': self.ids_user
, 'a_ids_user_auth0': self.ids_user_auth0
}
class User_Permission_Evaluation(db.Model):
__tablename__ = 'DOG_User_Permission_Evaluation'
__table_args__ = { 'extend_existing': True }
id_evaluation = db.Column(db.Integer, primary_key=True)
guid = db.Column(db.String(255))
id_user = db.Column(db.Integer)
id_permission_required = db.Column(db.Integer)
priority_access_level_required = db.Column(db.Integer)
id_product = db.Column(db.Integer)
is_super_user = db.Column(db.Boolean)
priority_access_level_user = db.Column(db.Integer)
can_view = db.Column(db.Boolean)
can_edit = db.Column(db.Boolean)
can_admin = db.Column(db.Boolean)
def from_DB_user_eval(query_row):
user_permission_evaluation = User_Permission_Evaluation()
user_permission_evaluation.id_evaluation = query_row[0]
user_permission_evaluation.guid = query_row[1]
user_permission_evaluation.id_user = query_row[2]
user_permission_evaluation.id_permission_required = query_row[3]
user_permission_evaluation.priority_access_level_required = query_row[4]
user_permission_evaluation.id_product = query_row[5]
user_permission_evaluation.is_super_user = query_row[6]
user_permission_evaluation.priority_access_level_user = query_row[7]
user_permission_evaluation.can_view = query_row[8]
user_permission_evaluation.can_edit = query_row[9]
user_permission_evaluation.can_admin = query_row[10]
return user_permission_evaluation
def __repr__(self):
return f'''
id_evaluation: {self.id_evaluation}
guid: {self.guid}
id_user: {self.id_user}
id_permission_required: {self.id_permission_required}
priority_access_level_required: {self.priority_access_level_required}
id_product: {self.id_product}
is_super_user: {self.is_super_user}
priority_access_level_user: {self.priority_access_level_user}
can_view: {self.can_view}
can_edit: {self.can_edit}
can_admin: {self.can_admin}
'''

View File

@@ -11,10 +11,9 @@ Business object for SQL errors returned by Get Many Stored Procedures
"""
# internal
from business_objects.base import Base
import lib.argument_validation as av
from lib import data_types
from forms.forms import Form_Basket_Add, Form_Basket_Edit # Form_Product
from dog_training.business_objects.base import Base
import dog_training.lib.argument_validation as av
from dog_training.lib import data_types
# external
from enum import Enum
from datetime import datetime, timedelta
@@ -49,7 +48,7 @@ class SQL_Error(db.Model):
super().__init__()
"""
def from_DB_record(record):
def from_db_record(record):
error = SQL_Error()
error.display_order = record[0]
error.id_type = record[1]