diff --git a/app.py b/app.py
index 7c6869d..8eb2306 100644
--- a/app.py
+++ b/app.py
@@ -17,11 +17,13 @@ Initializes the Flask application, sets the configuration based on the environme
# IMPORTS
# internal
from config import app_config, Config
-from controllers.core.contact import routes_core_contact
+from dog_training.controllers.dog.dog import routes_dog
+from dog_training.controllers.dog.dog_command_link import routes_dog_dog_command_link
from controllers.core.home import routes_core_home
from controllers.legal.legal import routes_legal
-from extensions import db, csrf, mail, oauth
-from helpers.helper_app import Helper_App
+from controllers.user.user import routes_user
+from dog_training.extensions import db, csrf, mail, oauth
+from dog_training.helpers.helper_app import Helper_App
# external
from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session
# from flask_appconfig import AppConfig
@@ -106,10 +108,13 @@ with app.app_context():
access_token_url = f'https://{app.config["DOMAIN_AUTH0"]}/oauth/token',
)
+ print(f"Registered clients: {list(oauth._clients.keys())}")
app.register_blueprint(routes_core_home)
-app.register_blueprint(routes_core_contact)
+app.register_blueprint(routes_dog)
+app.register_blueprint(routes_dog_dog_command_link)
app.register_blueprint(routes_legal)
+app.register_blueprint(routes_user)
diff --git a/business_objects/api.py b/business_objects/api.py
index 4f004b8..c5427a8 100644
--- a/business_objects/api.py
+++ b/business_objects/api.py
@@ -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
diff --git a/business_objects/base.py b/business_objects/base.py
index 061445d..fc912e7 100644
--- a/business_objects/base.py
+++ b/business_objects/base.py
@@ -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
diff --git a/business_objects/db_base.py b/business_objects/db_base.py
index f82a737..1306397 100644
--- a/business_objects/db_base.py
+++ b/business_objects/db_base.py
@@ -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
- }
\ No newline at end of file
+ }
+
+
+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()
\ No newline at end of file
diff --git a/business_objects/dog/DEPRECATED - access_level.py b/business_objects/dog/DEPRECATED - access_level.py
index d28a20a..8154e1d 100644
--- a/business_objects/dog/DEPRECATED - access_level.py
+++ b/business_objects/dog/DEPRECATED - access_level.py
@@ -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))
diff --git a/business_objects/dog/DEPRECATED - dog_command_link_container.py b/business_objects/dog/DEPRECATED - dog_command_link_container.py
new file mode 100644
index 0000000..7cd1a51
--- /dev/null
+++ b/business_objects/dog/DEPRECATED - dog_command_link_container.py
@@ -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)
+
\ No newline at end of file
diff --git a/business_objects/dog/understanding_level.py b/business_objects/dog/DEPRECATED - understanding_level.py
similarity index 89%
rename from business_objects/dog/understanding_level.py
rename to business_objects/dog/DEPRECATED - understanding_level.py
index 30167c1..f21ad26 100644
--- a/business_objects/dog/understanding_level.py
+++ b/business_objects/dog/DEPRECATED - understanding_level.py
@@ -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]
diff --git a/business_objects/dog/command.py b/business_objects/dog/command.py
index ade6bad..54602b5 100644
--- a/business_objects/dog/command.py
+++ b/business_objects/dog/command.py
@@ -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
\ No newline at end of file
+ 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
+ }
+
diff --git a/business_objects/dog/command_category.py b/business_objects/dog/command_category.py
index 4f90680..89bdd9e 100644
--- a/business_objects/dog/command_category.py
+++ b/business_objects/dog/command_category.py
@@ -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
diff --git a/business_objects/dog/dog.py b/business_objects/dog/dog.py
index e6a4c3b..470986a 100644
--- a/business_objects/dog/dog.py
+++ b/business_objects/dog/dog.py
@@ -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
+ }
+
diff --git a/business_objects/dog/dog_command_link.py b/business_objects/dog/dog_command_link.py
index 32f19d5..2e0268d 100644
--- a/business_objects/dog/dog_command_link.py
+++ b/business_objects/dog/dog_command_link.py
@@ -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
\ No newline at end of file
+ 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
+ }
+
diff --git a/business_objects/dog/obedience_level.py b/business_objects/dog/obedience_level.py
index df36aa8..0b12828 100644
--- a/business_objects/dog/obedience_level.py
+++ b/business_objects/dog/obedience_level.py
@@ -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'
diff --git a/business_objects/dog/user.py b/business_objects/dog/user.py
index 3f93c02..2799f2d 100644
--- a/business_objects/dog/user.py
+++ b/business_objects/dog/user.py
@@ -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__()
\ No newline at end of file
+ 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}
+ '''
diff --git a/business_objects/sql_error.py b/business_objects/sql_error.py
index 1b562b2..07788ab 100644
--- a/business_objects/sql_error.py
+++ b/business_objects/sql_error.py
@@ -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]
diff --git a/config.py b/config.py
index bfea46c..26551ca 100644
--- a/config.py
+++ b/config.py
@@ -37,9 +37,9 @@ class Config:
'pool_timeout': 30,
}
# Auth0
- SESSION_COOKIE_SECURE = True
+ SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
- SESSION_COOKIE_SAMESITE = 'Strict'
+ SESSION_COOKIE_SAMESITE = 'Lax'
REMEMBER_COOKIE_SECURE = True
WTF_CSRF_ENABLED = True
# WTF_CSRF_CHECK_DEFAULT = False # We'll check it manually for API routes
diff --git a/controllers/core/contact.py b/controllers/core/contact.py
deleted file mode 100644
index a715fc8..0000000
--- a/controllers/core/contact.py
+++ /dev/null
@@ -1,143 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: App Routing
-Feature: Core - Contact Routes
-
-Description:
-Contact Page Controller.
-"""
-
-# IMPORTS
-# internal
-from business_objects.api import API
-from business_objects.project_hub.command import Command
-from datastores.project_hub.datastore_command import DataStore_Command
-from forms.contact import Form_Contact
-from helpers.helper_app import Helper_App
-from models.model_view_contact import Model_View_Contact
-from models.model_view_contact_success import Model_View_Contact_Success
-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_core_contact = Blueprint('routes_core_contact', __name__)
-
-
-@routes_core_contact.route(Model_View_Contact.HASH_PAGE_CONTACT, methods=['GET'])
-def contact():
- try:
- form = Form_Contact()
- model = Model_View_Contact(form)
- html_body = render_template('pages/core/_contact.html', model = model)
- return html_body
- except Exception as e:
- return API.get_standard_response(
- success = False,
- status_code = 500,
- message = f"Error: {e}",
- data = None,
- errors = [str(e)],
- meta = None
- )
-
-@routes_core_contact.route(Model_View_Contact.HASH_GET_ALTCHA_CHALLENGE, methods=['GET'])
-def create_altcha_challenge():
- options = ChallengeOptions(
- expires = datetime.datetime.now() + datetime.timedelta(hours=1),
- max_number = 100000, # The maximum random number
- hmac_key = current_app.app_config.ALTCHA_SECRET_KEY,
- )
- challenge = create_challenge(options)
- Helper_App.console_log(f"Challenge created: {challenge}")
- # return jsonify({"challenge": challenge})
- return jsonify({
- "algorithm": challenge.algorithm,
- "challenge": challenge.challenge,
- "salt": challenge.salt,
- "signature": challenge.signature,
- })
-
-@routes_core_contact.route(Model_View_Contact.HASH_PAGE_CONTACT, methods=['POST'])
-def contact_post():
- try:
- form = Form_Contact()
- if form.validate_on_submit():
- try:
- email = form.email.data
- # CC = form.CC.data # not in use
- contact_name = form.contact_name.data
- company_name = form.company_name.data
- message = form.message.data
- receive_marketing = form.receive_marketing.data
- receive_marketing_text = "I would like to receive marketing emails.\n" if receive_marketing else ""
- # send email
- mailItem = Message("PARTS Website Contact Us Message", recipients=[current_app.config['MAIL_CONTACT_PUBLIC']])
- mailItem.body = f"Dear Lord Edward Middleton-Smith,\n\n{message}\n{receive_marketing_text}\nKind regards,\n{contact_name}\n{company_name}\n{email}"
- mail.send(mailItem)
- # save to database
- datastore = DataStore_Command()
- command = Command.from_json(form.to_json())
- datastore.save_commands(
- comment = command.message
- , commands = [command]
- )
- return redirect(url_for(Model_View_Contact.ENDPOINT_PAGE_CONTACT_SUCCESS))
- except Exception as e:
- return API.get_standard_response(
- success = False,
- status_code = 500,
- message = f"Error: {e}",
- data = None,
- errors = [str(e)],
- meta = None
- )
- return API.get_standard_response(
- success = False,
- status_code = 500,
- message = f"Error: {form.errors}",
- data = None,
- errors = [str(form.errors)],
- meta = None
- )
- # html_body = render_template('pages/core/_contact.html', model = model)
- except Exception as e:
- return API.get_standard_response(
- success = False,
- status_code = 500,
- message = f"Error: {e}",
- data = None,
- errors = [str(e)],
- meta = None
- )
-
-@routes_core_contact.route(Model_View_Contact.HASH_PAGE_CONTACT_SUCCESS, methods=['GET'])
-def contact_success():
- try:
- model = Model_View_Contact_Success()
- html_body = render_template('pages/core/_contact_success.html', model = model)
- return html_body
- except Exception as e:
- return API.get_standard_response(
- success = False,
- status_code = 500,
- message = f"Error: {e}",
- data = None,
- errors = [str(e)],
- meta = None
- )
diff --git a/controllers/core/home.py b/controllers/core/home.py
index f299424..e2a7afa 100644
--- a/controllers/core/home.py
+++ b/controllers/core/home.py
@@ -11,8 +11,8 @@ Home Page Controller.
"""
# internal
-from business_objects.api import API
-from models.model_view_home import Model_View_Home
+from dog_training.business_objects.api import API
+from dog_training.models.model_view_home import Model_View_Home
# external
from flask import render_template, jsonify, Blueprint
diff --git a/static/MySQL/7204_p_dog_test_get_many_command.sql b/controllers/dog/__init__.py
similarity index 100%
rename from static/MySQL/7204_p_dog_test_get_many_command.sql
rename to controllers/dog/__init__.py
diff --git a/controllers/dog/dog.py b/controllers/dog/dog.py
new file mode 100644
index 0000000..c6ebe55
--- /dev/null
+++ b/controllers/dog/dog.py
@@ -0,0 +1,48 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: App Routing
+Feature: Core - Contact Routes
+
+Description:
+Contact Page Controller.
+"""
+
+# IMPORTS
+# internal
+from dog_training.business_objects.api import API
+from dog_training.business_objects.dog.command import Command
+from dog_training.business_objects.dog.dog_command_link import Dog_Command_Link
+from dog_training.datastores.datastore_dog import DataStore_Dog
+from dog_training.forms.dog.dog_command_link import Filters_Dog_Command_Link
+from dog_training.helpers.helper_app import Helper_App
+from dog_training.models.model_view_dog_base import Model_View_Dog_Base
+from dog_training.models.model_view_home import Model_View_Home
+import dog_training.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, Response
+from flask_mail import Mail, Message
+from dog_training.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 = Blueprint('routes_dog', __name__)
+
+
+@routes_dog.route(Model_View_Dog_Base.HASH_DOG_SCRIPTS_SHARED, methods=['GET'])
+def scripts_section_dog():
+ hash_page_current = request.args.get('hash_page_current', default = Model_View_Dog_Base.HASH_SCRIPTS_SECTION_STORE, type = str)
+ model = Model_View_Dog_Base(hash_page_current=hash_page_current)
+ template = render_template('js/sections/dog.js', model = model)
+ return Response(template, mimetype='application/javascript')
\ No newline at end of file
diff --git a/controllers/dog/dog_command_link.py b/controllers/dog/dog_command_link.py
new file mode 100644
index 0000000..0f2f56e
--- /dev/null
+++ b/controllers/dog/dog_command_link.py
@@ -0,0 +1,99 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: App Routing
+Feature: Core - Contact Routes
+
+Description:
+Contact Page Controller.
+"""
+
+# IMPORTS
+# internal
+from dog_training.business_objects.api import API
+from dog_training.business_objects.dog.command import Command
+from dog_training.business_objects.dog.dog_command_link import Dog_Command_Link
+from dog_training.datastores.datastore_dog import DataStore_Dog
+from dog_training.forms.dog.dog_command_link import Filters_Dog_Command_Link
+from dog_training.helpers.helper_app import Helper_App
+from dog_training.models.model_view_dog_dog_command_link import Model_View_Dog_Dog_Command_Link
+from dog_training.models.model_view_home import Model_View_Home
+import dog_training.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 dog_training.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_dog_command_link = Blueprint('routes_dog_dog_command_link', __name__)
+
+
+@routes_dog_dog_command_link.route(Model_View_Dog_Dog_Command_Link.HASH_PAGE_DOG_DOG_COMMAND_LINKS, methods=['GET'])
+def dog_command_links():
+ Helper_App.console_log('dog_command_links')
+ Helper_App.console_log(f'request_args: {request.args}')
+ try:
+ form_filters = Filters_Dog_Command_Link.from_json(request.args)
+ except Exception as e:
+ Helper_App.console_log(f'Error: {e}')
+ form_filters = Filters_Dog_Command_Link()
+ Helper_App.console_log(f'form_filters={form_filters}')
+ model = Model_View_Dog_Dog_Command_Link(form_filters_old = form_filters)
+ if not model.is_user_logged_in:
+ return redirect(url_for('routes_core_home.home'))
+ return render_template('pages/dog/_dog_command_links.html', model = model)
+
+"""
+@routes_dog_dog_command_link.route(Model_View_Dog_Dog_Command_Link.HASH_SAVE_DOG_DOG_COMMAND_LINK, methods=['POST'])
+def save_category():
+ data = Helper_App.get_request_data(request)
+ try:
+ form_filters = Filters_Dog_Command_Link.from_json(data[Model_View_Dog_Dog_Command_Link.FLAG_FORM_FILTERS])
+ if not form_filters.validate_on_submit():
+ return jsonify({
+ Model_View_Dog_Dog_Command_Link.FLAG_STATUS: Model_View_Dog_Dog_Command_Link.FLAG_FAILURE,
+ Model_View_Dog_Dog_Command_Link.FLAG_MESSAGE: f'Filters form invalid.\n{form_filters.errors}'
+ })
+
+ dog_command_links = data[Model_View_Dog_Dog_Command_Link.FLAG_PRODUCT_CATEGORY]
+ if len(dog_command_links) == 0:
+ return jsonify({
+ Model_View_Dog_Dog_Command_Link.FLAG_STATUS: Model_View_Dog_Dog_Command_Link.FLAG_FAILURE,
+ Model_View_Dog_Dog_Command_Link.FLAG_MESSAGE: f'No dog command links.'
+ })
+ objs_dog_command_link = []
+ for dog_command_link in dog_command_links:
+ objs_dog_command_link.append(Dog_Command_Link.from_json(dog_command_link))
+ Helper_App.console_log(f'objs_dog_command_link={objs_dog_command_link}')
+ errors = Model_View_Dog_Dog_Command_Link.save_dog_command_links(data.get('comment', 'No comment'), objs_dog_command_link)
+
+ model_return = Model_View_Dog_Dog_Command_Link(form_filters_old=form_filters)
+ if not model_return.is_user_logged_in:
+ raise Exception('User not logged in')
+ if (len(errors) > 0):
+ return jsonify({
+ Model_View_Dog_Dog_Command_Link.FLAG_STATUS: Model_View_Dog_Dog_Command_Link.FLAG_FAILURE,
+ Model_View_Dog_Dog_Command_Link.FLAG_MESSAGE: f'Error saving dog command links.\n{model_return.convert_list_objects_to_json(errors)}'
+ })
+ return jsonify({
+ Model_View_Dog_Dog_Command_Link.FLAG_STATUS: Model_View_Dog_Dog_Command_Link.FLAG_SUCCESS,
+ Model_View_Dog_Dog_Command_Link.FLAG_DATA: model_return.category_list.to_json()
+ })
+ except Exception as e:
+ return jsonify({
+ Model_View_Dog_Dog_Command_Link.FLAG_STATUS: Model_View_Dog_Dog_Command_Link.FLAG_FAILURE,
+ Model_View_Dog_Dog_Command_Link.FLAG_MESSAGE: f'Bad data received by controller.\n{e}'
+ })
+"""
\ No newline at end of file
diff --git a/controllers/legal/legal.py b/controllers/legal/legal.py
index 4161312..c072fa1 100644
--- a/controllers/legal/legal.py
+++ b/controllers/legal/legal.py
@@ -12,13 +12,13 @@ Legal Section Controller.
# IMPORTS
# internal
-# from models.model_view_home import Model_View_Home
-from models.model_view_license import Model_View_License
-from models.model_view_privacy_policy import Model_View_Privacy_Policy
-from models.model_view_accessibility_report import Model_View_Accessibility_Report
-from models.model_view_accessibility_statement import Model_View_Accessibility_Statement
-from models.model_view_retention_schedule import Model_View_Retention_Schedule
-import lib.argument_validation as av
+# from dog_training.models.model_view_home import Model_View_Home
+from dog_training.models.model_view_license import Model_View_License
+from dog_training.models.model_view_privacy_policy import Model_View_Privacy_Policy
+from dog_training.models.model_view_accessibility_report import Model_View_Accessibility_Report
+from dog_training.models.model_view_accessibility_statement import Model_View_Accessibility_Statement
+from dog_training.models.model_view_retention_schedule import Model_View_Retention_Schedule
+import dog_training.lib.argument_validation as av
# external
from flask import render_template, Blueprint
diff --git a/controllers/user/user.py b/controllers/user/user.py
new file mode 100644
index 0000000..5dd3415
--- /dev/null
+++ b/controllers/user/user.py
@@ -0,0 +1,211 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: App Routing
+Feature: User Routes
+
+Description:
+Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles.
+"""
+
+# IMPORTS
+# internal
+from models.model_view_base import Model_View_Base
+from models.model_view_user import Model_View_User
+from business_objects.dog.user import User, Parameters_User
+from datastores.datastore_user import DataStore_User
+from helpers.helper_app import Helper_App
+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
+from flask_sqlalchemy import SQLAlchemy
+from sqlalchemy import exc
+from flask_wtf.csrf import generate_csrf
+from werkzeug.exceptions import BadRequest
+from extensions import oauth # db,
+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
+from functools import wraps
+
+db = SQLAlchemy()
+
+routes_user = Blueprint('routes_user', __name__)
+
+def handle_db_disconnect(f):
+ @wraps(f)
+ def decorated_function(*args, **kwargs):
+ try:
+ return f(*args, **kwargs)
+ except exc.OperationalError as e:
+ if "MySQL server has gone away" in str(e):
+ # Close the session and create a new connection
+ db.session.remove()
+ db.session.rollback()
+ # Retry the operation
+ return f(*args, **kwargs)
+ raise
+ return decorated_function
+
+# User authentication
+@routes_user.route("/login", methods=['POST', 'OPTIONS']) # required endpoint for Auth0
+def login():
+ oauth = current_app.extensions['authlib.integrations.flask_client']
+ try:
+ Helper_App.console_log('login')
+ Helper_App.console_log(f'method={request.method}')
+ try:
+ data = request.json
+ try:
+ data = request.get_json()
+ except:
+ data = {}
+ except:
+ data = {}
+ Helper_App.console_log(f'data={data}')
+ hash_callback = data.get(Model_View_Base.FLAG_CALLBACK, Model_View_Base.HASH_PAGE_HOME)
+ Helper_App.console_log(f'hash_callback: {hash_callback}')
+
+ """
+ # Verify CSRF token manually
+ Helper_App.console_log(f'request headers={request.headers}')
+ token = request.headers.get(Model_View_Base.FLAG_CSRF_TOKEN)
+ Helper_App.console_log(f'token={token}')
+ Helper_App.console_log(f'session={session}')
+ Helper_App.console_log(f'session token={session.get('csrf_token')}')
+ if not token or token != session.get('csrf_token'):
+ token = data.get(Model_View_Base.FLAG_CSRF_TOKEN, None)
+ Helper_App.console_log(f'token={token}')
+ if not token or token != session.get('csrf_token'):
+ raise BadRequest('Invalid or missing CSRF token')
+ """
+ # OAuth login
+ # callback_login = F'{Model_View_Base.HASH_CALLBACK_LOGIN}{data.get(Model_View_Base.FLAG_CALLBACK, Model_View_Base.HASH_PAGE_HOME)}'
+
+ # encoded_path = quote(data.get(Model_View_Base.FLAG_CALLBACK, Model_View_Base.HASH_PAGE_HOME))
+ uri_redirect = url_for('routes_user.login_callback', _external=True) # , subpath=encoded_path
+
+ # uri_redirect = f'{current_app.URL_HOST}/login_callback?subpath={data.get(Model_View_Base.FLAG_CALLBACK, Model_View_Base.HASH_PAGE_HOME)}'
+ Helper_App.console_log(f'redirect uri: {uri_redirect}')
+
+ Helper_App.console_log(f'Before red')
+ Helper_App.console_log(f"Registered clients: {list(oauth._clients.keys())}")
+ try:
+ with current_app.app_context():
+ red = oauth.auth0.authorize_redirect(
+ redirect_uri = uri_redirect
+ , state = quote(hash_callback)
+ )
+ except Exception as e:
+ Helper_App.console_log(f"Error: {str(e)}")
+ Helper_App.console_log(f'redirect: {red}')
+ headers = red.headers['Location']
+ Helper_App.console_log(f'headers: {headers}')
+ parsed_url = urlparse(headers)
+ query_params = parse_qs(parsed_url.query)
+ Helper_App.console_log(f"""
+ OAuth Authorize Redirect URL:
+
+ Base URL: {parsed_url.scheme}://{parsed_url.netloc}{parsed_url.path}
+ {parsed_url}
+
+ Query Parameters: {query_params}
+ """)
+ return jsonify({'Success': True, Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_SUCCESS, f'{Model_View_Base.FLAG_CALLBACK}': headers})
+
+ return jsonify({'status': 'success', 'redirect': callback})
+ except Exception as e:
+ return jsonify({'status': 'error', 'message': str(e)}), 400
+
+
+@routes_user.route("/login_callback")
+@handle_db_disconnect
+def login_callback():
+ oauth = current_app.extensions['authlib.integrations.flask_client']
+ Helper_App.console_log('login_callback')
+ try:
+ Helper_App.console_log(f'Redceived state: {request.args.get("state")}')
+ error_state = request.args.get(Model_View_User.FLAG_ERROR_OAUTH)
+ has_error = error_state is not None
+ if has_error:
+ error_description = request.args.get(Model_View_User.FLAG_ERROR_DESCRIPTION_OAUTH)
+ error_text = f'Error: {error_state}: {error_description}'
+ Helper_App.console_log(error_text)
+ return login()
+ token = None
+ try:
+ token = oauth.auth0.authorize_access_token()
+ except Exception as e:
+ Helper_App.console_log(f"Error: {str(e)}")
+ session[current_app.config['ID_TOKEN_USER']] = token
+ user = User.from_json_auth0(token)
+ Helper_App.console_log(f'user: {user}')
+ filters = Parameters_User.from_user(user)
+ datastore_user = DataStore_User()
+ users, errors = datastore_user.get_many_user(filters, user)
+ try:
+ user = users[0]
+ Helper_App.console_log('User logged in')
+ Helper_App.console_log(f'user ({str(type(user))}): {user}')
+ Helper_App.console_log(f'user key: {Model_View_Base.FLAG_USER}')
+ user_json = user.to_json()
+ session[Model_View_Base.FLAG_USER] = user_json
+ Helper_App.console_log(f'user stored on session')
+ except:
+ Helper_App.console_log(f'User not found: {Parameters_User}\nDatabase query error: {errors}')
+
+ try:
+ hash_callback = token.get('hash_callback')
+ if hash_callback is None:
+ Helper_App.console_log('hash is none')
+ state = request.args.get('state')
+ Helper_App.console_log(f'state: {state}')
+ hash_callback = state
+ Helper_App.console_log(f'hash_callback: {hash_callback}')
+ except:
+ Helper_App.console_log("get hash callback failed")
+
+ Helper_App.console_log(f'user session: {session[Model_View_Base.FLAG_USER]}')
+ return redirect(f"{current_app.config['URL_HOST']}{hash_callback}")
+ except Exception as e:
+ return jsonify({Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_FAILURE, Model_View_Base.FLAG_MESSAGE: f'Controller error.\n{e}'})
+
+@routes_user.route("/logout")
+def logout():
+ session.clear()
+ url_logout = f"https://{current_app.config['DOMAIN_AUTH0']}/v2/logout?" + urlencode(
+ {
+ "returnTo": url_for("routes_user.logout_callback", _external=True),
+ "client_id": current_app.config['ID_AUTH0_CLIENT'],
+ }
+ )
+ Helper_App.console_log(f"Redirecting to {url_logout}")
+ return redirect(url_logout)
+
+@routes_user.route("/logout_callback")
+@handle_db_disconnect
+def logout_callback():
+ return redirect(url_for('routes_core_home.home'))
+
+@routes_user.route("/account")
+def user():
+ try:
+ model = Model_View_User()
+ for currency in model.currencies:
+ if currency.id_currency == model.user.id_currency_default:
+ model.user.currency_default = currency
+ break
+ for region in model.regions:
+ if region.id_region == model.user.id_region_default:
+ model.user.region_default = region
+ break
+ model.users = [model.user]
+ if not model.is_user_logged_in:
+ return redirect(url_for('routes_core_home.home'))
+ html_body = render_template('pages/user/_user.html', model = model)
+ except Exception as e:
+ return str(e)
+ return html_body
diff --git a/datastores/datastore_base.py b/datastores/datastore_base.py
index bf9f57f..912af5f 100644
--- a/datastores/datastore_base.py
+++ b/datastores/datastore_base.py
@@ -12,15 +12,13 @@ Datastore for Store
# internal
# from routes import bp_home
-import lib.argument_validation as av
-from business_objects.sql_error import SQL_Error
-from business_objects.project_hub.user import User
-# from helpers.helper_db_mysql import Helper_DB_MySQL
-# from models.model_view_store_checkout import Model_View_Store_Checkout # circular!
-from extensions import db
-from forms.access_level import Filters_Access_Level
-from forms.unit_measurement import Filters_Unit_Measurement
-from helpers.helper_app import Helper_App
+import dog_training.lib.argument_validation as av
+from dog_training.business_objects.sql_error import SQL_Error
+from dog_training.business_objects.dog.user import User
+# from dog_training.helpers.helper_db_mysql import Helper_DB_MySQL
+# from dog_training.models.model_view_store_checkout import Model_View_Store_Checkout # circular!
+from dog_training.extensions import db
+from dog_training.helpers.helper_app import Helper_App
# external
from sqlalchemy import text
from flask import Flask, session, current_app
diff --git a/datastores/datastore_dog.py b/datastores/datastore_dog.py
new file mode 100644
index 0000000..a432d14
--- /dev/null
+++ b/datastores/datastore_dog.py
@@ -0,0 +1,201 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: DataStores
+Feature: User DataStore
+
+Description:
+Datastore for Users
+"""
+
+# internal
+# from routes import bp_home
+import dog_training.lib.argument_validation as av
+from dog_training.business_objects.dog.command import Command, Command_Temp
+from dog_training.business_objects.dog.dog import Dog
+from dog_training.business_objects.dog.dog_command_link import Dog_Command_Link
+from dog_training.business_objects.sql_error import SQL_Error
+from dog_training.datastores.datastore_base import DataStore_Base
+from dog_training.helpers.helper_app import Helper_App
+from dog_training.helpers.helper_db_mysql import Helper_DB_MySQL
+# from dog_training.models.model_view_store_checkout import Model_View_Store_Checkout # circular!
+from dog_training.extensions import db
+# external
+from flask_sqlalchemy import SQLAlchemy
+from datetime import datetime
+
+db = SQLAlchemy()
+
+
+class DataStore_Dog(DataStore_Base):
+
+ def __init__(self):
+ super().__init__()
+
+ @classmethod
+ def get_many_dog(cls, filters_dog):
+ _m = f'{cls.__qualname__}.get_many_dog'
+ user = cls.get_user_session()
+ argument_dict = {
+ 'a_id_user': user.id_user
+ , 'a_get_all_dog': filters_dog.get_all_dog
+ , 'a_get_inactive_dog': filters_dog.get_inactive_dog
+ , 'a_ids_dog': filters_dog.ids_dog
+ , 'a_names_dog': filters_dog.names_dog
+ , 'a_debug': 0
+ }
+ Helper_App.console_log(f'argument_dict: {argument_dict}')
+ result = cls.db_procedure_execute('p_dog_get_many_dog', argument_dict)
+ cursor = result.cursor
+
+ # Dogs
+ result_set_1 = cursor.fetchall()
+ Helper_App.console_log(f'raw dogs: {result_set_1}')
+ dogs = []
+ dog_indexes = {}
+ for row in result_set_1:
+ new_dog = Dog.from_db_dog(row)
+ dog_indexes[new_dog.id_dog] = len(dogs)
+ dogs.append(new_dog)
+
+ # 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 dogs, errors
+
+ @classmethod
+ def get_many_command(cls, filters_command):
+ _m = f'{cls.__qualname__}.get_many_command'
+ user = cls.get_user_session()
+ argument_dict = {
+ 'a_id_user': user.id_user
+ , 'a_get_all_command': filters_command.get_all_command
+ , 'a_get_inactive_command': filters_command.get_inactive_command
+ , 'a_ids_command': filters_command.ids_command
+ , 'a_names_command': filters_command.names_command
+ , 'a_debug': 0
+ }
+ Helper_App.console_log(f'argument_dict: {argument_dict}')
+ result = cls.db_procedure_execute('p_dog_get_many_command', argument_dict)
+ cursor = result.cursor
+
+ # Commands
+ result_set_1 = cursor.fetchall()
+ Helper_App.console_log(f'raw commands: {result_set_1}')
+ commands = []
+ command_indexes = {}
+ for row in result_set_1:
+ new_command = Command.from_db_command(row)
+ command_indexes[new_command.id_command] = len(commands)
+ commands.append(new_command)
+
+ # 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 commands, errors
+
+ @classmethod
+ def get_many_dog_command_link(cls, filters_dog_command_link):
+ _m = f'{cls.__qualname__}.get_many_dog_command_link'
+ user = cls.get_user_session()
+ argument_dict = {
+ 'a_id_user': user.id_user
+ , 'a_get_all_dog': filters_dog_command_link.get_all_dog
+ , 'a_get_inactive_dog': filters_dog_command_link.get_inactive_dog
+ , 'a_ids_dog': filters_dog_command_link.ids_dog
+ , 'a_get_all_command': filters_dog_command_link.get_all_command
+ , 'a_get_inactive_command': filters_dog_command_link.get_inactive_command
+ , 'a_ids_command': filters_dog_command_link.ids_command
+ , 'a_debug': 0
+ }
+ Helper_App.console_log(f'argument_dict: {argument_dict}')
+ result = cls.db_procedure_execute('p_dog_get_many_dog_command_link', argument_dict)
+ cursor = result.cursor
+
+ # Dog Command Links
+ result_set_1 = cursor.fetchall()
+ Helper_App.console_log(f'raw dog command links: {result_set_1}')
+ dog_command_links = []
+ dog_command_link_indexes = {}
+ for row in result_set_1:
+ new_dog_command_link = Dog_Command_Link.from_db_dog_command_link(row)
+ dog_command_link_indexes[new_dog_command_link.id_link] = len(dog_command_links)
+ dog_command_links.append(new_dog_command_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 dog_command_links, errors
+
+ @classmethod
+ def save_commands(cls, comment, commands):
+ _m = f'{cls}.save_commands'
+ av.val_str(comment, 'comment', _m)
+
+ guid = Helper_DB_MySQL.create_guid_str()
+ now = datetime.now()
+ user = cls.get_user_session()
+
+ Helper_App.console_log(f'saving commands: {commands}')
+
+ rows = []
+ for command in commands:
+ row = Command_Temp.from_command(command)
+ row.guid = guid
+ rows.append(row)
+
+ cls.upload_bulk(Command_Temp.__tablename__, rows, 1000)
+
+ Helper_App.console_log('Commands uploaded')
+
+ argument_dict_list = {
+ 'a_comment': comment,
+ 'a_guid': guid,
+ 'a_id_user': user.id_user,
+ 'a_debug': 0
+ }
+ result = cls.db_procedure_execute('p_dog_save_command', argument_dict_list)
+
+ Helper_App.console_log('Commands saved')
+
+ # Errors
+ cursor = result.cursor
+ cursor.nextset()
+ result_set_e = cursor.fetchall()
+ 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 errors
diff --git a/datastores/datastore_user.py b/datastores/datastore_user.py
new file mode 100644
index 0000000..0d5cf78
--- /dev/null
+++ b/datastores/datastore_user.py
@@ -0,0 +1,119 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: DataStores
+Feature: User DataStore
+
+Description:
+Datastore for Users
+"""
+
+# internal
+# from routes import bp_home
+import lib.argument_validation as av
+from business_objects.sql_error import SQL_Error
+from business_objects.dog.user import User, Parameters_User, User_Permission_Evaluation
+from datastores.datastore_base import DataStore_Base
+from helpers.helper_app import Helper_App
+from helpers.helper_db_mysql import Helper_DB_MySQL
+# from models.model_view_store_checkout import Model_View_Store_Checkout # circular!
+from extensions import db
+# external
+# from abc import ABC, abstractmethod, abstractproperty
+from flask_sqlalchemy import SQLAlchemy
+from sqlalchemy import text
+import stripe
+import os
+from flask import Flask, session, current_app
+from pydantic import BaseModel, ConfigDict
+from typing import ClassVar
+from datetime import datetime
+
+db = SQLAlchemy()
+
+
+class DataStore_User(DataStore_Base):
+ def __init__(self):
+ super().__init__()
+
+ def edit_user(self):
+ _m = 'DataStore_User.edit_user'
+
+ # guid = Helper_DB_MySQL.create_guid()
+ argument_dict_list = {
+ 'a_id_user': self.info_user.get('sub'),
+ 'a_name': self.info_user.get('name'),
+ 'a_email': self.info_user.get('email'),
+ 'a_email_verified': 1 if self.info_user.get('email_verified') == 'True' else 0
+ }
+
+ result = self.db_procedure_execute('p_dog_save_user', argument_dict_list)
+ cursor = result.cursor
+
+ result_set_1 = cursor.fetchall()
+ Helper_App.console_log(f'raw user data: {result_set_1}')
+
+ # Errors
+ cursor.nextset()
+ result_set_e = cursor.fetchall()
+ Helper_App.console_log(f'raw errors: {result_set_e}')
+ 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}")
+
+ DataStore_User.db_cursor_clear(cursor)
+
+ return (result_set_1[0][1] == b'\x01')
+
+ def get_many_user(self, user_filters, user=None):
+ _m = 'DataStore_User.get_many_user'
+ Helper_App.console_log(_m)
+ Helper_App.console_log(f'user_filters: {user_filters}')
+ Helper_App.console_log(f"valid user_filters: {av.val_instance(user_filters, 'user_filters', _m, Parameters_User)}")
+
+ # guid = Helper_DB_MySQL.create_guid()
+
+ Helper_App.console_log(f'user: {user}')
+ if user is None:
+ user = self.get_user_session()
+ Helper_App.console_log(f'user: {user}')
+ argument_dict_list = {
+ 'a_id_user': user.id_user
+ , 'a_id_user_auth0': user.id_user_auth0
+ , **user_filters.to_json()
+ , 'a_debug': 0
+
+ }
+ Helper_App.console_log(f'argument_dict_list: {argument_dict_list}')
+ result = self.db_procedure_execute('p_dog_get_many_user', argument_dict_list)
+ cursor = result.cursor
+ result_set = cursor.fetchall()
+ Helper_App.console_log(f'raw users: {result_set}')
+ Helper_App.console_log(f'type result set: {str(type(result_set))}')
+ Helper_App.console_log(f'len result set: {len(result_set)}')
+ users = []
+ if len(result_set) > 0:
+ for row in result_set:
+ Helper_App.console_log(f'row: {row}')
+ user = User.from_DB_user(row)
+ users.append(user)
+ Helper_App.console_log(f'user {str(type(user))}: {user}')
+ Helper_App.console_log(f'type users: {str(type(users))}\n type user 0: {str(type(None if len(users) == 0 else users[0]))}')
+ """
+ errors = []
+ cursor.nextset()
+ result_set_e = cursor.fetchall()
+ Helper_App.console_log(f'raw errors: {result_set_e}')
+ 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}")
+ """
+ errors = None
+ DataStore_User.db_cursor_clear(cursor)
+
+ return users, errors
+
diff --git a/datastores/project_hub/datastore_contact_form.py b/datastores/project_hub/datastore_contact_form.py
deleted file mode 100644
index 5e85411..0000000
--- a/datastores/project_hub/datastore_contact_form.py
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: DataStores
-Feature: User DataStore
-
-Description:
-Datastore for Users
-"""
-
-# internal
-# from routes import bp_home
-import lib.argument_validation as av
-from business_objects.sql_error import SQL_Error
-from business_objects.project_hub.command import Command, Command_Temp
-from datastores.datastore_base import DataStore_Base
-from helpers.helper_app import Helper_App
-from helpers.helper_db_mysql import Helper_DB_MySQL
-# from models.model_view_store_checkout import Model_View_Store_Checkout # circular!
-from extensions import db
-# external
-from flask_sqlalchemy import SQLAlchemy
-from datetime import datetime
-
-db = SQLAlchemy()
-
-
-class DataStore_Command(DataStore_Base):
-
- def __init__(self):
- super().__init__()
-
- @classmethod
- def get_many_command(cls):
- _m = f'{cls.__qualname__}.get_many_command'
- user = cls.get_user_session()
- argument_dict = {
- 'a_id_user': user.id_user
- , 'a_debug': 0
- }
- Helper_App.console_log(f'argument_dict: {argument_dict}')
- result = cls.db_procedure_execute('p_ph_get_many_command', argument_dict)
- cursor = result.cursor
-
- # Commands
- result_set_1 = cursor.fetchall()
- Helper_App.console_log(f'raw commands: {result_set_1}')
- commands = []
- command_indexes = {}
- for row in result_set_1:
- new_command = Command.from_DB_command(row)
- command_indexes[new_command.id_command] = len(commands)
- commands.append(new_command)
-
- # 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 commands, errors
-
- @classmethod
- def save_commands(cls, comment, commands):
- _m = f'{cls}.save_commands'
- av.val_str(comment, 'comment', _m)
-
- guid = Helper_DB_MySQL.create_guid_str()
- now = datetime.now()
- user = cls.get_user_session()
-
- Helper_App.console_log(f'saving commands: {commands}')
-
- rows = []
- for command in commands:
- row = Command_Temp.from_command(command)
- row.guid = guid
- rows.append(row)
-
- cls.upload_bulk(Command_Temp.__tablename__, rows, 1000)
-
- Helper_App.console_log('Commands uploaded')
-
- argument_dict_list = {
- 'a_comment': comment,
- 'a_guid': guid,
- 'a_id_user': user.id_user,
- 'a_debug': 0
- }
- result = cls.db_procedure_execute('p_ph_save_command', argument_dict_list)
-
- Helper_App.console_log('Commands saved')
-
- # Errors
- cursor = result.cursor
- cursor.nextset()
- result_set_e = cursor.fetchall()
- 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 errors
diff --git a/forms/access_level.py b/forms/access_level.py
deleted file mode 100644
index 5fd6f2f..0000000
--- a/forms/access_level.py
+++ /dev/null
@@ -1,37 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: Backend
-Feature: Forms - Access Level Filters data input
-
-Description:
-Defines Flask-WTF forms for handling access level filter input.
-"""
-
-# internal
-from business_objects.base import Base
-from forms.base import Form_Base
-import lib.argument_validation as av
-# external
-from flask_wtf import FlaskForm
-from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField
-from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional
-from flask_wtf.recaptcha import RecaptchaField
-from abc import ABCMeta, abstractmethod
-
-
-class Filters_Access_Level(Form_Base):
- active = BooleanField("Active only?", default = True)
- def __repr__(self):
- return f'{self.__class__.__name__}(active={self.active.data})'
- @classmethod
- def from_json(cls, json):
- form = Filters_Access_Level()
- form.active.data = av.input_bool(json[Base.FLAG_ACTIVE], Base.FLAG_ACTIVE, f'{cls.__name__}.from_json')
- return form
- def to_json(self):
- return {
- Base.FLAG_ACTIVE: 1 if av.input_bool(self.active.data, Base.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') else 0,
- }
\ No newline at end of file
diff --git a/forms/base.py b/forms/base.py
index 567803a..03a8867 100644
--- a/forms/base.py
+++ b/forms/base.py
@@ -11,9 +11,12 @@ Defines Flask-WTF base forms for handling user input.
"""
# internal
+from dog_training.helpers.helper_app import Helper_App
# external
from flask_wtf import FlaskForm
from abc import ABCMeta, abstractmethod
+from wtforms import SelectField, BooleanField, SubmitField
+from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional
class Form_Base_Meta(type(FlaskForm), ABCMeta):
@@ -21,45 +24,30 @@ class Form_Base_Meta(type(FlaskForm), ABCMeta):
class Form_Base(FlaskForm, metaclass=Form_Base_Meta):
- """
@classmethod
@abstractmethod
- def from_filters(cls, filters):
- pass
- @abstractmethod
- def __repr__(self):
- pass
- """
+ def from_json(cls, json):
+ Helper_App.console_log(f'Error: Parent classes of {cls.__qualname__} must define cls.from_json')
+
+ @classmethod
+ def get_default(cls):
+ return cls()
+ @classmethod
+ def get_select_option_blank(cls):
+ return (cls.get_select_option_default_value(), 'Select')
+ @classmethod
+ def get_select_option_all(cls):
+ return (cls.get_select_option_default_value(), 'All')
+
+ @staticmethod
+ def get_select_option_default_value():
+ return ''
+
def __repr__(self):
fields = ', '.join(
f"{name}={field.data}" for name, field in self._fields.items()
)
return f"{self.__class__.__name__}({fields})"
- @classmethod
- @abstractmethod
- def from_json(cls, json):
- pass
- @classmethod
- def get_default(cls):
- return cls()
- """
- @abstractmethod
- def test_69(self):
- pass
-
- def get_Filters_Product_Category(data_request):
- data_form = data_request[Model_View_Store_Product_Category.FLAG_FORM]
- form_filters = Filters_Product_Category(**data_form)
- form_filters.is_not_empty.data = av.input_bool(data_form['is_not_empty'], 'is_not_empty', 'filter_category')
- form_filters.active.data = av.input_bool(data_form['active'], 'active', 'filter_category')
- return form_filters
- """
- @classmethod
- def get_choices_blank(cls):
- return [('', 'Select')]
- @classmethod
- def get_choice_all(cls):
- return ('', 'All')
'''
class Filters_Stored_Procedure_Base(Form_Base):
@@ -75,4 +63,10 @@ class Filters_Stored_Procedure_Base(Form_Base):
@abstractmethod
def to_json(self):
pass
-'''
\ No newline at end of file
+'''
+
+
+
+class Form_Filters_User(FlaskForm):
+ active = BooleanField('Active only?', default = True)
+ id_user = SelectField('User ID', validators=[Optional()], choices=[])
\ No newline at end of file
diff --git a/forms/contact.py b/forms/contact.py
deleted file mode 100644
index df5f0ed..0000000
--- a/forms/contact.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: Backend
-Feature: Contact Us Form
-
-Description:
-Defines Flask-WTF form for handling user input on Contact Us page.
-"""
-
-# IMPORTS
-# internal
-from business_objects.base import Base
-from business_objects.project_hub.command import Command
-# 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
-# external
-from flask import Flask, render_template, request, flash, redirect, url_for, current_app
-from flask_wtf import FlaskForm
-from wtforms import StringField, TextAreaField, SubmitField, HiddenField, BooleanField, Field, EmailField
-from wtforms.validators import DataRequired, Email, ValidationError
-import markupsafe
-from flask_wtf.recaptcha import RecaptchaField
-from abc import ABCMeta, abstractmethod
-import json
-from altcha import verify_solution
-import base64
-
-class ALTCHAValidator:
- def __init__(self, message=None):
- self.message = message or 'ALTCHA verification failed'
-
- def __call__(self, form, field):
- altcha_data = field.data
-
- if not altcha_data:
- raise ValidationError(self.message)
-
- try:
- # The data is base64 encoded JSON
- try:
- # First try to decode it as JSON directly (if it's not base64 encoded)
- altcha_payload = json.loads(altcha_data)
- except json.JSONDecodeError:
- # If direct JSON decoding fails, try base64 decoding first
- decoded_data = base64.b64decode(altcha_data).decode('utf-8')
- altcha_payload = json.loads(decoded_data)
-
- ok, err = verify_solution(altcha_payload, current_app.app_config.ALTCHA_SECRET_KEY, check_expires=True)
-
- if err or not ok:
- raise ValidationError(self.message + ': ' + (err or 'Invalid solution'))
-
- except Exception as e:
- raise ValidationError(f'Invalid ALTCHA data: {str(e)}')
-
-class ALTCHAField(Field):
- def __init__(self, label='', validators=None, **kwargs):
- validators = validators or []
- validators.append(ALTCHAValidator())
-
- super(ALTCHAField, self).__init__(label, validators, **kwargs)
-
- def __call__(self, **kwargs):
- html = f"""
-
-
- """
- return markupsafe.Markup(html)
-
-
-class Form_Contact(FlaskForm):
- email = EmailField('Email')
- contact_name = StringField('Name')
- company_name = StringField('Company')
- message = TextAreaField('Message')
- receive_marketing = BooleanField('I would like to receive marketing emails.')
- # recaptcha = RecaptchaField()
- # altcha = HiddenField('ALTCHA') # , validators=[validate_altcha]
- altcha = ALTCHAField('Verify you are human')
- submit = SubmitField('Send Message')
-
- def to_json(self):
- return {
- Base.FLAG_EMAIL: self.email.data
- , Command.FLAG_NAME_CONTACT: self.contact_name.data
- , Command.FLAG_NAME_COMPANY: self.company_name.data
- , Command.FLAG_MESSAGE: self.message.data
- , Command.FLAG_RECEIVE_MARKETING_COMMUNICATIONS: self.receive_marketing.data
- , Command.FLAG_ALTCHA: self.altcha.data
- , Base.FLAG_ACTIVE: True
- , Base.FLAG_CREATED_ON: None
- }
diff --git a/templates/pages/dog/_dog_command_link.html b/forms/dog/__init__.py
similarity index 100%
rename from templates/pages/dog/_dog_command_link.html
rename to forms/dog/__init__.py
diff --git a/forms/dog/dog_command_link.py b/forms/dog/dog_command_link.py
new file mode 100644
index 0000000..406c3c7
--- /dev/null
+++ b/forms/dog/dog_command_link.py
@@ -0,0 +1,64 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: Backend
+Feature: Contact Us Form
+
+Description:
+Defines Flask-WTF form for handling user input on Contact Us page.
+"""
+
+# IMPORTS
+# internal
+from dog_training.business_objects.base import Base
+from dog_training.business_objects.dog.command import Command
+from dog_training.business_objects.dog.dog import Dog
+from dog_training.business_objects.dog.obedience_level import Obedience_Level
+# from dog_training.models.model_view_store import Model_View_Store # circular
+# from dog_training.models.model_view_base import Model_View_Base
+from dog_training.forms.base import Form_Base
+import dog_training.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, SubmitField
+from wtforms.validators import DataRequired, Email, ValidationError
+import markupsafe
+from flask_wtf.recaptcha import RecaptchaField
+from abc import ABCMeta, abstractmethod
+import json
+
+class Filters_Dog_Command_Link(Form_Base):
+ id_dog = SelectField(
+ 'Dog'
+ , 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()
+ )
+ active_only = BooleanField(
+ 'Active'
+ , default = True
+ )
+
+ @classmethod
+ def from_json(cls, json):
+ filters = cls()
+ filters.id_dog.choices = [(json[Dog.ATTR_ID_DOG], json[Dog.ATTR_ID_DOG])]
+ filters.id_dog.data = json[Dog.ATTR_ID_DOG]
+ filters.id_command.choices = [(json[Command.ATTR_ID_COMMAND], json[Command.ATTR_ID_COMMAND])]
+ filters.id_command.data = json[Command.ATTR_ID_COMMAND]
+ filters.active_only.data = av.input_bool(json[Base.FLAG_ACTIVE], Base.FLAG_ACTIVE, f'{cls.__name__}.from_json')
+ return filters
+
+ def to_json(self):
+ return {
+ Dog.FLAG_DOG: self.id_dog.data
+ , Command.FLAG_COMMAND: self.id_command.data
+ , Base.FLAG_ACTIVE: self.active_only.data
+ }
diff --git a/forms/forms.py b/forms/forms.py
deleted file mode 100644
index 9341971..0000000
--- a/forms/forms.py
+++ /dev/null
@@ -1,134 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: Backend
-Feature: Forms - User data input
-
-Description:
-Defines Flask-WTF forms for handling user input.
-"""
-
-# IMPORTS
-# internal
-# from business_objects.store.product_category import Filters_Product_Category # circular
-# from models.model_view_store import Model_View_Store # circular
-from forms.base import Form_Base
-# external
-from flask_wtf import FlaskForm
-from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField
-from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional
-from flask_wtf.recaptcha import RecaptchaField
-from abc import ABCMeta, abstractmethod
-
-
-
-class Form_Contact(FlaskForm):
- email = StringField('Email address')
- CC = BooleanField('Would you like to receive a copy of this email request?') # not in use
- name = StringField('Name')
- message = TextAreaField('Message')
- recaptcha = RecaptchaField()
- submit = SubmitField('Submit')
-
-class Form_Register(FlaskForm):
- email = StringField('Email address')
- CC = BooleanField('Would you like to receive a copy of this email request?') # not in use
- name = StringField('Name')
- message = TextAreaField('Message')
- submit = SubmitField('Submit')
-
-
-"""
-class Form_Product(FlaskForm): # for basket, product tiles, product add
- # PositiveIntegerField with validation constraints
- quantity = IntegerField(
- 'Quantity',
- validators=[
- # InputRequired(message='Quantity'),
- NumberRange(min=1, message='Please enter a positive integer')
- ],
- default=1
- )
-"""
-
-class Form_Basket_Add(FlaskForm): # for basket, product tiles, product add
- # PositiveIntegerField with validation constraints
- quantity = IntegerField(
- 'Quantity',
- validators=[
- # InputRequired(message='Quantity'),
- NumberRange(min=1, message='Please enter a positive integer')
- ],
- default=1
- # render_kw={'id-product': ''} # {Model_View_Store.attr_id_product: ''}
- )
- submit = SubmitField('Add')
- form_type = 'Form_Basket_Add'
-
-class Form_Basket_Edit(FlaskForm): # for basket, product tiles, product add
- # PositiveIntegerField with validation constraints
- quantity = IntegerField(
- 'Quantity',
- validators=[
- # InputRequired(message='Quantity'),
- NumberRange(min=1, message='Please enter a positive integer')
- ],
- default=1
- # render_kw={'id-product': ''} # {Model_View_Store.attr_id_product: ''}
- )
- submit = SubmitField('Update')
- form_type = 'Form_Basket_Edit'
-
-class Form_Billing(FlaskForm):
- identical = BooleanField('Use delivery address')
- region = SelectField('Country / region', choices=[('uk', 'UK'), ('international', 'International')], validators=[DataRequired()])
- name_full = StringField('Full name')
- phone_number = StringField('Phone number', validators=[Regexp(r'^\+?[0-9\s]{5,20}$', message='Only numbers, plus symbol, and space are allowed.'), DataRequired()])
- postcode = StringField('Post code', validators=[DataRequired()])
- address_1 = StringField('Address line 1', validators=[DataRequired()])
- address_2 = StringField('Address line 2 (optional)')
- city = StringField('City', validators=[DataRequired()])
- county = StringField('County', validators=[DataRequired()])
- submit = SubmitField('Submit')
- form_type_billing_not_delivery = False
-
- def output_id(self):
- return 'formBilling' if self.form_type_billing_not_delivery else 'formDeliver'
-
-class Form_Is_Included_VAT(FlaskForm):
- is_included = BooleanField('Include VAT')
-
-class Form_Delivery_Region(FlaskForm):
- id_id_region_delivery = 'id_region_delivery'
- id_region_delivery = SelectField('Region', id='id_region_delivery')
-
-class Form_Currency(FlaskForm):
- id_id_currency = 'id_currency'
- id_currency = SelectField('Currency', id='id_currency')
-
-
-# Store
-class Form_Supplier(FlaskForm):
- id_id_supplier = 'id_supplier'
- id_supplier = SelectField('Supplier', id='id_supplier')
- name_company = StringField('Company name')
- name_contact = StringField('Contact name')
- department_contact = StringField('Contact department')
- id_address = SelectField('Address ID')
- phone_number = StringField('Phone number')
- email = StringField('Email address')
- fax = StringField('Fax number')
- website = StringField('Website')
- id_currency = SelectField('Currency ID')
- is_active = BooleanField('Active', default = True)
-
-# class Form_Supplier_Purchase_Order(FlaskForm):
-
-
-
-# User
-class Form_Filters_User(FlaskForm):
- active = BooleanField('Active only?', default = True)
- id_user = SelectField('User ID', validators=[Optional()], choices=[])
\ No newline at end of file
diff --git a/forms/unit_measurement.py b/forms/unit_measurement.py
deleted file mode 100644
index 720da3e..0000000
--- a/forms/unit_measurement.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: Backend
-Feature: Forms - Unit of Measurement Filters data input
-
-Description:
-Defines Flask-WTF forms for handling unit of measurement filter input.
-"""
-
-# internal
-from business_objects.base import Base
-from forms.base import Form_Base
-import lib.argument_validation as av
-# external
-from flask_wtf import FlaskForm
-from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField
-from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional
-from flask_wtf.recaptcha import RecaptchaField
-from abc import ABCMeta, abstractmethod
-
-
-class Filters_Unit_Measurement(Form_Base):
- active = BooleanField("Active only?", default = True)
- @classmethod
- def from_filters(cls, filters):
- form = Filters_Unit_Measurement()
- form.active.data = filters.active
- return form
- def __repr__(self):
- return f'Filters_Unit_Measurement(active={self.active.data})'
- @classmethod
- def from_json(cls, json):
- form = Filters_Unit_Measurement()
- form.active.data = av.input_bool(json[Base.FLAG_ACTIVE], 'active', 'Filters_Unit_Measurement')
- return form
- def to_json(self):
- return {
- Base.FLAG_ACTIVE: av.input_bool(self.active.data, Base.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'),
- }
\ No newline at end of file
diff --git a/lib/argument_validation.py b/lib/argument_validation.py
index 6a9081a..8da7248 100644
--- a/lib/argument_validation.py
+++ b/lib/argument_validation.py
@@ -7,7 +7,7 @@ Created on Thu Apr 27 12:33:59 2023
Argument Validation
"""
-from helpers.helper_app import Helper_App
+from dog_training.helpers.helper_app import Helper_App
from typing import Optional
def error_msg_str(v, v_name, method, v_type, suppress_errors = False, suppress_console_outputs = False, v_arg_type = 'argument'):
diff --git a/models/model_view_accessibility_report.py b/models/model_view_accessibility_report.py
index 1faf5d8..6976405 100644
--- a/models/model_view_accessibility_report.py
+++ b/models/model_view_accessibility_report.py
@@ -11,7 +11,7 @@ Data model for accessibility report view
"""
# internal
-from models.model_view_base import Model_View_Base
+from dog_training.models.model_view_base import Model_View_Base
# from routes import bp_home
# external
diff --git a/models/model_view_accessibility_statement.py b/models/model_view_accessibility_statement.py
index 2ffcb79..edccb06 100644
--- a/models/model_view_accessibility_statement.py
+++ b/models/model_view_accessibility_statement.py
@@ -11,7 +11,7 @@ Data model for accessibility statement view
"""
# internal
-from models.model_view_base import Model_View_Base
+from dog_training.models.model_view_base import Model_View_Base
# from routes import bp_home
# external
diff --git a/models/model_view_base.py b/models/model_view_base.py
index 5ad0c1b..a0fc5cb 100644
--- a/models/model_view_base.py
+++ b/models/model_view_base.py
@@ -17,16 +17,13 @@ Base data model for views
# IMPORTS
# internal
# from routes import bp_home
-from business_objects.base import Base
-from business_objects.project_hub.user import User
-from business_objects.project_hub.command import Command
-from datastores.datastore_base import DataStore_Base
-from datastores.project_hub.datastore_command import DataStore_Command
-from forms.access_level import Filters_Access_Level
-from forms.forms import Form_Is_Included_VAT, Form_Delivery_Region, Form_Currency
-from forms.unit_measurement import Filters_Unit_Measurement
-from helpers.helper_app import Helper_App
-import lib.argument_validation as av
+from dog_training.business_objects.base import Base
+from dog_training.business_objects.dog.user import User
+from dog_training.business_objects.dog.command import Command
+from dog_training.datastores.datastore_base import DataStore_Base
+from dog_training.datastores.datastore_dog import DataStore_Dog
+from dog_training.helpers.helper_app import Helper_App
+import dog_training.lib.argument_validation as av
# external
from abc import ABC, abstractmethod
from flask_sqlalchemy import SQLAlchemy
@@ -105,8 +102,16 @@ class Model_View_Base(BaseModel, ABC):
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_CONTACT: ClassVar[str] = 'navContact'
+ FLAG_NAV_DOG_COMMAND: ClassVar[str] = 'navDogCommand'
+ FLAG_NAV_DOG_DOG: ClassVar[str] = 'navDogDog'
+ FLAG_NAV_DOG_DOG_COMMAND_LINK: ClassVar[str] = 'navDogDogCommandLink'
FLAG_NAV_HOME: ClassVar[str] = 'navHome'
+ FLAG_NAV_USER_ACCOUNT: ClassVar[str] = 'navUserAccount'
+ FLAG_NAV_USER_ADMIN: ClassVar[str] = 'navUserAdmin'
+ FLAG_NAV_USER_LOGIN: ClassVar[str] = 'navUserLogin'
+ FLAG_NAV_USER_LOGOUT: ClassVar[str] = 'navUserLogout'
FLAG_OVERLAY: ClassVar[str] = 'overlay'
FLAG_PAGE_BODY: ClassVar[str] = 'page-body'
FLAG_RIGHT_HAND_SIDE: ClassVar[str] = 'rhs'
@@ -125,6 +130,7 @@ class Model_View_Base(BaseModel, ABC):
HASH_GET_ALTCHA_CHALLENGE: ClassVar[str] = '/altcha/create-challenge'
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_CONTACT: ClassVar[str] = '/contact'
HASH_PAGE_CONTACT_SUCCESS: ClassVar[str] = '/contact-success'
HASH_PAGE_DATA_RETENTION_SCHEDULE: ClassVar[str] = '/retention-schedule'
@@ -132,6 +138,9 @@ class Model_View_Base(BaseModel, ABC):
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'
+ HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login'
+ HASH_PAGE_USER_LOGOUT: ClassVar[str] = '/logout'
ID_BUTTON_ADD: ClassVar[str] = 'buttonAdd'
ID_BUTTON_APPLY_FILTERS: ClassVar[str] = 'buttonApplyFilters'
ID_BUTTON_CANCEL: ClassVar[str] = 'buttonCancel'
diff --git a/models/model_view_contact.py b/models/model_view_contact.py
deleted file mode 100644
index 37ee540..0000000
--- a/models/model_view_contact.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: View Models
-Feature: Contact View Model
-
-Description:
-Data model for contact view
-"""
-
-# internal
-from business_objects.project_hub.command import Command
-from models.model_view_base import Model_View_Base
-# from routes import bp_home
-from lib import argument_validation as av
-from forms.contact import Form_Contact
-# external
-from flask_wtf import FlaskForm
-from abc import abstractproperty
-from pydantic import BaseModel
-from typing import ClassVar
-
-class Model_View_Contact(Model_View_Base):
-
- form_contact: Form_Contact
-
- @property
- def title(self):
- return 'Contact'
-
- def __init__(self, form_contact, hash_page_current=Model_View_Base.HASH_PAGE_CONTACT, **kwargs):
- super().__init__(hash_page_current=hash_page_current, form_contact=form_contact, **kwargs)
- # self.form = form
diff --git a/models/model_view_contact_success.py b/models/model_view_contact_success.py
deleted file mode 100644
index 178a0be..0000000
--- a/models/model_view_contact_success.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""
-Project: PARTS Website
-Author: Edward Middleton-Smith
- Precision And Research Technology Systems Limited
-
-Technology: View Models
-Feature: Contact View Model
-
-Description:
-Data model for contact view
-"""
-
-# internal
-from models.model_view_base import Model_View_Base
-# from routes import bp_home
-from lib import argument_validation as av
-# from forms.contact import Form_Contact
-# external
-from flask_wtf import FlaskForm
-from abc import abstractproperty
-from pydantic import BaseModel
-from typing import ClassVar
-
-class Model_View_Contact_Success(Model_View_Base):
-
- @property
- def title(self):
- return 'Contact Success'
-
- def __init__(self, hash_page_current=Model_View_Base.HASH_PAGE_CONTACT_SUCCESS, **kwargs):
- super().__init__(hash_page_current=hash_page_current, **kwargs)
diff --git a/models/model_view_dog_base.py b/models/model_view_dog_base.py
new file mode 100644
index 0000000..4802bfc
--- /dev/null
+++ b/models/model_view_dog_base.py
@@ -0,0 +1,59 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: View Models
+Feature: Store Parent View Model
+
+Description:
+Parent data model for store views
+"""
+
+
+# internal
+# from context import models
+from dog_training.business_objects.dog.dog import Dog, Parameters_Dog
+from dog_training.datastores.datastore_dog import DataStore_Dog
+from dog_training.helpers.helper_app import Helper_App
+import dog_training.lib.argument_validation as av
+from dog_training.models.model_view_base import Model_View_Base
+# external
+from flask import send_file, jsonify
+from flask_sqlalchemy import SQLAlchemy
+import locale
+from typing import ClassVar
+from abc import abstractmethod
+
+
+class Model_View_Dog_Base(Model_View_Base):
+ # ATTR_FORM_TYPE: ClassVar[str] = 'form-type'
+ # ATTR_ID_CUSTOMER: ClassVar[str] = 'id-customer'
+ # ATTR_ID_CUSTOMER_ADDRESS: ClassVar[str] = Store_Base.ATTR_ID_CUSTOMER_ADDRESS
+ # FLAG_CURRENCY_COST: ClassVar[str] = Product_Permutation.FLAG_CURRENCY_COST
+ # FLAG_CUSTOMER: ClassVar[str] = Store_Base.FLAG_CUSTOMER
+ # FLAG_SYMBOL_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = Product_Permutation.FLAG_SYMBOL_UNIT_MEASUREMENT_QUANTITY
+ # FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: ClassVar[str] = Product_Permutation.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED
+ # 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_DOG_SCRIPTS_SHARED: ClassVar[str] = '/dog/scripts_shared'
+ HASH_PAGE_DOG_DOG_COMMAND_LINKS: ClassVar[str] = '/dog/dog_command_links'
+
+
+ @property
+ def title(self):
+ raise NotImplementedError('title must be implemented in child class')
+
+ def __init__(self, hash_page_current, **kwargs):
+ _m = 'Model_View_Dog_Base.__init__'
+ Helper_App.console_log(f'{_m}\nstarting')
+ super().__init__(hash_page_current=hash_page_current, **kwargs)
+ self.is_page_store = True
+
+ """
+ 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)
+ """
+
diff --git a/models/model_view_dog_dog_command_link.py b/models/model_view_dog_dog_command_link.py
new file mode 100644
index 0000000..07d7aa4
--- /dev/null
+++ b/models/model_view_dog_dog_command_link.py
@@ -0,0 +1,64 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: View Models
+Feature: Store Permutations View Model
+
+Description:
+Data model for store permutations view
+"""
+
+# internal
+from dog_training.business_objects.dog.command import Command, Parameters_Command
+from dog_training.business_objects.dog.dog import Dog, Parameters_Dog
+from dog_training.business_objects.dog.dog_command_link import Dog_Command_Link, Parameters_Dog_Command_Link
+from dog_training.business_objects.dog.obedience_level import Obedience_Level
+from dog_training.datastores.datastore_dog import DataStore_Dog
+from dog_training.models.model_view_dog_base import Model_View_Dog_Base
+from dog_training.forms.dog.dog_command_link import Filters_Dog_Command_Link
+# from routes import bp_home
+from dog_training.helpers.helper_app import Helper_App
+import dog_training.lib.argument_validation as av
+
+# external
+from pydantic import BaseModel
+from typing import ClassVar
+
+class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base):
+ filter_dogs: list = None
+ filter_commands: list = None
+ dog_command_links: list = None
+ form_filters: Filters_Dog_Command_Link = None
+ 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):
+ _m = 'Model_View_Dog_Dog_Command_Link.__init__'
+ Helper_App.console_log(f'{_m}\nstarting...')
+ super().__init__(hash_page_current=hash_page_current, form_filters_old=form_filters_old)
+ self.form_filters = form_filters_old
+ datastore = DataStore_Dog()
+ parameters_filter_dog = Parameters_Dog.get_default()
+ self.filter_dogs, errors = datastore.get_many_dog(parameters_filter_dog)
+
+ parameters_filter_command = Parameters_Command.get_default()
+ self.filter_commands, errors = datastore.get_many_command(parameters_filter_command)
+
+ parameters_filter_dog_command_link = Parameters_Dog_Command_Link.get_default()
+ self.dog_command_links, errors = datastore.get_many_dog_command_link(parameters_filter_dog_command_link)
+
+ Helper_App.console_log(f'dogs: {self.filter_dogs}')
+ Helper_App.console_log(f'commands: {self.filter_commands}')
+ Helper_App.console_log(f'links: {self.dog_command_links}')
+
+ """
+ @classmethod
+ def save_categories(cls, comment, list_categories):
+ _m = f'{cls.__name__}.save_categories'
+ return DataStore_Store_Product_Category().save_categories(comment, list_categories)
+ """
\ No newline at end of file
diff --git a/models/model_view_home.py b/models/model_view_home.py
index f7bb6e2..d3e1f25 100644
--- a/models/model_view_home.py
+++ b/models/model_view_home.py
@@ -11,7 +11,7 @@ Data model for home view
"""
# internal
-from models.model_view_base import Model_View_Base
+from dog_training.models.model_view_base import Model_View_Base
# from routes import bp_home
# external
diff --git a/models/model_view_license.py b/models/model_view_license.py
index f891df1..0383bac 100644
--- a/models/model_view_license.py
+++ b/models/model_view_license.py
@@ -11,7 +11,7 @@ Data model for license view
"""
# internal
-from models.model_view_base import Model_View_Base
+from dog_training.models.model_view_base import Model_View_Base
# from routes import bp_home
# external
diff --git a/models/model_view_privacy_policy.py b/models/model_view_privacy_policy.py
index 0424333..4e47b99 100644
--- a/models/model_view_privacy_policy.py
+++ b/models/model_view_privacy_policy.py
@@ -11,7 +11,7 @@ Data model for privacy policy view
"""
# internal
-from models.model_view_base import Model_View_Base
+from dog_training.models.model_view_base import Model_View_Base
# from routes import bp_home
# external
diff --git a/models/model_view_retention_schedule.py b/models/model_view_retention_schedule.py
index 3f28d20..f665bf2 100644
--- a/models/model_view_retention_schedule.py
+++ b/models/model_view_retention_schedule.py
@@ -11,7 +11,7 @@ Data model for retention schedule view
"""
# internal
-from models.model_view_base import Model_View_Base
+from dog_training.models.model_view_base import Model_View_Base
# from routes import bp_home
# external
diff --git a/models/model_view_user.py b/models/model_view_user.py
new file mode 100644
index 0000000..43dedbc
--- /dev/null
+++ b/models/model_view_user.py
@@ -0,0 +1,38 @@
+"""
+Project: PARTS Website
+Author: Edward Middleton-Smith
+ Precision And Research Technology Systems Limited
+
+Technology: View Models
+Feature: User View Model
+
+Description:
+Data model for user view
+"""
+
+# internal
+from datastores.datastore_user import DataStore_User
+from models.model_view_base import Model_View_Base
+# from routes import bp_home
+# external
+from typing import ClassVar
+
+class Model_View_User(Model_View_Base):
+ FLAG_ERROR_OAUTH: ClassVar[str] = 'error'
+ FLAG_ERROR_DESCRIPTION_OAUTH: ClassVar[str] = 'error_description'
+ FLAG_FIRSTNAME: ClassVar[str] = 'firstname'
+ FLAG_SURNAME: ClassVar[str] = 'surname'
+ FLAG_STATE_OAUTH: ClassVar[str] = 'state'
+ currencies: list = None
+ regions: list = None
+ users: list = None
+ @property
+ def title(self):
+ return 'User'
+
+ 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)
+ datastore_user = DataStore_User()
+ self.currencies = datastore_user.get_many_currency()
+ self.regions = datastore_user.get_many_region()
+
\ No newline at end of file
diff --git a/routes.py b/routes.py
index d93a97a..73321d2 100644
--- a/routes.py
+++ b/routes.py
@@ -14,7 +14,7 @@ Manages the interaction between the frontend and backend.
from flask import render_template, url_for, Blueprint
from app import app
from app.forms import Form_Contact
-# from forms import MyForm
+# from dog_training.forms import MyForm
# from app import MyForm
from model_view_contact import Model_View_Contact
diff --git a/static/MySQL/00000_combined.sql b/static/MySQL/00000_combined.sql
new file mode 100644
index 0000000..fd6bd65
--- /dev/null
+++ b/static/MySQL/00000_combined.sql
@@ -0,0 +1,759 @@
+
+USE demo;
+
+DROP PROCEDURE IF EXISTS demo.p_DOG_get_many_dog;
+
+DELIMITER //
+CREATE PROCEDURE demo.p_DOG_get_many_dog (
+ IN a_id_user INT
+ , IN a_get_all_dog BIT
+ , IN a_get_inactive_dog BIT
+ , IN a_ids_dog TEXT
+ , IN a_names_dog TEXT
+ , IN a_debug BIT
+)
+BEGIN
+ DECLARE v_code_type_error_bad_data VARCHAR(100);
+ DECLARE v_code_type_error_no_permission VARCHAR(100);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_id_type_error_no_permission INT;
+ DECLARE v_has_filter_dog_id BIT;
+ DECLARE v_has_filter_dog_name BIT;
+ DECLARE v_guid BINARY(36);
+ DECLARE v_id_permission_dog_view INT;
+ DECLARE v_id_minimum INT;
+ DECLARE v_time_start TIMESTAMP(6);
+ DECLARE v_can_view BIT;
+
+ 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(100) NOT NULL
+ , msg VARCHAR(4000) 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 a_id_user := IFNULL(a_id_user, 0);
+ SET a_get_all_dog := IFNULL(a_get_all_dog, 0);
+ SET a_get_inactive_dog := IFNULL(a_get_inactive_dog, 0);
+ SET a_ids_dog := TRIM(IFNULL(a_ids_dog, ''));
+ SET a_names_dog := TRIM(IFNULL(a_names_dog, ''));
+ SET a_debug := IFNULL(a_debug, 0);
+
+ IF a_debug = 1 THEN
+ SELECT
+ a_id_user
+ , a_get_all_dog
+ , a_get_inactive_dog
+ , a_ids_dog
+ , a_names_dog
+ , 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_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
+
+ CREATE TEMPORARY TABLE tmp_Dog (
+ id_dog INT NOT NULL
+ , name 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(100) NOT NULL
+ , msg VARCHAR(4000) NOT NULL
+ );
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Id;
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Name;
+
+ CALL demo.p_core_validate_guid ( v_guid );
+
+ SET v_has_filter_dog_id = CASE WHEN a_ids_dog = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_dog_name = CASE WHEN a_names_dog = '' THEN 0 ELSE 1 END;
+
+ -- Dogs
+ IF v_has_filter_dog_id = 1 THEN
+ CALL demo.p_split(v_guid, a_ids_dog, ',', a_debug);
+
+ INSERT INTO tmp_Split_Id (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM demo.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL demo.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF v_has_filter_dog_name = 1 THEN
+ CALL demo.p_split(v_guid, a_names_dog, ',', a_debug);
+
+ INSERT INTO tmp_Split_Name (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM demo.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL demo.p_clear_split_temp( v_guid );
+ END IF;
+
+ 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 EXISTS (
+ SELECT *
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 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('Invalid or inactive Dog IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 0
+ )
+ ;
+ /* Don't error on names not found
+ ELSEIF EXISTS (
+ SELECT *
+ FROM tmp_Split t_SPLIT
+ LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 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('Invalid or inactive Dog IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split t_SPLIT
+ LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 0
+ )
+ ;
+ */
+ ELSE
+ INSERT INTO tmp_Dog (
+ id_dog
+ , name
+ )
+ SELECT
+ DOG.id_dog
+ , DOG.name
+ FROM demo.DOG_Dog DOG
+ LEFT JOIN tmp_Split_Id t_SPLIT_ID ON DOG.id_dog = t_SPLIT_ID.as_int
+ LEFT JOIN tmp_Split_Name t_SPLIT_NAME ON DOG.name = t_SPLIT_NAME.substring
+ WHERE
+ (
+ a_get_all_dog = 1
+ OR (
+ v_has_filter_dog_id = 1
+ OR v_has_filter_dog_name = 1
+ )
+ )
+ AND (
+ a_get_inactive_dog = 1
+ OR DOG.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ DELETE FROM tmp_Split_Id;
+ DELETE FROM tmp_Split_Name;
+
+
+ -- Permissions
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_dog_view
+ , 0 -- a_debug
+ ;
+ END IF;
+
+ CALL demo.p_DOG_calc_user(
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_dog_view
+ , 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;
+ 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 Commands.'
+ )
+ ;
+ END IF;
+
+ CALL demo.p_DOG_clear_calc_user(
+ v_guid
+ , 0 -- a_debug
+ );
+
+ 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_Dog;
+ END IF;
+
+ DELETE FROM tmp_Dog;
+ END IF;
+
+ -- Outputs
+ -- Commands
+ SELECT
+ t_DOG.id_dog
+ , t_DOG.name
+ , DOG.appearance
+ , DOG.mass_kg
+ , DOG.notes
+ , DOG.active
+ FROM demo.DOG_Dog DOG
+ INNER JOIN tmp_Dog t_DOG ON DOG.id_dog = t_DOG.id_dog
+ ;
+
+ -- 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_Dog;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
+
+ IF a_debug = 1 THEN
+ CALL demo.p_core_debug_timing_reporting ( v_time_start );
+ END IF;
+END //
+DELIMITER ;
+
+
+
+USE demo;
+
+DROP PROCEDURE IF EXISTS demo.p_DOG_get_many_command;
+
+DELIMITER //
+CREATE PROCEDURE demo.p_DOG_get_many_command (
+ IN a_id_user INT
+ , IN a_get_all_command BIT
+ , IN a_get_inactive_command BIT
+ , IN a_ids_command TEXT
+ , IN a_names_command TEXT
+ , IN a_debug BIT
+)
+BEGIN
+ DECLARE v_code_type_error_bad_data VARCHAR(100);
+ DECLARE v_code_type_error_no_permission VARCHAR(100);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_id_type_error_no_permission INT;
+ DECLARE v_has_filter_command_id BIT;
+ DECLARE v_has_filter_command_name BIT;
+ DECLARE v_guid BINARY(36);
+ DECLARE v_id_permission_command_view INT;
+ DECLARE v_id_minimum INT;
+ DECLARE v_time_start TIMESTAMP(6);
+ DECLARE v_can_view BIT;
+
+ 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(100) NOT NULL
+ , msg VARCHAR(4000) 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_command_view := (SELECT PERMISSION.id_permission FROM demo.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1);
+
+ SET a_id_user := IFNULL(a_id_user, 0);
+ SET a_get_all_command := IFNULL(a_get_all_command, 0);
+ SET a_get_inactive_command := IFNULL(a_get_inactive_command, 0);
+ SET a_ids_command := TRIM(IFNULL(a_ids_command, ''));
+ SET a_names_command := TRIM(IFNULL(a_names_command, ''));
+ SET a_debug := IFNULL(a_debug, 0);
+
+ IF a_debug = 1 THEN
+ SELECT
+ a_id_user
+ , a_get_all_command
+ , a_get_inactive_command
+ , a_ids_command
+ , a_names_command
+ , a_debug
+ ;
+
+ SELECT
+ v_id_type_error_bad_data
+ , v_id_type_error_no_permission
+ , v_guid
+ , v_id_permission_command_view
+ , v_time_start
+ ;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Command;
+
+ CREATE TEMPORARY TABLE tmp_Command (
+ id_command INT NOT NULL
+ , name 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(100) NOT NULL
+ , msg VARCHAR(4000) NOT NULL
+ );
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Id;
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Name;
+
+ CALL demo.p_core_validate_guid ( v_guid );
+
+ SET v_has_filter_command_id = CASE WHEN a_ids_command = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_command_name = CASE WHEN a_names_command = '' THEN 0 ELSE 1 END;
+
+ -- Commands
+ IF v_has_filter_command_id = 1 THEN
+ CALL demo.p_split(v_guid, a_ids_command, ',', a_debug);
+
+ INSERT INTO tmp_Split_Id (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM demo.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL demo.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF v_has_filter_command_name = 1 THEN
+ CALL demo.p_split(v_guid, a_names_command, ',', a_debug);
+
+ INSERT INTO tmp_Split_Name (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM demo.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL demo.p_clear_split_temp( v_guid );
+ END IF;
+
+ 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 EXISTS (
+ SELECT *
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN demo.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(COMMAND.id_command)
+ OR (
+ COMMAND.active = 0
+ AND a_get_inactive_command = 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('Invalid or inactive Command IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN demo.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(COMMAND.id_command)
+ OR (
+ COMMAND.active = 0
+ AND a_get_inactive_command = 0
+ )
+ ;
+ /* Don't error on codes or names not found
+ ELSEIF EXISTS (
+ SELECT *
+ */
+ ELSE
+ INSERT INTO tmp_Command (
+ id_command
+ , name
+ )
+ SELECT
+ COMMAND.id_command
+ , COMMAND.name
+ FROM demo.DOG_Command COMMAND
+ LEFT JOIN tmp_Split_Id t_SPLIT_ID ON COMMAND.id_command = t_SPLIT_ID.as_int
+ LEFT JOIN tmp_Split_Name t_SPLIT_NAME ON COMMAND.name = t_SPLIT_NAME.substring
+ WHERE
+ (
+ a_get_all_command = 1
+ OR (
+ v_has_filter_command_id = 1
+ OR v_has_filter_command_name = 1
+ )
+ )
+ AND (
+ a_get_inactive_command = 1
+ OR COMMAND.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ DELETE FROM tmp_Split_Id;
+ DELETE FROM tmp_Split_Name;
+
+
+ -- Permissions
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_command_view
+ , 0 -- a_debug
+ ;
+ END IF;
+
+ CALL demo.p_DOG_calc_user(
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_command_view
+ , 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;
+ 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 Commands.'
+ )
+ ;
+ END IF;
+
+ CALL demo.p_DOG_clear_calc_user(
+ v_guid
+ , 0 -- a_debug
+ );
+
+ 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_Command;
+ END IF;
+
+ DELETE FROM tmp_Command;
+ END IF;
+
+ -- Outputs
+ -- Commands
+ SELECT
+ t_COMMAND.id_command
+ , COMMAND.id_command_category
+ , t_COMMAND.name
+ , COMMAND.hand_signal_default_description
+ , COMMAND.can_have_button
+ , COMMAND.notes
+ , COMMAND.active
+ FROM demo.DOG_Command COMMAND
+ INNER JOIN tmp_Command t_COMMAND ON COMMAND.id_command = t_COMMAND.id_command
+ ;
+
+ -- 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_Command;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Command;
+
+ 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_dog (
+ 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
+ , 1 -- a_get_all_dog
+ , 0 -- a_get_inactive_dog
+ , '' -- a_ids_dog
+ , '' -- a_names_dog
+ , 1 -- a_debug
+);
+
+
+
+CALL demo.p_DOG_get_many_command (
+ 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
+ , 1 -- a_get_all_command
+ , 0 -- a_get_inactive_command
+ , '' -- a_ids_command
+ , '' -- a_names_command
+ , 1 -- a_debug
+);
diff --git a/static/MySQL/0001_destroy.sql b/static/MySQL/00001_destroy.sql
similarity index 70%
rename from static/MySQL/0001_destroy.sql
rename to static/MySQL/00001_destroy.sql
index 0affff6..c48eea9 100644
--- a/static/MySQL/0001_destroy.sql
+++ b/static/MySQL/00001_destroy.sql
@@ -14,13 +14,49 @@ DROP TABLE IF EXISTS parts.tmp_DOG_User_Role_Link;
-- Permanent Tables
-DROP TABLE IF EXISTS parts.DOG_Dog_Drive_Link_Temp;
-DROP TABLE IF EXISTS parts.DOG_Dog_Drive_Link_Audit;
-DROP TABLE IF EXISTS parts.DOG_Dog_Drive_Link;
+DROP TABLE IF EXISTS parts.DOG_Assessment_Response_Temp;
+DROP TABLE IF EXISTS parts.DOG_Assessment_Response_Audit;
+DROP TABLE IF EXISTS parts.DOG_Assessment_Response;
-DROP TABLE IF EXISTS parts.DOG_Drive_Temp;
-DROP TABLE IF EXISTS parts.DOG_Drive_Audit;
-DROP TABLE IF EXISTS parts.DOG_Drive;
+DROP TABLE IF EXISTS parts.DOG_Obedience_Level_Temp;
+DROP TABLE IF EXISTS parts.DOG_Obedience_Level_Audit;
+DROP TABLE IF EXISTS parts.DOG_Obedience_Level;
+
+DROP TABLE IF EXISTS parts.DOG_Response_Quality_Metric_Temp;
+DROP TABLE IF EXISTS parts.DOG_Response_Quality_Metric_Audit;
+DROP TABLE IF EXISTS parts.DOG_Response_Quality_Metric;
+
+DROP TABLE IF EXISTS parts.DOG_Assessment_Command_Modality_Link_Temp;
+DROP TABLE IF EXISTS parts.DOG_Assessment_Command_Modality_Link_Audit;
+DROP TABLE IF EXISTS parts.DOG_Assessment_Command_Modality_Link;
+
+DROP TABLE IF EXISTS parts.DOG_Bribe_Temp;
+DROP TABLE IF EXISTS parts.DOG_Bribe_Audit;
+DROP TABLE IF EXISTS parts.DOG_Bribe;
+
+DROP TABLE IF EXISTS parts.DOG_Distraction_Temp;
+DROP TABLE IF EXISTS parts.DOG_Distraction_Audit;
+DROP TABLE IF EXISTS parts.DOG_Distraction;
+
+DROP TABLE IF EXISTS parts.DOG_Distraction_Intensity_Level_Temp;
+DROP TABLE IF EXISTS parts.DOG_Distraction_Intensity_Level_Audit;
+DROP TABLE IF EXISTS parts.DOG_Distraction_Intensity_Level;
+
+DROP TABLE IF EXISTS parts.DOG_Distraction_Type_Temp;
+DROP TABLE IF EXISTS parts.DOG_Distraction_Type_Audit;
+DROP TABLE IF EXISTS parts.DOG_Distraction_Type;
+
+DROP TABLE IF EXISTS parts.DOG_Assessment_Temp;
+DROP TABLE IF EXISTS parts.DOG_Assessment_Audit;
+DROP TABLE IF EXISTS parts.DOG_Assessment;
+
+DROP TABLE IF EXISTS parts.DOG_Lighting_Level_Temp;
+DROP TABLE IF EXISTS parts.DOG_Lighting_Level_Audit;
+DROP TABLE IF EXISTS parts.DOG_Lighting_Level;
+
+DROP TABLE IF EXISTS parts.DOG_Weather_Temp;
+DROP TABLE IF EXISTS parts.DOG_Weather_Audit;
+DROP TABLE IF EXISTS parts.DOG_Weather;
DROP TABLE IF EXISTS parts.DOG_Command_Button_Link_Temp;
DROP TABLE IF EXISTS parts.DOG_Command_Button_Link_Audit;
@@ -34,14 +70,14 @@ DROP TABLE IF EXISTS parts.DOG_Image_Temp;
DROP TABLE IF EXISTS parts.DOG_Image_Audit;
DROP TABLE IF EXISTS parts.DOG_Image;
-DROP TABLE IF EXISTS parts.DOG_Button_Shape_Temp;
-DROP TABLE IF EXISTS parts.DOG_Button_Shape_Audit;
-DROP TABLE IF EXISTS parts.DOG_Button_Shape;
-
DROP TABLE IF EXISTS parts.DOG_Colour_Temp;
DROP TABLE IF EXISTS parts.DOG_Colour_Audit;
DROP TABLE IF EXISTS parts.DOG_Colour;
+DROP TABLE IF EXISTS parts.DOG_Button_Shape_Temp;
+DROP TABLE IF EXISTS parts.DOG_Button_Shape_Audit;
+DROP TABLE IF EXISTS parts.DOG_Button_Shape;
+
DROP TABLE IF EXISTS parts.DOG_Location_Link_Temp;
DROP TABLE IF EXISTS parts.DOG_Location_Link_Audit;
DROP TABLE IF EXISTS parts.DOG_Location_Link;
@@ -50,9 +86,15 @@ DROP TABLE IF EXISTS parts.DOG_Location_Temp;
DROP TABLE IF EXISTS parts.DOG_Location_Audit;
DROP TABLE IF EXISTS parts.DOG_Location;
+DROP TABLE IF EXISTS parts.DOG_Command_Modality_Temp;
+DROP TABLE IF EXISTS parts.DOG_Command_Modality_Audit;
+DROP TABLE IF EXISTS parts.DOG_Command_Modality;
+
+/* Start of remove section */
DROP TABLE IF EXISTS parts.DOG_Personal_Best_Temp;
DROP TABLE IF EXISTS parts.DOG_Personal_Best_Audit;
DROP TABLE IF EXISTS parts.DOG_Personal_Best;
+/* End of remove section */
DROP TABLE IF EXISTS parts.DOG_Dog_Command_Link_Temp;
DROP TABLE IF EXISTS parts.DOG_Dog_Command_Link_Audit;
@@ -66,10 +108,7 @@ DROP TABLE IF EXISTS parts.DOG_Command_Category_Temp;
DROP TABLE IF EXISTS parts.DOG_Command_Category_Audit;
DROP TABLE IF EXISTS parts.DOG_Command_Category;
-DROP TABLE IF EXISTS parts.DOG_Obedience_Level_Temp;
-DROP TABLE IF EXISTS parts.DOG_Obedience_Level_Audit;
-DROP TABLE IF EXISTS parts.DOG_Obedience_Level;
-
+/* Start of remove section */
DROP TABLE IF EXISTS parts.DOG_Understanding_Level_Temp;
DROP TABLE IF EXISTS parts.DOG_Understanding_Level_Audit;
DROP TABLE IF EXISTS parts.DOG_Understanding_Level;
@@ -77,6 +116,15 @@ DROP TABLE IF EXISTS parts.DOG_Understanding_Level;
DROP TABLE IF EXISTS parts.DOG_Competency_Level_Temp;
DROP TABLE IF EXISTS parts.DOG_Competency_Level_Audit;
DROP TABLE IF EXISTS parts.DOG_Competency_Level;
+/* End of remove section */
+
+DROP TABLE IF EXISTS parts.DOG_Dog_Drive_Link_Temp;
+DROP TABLE IF EXISTS parts.DOG_Dog_Drive_Link_Audit;
+DROP TABLE IF EXISTS parts.DOG_Dog_Drive_Link;
+
+DROP TABLE IF EXISTS parts.DOG_Drive_Temp;
+DROP TABLE IF EXISTS parts.DOG_Drive_Audit;
+DROP TABLE IF EXISTS parts.DOG_Drive;
DROP TABLE IF EXISTS parts.DOG_Dog_Breed_Link_Temp;
DROP TABLE IF EXISTS parts.DOG_Dog_Breed_Link_Audit;
@@ -92,6 +140,13 @@ DROP TABLE IF EXISTS parts.DOG_Dog;
DROP TABLE IF EXISTS parts.DOG_Dog_Change_Set;
+-- Core tables
+DROP TABLE IF EXISTS parts.DOG_Unit_Measurement_Conversion_Audit;
+DROP TABLE IF EXISTS parts.DOG_Unit_Measurement_Conversion;
+
+DROP TABLE IF EXISTS parts.DOG_Unit_Measurement_Audit;
+DROP TABLE IF EXISTS parts.DOG_Unit_Measurement;
+
DROP TABLE IF EXISTS parts.DOG_Calc_User_Temp;
DROP TABLE IF EXISTS parts.DOG_User_Role_Link_Audit;
@@ -118,11 +173,10 @@ DROP TABLE IF EXISTS parts.DOG_Access_Level;
DROP TABLE IF EXISTS parts.DOG_User_Change_Set;
-/*
+
DROP TABLE IF EXISTS parts.CORE_Split_Key_Value_Pair_Csv_Temp;
DROP TABLE IF EXISTS parts.CORE_Split_Temp;
-*/
DROP TABLE IF EXISTS parts.CORE_File_Type;
DROP TABLE IF EXISTS parts.CORE_Msg_Error_Type;
@@ -130,6 +184,8 @@ DROP TABLE IF EXISTS parts.CORE_Msg_Error_Type;
DROP PROCEDURE IF EXISTS parts.p_DOG_test_get_many_dog_command;
DROP PROCEDURE IF EXISTS parts.p_DOG_test_get_many_command;
DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_command;
+DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_dog_command;
+DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_dog_command_link;
DROP PROCEDURE IF EXISTS parts.p_DOG_test_save_command;
DROP PROCEDURE IF EXISTS parts.p_DOG_save_command;
diff --git a/static/MySQL/0000_combined.sql b/static/MySQL/0000_combined.sql
deleted file mode 100644
index 060701e..0000000
--- a/static/MySQL/0000_combined.sql
+++ /dev/null
@@ -1,672 +0,0 @@
-
-USE demo;
-
-DROP PROCEDURE IF EXISTS demo.p_DOG_get_many_dog_command;
-
-DELIMITER //
-CREATE PROCEDURE demo.p_DOG_get_many_dog_command (
- IN a_id_user INT
- , IN a_get_all_dog BIT
- , IN a_get_inactive_dog BIT
- , IN a_ids_dog TEXT
- , IN a_get_all_command BIT
- , IN a_get_inactive_command BIT
- , IN a_ids_command TEXT
- , IN a_get_all_understanding_level BIT
- , IN a_get_inactive_understanding_level BIT
- , IN a_ids_understanding_level TEXT
- , IN a_get_all_obedience_level BIT
- , IN a_get_inactive_obedience_level BIT
- , IN a_ids_obedience_level TEXT
- , IN a_debug BIT
-)
-BEGIN
- DECLARE v_code_type_error_bad_data VARCHAR(100);
- DECLARE v_code_type_error_no_permission VARCHAR(100);
- DECLARE v_id_type_error_bad_data INT;
- DECLARE v_id_type_error_no_permission INT;
- DECLARE v_has_filter_command BIT;
- DECLARE v_has_filter_dog BIT;
- DECLARE v_has_filter_obedience_level BIT;
- DECLARE v_has_filter_understanding_level BIT;
- DECLARE v_guid BINARY(36);
- DECLARE v_id_permission_dog_view INT;
- DECLARE v_id_minimum INT;
- DECLARE v_time_start TIMESTAMP(6);
- DECLARE v_can_view BIT;
-
- 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(100) NOT NULL
- , msg VARCHAR(4000) 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 a_id_user := IFNULL(a_id_user, 0);
- SET a_get_all_dog := IFNULL(a_get_all_dog, 0);
- SET a_get_inactive_dog := IFNULL(a_get_inactive_dog, 0);
- SET a_ids_dog := TRIM(IFNULL(a_ids_dog, ''));
- SET a_get_all_command := IFNULL(a_get_all_command, 0);
- SET a_get_inactive_command := IFNULL(a_get_inactive_command, 0);
- SET a_ids_command := TRIM(IFNULL(a_ids_command, ''));
- SET a_get_all_understanding_level := IFNULL(a_get_all_understanding_level, 0);
- SET a_get_inactive_understanding_level := IFNULL(a_get_inactive_understanding_level, 0);
- SET a_ids_understanding_level := TRIM(IFNULL(a_ids_understanding_level, ''));
- SET a_get_all_obedience_level := IFNULL(a_get_all_obedience_level, 0);
- SET a_get_inactive_obedience_level := IFNULL(a_get_inactive_obedience_level, 0);
- SET a_ids_obedience_level := TRIM(IFNULL(a_ids_obedience_level, ''));
- SET a_debug := IFNULL(a_debug, 0);
-
- IF a_debug = 1 THEN
- SELECT
- a_id_user
- , a_get_all_dog
- , a_get_inactive_dog
- , a_ids_dog
- , a_get_all_command
- , a_get_inactive_command
- , a_ids_command
- , a_get_all_understanding_level
- , a_get_inactive_understanding_level
- , a_ids_understanding_level
- , a_get_all_obedience_level
- , a_get_inactive_obedience_level
- , a_ids_obedience_level
- , 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_Split;
- DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
- DROP TEMPORARY TABLE IF EXISTS tmp_Obedience_Level;
- DROP TEMPORARY TABLE IF EXISTS tmp_Understanding_Level;
- DROP TEMPORARY TABLE IF EXISTS tmp_Command;
- DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
-
- CREATE TEMPORARY TABLE tmp_Dog (
- id_dog INT NOT NULL
- , name VARCHAR(250)
- );
-
- CREATE TEMPORARY TABLE tmp_Command (
- id_command INT NOT NULL
- , id_command_category INT NOT NULL
- , name_command_category VARCHAR(250)
- , has_button
- -- , code VARCHAR(100)
- , name VARCHAR(250)
- );
-
- CREATE TEMPORARY TABLE tmp_Understanding_Level (
- id_understanding_level INT NOT NULL
- , code VARCHAR(100)
- , name VARCHAR(250)
- );
-
- CREATE TEMPORARY TABLE tmp_Obedience_Level (
- id_obedience_level INT NOT NULL
- , code VARCHAR(100)
- , name 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(100) NOT NULL
- , msg VARCHAR(4000) NOT NULL
- );
-
- CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
- substring VARCHAR(4000) NOT NULL
- , as_int INT NULL
- );
- DELETE FROM tmp_Split;
-
- CALL demo.p_core_validate_guid ( v_guid );
-
- SET v_has_filter_dog = CASE WHEN a_ids_dog = '' THEN 0 ELSE 1 END;
- SET v_has_filter_command = CASE WHEN a_ids_command = '' THEN 0 ELSE 1 END;
- SET v_has_filter_understanding_level = CASE WHEN a_ids_understanding_level = '' THEN 0 ELSE 1 END;
- SET v_has_filter_obedience_level = CASE WHEN a_ids_obedience_level = '' THEN 0 ELSE 1 END;
-
- -- Dogs
- IF v_has_filter_dog = 1 THEN
- CALL demo.p_split(v_guid, a_ids_dog, ',', a_debug);
-
- INSERT INTO tmp_Split (
- substring
- , as_int
- )
- SELECT
- SPLIT_T.substring
- , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
- FROM demo.CORE_Split_Temp SPLIT_T
- WHERE
- SPLIT_T.GUID = v_guid
- AND IFNULL(SPLIT_T.substring, '') <> ''
- ;
-
- CALL demo.p_clear_split_temp( v_guid );
- END IF;
-
- 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 EXISTS (
- SELECT *
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(DOG.id_dog)
- OR (
- DOG.active = 0
- AND a_get_inactive_dog = 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('Invalid or inactive Dog IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(DOG.id_dog)
- OR (
- DOG.active = 0
- AND a_get_inactive_dog = 0
- )
- ;
- ELSE
- INSERT INTO tmp_Dog (
- id_dog
- , name
- )
- SELECT
- DOG.id_dog
- , DOG.name
- FROM tmp_Split t_SPLIT
- RIGHT JOIN demo.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
- WHERE
- (
- a_get_all_dog = 1
- OR (
- v_has_filter_dog = 1
- AND NOT ISNULL(t_SPLIT.as_int)
- )
- )
- AND (
- a_get_inactive_dog = 1
- OR DOG.active = 1
- )
- ;
- END IF;
- END IF;
-
- DELETE FROM tmp_Split;
-
- -- Commands
- IF v_has_filter_command = 1 THEN
- CALL demo.p_split(v_guid, a_ids_command, ',', a_debug);
-
- INSERT INTO tmp_Split (
- substring
- , as_int
- )
- SELECT
- substring
- , CONVERT(substring, DECIMAL(10,0)) AS as_int
- FROM demo.CORE_Split_Temp
- WHERE
- GUID = v_guid
- AND NOT ISNULL(substring)
- AND substring <> ''
- ;
-
- CALL demo.p_clear_split_temp( v_guid );
- END IF;
-
- 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 EXISTS (
- SELECT *
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Command COMMAND ON t_SPLIT.as_int = COMMAND.id_command
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(COMMAND.id_command)
- OR (
- COMMAND.active = 0
- AND a_get_inactive_command = 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('Invalid or inactive Command IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Command COMMAND ON t_SPLIT.as_int = COMMAND.id_command
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(COMMAND.id_command)
- OR (
- COMMAND.active = 0
- AND a_get_inactive_command = 0
- )
- ;
- ELSE
- INSERT INTO tmp_Command (
- id_command
- , id_command_category
- , name_command_category
- , name
- )
- SELECT
- COMMAND.id_command
- , COMMAND.id_command_category
- , COMMAND_CATEGORY.name AS name_command_category
- -- , COMMAND.code
- , COMMAND.name
- FROM tmp_Split t_SPLIT
- RIGHT JOIN demo.DOG_Command COMMAND ON t_SPLIT.as_int = COMMAND.id_command
- LEFT JOIN demo.DOG_Command_Category COMMAND_CATEGORY ON COMMAND.id_command_category = COMMAND_CATEGORY.id_command_category
- WHERE
- (
- a_get_all_command = 1
- OR (
- v_has_filter_command = 1
- AND NOT ISNULL(t_SPLIT.as_int)
- )
- )
- AND (
- a_get_inactive_command = 1
- OR COMMAND.active = 1
- )
- ;
- END IF;
- END IF;
-
- DELETE FROM tmp_Split;
-
- -- Understanding Levels
- IF v_has_filter_understanding_level = 1 THEN
- CALL demo.p_split(v_guid, a_ids_understanding_level, ',', a_debug);
-
- INSERT INTO tmp_Split (
- substring
- , as_int
- )
- SELECT
- substring
- , CONVERT(substring, DECIMAL(10,0)) AS as_int
- FROM demo.CORE_Split_Temp
- WHERE
- GUID = v_guid
- AND NOT ISNULL(substring)
- AND substring <> ''
- ;
-
- CALL demo.p_clear_split_temp( v_guid );
- END IF;
-
- 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 EXISTS (
- SELECT *
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT.as_int = UNDERSTANDING_LEVEL.id_understanding_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(UNDERSTANDING_LEVEL.id_understanding_level)
- OR (
- UNDERSTANDING_LEVEL.active = 0
- AND a_get_inactive_understanding_level = 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('Invalid or inactive Understanding Level IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT.as_int = UNDERSTANDING_LEVEL.id_understanding_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(UNDERSTANDING_LEVEL.id_understanding_level)
- OR (
- UNDERSTANDING_LEVEL.active = 0
- AND a_get_inactive_understanding_level = 0
- )
- ;
- ELSE
- INSERT INTO tmp_Understanding_Level (
- id_understanding_level
- , code
- , name
- )
- SELECT
- UNDERSTANDING_LEVEL.id_understanding_level
- , UNDERSTANDING_LEVEL.code
- , UNDERSTANDING_LEVEL.name
- FROM tmp_Split t_SPLIT
- RIGHT JOIN demo.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT.as_int = UNDERSTANDING_LEVEL.id_understanding_level
- WHERE
- (
- a_get_all_understanding_level = 1
- OR (
- v_has_filter_understanding_level = 1
- AND NOT ISNULL(t_SPLIT.as_int)
- )
- )
- AND (
- a_get_inactive_understanding_level = 1
- OR UNDERSTANDING_LEVEL.active = 1
- )
- ;
- END IF;
- END IF;
-
- DELETE FROM tmp_Split;
-
- -- Obedience Levels
- IF v_has_filter_obedience_level = 1 THEN
- CALL demo.p_split(v_guid, a_ids_obedience_level, ',', a_debug);
-
- INSERT INTO tmp_Split (
- substring
- , as_int
- )
- SELECT
- substring
- , CONVERT(substring, DECIMAL(10,0)) AS as_int
- FROM demo.CORE_Split_Temp
- WHERE
- GUID = v_guid
- AND NOT ISNULL(substring)
- AND substring <> ''
- ;
-
- CALL demo.p_clear_split_temp( v_guid );
- END IF;
-
- 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 EXISTS (
- SELECT *
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_SPLIT.as_int = OBEDIENCE_LEVEL.id_obedience_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(OBEDIENCE_LEVEL.id_obedience_level)
- OR (
- OBEDIENCE_LEVEL.active = 0
- AND a_get_inactive_obedience_level = 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('Invalid or inactive Obedience Level IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
- FROM tmp_Split t_SPLIT
- LEFT JOIN demo.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_SPLIT.as_int = OBEDIENCE_LEVEL.id_obedience_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(OBEDIENCE_LEVEL.id_obedience_level)
- OR (
- OBEDIENCE_LEVEL.active = 0
- AND a_get_inactive_obedience_level = 0
- )
- ;
- ELSE
- INSERT INTO tmp_Obedience_Level (
- id_obedience_level
- , code
- , name
- )
- SELECT
- OBEDIENCE_LEVEL.id_obedience_level
- , OBEDIENCE_LEVEL.code
- , OBEDIENCE_LEVEL.name
- FROM tmp_Split t_SPLIT
- RIGHT JOIN demo.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_SPLIT.as_int = OBEDIENCE_LEVEL.id_obedience_level
- WHERE
- (
- a_get_all_obedience_level = 1
- OR (
- v_has_filter_obedience_level = 1
- AND NOT ISNULL(t_SPLIT.as_int)
- )
- )
- AND (
- a_get_inactive_obedience_level = 1
- OR OBEDIENCE_LEVEL.active = 1
- )
- ;
- END IF;
- END IF;
-
- DELETE FROM tmp_Split;
-
-
- -- Permissions
- IF a_debug = 1 THEN
- SELECT
- v_guid
- , a_id_user
- , FALSE -- a_get_inactive_user
- , v_id_permission_dog_view
- , 0 -- a_debug
- ;
- END IF;
-
- CALL demo.p_DOG_calc_user(
- v_guid
- , a_id_user
- , FALSE -- a_get_inactive_user
- , v_id_permission_dog_view
- , 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;
- 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 Commands.'
- )
- ;
- END IF;
-
- CALL demo.p_DOG_clear_calc_user(
- v_guid
- , 0 -- a_debug
- );
-
- 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_Dog;
- SELECT * FROM tmp_Command;
- SELECT * FROM tmp_Obedience_Level;
- END IF;
-
- DELETE FROM tmp_Dog;
- DELETE FROM tmp_Command;
- SELECT * FROM tmp_Understanding_Level;
- DELETE FROM tmp_Obedience_Level;
- END IF;
-
- -- Outputs
- -- Commands
- SELECT
- DOG_COMMAND_LINK.id_link AS id_dog_command_link
- , t_DOG.id_dog
- , t_DOG.name AS name_dog
- , t_COMMAND.id_command_category
- , t_COMMAND.name_command_category
- , t_COMMAND.id_command
- -- , t_COMMAND.code
- , t_COMMAND.name AS name_command
- , t_UNDERSTANDING_LEVEL.id_understanding_level
- , t_UNDERSTANDING_LEVEL.code AS code_understanding_level
- , t_UNDERSTANDING_LEVEL.name AS name_understanding_level
- , t_OBEDIENCE_LEVEL.id_obedience_level
- , t_OBEDIENCE_LEVEL.code AS code_obedience_level
- , t_OBEDIENCE_LEVEL.name AS name_obedience_level
- , DOG_COMMAND_LINK.hand_signal_description
- , DOG_COMMAND_LINK.notes
- , DOG_COMMAND_LINK.active
- FROM demo.DOG_Dog_Command_Link DOG_COMMAND_LINK
- INNER JOIN tmp_Dog t_DOG ON DOG_COMMAND_LINK.id_dog = t_DOG.id_dog
- INNER JOIN tmp_Command t_COMMAND ON DOG_COMMAND_LINK.id_command = t_COMMAND.id_command
- INNER JOIN tmp_Understanding_Level t_UNDERSTANDING_LEVEL ON DOG_COMMAND_LINK.id_understanding_level = t_UNDERSTANDING_LEVEL.id_understanding_level
- INNER JOIN tmp_Obedience_Level t_OBEDIENCE_LEVEL ON DOG_COMMAND_LINK.id_obedience_level = t_OBEDIENCE_LEVEL.id_obedience_level
- ;
-
- -- 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_Dog;
- SELECT * FROM tmp_Command;
- SELECT * FROM tmp_Understanding_Level;
- SELECT * FROM tmp_Obedience_Level;
- END IF;
-
- DROP TEMPORARY TABLE IF EXISTS tmp_Split;
- DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
- DROP TEMPORARY TABLE IF EXISTS tmp_Obedience_Level;
- DROP TEMPORARY TABLE IF EXISTS tmp_Understanding_Level;
- DROP TEMPORARY TABLE IF EXISTS tmp_Command;
- DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
-
- 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_dog_command (
- 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
- , 1 -- a_get_all_dog
- , 0 -- a_get_inactive_dog
- , '' -- a_ids_dog
- , 1 -- a_get_all_command
- , 0 -- a_get_inactive_command
- , '' -- a_ids_command
- , 1 -- a_get_all_understanding_level
- , 0 -- a_get_inactive_understanding_level
- , '' -- a_ids_understanding_level
- , 1 -- a_get_all_obedience_level
- , 0 -- a_get_inactive_obedience_level
- , '' -- a_ids_obedience_level
- , 1 -- a_debug
-);
-
-*/
\ No newline at end of file
diff --git a/static/MySQL/1000_tbl_CORE_Msg_Error_Type.sql b/static/MySQL/10000_tbl_CORE_Msg_Error_Type.sql
similarity index 100%
rename from static/MySQL/1000_tbl_CORE_Msg_Error_Type.sql
rename to static/MySQL/10000_tbl_CORE_Msg_Error_Type.sql
diff --git a/static/MySQL/1020_tbl_CORE_File_Type.sql b/static/MySQL/10004_tbl_CORE_File_Type.sql
similarity index 100%
rename from static/MySQL/1020_tbl_CORE_File_Type.sql
rename to static/MySQL/10004_tbl_CORE_File_Type.sql
diff --git a/static/MySQL/1090_tbl_CORE_Split_Temp.sql b/static/MySQL/10020_tbl_CORE_Split_Temp.sql
similarity index 100%
rename from static/MySQL/1090_tbl_CORE_Split_Temp.sql
rename to static/MySQL/10020_tbl_CORE_Split_Temp.sql
diff --git a/static/MySQL/1091_tbl_CORE_Split_Key_Value_Pair_Csv_Temp.sql b/static/MySQL/10021_tbl_CORE_Split_Key_Value_Pair_Csv_Temp.sql
similarity index 100%
rename from static/MySQL/1091_tbl_CORE_Split_Key_Value_Pair_Csv_Temp.sql
rename to static/MySQL/10021_tbl_CORE_Split_Key_Value_Pair_Csv_Temp.sql
diff --git a/static/MySQL/1100_tbl_DOG_User_Change_Set.sql b/static/MySQL/10500_tbl_DOG_User_Change_Set.sql
similarity index 100%
rename from static/MySQL/1100_tbl_DOG_User_Change_Set.sql
rename to static/MySQL/10500_tbl_DOG_User_Change_Set.sql
diff --git a/static/MySQL/1104_tbl_DOG_Access_Level.sql b/static/MySQL/10504_tbl_DOG_Access_Level.sql
similarity index 100%
rename from static/MySQL/1104_tbl_DOG_Access_Level.sql
rename to static/MySQL/10504_tbl_DOG_Access_Level.sql
diff --git a/static/MySQL/1108_tbl_DOG_Permission_Group.sql b/static/MySQL/10508_tbl_DOG_Permission_Group.sql
similarity index 100%
rename from static/MySQL/1108_tbl_DOG_Permission_Group.sql
rename to static/MySQL/10508_tbl_DOG_Permission_Group.sql
diff --git a/static/MySQL/1112_tbl_DOG_Permission.sql b/static/MySQL/10512_tbl_DOG_Permission.sql
similarity index 100%
rename from static/MySQL/1112_tbl_DOG_Permission.sql
rename to static/MySQL/10512_tbl_DOG_Permission.sql
diff --git a/static/MySQL/1116_tbl_DOG_User.sql b/static/MySQL/10516_tbl_DOG_User.sql
similarity index 100%
rename from static/MySQL/1116_tbl_DOG_User.sql
rename to static/MySQL/10516_tbl_DOG_User.sql
diff --git a/static/MySQL/1118_tbl_DOG_User_Audit.sql b/static/MySQL/10517_tbl_DOG_User_Audit.sql
similarity index 100%
rename from static/MySQL/1118_tbl_DOG_User_Audit.sql
rename to static/MySQL/10517_tbl_DOG_User_Audit.sql
diff --git a/static/MySQL/1119_tbl_DOG_User_Temp.sql b/static/MySQL/10518_tbl_DOG_User_Temp.sql
similarity index 100%
rename from static/MySQL/1119_tbl_DOG_User_Temp.sql
rename to static/MySQL/10518_tbl_DOG_User_Temp.sql
diff --git a/static/MySQL/1120_tbl_DOG_Role.sql b/static/MySQL/10520_tbl_DOG_Role.sql
similarity index 100%
rename from static/MySQL/1120_tbl_DOG_Role.sql
rename to static/MySQL/10520_tbl_DOG_Role.sql
diff --git a/static/MySQL/1121_tbl_DOG_Role_Audit.sql b/static/MySQL/10521_tbl_DOG_Role_Audit.sql
similarity index 100%
rename from static/MySQL/1121_tbl_DOG_Role_Audit.sql
rename to static/MySQL/10521_tbl_DOG_Role_Audit.sql
diff --git a/static/MySQL/1124_tbl_DOG_Role_Permission_Link.sql b/static/MySQL/10524_tbl_DOG_Role_Permission_Link.sql
similarity index 100%
rename from static/MySQL/1124_tbl_DOG_Role_Permission_Link.sql
rename to static/MySQL/10524_tbl_DOG_Role_Permission_Link.sql
diff --git a/static/MySQL/1125_tbl_DOG_Role_Permission_Link_Audit.sql b/static/MySQL/10525_tbl_DOG_Role_Permission_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1125_tbl_DOG_Role_Permission_Link_Audit.sql
rename to static/MySQL/10525_tbl_DOG_Role_Permission_Link_Audit.sql
diff --git a/static/MySQL/1128_tbl_DOG_User_Role_Link.sql b/static/MySQL/10528_tbl_DOG_User_Role_Link.sql
similarity index 100%
rename from static/MySQL/1128_tbl_DOG_User_Role_Link.sql
rename to static/MySQL/10528_tbl_DOG_User_Role_Link.sql
diff --git a/static/MySQL/1129_tbl_DOG_User_Role_Link_Audit.sql b/static/MySQL/10529_tbl_DOG_User_Role_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1129_tbl_DOG_User_Role_Link_Audit.sql
rename to static/MySQL/10529_tbl_DOG_User_Role_Link_Audit.sql
diff --git a/static/MySQL/1130_tbl_DOG_Calc_User_Temp.sql b/static/MySQL/10530_tbl_DOG_Calc_User_Temp.sql
similarity index 100%
rename from static/MySQL/1130_tbl_DOG_Calc_User_Temp.sql
rename to static/MySQL/10530_tbl_DOG_Calc_User_Temp.sql
diff --git a/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql b/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql
new file mode 100644
index 0000000..54253a3
--- /dev/null
+++ b/static/MySQL/10700_tbl_DOG_Unit_Measurement.sql
@@ -0,0 +1,25 @@
+
+# Unit of Measurement
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Unit_Measurement'
+;
+
+CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement (
+ id_unit_measurement INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , name_singular VARCHAR(255) NOT NULL
+ , name_plural VARCHAR(256) NOT NULL
+ , symbol VARCHAR(50) NOT NULL
+ , symbol_is_suffix_not_prefix BIT NOT NULL DEFAULT 1
+ , is_base_unit BIT NOT NULL DEFAULT 0
+ , is_unit_of_distance BIT NOT NULL DEFAULT 0
+ , is_unit_of_mass BIT NOT NULL DEFAULT 0
+ , is_unit_of_time BIT NOT NULL DEFAULT 0
+ , is_unit_of_volume BIT NOT NULL DEFAULT 0
+ , active BIT NOT NULL DEFAULT 1
+);
diff --git a/static/MySQL/10704_tbl_DOG_Unit_Measurement_Conversion.sql b/static/MySQL/10704_tbl_DOG_Unit_Measurement_Conversion.sql
new file mode 100644
index 0000000..d04b2f2
--- /dev/null
+++ b/static/MySQL/10704_tbl_DOG_Unit_Measurement_Conversion.sql
@@ -0,0 +1,22 @@
+
+# Unit of Measurement Conversion
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Unit_Measurement_Conversion'
+;
+
+CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement_Conversion (
+ id_conversion INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_unit_derived INT NOT NULL
+ , id_unit_base INT NOT NULL
+ , multiplier_unit_base FLOAT NOT NULL
+ , increment_unit_base FLOAT NOT NULL
+ , apply_multiplier_before_increment BIT NOT NULL DEFAULT 1
+ , active BIT NOT NULL DEFAULT 1
+ , display_order INT NOT NULL
+);
diff --git a/static/MySQL/1200_tbl_DOG_Dog_Change_Set.sql b/static/MySQL/11000_tbl_DOG_Dog_Change_Set.sql
similarity index 100%
rename from static/MySQL/1200_tbl_DOG_Dog_Change_Set.sql
rename to static/MySQL/11000_tbl_DOG_Dog_Change_Set.sql
diff --git a/static/MySQL/1201_tbl_DOG_Dog.sql b/static/MySQL/11001_tbl_DOG_Dog.sql
similarity index 100%
rename from static/MySQL/1201_tbl_DOG_Dog.sql
rename to static/MySQL/11001_tbl_DOG_Dog.sql
diff --git a/static/MySQL/1202_tbl_DOG_Dog_Audit.sql b/static/MySQL/11002_tbl_DOG_Dog_Audit.sql
similarity index 100%
rename from static/MySQL/1202_tbl_DOG_Dog_Audit.sql
rename to static/MySQL/11002_tbl_DOG_Dog_Audit.sql
diff --git a/static/MySQL/1203_tbl_DOG_Dog_Temp.sql b/static/MySQL/11003_tbl_DOG_Dog_Temp.sql
similarity index 100%
rename from static/MySQL/1203_tbl_DOG_Dog_Temp.sql
rename to static/MySQL/11003_tbl_DOG_Dog_Temp.sql
diff --git a/static/MySQL/1205_tbl_DOG_Breed.sql b/static/MySQL/11005_tbl_DOG_Breed.sql
similarity index 100%
rename from static/MySQL/1205_tbl_DOG_Breed.sql
rename to static/MySQL/11005_tbl_DOG_Breed.sql
diff --git a/static/MySQL/1206_tbl_DOG_Breed_Audit.sql b/static/MySQL/11006_tbl_DOG_Breed_Audit.sql
similarity index 100%
rename from static/MySQL/1206_tbl_DOG_Breed_Audit.sql
rename to static/MySQL/11006_tbl_DOG_Breed_Audit.sql
diff --git a/static/MySQL/1207_tbl_DOG_Breed_Temp.sql b/static/MySQL/11007_tbl_DOG_Breed_Temp.sql
similarity index 100%
rename from static/MySQL/1207_tbl_DOG_Breed_Temp.sql
rename to static/MySQL/11007_tbl_DOG_Breed_Temp.sql
diff --git a/static/MySQL/1209_tbl_DOG_Dog_Breed_Link.sql b/static/MySQL/11009_tbl_DOG_Dog_Breed_Link.sql
similarity index 100%
rename from static/MySQL/1209_tbl_DOG_Dog_Breed_Link.sql
rename to static/MySQL/11009_tbl_DOG_Dog_Breed_Link.sql
diff --git a/static/MySQL/1210_tbl_DOG_Dog_Breed_Link_Audit.sql b/static/MySQL/11010_tbl_DOG_Dog_Breed_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1210_tbl_DOG_Dog_Breed_Link_Audit.sql
rename to static/MySQL/11010_tbl_DOG_Dog_Breed_Link_Audit.sql
diff --git a/static/MySQL/1211_tbl_DOG_Dog_Breed_Link_Temp.sql b/static/MySQL/11011_tbl_DOG_Dog_Breed_Link_Temp.sql
similarity index 100%
rename from static/MySQL/1211_tbl_DOG_Dog_Breed_Link_Temp.sql
rename to static/MySQL/11011_tbl_DOG_Dog_Breed_Link_Temp.sql
diff --git a/static/MySQL/1257_tbl_DOG_Drive.sql b/static/MySQL/11030_tbl_DOG_Drive.sql
similarity index 100%
rename from static/MySQL/1257_tbl_DOG_Drive.sql
rename to static/MySQL/11030_tbl_DOG_Drive.sql
diff --git a/static/MySQL/1258_tbl_DOG_Drive_Audit.sql b/static/MySQL/11031_tbl_DOG_Drive_Audit.sql
similarity index 100%
rename from static/MySQL/1258_tbl_DOG_Drive_Audit.sql
rename to static/MySQL/11031_tbl_DOG_Drive_Audit.sql
diff --git a/static/MySQL/1259_tbl_DOG_Drive_Temp.sql b/static/MySQL/11032_tbl_DOG_Drive_Temp.sql
similarity index 100%
rename from static/MySQL/1259_tbl_DOG_Drive_Temp.sql
rename to static/MySQL/11032_tbl_DOG_Drive_Temp.sql
diff --git a/static/MySQL/1261_tbl_DOG_Dog_Drive_Link.sql b/static/MySQL/11034_tbl_DOG_Dog_Drive_Link.sql
similarity index 100%
rename from static/MySQL/1261_tbl_DOG_Dog_Drive_Link.sql
rename to static/MySQL/11034_tbl_DOG_Dog_Drive_Link.sql
diff --git a/static/MySQL/1262_tbl_DOG_Dog_Drive_Link_Audit.sql b/static/MySQL/11035_tbl_DOG_Dog_Drive_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1262_tbl_DOG_Dog_Drive_Link_Audit.sql
rename to static/MySQL/11035_tbl_DOG_Dog_Drive_Link_Audit.sql
diff --git a/static/MySQL/1263_tbl_DOG_Dog_Drive_Link_Temp.sql b/static/MySQL/11036_tbl_DOG_Dog_Drive_Link_Temp.sql
similarity index 100%
rename from static/MySQL/1263_tbl_DOG_Dog_Drive_Link_Temp.sql
rename to static/MySQL/11036_tbl_DOG_Dog_Drive_Link_Temp.sql
diff --git a/static/MySQL/1217_tbl_DOG_Command_Category.sql b/static/MySQL/11100_tbl_DOG_Command_Category.sql
similarity index 100%
rename from static/MySQL/1217_tbl_DOG_Command_Category.sql
rename to static/MySQL/11100_tbl_DOG_Command_Category.sql
diff --git a/static/MySQL/1218_tbl_DOG_Command_Category_Audit.sql b/static/MySQL/11101_tbl_DOG_Command_Category_Audit.sql
similarity index 100%
rename from static/MySQL/1218_tbl_DOG_Command_Category_Audit.sql
rename to static/MySQL/11101_tbl_DOG_Command_Category_Audit.sql
diff --git a/static/MySQL/1219_tbl_DOG_Command_Category_Temp.sql b/static/MySQL/11102_tbl_DOG_Command_Category_Temp.sql
similarity index 100%
rename from static/MySQL/1219_tbl_DOG_Command_Category_Temp.sql
rename to static/MySQL/11102_tbl_DOG_Command_Category_Temp.sql
diff --git a/static/MySQL/1221_tbl_DOG_Command.sql b/static/MySQL/11104_tbl_DOG_Command.sql
similarity index 100%
rename from static/MySQL/1221_tbl_DOG_Command.sql
rename to static/MySQL/11104_tbl_DOG_Command.sql
diff --git a/static/MySQL/1222_tbl_DOG_Command_Audit.sql b/static/MySQL/11105_tbl_DOG_Command_Audit.sql
similarity index 100%
rename from static/MySQL/1222_tbl_DOG_Command_Audit.sql
rename to static/MySQL/11105_tbl_DOG_Command_Audit.sql
diff --git a/static/MySQL/1223_tbl_DOG_Command_Temp.sql b/static/MySQL/11106_tbl_DOG_Command_Temp.sql
similarity index 100%
rename from static/MySQL/1223_tbl_DOG_Command_Temp.sql
rename to static/MySQL/11106_tbl_DOG_Command_Temp.sql
diff --git a/static/MySQL/1225_tbl_DOG_Dog_Command_Link.sql b/static/MySQL/11108_tbl_DOG_Dog_Command_Link.sql
similarity index 99%
rename from static/MySQL/1225_tbl_DOG_Dog_Command_Link.sql
rename to static/MySQL/11108_tbl_DOG_Dog_Command_Link.sql
index 3df793b..a6a8470 100644
--- a/static/MySQL/1225_tbl_DOG_Dog_Command_Link.sql
+++ b/static/MySQL/11108_tbl_DOG_Dog_Command_Link.sql
@@ -18,6 +18,7 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Dog_Command_Link (
, CONSTRAINT FK_DOG_Dog_Command_Link_id_command
FOREIGN KEY (id_command)
REFERENCES parts.DOG_Command(id_command)
+ /*
, id_understanding_level INT NOT NULL
, CONSTRAINT FK_DOG_Dog_Command_Link_id_understanding_level
FOREIGN KEY (id_understanding_level)
@@ -26,6 +27,7 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Dog_Command_Link (
, CONSTRAINT FK_DOG_Dog_Command_Link_id_obedience_level
FOREIGN KEY (id_obedience_level)
REFERENCES parts.DOG_Obedience_Level(id_obedience_level)
+ */
, hand_signal_description TEXT
, notes TEXT
-- , has_button BIT NOT NULL DEFAULT 0
diff --git a/static/MySQL/1226_tbl_DOG_Dog_Command_Link_Audit.sql b/static/MySQL/11109_tbl_DOG_Dog_Command_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1226_tbl_DOG_Dog_Command_Link_Audit.sql
rename to static/MySQL/11109_tbl_DOG_Dog_Command_Link_Audit.sql
diff --git a/static/MySQL/1227_tbl_DOG_Dog_Command_Link_Temp.sql b/static/MySQL/11110_tbl_DOG_Dog_Command_Link_Temp.sql
similarity index 97%
rename from static/MySQL/1227_tbl_DOG_Dog_Command_Link_Temp.sql
rename to static/MySQL/11110_tbl_DOG_Dog_Command_Link_Temp.sql
index 236d7ee..0e95118 100644
--- a/static/MySQL/1227_tbl_DOG_Dog_Command_Link_Temp.sql
+++ b/static/MySQL/11110_tbl_DOG_Dog_Command_Link_Temp.sql
@@ -13,8 +13,10 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Dog_Command_Link_Temp (
, id_link INT
, id_dog INT
, id_command INT
+ /*
, id_understanding_level INT
, id_obedience_level INT
+ */
, hand_signal_description TEXT
, notes TEXT
-- , has_button BIT
diff --git a/static/MySQL/11111_tbl_DOG_Command_Modality.sql b/static/MySQL/11111_tbl_DOG_Command_Modality.sql
new file mode 100644
index 0000000..7b34cd5
--- /dev/null
+++ b/static/MySQL/11111_tbl_DOG_Command_Modality.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Command_Modality'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Command_Modality (
+ id_command_modality INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Command_Modality_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Command_Modality_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11112_tbl_DOG_Command_Modality_Audit.sql b/static/MySQL/11112_tbl_DOG_Command_Modality_Audit.sql
new file mode 100644
index 0000000..b3dc453
--- /dev/null
+++ b/static/MySQL/11112_tbl_DOG_Command_Modality_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Command_Modality_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Command_Modality_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_command_modality INT NOT NULL
+ , CONSTRAINT FK_DOG_Command_Modality_Audit_id_command_modality
+ FOREIGN KEY (id_command_modality)
+ REFERENCES parts.DOG_Command_Modality(id_command_modality)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Command_Modality_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11113_tbl_DOG_Command_Modality_Temp.sql b/static/MySQL/11113_tbl_DOG_Command_Modality_Temp.sql
new file mode 100644
index 0000000..df6c2c7
--- /dev/null
+++ b/static/MySQL/11113_tbl_DOG_Command_Modality_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Command_Modality_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Command_Modality_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_command_modality INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/1229_tbl_DOG_Location.sql b/static/MySQL/11200_tbl_DOG_Location.sql
similarity index 100%
rename from static/MySQL/1229_tbl_DOG_Location.sql
rename to static/MySQL/11200_tbl_DOG_Location.sql
diff --git a/static/MySQL/1230_tbl_DOG_Location_Audit.sql b/static/MySQL/11201_tbl_DOG_Location_Audit.sql
similarity index 100%
rename from static/MySQL/1230_tbl_DOG_Location_Audit.sql
rename to static/MySQL/11201_tbl_DOG_Location_Audit.sql
diff --git a/static/MySQL/1231_tbl_DOG_Location_Temp.sql b/static/MySQL/11202_tbl_DOG_Location_Temp.sql
similarity index 100%
rename from static/MySQL/1231_tbl_DOG_Location_Temp.sql
rename to static/MySQL/11202_tbl_DOG_Location_Temp.sql
diff --git a/static/MySQL/1233_tbl_DOG_Location_Link.sql b/static/MySQL/11204_tbl_DOG_Location_Link.sql
similarity index 100%
rename from static/MySQL/1233_tbl_DOG_Location_Link.sql
rename to static/MySQL/11204_tbl_DOG_Location_Link.sql
diff --git a/static/MySQL/1234_tbl_DOG_Location_Link_Audit.sql b/static/MySQL/11205_tbl_DOG_Location_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1234_tbl_DOG_Location_Link_Audit.sql
rename to static/MySQL/11205_tbl_DOG_Location_Link_Audit.sql
diff --git a/static/MySQL/1235_tbl_DOG_Location_Link_Temp.sql b/static/MySQL/11206_tbl_DOG_Location_Link_Temp.sql
similarity index 100%
rename from static/MySQL/1235_tbl_DOG_Location_Link_Temp.sql
rename to static/MySQL/11206_tbl_DOG_Location_Link_Temp.sql
diff --git a/static/MySQL/1241_tbl_DOG_Button_Shape.sql b/static/MySQL/11220_tbl_DOG_Button_Shape.sql
similarity index 100%
rename from static/MySQL/1241_tbl_DOG_Button_Shape.sql
rename to static/MySQL/11220_tbl_DOG_Button_Shape.sql
diff --git a/static/MySQL/1242_tbl_DOG_Button_Shape_Audit.sql b/static/MySQL/11221_tbl_DOG_Button_Shape_Audit.sql
similarity index 100%
rename from static/MySQL/1242_tbl_DOG_Button_Shape_Audit.sql
rename to static/MySQL/11221_tbl_DOG_Button_Shape_Audit.sql
diff --git a/static/MySQL/1243_tbl_DOG_Button_Shape_Temp.sql b/static/MySQL/11222_tbl_DOG_Button_Shape_Temp.sql
similarity index 100%
rename from static/MySQL/1243_tbl_DOG_Button_Shape_Temp.sql
rename to static/MySQL/11222_tbl_DOG_Button_Shape_Temp.sql
diff --git a/static/MySQL/1237_tbl_DOG_Colour.sql b/static/MySQL/11224_tbl_DOG_Colour.sql
similarity index 100%
rename from static/MySQL/1237_tbl_DOG_Colour.sql
rename to static/MySQL/11224_tbl_DOG_Colour.sql
diff --git a/static/MySQL/1238_tbl_DOG_Colour_Audit.sql b/static/MySQL/11225_tbl_DOG_Colour_Audit.sql
similarity index 100%
rename from static/MySQL/1238_tbl_DOG_Colour_Audit.sql
rename to static/MySQL/11225_tbl_DOG_Colour_Audit.sql
diff --git a/static/MySQL/1239_tbl_DOG_Colour_Temp.sql b/static/MySQL/11226_tbl_DOG_Colour_Temp.sql
similarity index 100%
rename from static/MySQL/1239_tbl_DOG_Colour_Temp.sql
rename to static/MySQL/11226_tbl_DOG_Colour_Temp.sql
diff --git a/static/MySQL/1245_tbl_DOG_Image.sql b/static/MySQL/11228_tbl_DOG_Image.sql
similarity index 100%
rename from static/MySQL/1245_tbl_DOG_Image.sql
rename to static/MySQL/11228_tbl_DOG_Image.sql
diff --git a/static/MySQL/1246_tbl_DOG_Image_Audit.sql b/static/MySQL/11229_tbl_DOG_Image_Audit.sql
similarity index 100%
rename from static/MySQL/1246_tbl_DOG_Image_Audit.sql
rename to static/MySQL/11229_tbl_DOG_Image_Audit.sql
diff --git a/static/MySQL/1247_tbl_DOG_Image_Temp.sql b/static/MySQL/11230_tbl_DOG_Image_Temp.sql
similarity index 100%
rename from static/MySQL/1247_tbl_DOG_Image_Temp.sql
rename to static/MySQL/11230_tbl_DOG_Image_Temp.sql
diff --git a/static/MySQL/1249_tbl_DOG_Button_Icon.sql b/static/MySQL/11232_tbl_DOG_Button_Icon.sql
similarity index 100%
rename from static/MySQL/1249_tbl_DOG_Button_Icon.sql
rename to static/MySQL/11232_tbl_DOG_Button_Icon.sql
diff --git a/static/MySQL/1250_tbl_DOG_Button_Icon_Audit.sql b/static/MySQL/11233_tbl_DOG_Button_Icon_Audit.sql
similarity index 100%
rename from static/MySQL/1250_tbl_DOG_Button_Icon_Audit.sql
rename to static/MySQL/11233_tbl_DOG_Button_Icon_Audit.sql
diff --git a/static/MySQL/1251_tbl_DOG_Button_Icon_Temp.sql b/static/MySQL/11234_tbl_DOG_Button_Icon_Temp.sql
similarity index 100%
rename from static/MySQL/1251_tbl_DOG_Button_Icon_Temp.sql
rename to static/MySQL/11234_tbl_DOG_Button_Icon_Temp.sql
diff --git a/static/MySQL/1253_tbl_DOG_Command_Button_Link.sql b/static/MySQL/11236_tbl_DOG_Command_Button_Link.sql
similarity index 100%
rename from static/MySQL/1253_tbl_DOG_Command_Button_Link.sql
rename to static/MySQL/11236_tbl_DOG_Command_Button_Link.sql
diff --git a/static/MySQL/1254_tbl_DOG_Command_Button_Link_Audit.sql b/static/MySQL/11237_tbl_DOG_Command_Button_Link_Audit.sql
similarity index 100%
rename from static/MySQL/1254_tbl_DOG_Command_Button_Link_Audit.sql
rename to static/MySQL/11237_tbl_DOG_Command_Button_Link_Audit.sql
diff --git a/static/MySQL/1255_tbl_DOG_Command_Button_Link_Temp.sql b/static/MySQL/11238_tbl_DOG_Command_Button_Link_Temp.sql
similarity index 100%
rename from static/MySQL/1255_tbl_DOG_Command_Button_Link_Temp.sql
rename to static/MySQL/11238_tbl_DOG_Command_Button_Link_Temp.sql
diff --git a/static/MySQL/11300_tbl_DOG_Weather.sql b/static/MySQL/11300_tbl_DOG_Weather.sql
new file mode 100644
index 0000000..a2f4746
--- /dev/null
+++ b/static/MySQL/11300_tbl_DOG_Weather.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Weather'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Weather (
+ id_weather INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Weather_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Weather_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11301_tbl_DOG_Weather_Audit.sql b/static/MySQL/11301_tbl_DOG_Weather_Audit.sql
new file mode 100644
index 0000000..ccc2f74
--- /dev/null
+++ b/static/MySQL/11301_tbl_DOG_Weather_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Weather_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Weather_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_weather INT NOT NULL
+ , CONSTRAINT FK_DOG_Weather_Audit_id_weather
+ FOREIGN KEY (id_weather)
+ REFERENCES parts.DOG_Weather(id_weather)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Weather_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11302_tbl_DOG_Weather_Temp.sql b/static/MySQL/11302_tbl_DOG_Weather_Temp.sql
new file mode 100644
index 0000000..884efc5
--- /dev/null
+++ b/static/MySQL/11302_tbl_DOG_Weather_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Weather_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Weather_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_weather INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11304_tbl_DOG_Lighting_Level.sql b/static/MySQL/11304_tbl_DOG_Lighting_Level.sql
new file mode 100644
index 0000000..61e3bac
--- /dev/null
+++ b/static/MySQL/11304_tbl_DOG_Lighting_Level.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Lighting_Level'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Lighting_Level (
+ id_lighting_level INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Lighting_Level_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Lighting_Level_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11305_tbl_DOG_Lighting_Level_Audit.sql b/static/MySQL/11305_tbl_DOG_Lighting_Level_Audit.sql
new file mode 100644
index 0000000..d969d1a
--- /dev/null
+++ b/static/MySQL/11305_tbl_DOG_Lighting_Level_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Lighting_Level_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Lighting_Level_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_lighting_level INT NOT NULL
+ , CONSTRAINT FK_DOG_Lighting_Level_Audit_id_lighting_level
+ FOREIGN KEY (id_lighting_level)
+ REFERENCES parts.DOG_Lighting_Level(id_lighting_level)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Lighting_Level_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11306_tbl_DOG_Lighting_Level_Temp.sql b/static/MySQL/11306_tbl_DOG_Lighting_Level_Temp.sql
new file mode 100644
index 0000000..c27b4cc
--- /dev/null
+++ b/static/MySQL/11306_tbl_DOG_Lighting_Level_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Lighting_Level_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Lighting_Level_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_lighting_level INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11308_tbl_DOG_Assessment.sql b/static/MySQL/11308_tbl_DOG_Assessment.sql
new file mode 100644
index 0000000..0e4612b
--- /dev/null
+++ b/static/MySQL/11308_tbl_DOG_Assessment.sql
@@ -0,0 +1,42 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment (
+ id_assessment INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_weather INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_id_weather
+ FOREIGN KEY (id_weather)
+ REFERENCES parts.DOG_Weather(id_weather)
+ , id_lighting_level INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_id_lighting_level
+ FOREIGN KEY (id_lighting_level)
+ REFERENCES parts.DOG_Lighting_Level(id_lighting_level)
+ , id_location INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_id_location
+ FOREIGN KEY (id_location)
+ REFERENCES parts.DOG_Location(id_location)
+ , id_user_handler INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_id_user_handler
+ FOREIGN KEY (id_user_handler)
+ REFERENCES parts.DOG_User(id_user)
+ , notes TEXT
+ , temperature_celcius DECIMAL(5, 2)
+ , difficulty_level DOUBLE
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Assessment_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Assessment_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11309_tbl_DOG_Assessment_Audit.sql b/static/MySQL/11309_tbl_DOG_Assessment_Audit.sql
new file mode 100644
index 0000000..cd2708d
--- /dev/null
+++ b/static/MySQL/11309_tbl_DOG_Assessment_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_assessment INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Audit_id_assessment
+ FOREIGN KEY (id_assessment)
+ REFERENCES parts.DOG_Assessment(id_assessment)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11310_tbl_DOG_Assessment_Temp.sql b/static/MySQL/11310_tbl_DOG_Assessment_Temp.sql
new file mode 100644
index 0000000..81cacb1
--- /dev/null
+++ b/static/MySQL/11310_tbl_DOG_Assessment_Temp.sql
@@ -0,0 +1,23 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_assessment INT
+ , id_weather INT
+ , id_lighting_level INT
+ , id_location INT
+ , id_user_handler INT
+ , notes TEXT
+ , temperature_celcius DECIMAL(5, 2)
+-- , difficulty_level DOUBLE
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11312_tbl_DOG_Distraction_Type.sql b/static/MySQL/11312_tbl_DOG_Distraction_Type.sql
new file mode 100644
index 0000000..127b09d
--- /dev/null
+++ b/static/MySQL/11312_tbl_DOG_Distraction_Type.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Type'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Type (
+ id_type INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Distraction_Type_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Distraction_Type_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11313_tbl_DOG_Distraction_Type_Audit.sql b/static/MySQL/11313_tbl_DOG_Distraction_Type_Audit.sql
new file mode 100644
index 0000000..9390dc2
--- /dev/null
+++ b/static/MySQL/11313_tbl_DOG_Distraction_Type_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Type_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Type_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_type INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_Type_Audit_id_type
+ FOREIGN KEY (id_type)
+ REFERENCES parts.DOG_Distraction_Type(id_type)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_Type_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11314_tbl_DOG_Distraction_Type_Temp.sql b/static/MySQL/11314_tbl_DOG_Distraction_Type_Temp.sql
new file mode 100644
index 0000000..dee6859
--- /dev/null
+++ b/static/MySQL/11314_tbl_DOG_Distraction_Type_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Type_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Type_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_type INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11316_tbl_DOG_Distraction_Intensity_Level.sql b/static/MySQL/11316_tbl_DOG_Distraction_Intensity_Level.sql
new file mode 100644
index 0000000..544beb8
--- /dev/null
+++ b/static/MySQL/11316_tbl_DOG_Distraction_Intensity_Level.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Intensity_Level'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Intensity_Level (
+ id_intensity_level INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Distraction_Intensity_Level_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Distraction_Intensity_Level_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11317_tbl_DOG_Distraction_Intensity_Level_Audit.sql b/static/MySQL/11317_tbl_DOG_Distraction_Intensity_Level_Audit.sql
new file mode 100644
index 0000000..b001867
--- /dev/null
+++ b/static/MySQL/11317_tbl_DOG_Distraction_Intensity_Level_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Intensity_Level_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Intensity_Level_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_intensity_level INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_Intensity_Level_Audit_id_intensity_level
+ FOREIGN KEY (id_intensity_level)
+ REFERENCES parts.DOG_Distraction_Intensity_Level(id_intensity_level)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_Intensity_Level_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11318_tbl_DOG_Distraction_Intensity_Level_Temp.sql b/static/MySQL/11318_tbl_DOG_Distraction_Intensity_Level_Temp.sql
new file mode 100644
index 0000000..a489805
--- /dev/null
+++ b/static/MySQL/11318_tbl_DOG_Distraction_Intensity_Level_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Intensity_Level_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Intensity_Level_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_intensity_level INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11320_tbl_DOG_Distraction.sql b/static/MySQL/11320_tbl_DOG_Distraction.sql
new file mode 100644
index 0000000..8777d20
--- /dev/null
+++ b/static/MySQL/11320_tbl_DOG_Distraction.sql
@@ -0,0 +1,53 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction (
+ id_distraction INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_assessment INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_assessment
+ FOREIGN KEY (id_assessment)
+ REFERENCES parts.DOG_Assessment(id_assessment)
+ , id_distraction_type INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_distraction_type
+ FOREIGN KEY (id_distraction_type)
+ REFERENCES parts.DOG_Distraction_Type(id_type)
+ , id_intensity_level_emotional INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_intensity_level_emotional
+ FOREIGN KEY (id_intensity_level_emotional)
+ REFERENCES parts.DOG_Distraction_Intensity_Level(id_intensity_level)
+ , id_intensity_level_scent INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_intensity_level_scent
+ FOREIGN KEY (id_intensity_level_scent)
+ REFERENCES parts.DOG_Distraction_Intensity_Level(id_intensity_level)
+ , id_intensity_level_sight INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_intensity_level_sight
+ FOREIGN KEY (id_intensity_level_sight)
+ REFERENCES parts.DOG_Distraction_Intensity_Level(id_intensity_level)
+ , id_intensity_level_sound INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_intensity_level_sound
+ FOREIGN KEY (id_intensity_level_sound)
+ REFERENCES parts.DOG_Distraction_Intensity_Level(id_intensity_level)
+ , id_intensity_level_touch INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_id_intensity_level_touch
+ FOREIGN KEY (id_intensity_level_touch)
+ REFERENCES parts.DOG_Distraction_Intensity_Level(id_intensity_level)
+ , quantity INT
+ , proximity_metres FLOAT
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Distraction_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Distraction_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11321_tbl_DOG_Distraction_Audit.sql b/static/MySQL/11321_tbl_DOG_Distraction_Audit.sql
new file mode 100644
index 0000000..906ae69
--- /dev/null
+++ b/static/MySQL/11321_tbl_DOG_Distraction_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_distraction INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_Audit_id_distraction
+ FOREIGN KEY (id_distraction)
+ REFERENCES parts.DOG_Distraction(id_distraction)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Distraction_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql b/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql
new file mode 100644
index 0000000..dea3e27
--- /dev/null
+++ b/static/MySQL/11322_tbl_DOG_Distraction_Temp.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Distraction_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Distraction_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_assessment INT
+ , id_distraction_type INT
+ , id_intensity_level_emotional INT
+ , id_intensity_level_sight INT
+ , id_intensity_level_sound INT
+ , id_intensity_level_touch INT
+ , quantity INT
+ , proximity_metres FLOAT
+-- , difficulty_level DOUBLE
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11324_tbl_DOG_Bribe.sql b/static/MySQL/11324_tbl_DOG_Bribe.sql
new file mode 100644
index 0000000..1d57568
--- /dev/null
+++ b/static/MySQL/11324_tbl_DOG_Bribe.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Bribe'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Bribe (
+ id_bribe INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Bribe_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Bribe_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11325_tbl_DOG_Bribe_Audit.sql b/static/MySQL/11325_tbl_DOG_Bribe_Audit.sql
new file mode 100644
index 0000000..41b852e
--- /dev/null
+++ b/static/MySQL/11325_tbl_DOG_Bribe_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Bribe_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Bribe_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_bribe INT NOT NULL
+ , CONSTRAINT FK_DOG_Bribe_Audit_id_bribe
+ FOREIGN KEY (id_bribe)
+ REFERENCES parts.DOG_Bribe(id_bribe)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Bribe_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11326_tbl_DOG_Bribe_Temp.sql b/static/MySQL/11326_tbl_DOG_Bribe_Temp.sql
new file mode 100644
index 0000000..14e83e2
--- /dev/null
+++ b/static/MySQL/11326_tbl_DOG_Bribe_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Bribe_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Bribe_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_bribe INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11328_tbl_DOG_Assessment_Command_Modality_Link.sql b/static/MySQL/11328_tbl_DOG_Assessment_Command_Modality_Link.sql
new file mode 100644
index 0000000..a6ba3e3
--- /dev/null
+++ b/static/MySQL/11328_tbl_DOG_Assessment_Command_Modality_Link.sql
@@ -0,0 +1,45 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Command_Modality_Link'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Command_Modality_Link (
+ id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_assessment INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_id_assessment
+ FOREIGN KEY (id_assessment)
+ REFERENCES parts.DOG_Assessment(id_assessment)
+ , id_command INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_id_command
+ FOREIGN KEY (id_command)
+ REFERENCES parts.DOG_Command(id_command)
+ , id_command_modality INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_id_command_modality
+ FOREIGN KEY (id_command_modality)
+ REFERENCES parts.DOG_Command_Modality(id_command_modality)
+ , id_bribe INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_id_bribe
+ FOREIGN KEY (id_bribe)
+ REFERENCES parts.DOG_Bribe(id_bribe)
+ , distance_from_handler FLOAT
+ , is_in_sight_of_handler BIT
+ , is_in_scent_range_of_handler BIT
+ , is_in_hearing_range_of_handler BIT
+ , is_on_lead BIT
+ , trial_count INT
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11329_tbl_DOG_Assessment_Command_Modality_Link_Audit.sql b/static/MySQL/11329_tbl_DOG_Assessment_Command_Modality_Link_Audit.sql
new file mode 100644
index 0000000..736a1d8
--- /dev/null
+++ b/static/MySQL/11329_tbl_DOG_Assessment_Command_Modality_Link_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Command_Modality_Link_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Command_Modality_Link_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_link INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_Audit_id_link
+ FOREIGN KEY (id_link)
+ REFERENCES parts.DOG_Assessment_Command_Modality_Link(id_link)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Command_Modality_Link_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11330_tbl_DOG_Assessment_Command_Modality_Link_Temp.sql b/static/MySQL/11330_tbl_DOG_Assessment_Command_Modality_Link_Temp.sql
new file mode 100644
index 0000000..12b8b82
--- /dev/null
+++ b/static/MySQL/11330_tbl_DOG_Assessment_Command_Modality_Link_Temp.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Command_Modality_Link_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Command_Modality_Link_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_assessment INT
+ , id_command INT
+ , id_command_modality INT
+ , id_bribe INT
+ , distance_from_handler FLOAT
+ , is_in_sight_of_handler BIT
+ , is_in_scent_range_of_handler BIT
+ , is_in_hearing_range_of_handler BIT
+ , is_on_lead BIT
+ , trial_count INT
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/11332_tbl_DOG_Response_Quality_Metric.sql b/static/MySQL/11332_tbl_DOG_Response_Quality_Metric.sql
new file mode 100644
index 0000000..669c2ae
--- /dev/null
+++ b/static/MySQL/11332_tbl_DOG_Response_Quality_Metric.sql
@@ -0,0 +1,31 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Response_Quality_Metric'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Response_Quality_Metric (
+ id_metric INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_unit_measurement INT NOT NULL
+ , CONSTRAINT FK_DOG_Response_Quality_Metric_id_unit_measurement
+ FOREIGN KEY (id_unit_measurement)
+ REFERENCES parts.DOG_Unit_Measurement(id_unit_measurement)
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , value_min DOUBLE
+ , value_max DOUBLE
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Response_Quality_Metric_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Response_Quality_Metric_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11333_tbl_DOG_Response_Quality_Metric_Audit.sql b/static/MySQL/11333_tbl_DOG_Response_Quality_Metric_Audit.sql
new file mode 100644
index 0000000..7ea208e
--- /dev/null
+++ b/static/MySQL/11333_tbl_DOG_Response_Quality_Metric_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Response_Quality_Metric_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Response_Quality_Metric_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_metric INT NOT NULL
+ , CONSTRAINT FK_DOG_Response_Quality_Metric_Audit_id_metric
+ FOREIGN KEY (id_metric)
+ REFERENCES parts.DOG_Response_Quality_Metric(id_metric)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Response_Quality_Metric_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11334_tbl_DOG_Response_Quality_Metric_Temp.sql b/static/MySQL/11334_tbl_DOG_Response_Quality_Metric_Temp.sql
new file mode 100644
index 0000000..18ce3e6
--- /dev/null
+++ b/static/MySQL/11334_tbl_DOG_Response_Quality_Metric_Temp.sql
@@ -0,0 +1,21 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Response_Quality_Metric_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Response_Quality_Metric_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_metric INT
+ , id_unit_measurement INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , value_min DOUBLE
+ , value_max DOUBLE
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/1213_tbl_DOG_Obedience_Level.sql b/static/MySQL/11336_tbl_DOG_Obedience_Level.sql
similarity index 100%
rename from static/MySQL/1213_tbl_DOG_Obedience_Level.sql
rename to static/MySQL/11336_tbl_DOG_Obedience_Level.sql
diff --git a/static/MySQL/1214_tbl_DOG_Obedience_Level_Audit.sql b/static/MySQL/11337_tbl_DOG_Obedience_Level_Audit.sql
similarity index 100%
rename from static/MySQL/1214_tbl_DOG_Obedience_Level_Audit.sql
rename to static/MySQL/11337_tbl_DOG_Obedience_Level_Audit.sql
diff --git a/static/MySQL/1215_tbl_DOG_Obedience_Level_Temp.sql b/static/MySQL/11338_tbl_DOG_Obedience_Level_Temp.sql
similarity index 100%
rename from static/MySQL/1215_tbl_DOG_Obedience_Level_Temp.sql
rename to static/MySQL/11338_tbl_DOG_Obedience_Level_Temp.sql
diff --git a/static/MySQL/11340_tbl_DOG_Assessment_Response.sql b/static/MySQL/11340_tbl_DOG_Assessment_Response.sql
new file mode 100644
index 0000000..1a872ce
--- /dev/null
+++ b/static/MySQL/11340_tbl_DOG_Assessment_Response.sql
@@ -0,0 +1,37 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Response'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Response (
+ id_response INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_assessment_command_modality_link INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Response_id_assessment_command_modality_link
+ FOREIGN KEY (id_assessment_command_modality_link)
+ REFERENCES parts.DOG_Assessment_Command_Modality_Link(id_link)
+ , id_response_quality_metric INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Response_id_response_quality_metric
+ FOREIGN KEY (id_response_quality_metric)
+ REFERENCES parts.DOG_Response_Quality_Metric(id_metric)
+ , id_obedience_level INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Response_id_obedience_level
+ FOREIGN KEY (id_obedience_level)
+ REFERENCES parts.DOG_Obedience_Level(id_obedience_level)
+ , value_measured DOUBLE
+ , notes TEXT
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Assessment_Response_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Assessment_Response_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11341_tbl_DOG_Assessment_Response_Audit.sql b/static/MySQL/11341_tbl_DOG_Assessment_Response_Audit.sql
new file mode 100644
index 0000000..a3eb831
--- /dev/null
+++ b/static/MySQL/11341_tbl_DOG_Assessment_Response_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Response_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Response_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_response INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Response_Audit_id_response
+ FOREIGN KEY (id_response)
+ REFERENCES parts.DOG_Assessment_Response(id_response)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Assessment_Response_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql b/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql
new file mode 100644
index 0000000..42164ea
--- /dev/null
+++ b/static/MySQL/11342_tbl_DOG_Assessment_Response_Temp.sql
@@ -0,0 +1,20 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Assessment_Response_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Assessment_Response_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_assessment_command_modality_link INT
+ , id_response_quality_metric INT
+ , id_obedience_level INT
+ , value_measured DOUBLE
+ , notes TEXT
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/3100_tri_DOG_User_Change_Set.sql b/static/MySQL/30500_tri_DOG_User_Change_Set.sql
similarity index 100%
rename from static/MySQL/3100_tri_DOG_User_Change_Set.sql
rename to static/MySQL/30500_tri_DOG_User_Change_Set.sql
diff --git a/static/MySQL/3116_tri_DOG_User.sql b/static/MySQL/30516_tri_DOG_User.sql
similarity index 100%
rename from static/MySQL/3116_tri_DOG_User.sql
rename to static/MySQL/30516_tri_DOG_User.sql
diff --git a/static/MySQL/3120_tri_DOG_Role.sql b/static/MySQL/30520_tri_DOG_Role.sql
similarity index 100%
rename from static/MySQL/3120_tri_DOG_Role.sql
rename to static/MySQL/30520_tri_DOG_Role.sql
diff --git a/static/MySQL/3124_tri_DOG_Role_Permission_Link.sql b/static/MySQL/30524_tri_DOG_Role_Permission_Link.sql
similarity index 100%
rename from static/MySQL/3124_tri_DOG_Role_Permission_Link.sql
rename to static/MySQL/30524_tri_DOG_Role_Permission_Link.sql
diff --git a/static/MySQL/3128_tri_DOG_User_Role_Link.sql b/static/MySQL/30528_tri_DOG_User_Role_Link.sql
similarity index 100%
rename from static/MySQL/3128_tri_DOG_User_Role_Link.sql
rename to static/MySQL/30528_tri_DOG_User_Role_Link.sql
diff --git a/static/MySQL/3200_tri_DOG_Dog_Change_Set.sql b/static/MySQL/31000_tri_DOG_Dog_Change_Set.sql
similarity index 100%
rename from static/MySQL/3200_tri_DOG_Dog_Change_Set.sql
rename to static/MySQL/31000_tri_DOG_Dog_Change_Set.sql
diff --git a/static/MySQL/3201_tri_DOG_Dog.sql b/static/MySQL/31001_tri_DOG_Dog.sql
similarity index 100%
rename from static/MySQL/3201_tri_DOG_Dog.sql
rename to static/MySQL/31001_tri_DOG_Dog.sql
diff --git a/static/MySQL/3205_tri_DOG_Breed.sql b/static/MySQL/31005_tri_DOG_Breed.sql
similarity index 100%
rename from static/MySQL/3205_tri_DOG_Breed.sql
rename to static/MySQL/31005_tri_DOG_Breed.sql
diff --git a/static/MySQL/3209_tri_DOG_Dog_Breed_Link.sql b/static/MySQL/31009_tri_DOG_Dog_Breed_Link.sql
similarity index 100%
rename from static/MySQL/3209_tri_DOG_Dog_Breed_Link.sql
rename to static/MySQL/31009_tri_DOG_Dog_Breed_Link.sql
diff --git a/static/MySQL/3257_tri_DOG_Drive.sql b/static/MySQL/31030_tri_DOG_Drive.sql
similarity index 100%
rename from static/MySQL/3257_tri_DOG_Drive.sql
rename to static/MySQL/31030_tri_DOG_Drive.sql
diff --git a/static/MySQL/3261_tri_DOG_Dog_Drive_Link.sql b/static/MySQL/31034_tri_DOG_Dog_Drive_Link.sql
similarity index 100%
rename from static/MySQL/3261_tri_DOG_Dog_Drive_Link.sql
rename to static/MySQL/31034_tri_DOG_Dog_Drive_Link.sql
diff --git a/static/MySQL/3217_tri_DOG_Command_Category.sql b/static/MySQL/31100_tri_DOG_Command_Category.sql
similarity index 100%
rename from static/MySQL/3217_tri_DOG_Command_Category.sql
rename to static/MySQL/31100_tri_DOG_Command_Category.sql
diff --git a/static/MySQL/3221_tri_DOG_Command.sql b/static/MySQL/31104_tri_DOG_Command.sql
similarity index 100%
rename from static/MySQL/3221_tri_DOG_Command.sql
rename to static/MySQL/31104_tri_DOG_Command.sql
diff --git a/static/MySQL/3225_tri_DOG_Dog_Command_Link.sql b/static/MySQL/31108_tri_DOG_Dog_Command_Link.sql
similarity index 99%
rename from static/MySQL/3225_tri_DOG_Dog_Command_Link.sql
rename to static/MySQL/31108_tri_DOG_Dog_Command_Link.sql
index 3687241..54bc0dd 100644
--- a/static/MySQL/3225_tri_DOG_Dog_Command_Link.sql
+++ b/static/MySQL/31108_tri_DOG_Dog_Command_Link.sql
@@ -37,6 +37,7 @@ BEGIN
-- Changed id_command
SELECT NEW.id_link, 'id_command', CONVERT(OLD.id_command, CHAR), CONVERT(NEW.id_command, CHAR), NEW.id_change_set
WHERE NOT (OLD.id_command <=> NEW.id_command)
+ /*
UNION
-- Changed id_understanding_level
SELECT NEW.id_link, 'id_understanding_level', CONVERT(OLD.id_understanding_level, CHAR), CONVERT(NEW.id_understanding_level, CHAR), NEW.id_change_set
@@ -45,7 +46,8 @@ BEGIN
-- Changed id_obedience_level
SELECT NEW.id_link, 'id_obedience_level', CONVERT(OLD.id_obedience_level, CHAR), CONVERT(NEW.id_obedience_level, CHAR), NEW.id_change_set
WHERE NOT (OLD.id_obedience_level <=> NEW.id_obedience_level)
- UNION
+ */
+ UNION
-- Changed hand_signal_description
SELECT NEW.id_link, 'hand_signal_description', OLD.hand_signal_description, NEW.hand_signal_description, NEW.id_change_set
WHERE NOT OLD.hand_signal_description <=> NEW.hand_signal_description
diff --git a/static/MySQL/31111_tri_DOG_Command_Modality.sql b/static/MySQL/31111_tri_DOG_Command_Modality.sql
new file mode 100644
index 0000000..dbe0ff1
--- /dev/null
+++ b/static/MySQL/31111_tri_DOG_Command_Modality.sql
@@ -0,0 +1,46 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Command_Modality;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Command_Modality;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Command_Modality
+BEFORE INSERT ON parts.DOG_Command_Modality
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Command_Modality
+BEFORE UPDATE ON parts.DOG_Command_Modality
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Command_Modality_Audit (
+ id_command_modality
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed code
+ SELECT NEW.id_command_modality, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT OLD.code <=> NEW.code
+ UNION
+ -- Changed name
+ SELECT NEW.id_command_modality, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT OLD.name <=> NEW.name
+ UNION
+ -- Changed active
+ SELECT NEW.id_command_modality, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/3229_tri_DOG_Location.sql b/static/MySQL/31200_tri_DOG_Location.sql
similarity index 100%
rename from static/MySQL/3229_tri_DOG_Location.sql
rename to static/MySQL/31200_tri_DOG_Location.sql
diff --git a/static/MySQL/3233_tri_DOG_Location_Link.sql b/static/MySQL/31204_tri_DOG_Location_Link.sql
similarity index 100%
rename from static/MySQL/3233_tri_DOG_Location_Link.sql
rename to static/MySQL/31204_tri_DOG_Location_Link.sql
diff --git a/static/MySQL/3241_tri_DOG_Button_Shape.sql b/static/MySQL/31220_tri_DOG_Button_Shape.sql
similarity index 100%
rename from static/MySQL/3241_tri_DOG_Button_Shape.sql
rename to static/MySQL/31220_tri_DOG_Button_Shape.sql
diff --git a/static/MySQL/3237_tri_DOG_Dog_Colour.sql b/static/MySQL/31224_tri_DOG_Colour.sql
similarity index 100%
rename from static/MySQL/3237_tri_DOG_Dog_Colour.sql
rename to static/MySQL/31224_tri_DOG_Colour.sql
diff --git a/static/MySQL/3245_tri_DOG_Image.sql b/static/MySQL/31228_tri_DOG_Image.sql
similarity index 100%
rename from static/MySQL/3245_tri_DOG_Image.sql
rename to static/MySQL/31228_tri_DOG_Image.sql
diff --git a/static/MySQL/3249_tri_DOG_Button_Icon.sql b/static/MySQL/31232_tri_DOG_Button_Icon.sql
similarity index 100%
rename from static/MySQL/3249_tri_DOG_Button_Icon.sql
rename to static/MySQL/31232_tri_DOG_Button_Icon.sql
diff --git a/static/MySQL/3253_tri_DOG_Command_Button_Link.sql b/static/MySQL/31236_tri_DOG_Command_Button_Link.sql
similarity index 100%
rename from static/MySQL/3253_tri_DOG_Command_Button_Link.sql
rename to static/MySQL/31236_tri_DOG_Command_Button_Link.sql
diff --git a/static/MySQL/31300_tri_DOG_Weather.sql b/static/MySQL/31300_tri_DOG_Weather.sql
new file mode 100644
index 0000000..6fac73b
--- /dev/null
+++ b/static/MySQL/31300_tri_DOG_Weather.sql
@@ -0,0 +1,46 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Weather;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Weather;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Weather
+BEFORE INSERT ON parts.DOG_Weather
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Weather
+BEFORE UPDATE ON parts.DOG_Weather
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Weather_Audit (
+ id_weather
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed code
+ SELECT NEW.id_weather, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT (OLD.code <=> NEW.code)
+ UNION
+ -- Changed name
+ SELECT NEW.id_weather, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT (OLD.name <=> NEW.name)
+ UNION
+ -- Changed active
+ SELECT NEW.id_weather, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31304_tri_DOG_Lighting_Level.sql b/static/MySQL/31304_tri_DOG_Lighting_Level.sql
new file mode 100644
index 0000000..9ec0b51
--- /dev/null
+++ b/static/MySQL/31304_tri_DOG_Lighting_Level.sql
@@ -0,0 +1,46 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Lighting_Level;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Lighting_Level;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Lighting_Level
+BEFORE INSERT ON parts.DOG_Lighting_Level
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Lighting_Level
+BEFORE UPDATE ON parts.DOG_Lighting_Level
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Lighting_Level_Audit (
+ id_lighting_level
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed code
+ SELECT NEW.id_lighting_level, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT (OLD.code <=> NEW.code)
+ UNION
+ -- Changed name
+ SELECT NEW.id_lighting_level, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT (OLD.name <=> NEW.name)
+ UNION
+ -- Changed active
+ SELECT NEW.id_lighting_level, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31308_tri_DOG_Assessment.sql b/static/MySQL/31308_tri_DOG_Assessment.sql
new file mode 100644
index 0000000..3b0a7c4
--- /dev/null
+++ b/static/MySQL/31308_tri_DOG_Assessment.sql
@@ -0,0 +1,62 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Assessment;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Assessment;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Assessment
+BEFORE INSERT ON parts.DOG_Assessment
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Assessment
+BEFORE UPDATE ON parts.DOG_Assessment
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Assessment_Audit (
+ id_assessment
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed id_weather
+ SELECT NEW.id_assessment, 'id_weather', CONVERT(OLD.id_weather, CHAR), CONVERT(NEW.id_weather, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_weather <=> NEW.id_weather)
+ UNION
+ -- Changed id_lighting_level
+ SELECT NEW.id_assessment, 'id_lighting_level', CONVERT(OLD.id_lighting_level, CHAR), CONVERT(NEW.id_lighting_level, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_lighting_level <=> NEW.id_lighting_level)
+ UNION
+ -- Changed id_location
+ SELECT NEW.id_assessment, 'id_location', CONVERT(OLD.id_location, CHAR), CONVERT(NEW.id_location, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_location <=> NEW.id_location)
+ UNION
+ -- Changed id_user_handler
+ SELECT NEW.id_assessment, 'id_user_handler', CONVERT(OLD.id_user_handler, CHAR), CONVERT(NEW.id_user_handler, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_user_handler <=> NEW.id_user_handler)
+ UNION
+ -- Changed notes
+ SELECT NEW.id_assessment, 'notes', OLD.notes, NEW.notes, NEW.id_change_set
+ WHERE NOT (OLD.notes <=> NEW.notes)
+ UNION
+ -- Changed temperature_celcius
+ SELECT NEW.id_assessment, 'temperature_celcius', CONVERT(OLD.temperature_celcius, CHAR), CONVERT(NEW.temperature_celcius, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.temperature_celcius <=> NEW.temperature_celcius)
+ UNION
+ -- Changed active
+ SELECT NEW.id_assessment, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31312_tri_DOG_Distraction_Type.sql b/static/MySQL/31312_tri_DOG_Distraction_Type.sql
new file mode 100644
index 0000000..ad1a796
--- /dev/null
+++ b/static/MySQL/31312_tri_DOG_Distraction_Type.sql
@@ -0,0 +1,46 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Distraction_Type;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Distraction_Type;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Distraction_Type
+BEFORE INSERT ON parts.DOG_Distraction_Type
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Distraction_Type
+BEFORE UPDATE ON parts.DOG_Distraction_Type
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Distraction_Type_Audit (
+ id_type
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed code
+ SELECT NEW.id_type, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT (OLD.code <=> NEW.code)
+ UNION
+ -- Changed name
+ SELECT NEW.id_type, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT (OLD.name <=> NEW.name)
+ UNION
+ -- Changed active
+ SELECT NEW.id_type, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31316_tri_DOG_Distraction_Intensity_Level.sql b/static/MySQL/31316_tri_DOG_Distraction_Intensity_Level.sql
new file mode 100644
index 0000000..d42b80f
--- /dev/null
+++ b/static/MySQL/31316_tri_DOG_Distraction_Intensity_Level.sql
@@ -0,0 +1,46 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Distraction_Intensity_Level;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Distraction_Intensity_Level;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Distraction_Intensity_Level
+BEFORE INSERT ON parts.DOG_Distraction_Intensity_Level
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Distraction_Intensity_Level
+BEFORE UPDATE ON parts.DOG_Distraction_Intensity_Level
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Distraction_Intensity_Level_Audit (
+ id_intensity_level
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed code
+ SELECT NEW.id_intensity_level, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT (OLD.code <=> NEW.code)
+ UNION
+ -- Changed name
+ SELECT NEW.id_intensity_level, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT (OLD.name <=> NEW.name)
+ UNION
+ -- Changed active
+ SELECT NEW.id_intensity_level, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31320_tri_DOG_Distraction.sql b/static/MySQL/31320_tri_DOG_Distraction.sql
new file mode 100644
index 0000000..dbda17d
--- /dev/null
+++ b/static/MySQL/31320_tri_DOG_Distraction.sql
@@ -0,0 +1,74 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Distraction;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Distraction;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Distraction
+BEFORE INSERT ON parts.DOG_Distraction
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Distraction
+BEFORE UPDATE ON parts.DOG_Distraction
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Distraction_Audit (
+ id_distraction
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed id_assessment
+ SELECT NEW.id_distraction, 'id_assessment', CONVERT(OLD.id_assessment, CHAR), CONVERT(NEW.id_assessment, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_assessment <=> NEW.id_assessment)
+ UNION
+ -- Changed id_distraction_type
+ SELECT NEW.id_distraction, 'id_distraction_type', CONVERT(OLD.id_distraction_type, CHAR), CONVERT(NEW.id_distraction_type, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_distraction_type <=> NEW.id_distraction_type)
+ UNION
+ -- Changed id_intensity_level_emotional
+ SELECT NEW.id_distraction, 'id_intensity_level_emotional', CONVERT(OLD.id_intensity_level_emotional, CHAR), CONVERT(NEW.id_intensity_level_emotional, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_intensity_level_emotional <=> NEW.id_intensity_level_emotional)
+ UNION
+ -- Changed id_intensity_level_scent
+ SELECT NEW.id_distraction, 'id_intensity_level_scent', CONVERT(OLD.id_intensity_level_scent, CHAR), CONVERT(NEW.id_intensity_level_scent, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_intensity_level_scent <=> NEW.id_intensity_level_scent)
+ UNION
+ -- Changed id_intensity_level_sight
+ SELECT NEW.id_distraction, 'id_intensity_level_sight', CONVERT(OLD.id_intensity_level_sight, CHAR), CONVERT(NEW.id_intensity_level_sight, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_intensity_level_sight <=> NEW.id_intensity_level_sight)
+ UNION
+ -- Changed id_intensity_level_sound
+ SELECT NEW.id_distraction, 'id_intensity_level_sound', CONVERT(OLD.id_intensity_level_sound, CHAR), CONVERT(NEW.id_intensity_level_sound, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_intensity_level_sound <=> NEW.id_intensity_level_sound)
+ UNION
+ -- Changed id_intensity_level_touch
+ SELECT NEW.id_distraction, 'id_intensity_level_touch', CONVERT(OLD.id_intensity_level_touch, CHAR), CONVERT(NEW.id_intensity_level_touch, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_intensity_level_touch <=> NEW.id_intensity_level_touch)
+ UNION
+ -- Changed quantity
+ SELECT NEW.id_distraction, 'quantity', CONVERT(OLD.quantity, CHAR), CONVERT(NEW.quantity, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.quantity <=> NEW.quantity)
+ UNION
+ -- Changed proximity_metres
+ SELECT NEW.id_distraction, 'proximity_metres', CONVERT(OLD.proximity_metres, CHAR), CONVERT(NEW.proximity_metres, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.proximity_metres <=> NEW.proximity_metres)
+ UNION
+ -- Changed active
+ SELECT NEW.id_distraction, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31324_tri_DOG_Bribe.sql b/static/MySQL/31324_tri_DOG_Bribe.sql
new file mode 100644
index 0000000..805b2b6
--- /dev/null
+++ b/static/MySQL/31324_tri_DOG_Bribe.sql
@@ -0,0 +1,46 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Bribe;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Bribe;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Bribe
+BEFORE INSERT ON parts.DOG_Bribe
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Bribe
+BEFORE UPDATE ON parts.DOG_Bribe
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Bribe_Audit (
+ id_bribe
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed code
+ SELECT NEW.id_bribe, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT (OLD.code <=> NEW.code)
+ UNION
+ -- Changed name
+ SELECT NEW.id_bribe, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT (OLD.name <=> NEW.name)
+ UNION
+ -- Changed active
+ SELECT NEW.id_bribe, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31328_tri_DOG_Assessment_Command_Modality_Link.sql b/static/MySQL/31328_tri_DOG_Assessment_Command_Modality_Link.sql
new file mode 100644
index 0000000..a58d916
--- /dev/null
+++ b/static/MySQL/31328_tri_DOG_Assessment_Command_Modality_Link.sql
@@ -0,0 +1,78 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Assessment_Command_Modality_Link;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Assessment_Command_Modality_Link;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Assessment_Command_Modality_Link
+BEFORE INSERT ON parts.DOG_Assessment_Command_Modality_Link
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Assessment_Command_Modality_Link
+BEFORE UPDATE ON parts.DOG_Assessment_Command_Modality_Link
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Assessment_Command_Modality_Link_Audit (
+ id_link
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed id_assessment
+ SELECT NEW.id_link, 'id_assessment', CONVERT(OLD.id_assessment, CHAR), CONVERT(NEW.id_assessment, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_assessment <=> NEW.id_assessment)
+ UNION
+ -- Changed id_command
+ SELECT NEW.id_link, 'id_command', CONVERT(OLD.id_command, CHAR), CONVERT(NEW.id_command, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_command <=> NEW.id_command)
+ UNION
+ -- Changed id_command_modality
+ SELECT NEW.id_link, 'id_command_modality', CONVERT(OLD.id_command_modality, CHAR), CONVERT(NEW.id_command_modality, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_command_modality <=> NEW.id_command_modality)
+ UNION
+ -- Changed id_bribe
+ SELECT NEW.id_link, 'id_bribe', CONVERT(OLD.id_bribe, CHAR), CONVERT(NEW.id_bribe, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_bribe <=> NEW.id_bribe)
+ UNION
+ -- Changed distance_from_handler
+ SELECT NEW.id_link, 'distance_from_handler', CONVERT(OLD.distance_from_handler, CHAR), CONVERT(NEW.distance_from_handler, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.distance_from_handler <=> NEW.distance_from_handler)
+ UNION
+ -- Changed is_in_sight_of_handler
+ SELECT NEW.id_link, 'is_in_sight_of_handler', CONVERT(CONVERT(OLD.is_in_sight_of_handler, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_in_sight_of_handler, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.is_in_sight_of_handler <=> NEW.is_in_sight_of_handler)
+ UNION
+ -- Changed is_in_scent_range_of_handler
+ SELECT NEW.id_link, 'is_in_scent_range_of_handler', CONVERT(CONVERT(OLD.is_in_scent_range_of_handler, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_in_scent_range_of_handler, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.is_in_scent_range_of_handler <=> NEW.is_in_scent_range_of_handler)
+ UNION
+ -- Changed is_in_hearing_range_of_handler
+ SELECT NEW.id_link, 'is_in_hearing_range_of_handler', CONVERT(CONVERT(OLD.is_in_hearing_range_of_handler, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_in_hearing_range_of_handler, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.is_in_hearing_range_of_handler <=> NEW.is_in_hearing_range_of_handler)
+ UNION
+ -- Changed is_on_lead
+ SELECT NEW.id_link, 'is_on_lead', CONVERT(CONVERT(OLD.is_on_lead, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_on_lead, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.is_on_lead <=> NEW.is_on_lead)
+ UNION
+ -- Changed trial_count
+ SELECT NEW.id_link, 'trial_count', CONVERT(OLD.trial_count, CHAR), CONVERT(NEW.trial_count, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.trial_count <=> NEW.trial_count)
+ UNION
+ -- Changed active
+ SELECT NEW.id_link, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/31332_tri_DOG_Response_Quality_Metric.sql b/static/MySQL/31332_tri_DOG_Response_Quality_Metric.sql
new file mode 100644
index 0000000..5539fd0
--- /dev/null
+++ b/static/MySQL/31332_tri_DOG_Response_Quality_Metric.sql
@@ -0,0 +1,58 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Response_Quality_Metric;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Response_Quality_Metric;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Response_Quality_Metric
+BEFORE INSERT ON parts.DOG_Response_Quality_Metric
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Response_Quality_Metric
+BEFORE UPDATE ON parts.DOG_Response_Quality_Metric
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Response_Quality_Metric_Audit (
+ id_metric
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed id_unit_measurement
+ SELECT NEW.id_metric, 'id_unit_measurement', CONVERT(OLD.id_unit_measurement, CHAR), CONVERT(NEW.id_unit_measurement, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_unit_measurement <=> NEW.id_unit_measurement)
+ UNION
+ -- Changed code
+ SELECT NEW.id_metric, 'code', OLD.code, NEW.code, NEW.id_change_set
+ WHERE NOT (OLD.code <=> NEW.code)
+ UNION
+ -- Changed name
+ SELECT NEW.id_metric, 'name', OLD.name, NEW.name, NEW.id_change_set
+ WHERE NOT (OLD.name <=> NEW.name)
+ UNION
+ -- Changed value_min
+ SELECT NEW.id_metric, 'value_min', CONVERT(OLD.value_min, CHAR), CONVERT(NEW.value_min, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.value_min <=> NEW.value_min)
+ UNION
+ -- Changed value_max
+ SELECT NEW.id_metric, 'value_max', CONVERT(OLD.value_max, CHAR), CONVERT(NEW.value_max, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.value_max <=> NEW.value_max)
+ UNION
+ -- Changed active
+ SELECT NEW.id_metric, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/3213_tri_DOG_Obedience_Level.sql b/static/MySQL/31336_tri_DOG_Obedience_Level.sql
similarity index 100%
rename from static/MySQL/3213_tri_DOG_Obedience_Level.sql
rename to static/MySQL/31336_tri_DOG_Obedience_Level.sql
diff --git a/static/MySQL/31340_tri_DOG_Assessment_Response.sql b/static/MySQL/31340_tri_DOG_Assessment_Response.sql
new file mode 100644
index 0000000..da10a53
--- /dev/null
+++ b/static/MySQL/31340_tri_DOG_Assessment_Response.sql
@@ -0,0 +1,58 @@
+
+USE parts;
+
+DROP TRIGGER IF EXISTS parts.before_insert_DOG_Assessment_Response;
+DROP TRIGGER IF EXISTS parts.before_update_DOG_Assessment_Response;
+
+DELIMITER //
+CREATE TRIGGER parts.before_insert_DOG_Assessment_Response
+BEFORE INSERT ON parts.DOG_Assessment_Response
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+END //
+DELIMITER ;
+
+DELIMITER //
+CREATE TRIGGER parts.before_update_DOG_Assessment_Response
+BEFORE UPDATE ON parts.DOG_Assessment_Response
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO parts.DOG_Assessment_Response_Audit (
+ id_response
+ , name_field
+ , value_prev
+ , value_new
+ , id_change_set
+ )
+ -- Changed id_assessment_command_modality_link
+ SELECT NEW.id_response, 'id_assessment_command_modality_link', CONVERT(OLD.id_assessment_command_modality_link, CHAR), CONVERT(NEW.id_assessment_command_modality_link, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_assessment_command_modality_link <=> NEW.id_assessment_command_modality_link)
+ UNION
+ -- Changed id_response_quality_metric
+ SELECT NEW.id_response, 'id_response_quality_metric', CONVERT(OLD.id_response_quality_metric, CHAR), CONVERT(NEW.id_response_quality_metric, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_response_quality_metric <=> NEW.id_response_quality_metric)
+ UNION
+ -- Changed id_obedience_level
+ SELECT NEW.id_response, 'id_obedience_level', CONVERT(OLD.id_obedience_level, CHAR), CONVERT(NEW.id_obedience_level, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.id_obedience_level <=> NEW.id_obedience_level)
+ UNION
+ -- Changed value_measured
+ SELECT NEW.id_response, 'value_measured', CONVERT(OLD.value_measured, CHAR), CONVERT(NEW.value_measured, CHAR), NEW.id_change_set
+ WHERE NOT (OLD.value_measured <=> NEW.value_measured)
+ UNION
+ -- Changed notes
+ SELECT NEW.id_response, 'notes', OLD.notes, NEW.notes, NEW.id_change_set
+ WHERE NOT (OLD.notes <=> NEW.notes)
+ UNION
+ -- Changed active
+ SELECT NEW.id_response, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
+ WHERE NOT (OLD.active <=> NEW.active)
+ ;
+END //
+DELIMITER ;
diff --git a/static/MySQL/6000_p_core_validate_guid.sql b/static/MySQL/60000_p_core_validate_guid.sql
similarity index 100%
rename from static/MySQL/6000_p_core_validate_guid.sql
rename to static/MySQL/60000_p_core_validate_guid.sql
diff --git a/static/MySQL/6001_p_core_debug_timing_reporting.sql b/static/MySQL/60001_p_core_debug_timing_reporting.sql
similarity index 100%
rename from static/MySQL/6001_p_core_debug_timing_reporting.sql
rename to static/MySQL/60001_p_core_debug_timing_reporting.sql
diff --git a/static/MySQL/6010_p_core_split.sql b/static/MySQL/60010_p_core_split.sql
similarity index 100%
rename from static/MySQL/6010_p_core_split.sql
rename to static/MySQL/60010_p_core_split.sql
diff --git a/static/MySQL/6011_p_core_clear_split.sql b/static/MySQL/60011_p_core_clear_split.sql
similarity index 100%
rename from static/MySQL/6011_p_core_clear_split.sql
rename to static/MySQL/60011_p_core_clear_split.sql
diff --git a/static/MySQL/6012_p_core_split_key_value_pair_csv.sql b/static/MySQL/60012_p_core_split_key_value_pair_csv.sql
similarity index 100%
rename from static/MySQL/6012_p_core_split_key_value_pair_csv.sql
rename to static/MySQL/60012_p_core_split_key_value_pair_csv.sql
diff --git a/static/MySQL/6013_p_core_clear_split_key_value_pair_csv.sql b/static/MySQL/60013_p_core_clear_split_key_value_pair_csv.sql
similarity index 100%
rename from static/MySQL/6013_p_core_clear_split_key_value_pair_csv.sql
rename to static/MySQL/60013_p_core_clear_split_key_value_pair_csv.sql
diff --git a/static/MySQL/70516_p_dog_get_many_user.sql b/static/MySQL/70516_p_dog_get_many_user.sql
new file mode 100644
index 0000000..0d34936
--- /dev/null
+++ b/static/MySQL/70516_p_dog_get_many_user.sql
@@ -0,0 +1,539 @@
+
+USE parts;
+
+-- Clear previous proc
+DROP PROCEDURE IF EXISTS p_dog_get_many_user;
+
+
+DELIMITER //
+CREATE PROCEDURE p_dog_get_many_user (
+ IN a_id_user INT
+ , IN a_id_user_auth0 VARCHAR(200)
+ , IN a_get_all_user BIT
+ , IN a_get_inactive_user BIT
+ , IN a_ids_user LONGTEXT
+ , IN a_ids_user_auth0 LONGTEXT
+ , IN a_debug BIT
+)
+BEGIN
+ DECLARE v_id_access_level_admin INT;
+ DECLARE v_id_access_level_view INT;
+ DECLARE v_id_permission_store_admin INT;
+ DECLARE v_id_permission_user INT;
+ DECLARE v_id_permission_user_admin INT;
+ DECLARE v_ids_permission_required VARCHAR(4000);
+ DECLARE v_id_minimum INT;
+ DECLARE v_code_error_bad_data VARCHAR(50);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_has_filter_user BIT;
+ DECLARE v_has_filter_user_auth0 BIT;
+ DECLARE v_guid BINARY(36);
+ DECLARE v_rank_max INT;
+ DECLARE v_time_start TIMESTAMP(6);
+ DECLARE v_is_new BIT;
+
+ SET v_time_start := CURRENT_TIMESTAMP(6);
+ SET v_guid := UUID();
+ SET v_id_access_level_admin := (SELECT id_access_level FROM demo.Shop_Access_Level WHERE code = 'ADMIN' LIMIT 1);
+ SET v_id_access_level_view := (SELECT id_access_level FROM demo.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
+ SET v_id_permission_store_admin := (SELECT id_permission FROM demo.Shop_Permission WHERE code = 'STORE_ADMIN' LIMIT 1);
+ SET v_id_permission_user := (SELECT id_permission FROM demo.Shop_Permission WHERE code = 'STORE_USER' LIMIT 1);
+ SET v_id_permission_user_admin := (SELECT id_permission FROM demo.Shop_Permission WHERE code = 'STORE_USER_ADMIN' LIMIT 1);
+ SET v_code_error_bad_data := (SELECT code FROM demo.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
+ SET v_id_type_error_bad_data := (SELECT id_type FROM demo.Shop_Msg_Error_Type WHERE code = v_code_error_bad_data LIMIT 1);
+ SET v_ids_permission_required := CONCAT(v_id_permission_user, ',', v_id_permission_user_admin, ',', v_id_permission_store_admin);
+ SET v_is_new := FALSE;
+
+ SET a_get_all_user := IFNULL(a_get_all_user, 1);
+ SET a_get_inactive_user := IFNULL(a_get_inactive_user, 0);
+ -- SET a_get_first_user_only := IFNULL(a_get_first_user_only, 0);
+ SET a_ids_user := TRIM(IFNULL(a_ids_user, ''));
+ SET a_ids_user_auth0 := TRIM(IFNULL(a_ids_user_auth0, ''));
+ SET a_debug := IFNULL(a_debug, 0);
+
+ IF a_debug = 1 THEN
+ SELECT
+ a_id_user
+ , a_id_user_auth0
+ , a_get_all_user
+ , a_get_inactive_user
+ -- , a_get_first_user_only
+ , a_ids_user
+ , a_ids_user_auth0
+ , a_debug
+ ;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_User;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+
+ CREATE TEMPORARY TABLE tmp_User (
+ id_user INT NULL
+ , rank_user INT NULL
+ , can_admin_store BIT NULL
+ , can_admin_user BIT NULL
+ );
+
+ CREATE TEMPORARY TABLE tmp_Msg_Error (
+ display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ -- guid BINARY(36) NOT NULL,
+ id_type INT NOT NULL,
+ code VARCHAR(50) NOT NULL,
+ msg VARCHAR(4000) NOT NULL
+ );
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+
+ IF ISNULL(a_id_user) AND NOT ISNULL(a_id_user_auth0) THEN
+ SET a_id_user := (SELECT U.id_user FROM demo.Shop_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1); -- LIKE CONCAT('%', a_id_user_auth0, '%') LIMIT 1);
+ END IF;
+
+ IF ISNULL(a_id_user) THEN
+ IF NOT ISNULL(a_id_user_auth0) THEN
+ INSERT INTO demo.Shop_User (
+ id_user_auth0
+ , is_super_user
+ , active
+ )
+ VALUES (
+ a_id_user_auth0
+ , 0 -- is_super_user
+ , 1 -- active
+ )
+ ;
+ SET a_id_user := (SELECT U.id_user FROM demo.Shop_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1);
+ SET v_is_new := TRUE;
+ ELSE
+ INSERT INTO tmp_Msg_Error (
+ id_type,
+ code,
+ msg
+ )
+ VALUES (
+ v_id_type_error_bad_data,
+ v_code_error_bad_data,
+ CONCAT('User ID required for authorisation.')
+ )
+ ;
+ END IF;
+ END IF;
+
+ SET v_has_filter_user := CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_user_auth0 := CASE WHEN a_ids_user_auth0 = '' THEN 0 ELSE 1 END;
+
+ IF a_debug = 1 THEN
+ SELECT
+ v_has_filter_user
+ , v_has_filter_user_auth0
+ ;
+ END IF;
+
+ -- User IDs
+ IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user = 1) THEN
+ CALL demo.p_split(v_guid, a_ids_user, ',', FALSE);
+
+ DELETE FROM tmp_Split;
+
+ INSERT INTO tmp_Split (
+ substring
+ , as_int
+ )
+ SELECT
+ substring
+ , CONVERT(substring, DECIMAL(10,0)) AS as_int
+ FROM demo.Split_Temp
+ WHERE 1=1
+ AND GUID = v_guid
+ AND NOT ISNULL(substring)
+ AND substring != ''
+ ;
+
+ CALL demo.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user = 1) THEN
+ IF EXISTS (
+ SELECT *
+ FROM tmp_Split t_S
+ LEFT JOIN demo.Shop_User U ON t_S.as_int = U.id_user
+ WHERE
+ ISNULL(t_S.as_int)
+ OR ISNULL(U.id_user)
+ ) THEN
+ INSERT INTO tmp_Msg_Error (
+ -- guid,
+ id_type,
+ code,
+ msg
+ )
+ SELECT
+ -- v_guid,
+ v_id_type_error_bad_data,
+ v_code_error_bad_data,
+ CONCAT('Invalid or inactive User IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split t_S
+ LEFT JOIN demo.Shop_User U ON t_S.as_int = U.id_user
+ WHERE
+ ISNULL(t_S.as_int)
+ OR ISNULL(U.id_user)
+ ;
+ ELSE
+ INSERT INTO tmp_User (
+ id_user
+ , rank_user
+ )
+ SELECT
+ U.id_user
+ , RANK() OVER (ORDER BY U.id_user DESC) AS rank_user
+ FROM tmp_Split t_S
+ RIGHT JOIN demo.Shop_User U ON t_S.as_int = U.id_user
+ WHERE
+ (
+ a_get_all_user = 1
+ OR (
+ v_has_filter_user = 1
+ AND NOT ISNULL(t_S.as_int)
+ )
+ )
+ AND (
+ a_get_inactive_user = 1
+ OR U.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ -- Auth0 User IDs
+ IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user_auth0 = 1) THEN
+ CALL demo.p_split(v_guid, a_ids_user_auth0, ',', FALSE);
+
+ DELETE FROM tmp_Split;
+
+ INSERT INTO tmp_Split (
+ substring
+ )
+ SELECT
+ substring
+ FROM demo.Split_Temp
+ WHERE 1=1
+ AND GUID = v_guid
+ AND NOT ISNULL(substring)
+ AND substring != ''
+ ;
+
+ CALL demo.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user_auth0 = 1) THEN
+ IF EXISTS (
+ SELECT *
+ FROM tmp_Split t_S
+ LEFT JOIN demo.Shop_User U ON t_S.substring = U.id_user_auth0
+ WHERE
+ ISNULL(t_S.substring)
+ OR ISNULL(U.id_user_auth0)
+ ) THEN
+ INSERT INTO tmp_Msg_Error (
+ -- guid,
+ id_type,
+ code,
+ msg
+ )
+ SELECT
+ -- v_guid,
+ v_id_type_error_bad_data,
+ v_code_error_bad_data,
+ CONCAT('Invalid or inactive Auth0 User IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split t_S
+ LEFT JOIN demo.Shop_User U ON t_S.substring = U.id_user_auth0
+ WHERE
+ ISNULL(t_S.substring)
+ OR ISNULL(U.id_user_auth0)
+ ;
+ ELSE
+ SET v_rank_max := IFNULL((SELECT rank_user FROM tmp_User ORDER BY rank_user DESC LIMIT 1), 0);
+
+ INSERT INTO tmp_User (
+ id_user
+ , rank_user
+ )
+ SELECT
+ U.id_user
+ , v_rank_max + (RANK() OVER (ORDER BY U.id_user DESC)) AS rank_user
+ FROM tmp_Split t_S
+ RIGHT JOIN demo.Shop_User U ON t_S.substring = U.id_user_auth0
+ WHERE
+ (
+ a_get_all_user = 1
+ OR (
+ v_has_filter_user_auth0 = 1
+ AND NOT ISNULL(t_S.substring)
+ )
+ )
+ AND (
+ a_get_inactive_user = 1
+ OR U.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ IF a_debug = 1 THEN
+ SELECT * FROM tmp_User;
+ END IF;
+
+ /*
+ IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
+ IF a_get_first_user_only THEN
+ DELETE t_U
+ FROM tmp_User t_U
+ WHERE t_U.rank_user > 1
+ ;
+ END IF;
+ END IF;
+ */
+
+ IF a_debug = 1 THEN
+ SELECT * FROM tmp_User;
+ END IF;
+
+ -- Can admin store
+ IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid -- guid
+ , a_id_user -- ids_user
+ , FALSE -- get_inactive_user
+ , v_id_permission_store_admin -- ids_permission
+ , v_id_access_level_admin -- ids_access_level
+ , '' -- ids_product
+ , 0 -- a_debug
+ ;
+ SELECT * FROM demo.Shop_Calc_User_Temp;
+ END IF;
+
+ CALL demo.p_shop_calc_user(
+ v_guid -- guid
+ , a_id_user -- ids_user
+ , FALSE -- get_inactive_user
+ , v_id_permission_store_admin -- ids_permission
+ , v_id_access_level_admin -- ids_access_level
+ , '' -- ids_product
+ , 0 -- a_debug
+ );
+
+ IF a_debug = 1 THEN
+ SELECT * FROM demo.Shop_Calc_User_Temp WHERE GUID = v_guid;
+ END IF;
+
+ UPDATE tmp_User t_U
+ INNER JOIN demo.Shop_Calc_User_Temp CUT
+ ON CUT.GUID = v_guid
+ AND t_U.id_user = CUT.id_user
+ SET t_U.can_admin_store = CUT.can_admin
+ ;
+
+ CALL demo.p_shop_clear_calc_user( v_guid, FALSE );
+ END IF;
+
+ -- Can admin user
+ IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid -- guid
+ , a_id_user -- ids_user
+ , FALSE -- get_inactive_user
+ , v_id_permission_user_admin -- ids_permission
+ , v_id_access_level_admin -- ids_access_level
+ , '' -- ids_product
+ , 0 -- a_debug
+ ;
+ SELECT * FROM demo.Shop_Calc_User_Temp;
+ END IF;
+
+ CALL demo.p_shop_calc_user(
+ v_guid -- guid
+ , a_id_user -- ids_user
+ , FALSE -- get_inactive_user
+ , v_id_permission_user_admin -- ids_permission
+ , v_id_access_level_admin -- ids_access_level
+ , '' -- ids_product
+ , 0 -- a_debug
+ );
+
+ IF a_debug = 1 THEN
+ SELECT * FROM demo.Shop_Calc_User_Temp WHERE GUID = v_guid;
+ END IF;
+
+ UPDATE tmp_User t_U
+ INNER JOIN demo.Shop_Calc_User_Temp CUT
+ ON CUT.GUID = v_guid
+ AND t_U.id_user = CUT.id_user
+ SET t_U.can_admin_user = CUT.can_admin
+ ;
+
+ CALL demo.p_shop_clear_calc_user( v_guid, FALSE );
+ END IF;
+
+ -- Permissions
+ IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid -- guid
+ , a_id_user -- ids_user
+ , FALSE -- get_inactive_user
+ , v_ids_permission_required -- ids_permission
+ , v_id_access_level_view -- ids_access_level
+ , '' -- ids_product
+ , 0 -- a_debug
+ ;
+ SELECT * FROM demo.Shop_Calc_User_Temp;
+ END IF;
+
+ CALL demo.p_shop_calc_user(
+ v_guid -- guid
+ , a_id_user -- ids_user
+ , FALSE -- get_inactive_user
+ , v_ids_permission_required -- ids_permission
+ , v_id_access_level_view -- ids_access_level
+ , '' -- ids_product
+ , 0 -- a_debug
+ );
+
+ IF a_debug = 1 THEN
+ SELECT * FROM demo.Shop_Calc_User_Temp WHERE GUID = v_guid;
+ END IF;
+
+ IF NOT EXISTS (
+ SELECT can_view
+ FROM demo.Shop_Calc_User_Temp CUT
+ WHERE 1=1
+ AND CUT.GUID = v_guid
+ AND can_view = 1
+ -- AND FIND_IN_SET(v_ids_permission_required, CUT.id_permission_required) > 0
+ ) THEN
+ INSERT INTO tmp_Msg_Error (
+ id_type,
+ code,
+ msg
+ )
+ VALUES (
+ v_id_type_error_bad_data,
+ v_code_error_bad_data,
+ -- CONCAT('You do not have view permissions for ', (SELECT name FROM demo.Shop_Permission WHERE id_permission = v_id_permission_user LIMIT 1))
+ -- CONCAT('You do not have view permissions for ', (SELECT GROUP_CONCAT(name SEPARATOR ', ') FROM demo.Shop_Permission WHERE FIND_IN_SET(v_id_permission_user, id_permission) > 0))
+ CONCAT('You do not have view permissions for ', (SELECT name FROM demo.Shop_Permission P INNER JOIN demo.Shop_Calc_User_Temp CUT ON P.id_permission = CUT.id_permission_required WHERE GUID = v_guid AND IFNULL(can_view, 0) = 0 LIMIT 1)) -- WHERE IFNULL(CUT.can_view, 0) = 0
+ )
+ ;
+ ELSE
+ -- INSERT INTO
+ SET a_debug := a_debug;
+ END IF;
+
+ CALL demo.p_shop_clear_calc_user( v_guid, FALSE );
+ END IF;
+
+
+ -- Returns
+ /* NULL record required for flask sql_alchemy to detect result set */
+ IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN
+ DELETE FROM tmp_User;
+ INSERT INTO tmp_User ( id_user )
+ VALUES ( NULL );
+ END IF;
+
+
+ SELECT
+ U.id_user
+ , U.id_user_auth0
+ , U.firstname
+ , U.surname
+ , U.email
+ , U.is_email_verified
+ , U.id_currency_default
+ , U.id_region_default
+ , U.is_included_VAT_default
+ , U.is_super_user
+ , t_U.can_admin_store
+ , t_U.can_admin_user
+ , v_is_new AS is_new
+ FROM tmp_User t_U
+ INNER JOIN demo.Shop_User U ON t_U.id_user = U.id_user
+ ;
+
+ # Errors
+ SELECT
+ t_ME.display_order,
+ MET.code,
+ t_ME.msg,
+ MET.name,
+ MET.description
+ FROM tmp_Msg_Error t_ME
+ INNER JOIN demo.Shop_Msg_Error_Type MET
+ ON t_ME.id_type = MET.id_type
+ ;
+
+
+ IF a_debug = 1 THEN
+ SELECT * FROM tmp_User;
+ END IF;
+
+ -- Clean up
+ DROP TEMPORARY TABLE IF EXISTS tmp_User;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+
+ /*
+ DELETE FROM demo.Shop_Calc_User_Temp
+ WHERE GUID = v_guid;
+ */
+
+ IF a_debug = 1 THEN
+ CALL demo.p_debug_timing_reporting ( v_time_start );
+ END IF;
+END //
+DELIMITER ;
+
+
+
+/*
+CALL p_dog_get_many_user (
+ NULL
+ , 'google-oauth2|109567376920138999933'
+ , False
+ , False
+ -- , False
+ , NULL
+ , 'google-oauth2|109567376920138999933'
+ , 0
+);
+ NULL # a_id_user
+ , 'auth0|6582b95c895d09a70ba10fef' # a_id_user_auth0
+ , 0 # a_get_all_user
+ , 0 # a_get_inactive_user
+ -- , 0 # a_get_first_user_only
+ , NULL # a_ids_user
+ , 'auth0|6582b95c895d09a70ba10fef' # a_ids_user_auth0
+ , 0 -- a_debug
+);*/
+
+/*
+select * FROM demo.Shop_Calc_User_Temp;
+delete FROM demo.Shop_Calc_User_Temp;
+
+SELECT *
+FROM demo.Shop_USER;
+
+CALL p_dog_get_many_user(
+ NULL -- :a_id_user,
+ , 'auth0|6582b95c895d09a70ba10fef' -- :a_id_user_auth0,
+ , 1 -- :a_get_all_user,
+ , 0 -- :a_get_inactive_user,
+ -- , 0 -- :a_get_first_user_only,
+ , NULL -- :a_ids_user,
+ , 'auth0|6582b95c895d09a70ba10fef' -- :a_ids_user_auth0
+);
+
+*/
diff --git a/static/MySQL/70518_p_dog_save_user.sql b/static/MySQL/70518_p_dog_save_user.sql
new file mode 100644
index 0000000..ca5eee6
--- /dev/null
+++ b/static/MySQL/70518_p_dog_save_user.sql
@@ -0,0 +1,279 @@
+
+
+DROP PROCEDURE IF EXISTS p_dog_save_user;
+
+
+DELIMITER //
+CREATE PROCEDURE p_dog_save_user (
+ IN a_comment VARCHAR(500),
+ IN a_guid BINARY(36),
+ IN a_id_user INT,
+ IN a_debug BIT
+)
+BEGIN
+ DECLARE v_code_type_error_bad_data VARCHAR(100);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_id_permission_product INT;
+ DECLARE v_id_permission_user_admin LONGTEXT;
+ DECLARE v_id_change_set INT;
+ DECLARE v_id_access_level_edit INT;
+ DECLARE v_can_admin_user BIT;
+ 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 (
+ display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_type INT NULL
+ , code VARCHAR(50) NOT NULL
+ , msg VARCHAR(4000) NOT NULL
+ );
+ INSERT INTO tmp_Msg_Error (
+ id_type
+ , code
+ , msg
+ )
+ SELECT
+ MET.id_type
+ , @errno
+ , @text
+ FROM demo.Shop_Msg_Error_Type MET
+ WHERE MET.code = 'MYSQL_ERROR'
+ ;
+ SELECT *
+ FROM tmp_Msg_Error;
+ DROP TABLE IF EXISTS tmp_Msg_Error;
+ END;
+
+ SET v_time_start := CURRENT_TIMESTAMP(6);
+ SET v_code_type_error_bad_data := 'BAD_DATA';
+ SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
+ SET v_id_access_level_edit := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
+ SET v_id_permission_user_admin := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM Shop_Permission WHERE code = 'STORE_USER_ADMIN' LIMIT 1);
+ CALL p_validate_guid ( a_guid );
+
+ DROP TABLE IF EXISTS tmp_Msg_Error;
+ DROP TABLE IF EXISTS tmp_User;
+
+ CREATE TABLE tmp_User (
+ id_user INT NOT NULL
+ , id_user_auth0 VARCHAR(200) NOT NULL
+ , firstname VARCHAR(255)
+ , surname VARCHAR(255)
+ , email VARCHAR(254)
+ , is_email_verified BIT NOT NULL
+ , is_super_user BIT NOT NULL
+ , id_currency_default INT
+ , id_region_default INT
+ , is_included_VAT_default BIT
+ , active BIT NOT NULL
+ , name_error VARCHAR(1000)
+ );
+
+ CREATE TABLE tmp_Msg_Error (
+ display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ id_type INT NOT NULL,
+ code VARCHAR(50) NOT NULL,
+ msg VARCHAR(4000) NOT NULL
+ );
+
+ -- Get data from Temp table
+ INSERT INTO tmp_User (
+ id_user
+ , id_user_auth0
+ , firstname
+ , surname
+ , email
+ , is_email_verified
+ , is_super_user
+ , id_currency_default
+ , id_region_default
+ , is_included_VAT_default
+ , active
+ )
+ SELECT
+ U_T.id_user
+ , U_T.id_user_auth0
+ , IFNULL(U_T.firstname, U.firstname) AS firstname
+ , IFNULL(U_T.surname, U.surname) AS surname
+ , IFNULL(U_T.email, U.email) AS email
+ , IFNULL(U_T.is_email_verified, U.is_email_verified) AS is_email_verified
+ , IFNULL(U_T.is_super_user, U.is_super_user) AS is_super_user
+ , IFNULL(U_T.id_currency_default, U.id_currency_default) AS id_currency_default
+ , IFNULL(U_T.id_region_default, U.id_region_default) AS id_region_default
+ , IFNULL(U_T.is_included_VAT_default, U.is_included_VAT_default) AS is_included_VAT_default
+ , IFNULL(IFNULL(U_T.active, U.active), 1) AS active
+ , IFNULL(U_T.display_order, PC.display_order) AS display_order
+ FROM demo.Shop_User_Temp U_T
+ LEFT JOIN Shop_User U ON U_T.id_user = U.id_user
+ WHERE U_T.guid = a_guid
+ ;
+
+ UPDATE tmp_User t_U
+ SET
+ t_U.name_error = IFNULL(t_U.email, t_U.id_user_auth0)
+ ;
+
+ -- Validation
+ -- Missing mandatory fields
+ -- email
+ IF EXISTS (SELECT * FROM tmp_User t_U WHERE ISNULL(t_U.email) LIMIT 1) 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 User(s) do not have an email: ', GROUP_CONCAT(t_U.name_error SEPARATOR ', ')) AS msg
+ FROM tmp_User t_U
+ WHERE ISNULL(t_U.email)
+ ;
+ END IF;
+ -- is_super_user
+ IF EXISTS (SELECT * FROM tmp_User t_U WHERE ISNULL(t_U.is_super_user) LIMIT 1) 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 User(s) do not have an is super user field: ', GROUP_CONCAT(t_U.name_error SEPARATOR ', ')) AS msg
+ FROM tmp_User t_U
+ WHERE ISNULL(t_U.is_super_user)
+ ;
+ END IF;
+ -- is_email_verified
+ IF EXISTS (SELECT * FROM tmp_User t_U WHERE ISNULL(t_U.is_email_verified) LIMIT 1) 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 User(s) do not have an is email verified: ', GROUP_CONCAT(t_U.name_error SEPARATOR ', ')) AS msg
+ FROM tmp_User t_U
+ WHERE ISNULL(t_U.is_email_verified)
+ ;
+ END IF;
+
+
+ -- Permissions
+ IF a_debug = 1 THEN
+ SELECT
+ a_guid -- GUID
+ , a_id_user -- ID User
+ , FALSE -- get inactive Users
+ , v_id_permission_user_admin -- IDs Permission
+ , v_id_access_level_edit -- ID Access Level
+ , NULL -- IDs Product
+ ;
+ END IF;
+
+ CALL p_shop_calc_user(
+ a_guid -- GUID
+ , a_id_user -- ID User
+ , FALSE -- get inactive Users
+ , v_id_permission_user_admin -- IDs Permission
+ , v_id_access_level_edit -- ID Access Level
+ , NULL -- IDs Product
+ );
+
+ SET v_can_admin_user := (
+ SELECT IFNULL(UE_T.can_edit, 0) = 1
+ FROM demo.Shop_User_Eval_Temp UE_T
+ WHERE
+ UE_T.GUID = a_guid
+ AND UE_T.id_user = a_id_user
+ AND UE_T.id_permission = v_id_permission_user_admin
+ );
+
+ IF (v_can_admin_user = 0 AND EXISTS (
+ SELECT *
+ FROM tmp_User t_U
+ WHERE
+ t_U.id_user <> a_id_user
+ )) THEN
+ DELETE FROM tmp_Msg_Error;
+ 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 other Users.'
+ )
+ ;
+ END IF;
+
+ CALL p_shop_clear_calc_user(a_guid);
+
+ IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
+ START TRANSACTION;
+
+ INSERT INTO Shop_User_Change_Set ( comment )
+ VALUES ( a_comment )
+ ;
+
+ SET v_id_change_set := LAST_INSERT_ID();
+
+ UPDATE Shop_User U
+ INNER JOIN tmp_User t_U ON U.id_user = t_U.id_user
+ SET
+ U.id_user_auth0 = t_U.id_user_auth0
+ , U.firstname = t_U.firstname
+ , U.surname = t_U.surname
+ , U.email = t_U.email
+ , U.is_email_verified = t_U.is_email_verified
+ , U.is_super_user = t_U.is_super_user
+ , U.id_currency_default = t_U.id_currency_default
+ , U.id_region_default = t_U.id_region_default
+ , U.is_included_VAT_default = t_U.is_included_VAT_default
+ , U.active = t_U.active
+ , U.id_change_set = v_id_change_set
+ ;
+
+ COMMIT;
+ END IF;
+
+ START TRANSACTION;
+
+ DELETE FROM Shop_User_Temp
+ WHERE GUID = a_guid;
+
+ COMMIT;
+
+ # Errors
+ SELECT *
+ FROM tmp_Msg_Error t_ME
+ INNER JOIN demo.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
+ ;
+
+ IF a_debug = 1 THEN
+ SELECT * from tmp_User;
+ END IF;
+
+ DROP TABLE IF EXISTS tmp_Msg_Error;
+ DROP TABLE IF EXISTS tmp_User;
+
+ IF a_debug = 1 THEN
+ CALL demo.p_debug_timing_reporting ( v_time_start );
+ END IF;
+END //
+DELIMITER ;
+
diff --git a/static/MySQL/7130_p_dog_calc_user.sql b/static/MySQL/70530_p_dog_calc_user.sql
similarity index 100%
rename from static/MySQL/7130_p_dog_calc_user.sql
rename to static/MySQL/70530_p_dog_calc_user.sql
diff --git a/static/MySQL/7131_p_dog_clear_calc_user.sql b/static/MySQL/70531_p_dog_clear_calc_user.sql
similarity index 100%
rename from static/MySQL/7131_p_dog_clear_calc_user.sql
rename to static/MySQL/70531_p_dog_clear_calc_user.sql
diff --git a/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql b/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql
new file mode 100644
index 0000000..a15a3c0
--- /dev/null
+++ b/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql
@@ -0,0 +1,43 @@
+
+USE parts;
+
+-- Clear previous proc
+DROP PROCEDURE IF EXISTS p_dog_get_many_unit_measurement;
+
+
+DELIMITER //
+CREATE PROCEDURE p_dog_get_many_unit_measurement (
+ IN a_get_inactive_unit_measurement BIT
+)
+BEGIN
+ SET a_get_inactive_unit_measurement := IFNULL(a_get_inactive_unit_measurement, 0);
+
+ SELECT
+ UM.id_unit_measurement,
+ UM.name_singular,
+ UM.name_plural,
+ UM.symbol,
+ UM.symbol_is_suffix_not_prefix,
+ UM.is_base_unit,
+ UM.is_unit_of_distance,
+ UM.is_unit_of_mass,
+ UM.is_unit_of_time,
+ UM.is_unit_of_volume,
+ UM.active
+ FROM parts.DOG_Unit_Measurement UM
+ WHERE
+ a_get_inactive_unit_measurement = 1
+ OR UM.active = 1
+ ;
+END //
+DELIMITER ;
+
+
+/*
+CALL p_dog_get_many_unit_measurement (
+ 0 # a_get_inactive_unit_measurement
+);
+
+select *
+from dog_unit_measurement
+*/
diff --git a/static/MySQL/71001_p_dog_get_many_dog.sql b/static/MySQL/71001_p_dog_get_many_dog.sql
new file mode 100644
index 0000000..4f75aca
--- /dev/null
+++ b/static/MySQL/71001_p_dog_get_many_dog.sql
@@ -0,0 +1,396 @@
+
+USE parts;
+
+DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_dog;
+
+DELIMITER //
+CREATE PROCEDURE parts.p_DOG_get_many_dog (
+ IN a_id_user INT
+ , IN a_get_all_dog BIT
+ , IN a_get_inactive_dog BIT
+ , IN a_ids_dog TEXT
+ , IN a_names_dog TEXT
+ , IN a_debug BIT
+)
+BEGIN
+ DECLARE v_code_type_error_bad_data VARCHAR(100);
+ DECLARE v_code_type_error_no_permission VARCHAR(100);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_id_type_error_no_permission INT;
+ DECLARE v_has_filter_dog_id BIT;
+ DECLARE v_has_filter_dog_name BIT;
+ DECLARE v_guid BINARY(36);
+ DECLARE v_id_permission_dog_view INT;
+ DECLARE v_id_minimum INT;
+ DECLARE v_time_start TIMESTAMP(6);
+ DECLARE v_can_view BIT;
+
+ 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(100) NOT NULL
+ , msg VARCHAR(4000) 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 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 parts.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 parts.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 parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1);
+
+ SET a_id_user := IFNULL(a_id_user, 0);
+ SET a_get_all_dog := IFNULL(a_get_all_dog, 0);
+ SET a_get_inactive_dog := IFNULL(a_get_inactive_dog, 0);
+ SET a_ids_dog := TRIM(IFNULL(a_ids_dog, ''));
+ SET a_names_dog := TRIM(IFNULL(a_names_dog, ''));
+ SET a_debug := IFNULL(a_debug, 0);
+
+ IF a_debug = 1 THEN
+ SELECT
+ a_id_user
+ , a_get_all_dog
+ , a_get_inactive_dog
+ , a_ids_dog
+ , a_names_dog
+ , 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_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
+
+ CREATE TEMPORARY TABLE tmp_Dog (
+ id_dog INT NOT NULL
+ , name 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(100) NOT NULL
+ , msg VARCHAR(4000) NOT NULL
+ );
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Id;
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Name;
+
+ CALL parts.p_core_validate_guid ( v_guid );
+
+ SET v_has_filter_dog_id = CASE WHEN a_ids_dog = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_dog_name = CASE WHEN a_names_dog = '' THEN 0 ELSE 1 END;
+
+ -- Dogs
+ IF v_has_filter_dog_id = 1 THEN
+ CALL parts.p_split(v_guid, a_ids_dog, ',', a_debug);
+
+ INSERT INTO tmp_Split_Id (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF v_has_filter_dog_name = 1 THEN
+ CALL parts.p_split(v_guid, a_names_dog, ',', a_debug);
+
+ INSERT INTO tmp_Split_Name (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ 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
+ IF EXISTS (
+ SELECT *
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN parts.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 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('Invalid or inactive Dog IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN parts.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 0
+ )
+ ;
+ /* Don't error on names not found
+ ELSEIF EXISTS (
+ SELECT *
+ FROM tmp_Split t_SPLIT
+ LEFT JOIN parts.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 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('Invalid or inactive Dog IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split t_SPLIT
+ LEFT JOIN parts.DOG_Dog DOG ON t_SPLIT.as_int = DOG.id_dog
+ WHERE
+ ISNULL(t_SPLIT.as_int)
+ OR ISNULL(DOG.id_dog)
+ OR (
+ DOG.active = 0
+ AND a_get_inactive_dog = 0
+ )
+ ;
+ */
+ ELSE
+ INSERT INTO tmp_Dog (
+ id_dog
+ , name
+ )
+ SELECT
+ DOG.id_dog
+ , DOG.name
+ FROM parts.DOG_Dog DOG
+ LEFT JOIN tmp_Split_Id t_SPLIT_ID ON DOG.id_dog = t_SPLIT_ID.as_int
+ LEFT JOIN tmp_Split_Name t_SPLIT_NAME ON DOG.name = t_SPLIT_NAME.substring
+ WHERE
+ (
+ a_get_all_dog = 1
+ OR (
+ v_has_filter_dog_id = 1
+ OR v_has_filter_dog_name = 1
+ )
+ )
+ AND (
+ a_get_inactive_dog = 1
+ OR DOG.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ DELETE FROM tmp_Split_Id;
+ DELETE FROM tmp_Split_Name;
+
+
+ -- Permissions
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_dog_view
+ , 0 -- a_debug
+ ;
+ END IF;
+
+ CALL parts.p_DOG_calc_user(
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_dog_view
+ , 0 -- a_debug
+ );
+
+ SELECT
+ IFNULL(CALC_USER_T.has_access, 0)
+ INTO
+ v_can_view
+ FROM parts.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;
+ 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 Commands.'
+ )
+ ;
+ END IF;
+
+ CALL parts.p_DOG_clear_calc_user(
+ v_guid
+ , 0 -- a_debug
+ );
+
+ 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;
+ END IF;
+
+ DELETE FROM tmp_Dog;
+ END IF;
+
+ -- Outputs
+ -- Commands
+ SELECT
+ t_DOG.id_dog
+ , t_DOG.name
+ , DOG.appearance
+ , DOG.mass_kg
+ , DOG.notes
+ , DOG.active
+ FROM parts.DOG_Dog DOG
+ INNER JOIN tmp_Dog t_DOG ON DOG.id_dog = t_DOG.id_dog
+ ;
+
+ -- 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 AND v_can_view = 1 THEN
+ SELECT * FROM tmp_Dog;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
+
+ IF a_debug = 1 THEN
+ CALL parts.p_core_debug_timing_reporting ( v_time_start );
+ END IF;
+END //
+DELIMITER ;
+
+
+/*
+
+CALL parts.p_DOG_get_many_dog (
+ 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
+ , 1 -- a_get_all_dog
+ , 0 -- a_get_inactive_dog
+ , '' -- a_ids_dog
+ , '' -- a_names_dog
+ , 1 -- a_debug
+);
+
+*/
\ No newline at end of file
diff --git a/static/MySQL/7201_p_dog_save_command.sql b/static/MySQL/71003_p_dog_save_command.sql
similarity index 100%
rename from static/MySQL/7201_p_dog_save_command.sql
rename to static/MySQL/71003_p_dog_save_command.sql
diff --git a/static/MySQL/7202_p_dog_test_save_command.sql b/static/MySQL/71004_p_dog_test_save_command.sql
similarity index 100%
rename from static/MySQL/7202_p_dog_test_save_command.sql
rename to static/MySQL/71004_p_dog_test_save_command.sql
diff --git a/static/MySQL/71104_p_dog_get_many_command.sql b/static/MySQL/71104_p_dog_get_many_command.sql
new file mode 100644
index 0000000..5d77e22
--- /dev/null
+++ b/static/MySQL/71104_p_dog_get_many_command.sql
@@ -0,0 +1,368 @@
+
+USE parts;
+
+DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_command;
+
+DELIMITER //
+CREATE PROCEDURE parts.p_DOG_get_many_command (
+ IN a_id_user INT
+ , IN a_get_all_command BIT
+ , IN a_get_inactive_command BIT
+ , IN a_ids_command TEXT
+ , IN a_names_command TEXT
+ , IN a_debug BIT
+)
+BEGIN
+ DECLARE v_code_type_error_bad_data VARCHAR(100);
+ DECLARE v_code_type_error_no_permission VARCHAR(100);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_id_type_error_no_permission INT;
+ DECLARE v_has_filter_command_id BIT;
+ DECLARE v_has_filter_command_name BIT;
+ DECLARE v_guid BINARY(36);
+ DECLARE v_id_permission_command_view INT;
+ DECLARE v_id_minimum INT;
+ DECLARE v_time_start TIMESTAMP(6);
+ DECLARE v_can_view BIT;
+
+ 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(100) NOT NULL
+ , msg VARCHAR(4000) 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 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 parts.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 parts.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_no_permission LIMIT 1);
+ SET v_id_permission_command_view := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1);
+
+ SET a_id_user := IFNULL(a_id_user, 0);
+ SET a_get_all_command := IFNULL(a_get_all_command, 0);
+ SET a_get_inactive_command := IFNULL(a_get_inactive_command, 0);
+ SET a_ids_command := TRIM(IFNULL(a_ids_command, ''));
+ SET a_names_command := TRIM(IFNULL(a_names_command, ''));
+ SET a_debug := IFNULL(a_debug, 0);
+
+ IF a_debug = 1 THEN
+ SELECT
+ a_id_user
+ , a_get_all_command
+ , a_get_inactive_command
+ , a_ids_command
+ , a_names_command
+ , a_debug
+ ;
+
+ SELECT
+ v_id_type_error_bad_data
+ , v_id_type_error_no_permission
+ , v_guid
+ , v_id_permission_command_view
+ , v_time_start
+ ;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Command;
+
+ CREATE TEMPORARY TABLE tmp_Command (
+ id_command INT NOT NULL
+ , name 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(100) NOT NULL
+ , msg VARCHAR(4000) NOT NULL
+ );
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Id;
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Name;
+
+ CALL parts.p_core_validate_guid ( v_guid );
+
+ SET v_has_filter_command_id = CASE WHEN a_ids_command = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_command_name = CASE WHEN a_names_command = '' THEN 0 ELSE 1 END;
+
+ -- Commands
+ IF v_has_filter_command_id = 1 THEN
+ CALL parts.p_split(v_guid, a_ids_command, ',', a_debug);
+
+ INSERT INTO tmp_Split_Id (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF v_has_filter_command_name = 1 THEN
+ CALL parts.p_split(v_guid, a_names_command, ',', a_debug);
+
+ INSERT INTO tmp_Split_Name (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ 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
+ IF EXISTS (
+ SELECT *
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN parts.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(COMMAND.id_command)
+ OR (
+ COMMAND.active = 0
+ AND a_get_inactive_command = 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('Invalid or inactive Command IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN parts.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(COMMAND.id_command)
+ OR (
+ COMMAND.active = 0
+ AND a_get_inactive_command = 0
+ )
+ ;
+ /* Don't error on codes or names not found
+ ELSEIF EXISTS (
+ SELECT *
+ */
+ ELSE
+ INSERT INTO tmp_Command (
+ id_command
+ , name
+ )
+ SELECT
+ COMMAND.id_command
+ , COMMAND.name
+ FROM parts.DOG_Command COMMAND
+ LEFT JOIN tmp_Split_Id t_SPLIT_ID ON COMMAND.id_command = t_SPLIT_ID.as_int
+ LEFT JOIN tmp_Split_Name t_SPLIT_NAME ON COMMAND.name = t_SPLIT_NAME.substring
+ WHERE
+ (
+ a_get_all_command = 1
+ OR (
+ v_has_filter_command_id = 1
+ OR v_has_filter_command_name = 1
+ )
+ )
+ AND (
+ a_get_inactive_command = 1
+ OR COMMAND.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ DELETE FROM tmp_Split_Id;
+ DELETE FROM tmp_Split_Name;
+
+
+ -- Permissions
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_command_view
+ , 0 -- a_debug
+ ;
+ END IF;
+
+ CALL parts.p_DOG_calc_user(
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_command_view
+ , 0 -- a_debug
+ );
+
+ SELECT
+ IFNULL(CALC_USER_T.has_access, 0)
+ INTO
+ v_can_view
+ FROM parts.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;
+ 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 Commands.'
+ )
+ ;
+ END IF;
+
+ CALL parts.p_DOG_clear_calc_user(
+ v_guid
+ , 0 -- a_debug
+ );
+
+ 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_Command;
+ END IF;
+
+ DELETE FROM tmp_Command;
+ END IF;
+
+ -- Outputs
+ -- Commands
+ SELECT
+ t_COMMAND.id_command
+ , COMMAND.id_command_category
+ , t_COMMAND.name
+ , COMMAND.hand_signal_default_description
+ , COMMAND.can_have_button
+ , COMMAND.notes
+ , COMMAND.active
+ FROM parts.DOG_Command COMMAND
+ INNER JOIN tmp_Command t_COMMAND ON COMMAND.id_command = t_COMMAND.id_command
+ ;
+
+ -- 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 AND v_can_view = 1 THEN
+ SELECT * FROM tmp_Command;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Command;
+
+ IF a_debug = 1 THEN
+ CALL parts.p_core_debug_timing_reporting ( v_time_start );
+ END IF;
+END //
+DELIMITER ;
+
+
+/*
+
+CALL parts.p_DOG_get_many_command (
+ 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
+ , 1 -- a_get_all_command
+ , 0 -- a_get_inactive_command
+ , '' -- a_ids_command
+ , '' -- a_names_command
+ , 1 -- a_debug
+);
+
+*/
\ No newline at end of file
diff --git a/static/MySQL/7203_p_dog_get_many_dog_command.sql b/static/MySQL/71108_p_dog_get_many_dog_command_link.sql
similarity index 61%
rename from static/MySQL/7203_p_dog_get_many_dog_command.sql
rename to static/MySQL/71108_p_dog_get_many_dog_command_link.sql
index 9b2e676..8823b57 100644
--- a/static/MySQL/7203_p_dog_get_many_dog_command.sql
+++ b/static/MySQL/71108_p_dog_get_many_dog_command_link.sql
@@ -2,9 +2,10 @@
USE parts;
DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_dog_command;
+DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_dog_command_link;
DELIMITER //
-CREATE PROCEDURE parts.p_DOG_get_many_dog_command (
+CREATE PROCEDURE parts.p_DOG_get_many_dog_command_link (
IN a_id_user INT
, IN a_get_all_dog BIT
, IN a_get_inactive_dog BIT
@@ -12,12 +13,6 @@ CREATE PROCEDURE parts.p_DOG_get_many_dog_command (
, IN a_get_all_command BIT
, IN a_get_inactive_command BIT
, IN a_ids_command TEXT
- , IN a_get_all_understanding_level BIT
- , IN a_get_inactive_understanding_level BIT
- , IN a_ids_understanding_level TEXT
- , IN a_get_all_obedience_level BIT
- , IN a_get_inactive_obedience_level BIT
- , IN a_ids_obedience_level TEXT
, IN a_debug BIT
)
BEGIN
@@ -27,8 +22,6 @@ BEGIN
DECLARE v_id_type_error_no_permission INT;
DECLARE v_has_filter_command BIT;
DECLARE v_has_filter_dog BIT;
- DECLARE v_has_filter_obedience_level BIT;
- DECLARE v_has_filter_understanding_level BIT;
DECLARE v_guid BINARY(36);
DECLARE v_id_permission_dog_view INT;
DECLARE v_id_minimum INT;
@@ -97,12 +90,6 @@ BEGIN
SET a_get_all_command := IFNULL(a_get_all_command, 0);
SET a_get_inactive_command := IFNULL(a_get_inactive_command, 0);
SET a_ids_command := TRIM(IFNULL(a_ids_command, ''));
- SET a_get_all_understanding_level := IFNULL(a_get_all_understanding_level, 0);
- SET a_get_inactive_understanding_level := IFNULL(a_get_inactive_understanding_level, 0);
- SET a_ids_understanding_level := TRIM(IFNULL(a_ids_understanding_level, ''));
- SET a_get_all_obedience_level := IFNULL(a_get_all_obedience_level, 0);
- SET a_get_inactive_obedience_level := IFNULL(a_get_inactive_obedience_level, 0);
- SET a_ids_obedience_level := TRIM(IFNULL(a_ids_obedience_level, ''));
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
@@ -114,12 +101,6 @@ BEGIN
, a_get_all_command
, a_get_inactive_command
, a_ids_command
- , a_get_all_understanding_level
- , a_get_inactive_understanding_level
- , a_ids_understanding_level
- , a_get_all_obedience_level
- , a_get_inactive_obedience_level
- , a_ids_obedience_level
, a_debug
;
@@ -134,8 +115,6 @@ BEGIN
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
- DROP TEMPORARY TABLE IF EXISTS tmp_Obedience_Level;
- DROP TEMPORARY TABLE IF EXISTS tmp_Understanding_Level;
DROP TEMPORARY TABLE IF EXISTS tmp_Command;
DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
@@ -153,18 +132,6 @@ BEGIN
, has_button BIT
);
- CREATE TEMPORARY TABLE tmp_Understanding_Level (
- id_understanding_level INT NOT NULL
- , code VARCHAR(100)
- , name VARCHAR(250)
- );
-
- CREATE TEMPORARY TABLE tmp_Obedience_Level (
- id_obedience_level INT NOT NULL
- , code VARCHAR(100)
- , name VARCHAR(250)
- );
-
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
@@ -182,8 +149,6 @@ BEGIN
SET v_has_filter_dog = CASE WHEN a_ids_dog = '' THEN 0 ELSE 1 END;
SET v_has_filter_command = CASE WHEN a_ids_command = '' THEN 0 ELSE 1 END;
- SET v_has_filter_understanding_level = CASE WHEN a_ids_understanding_level = '' THEN 0 ELSE 1 END;
- SET v_has_filter_obedience_level = CASE WHEN a_ids_obedience_level = '' THEN 0 ELSE 1 END;
-- Dogs
IF v_has_filter_dog = 1 THEN
@@ -358,172 +323,6 @@ BEGIN
DELETE FROM tmp_Split;
- -- Understanding Levels
- IF v_has_filter_understanding_level = 1 THEN
- CALL parts.p_split(v_guid, a_ids_understanding_level, ',', a_debug);
-
- INSERT INTO tmp_Split (
- substring
- , as_int
- )
- SELECT
- substring
- , CONVERT(substring, DECIMAL(10,0)) AS as_int
- FROM parts.CORE_Split_Temp
- WHERE
- GUID = v_guid
- AND NOT ISNULL(substring)
- AND substring <> ''
- ;
-
- CALL parts.p_clear_split_temp( v_guid );
- 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
- IF EXISTS (
- SELECT *
- FROM tmp_Split t_SPLIT
- LEFT JOIN parts.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT.as_int = UNDERSTANDING_LEVEL.id_understanding_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(UNDERSTANDING_LEVEL.id_understanding_level)
- OR (
- UNDERSTANDING_LEVEL.active = 0
- AND a_get_inactive_understanding_level = 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('Invalid or inactive Understanding Level IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
- FROM tmp_Split t_SPLIT
- LEFT JOIN parts.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT.as_int = UNDERSTANDING_LEVEL.id_understanding_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(UNDERSTANDING_LEVEL.id_understanding_level)
- OR (
- UNDERSTANDING_LEVEL.active = 0
- AND a_get_inactive_understanding_level = 0
- )
- ;
- ELSE
- INSERT INTO tmp_Understanding_Level (
- id_understanding_level
- , code
- , name
- )
- SELECT
- UNDERSTANDING_LEVEL.id_understanding_level
- , UNDERSTANDING_LEVEL.code
- , UNDERSTANDING_LEVEL.name
- FROM tmp_Split t_SPLIT
- RIGHT JOIN parts.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT.as_int = UNDERSTANDING_LEVEL.id_understanding_level
- WHERE
- (
- a_get_all_understanding_level = 1
- OR (
- v_has_filter_understanding_level = 1
- AND NOT ISNULL(t_SPLIT.as_int)
- )
- )
- AND (
- a_get_inactive_understanding_level = 1
- OR UNDERSTANDING_LEVEL.active = 1
- )
- ;
- END IF;
- END IF;
-
- DELETE FROM tmp_Split;
-
- -- Obedience Levels
- IF v_has_filter_obedience_level = 1 THEN
- CALL parts.p_split(v_guid, a_ids_obedience_level, ',', a_debug);
-
- INSERT INTO tmp_Split (
- substring
- , as_int
- )
- SELECT
- substring
- , CONVERT(substring, DECIMAL(10,0)) AS as_int
- FROM parts.CORE_Split_Temp
- WHERE
- GUID = v_guid
- AND NOT ISNULL(substring)
- AND substring <> ''
- ;
-
- CALL parts.p_clear_split_temp( v_guid );
- 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
- IF EXISTS (
- SELECT *
- FROM tmp_Split t_SPLIT
- LEFT JOIN parts.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_SPLIT.as_int = OBEDIENCE_LEVEL.id_obedience_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(OBEDIENCE_LEVEL.id_obedience_level)
- OR (
- OBEDIENCE_LEVEL.active = 0
- AND a_get_inactive_obedience_level = 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('Invalid or inactive Obedience Level IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ', '), 'NULL'))
- FROM tmp_Split t_SPLIT
- LEFT JOIN parts.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_SPLIT.as_int = OBEDIENCE_LEVEL.id_obedience_level
- WHERE
- ISNULL(t_SPLIT.as_int)
- OR ISNULL(OBEDIENCE_LEVEL.id_obedience_level)
- OR (
- OBEDIENCE_LEVEL.active = 0
- AND a_get_inactive_obedience_level = 0
- )
- ;
- ELSE
- INSERT INTO tmp_Obedience_Level (
- id_obedience_level
- , code
- , name
- )
- SELECT
- OBEDIENCE_LEVEL.id_obedience_level
- , OBEDIENCE_LEVEL.code
- , OBEDIENCE_LEVEL.name
- FROM tmp_Split t_SPLIT
- RIGHT JOIN parts.DOG_Obedience_Level OBEDIENCE_LEVEL ON t_SPLIT.as_int = OBEDIENCE_LEVEL.id_obedience_level
- WHERE
- (
- a_get_all_obedience_level = 1
- OR (
- v_has_filter_obedience_level = 1
- AND NOT ISNULL(t_SPLIT.as_int)
- )
- )
- AND (
- a_get_inactive_obedience_level = 1
- OR OBEDIENCE_LEVEL.active = 1
- )
- ;
- END IF;
- END IF;
-
- DELETE FROM tmp_Split;
-
-- Permissions
IF a_debug = 1 THEN
@@ -584,13 +383,10 @@ BEGIN
IF a_debug = 1 THEN
SELECT * FROM tmp_Dog;
SELECT * FROM tmp_Command;
- SELECT * FROM tmp_Obedience_Level;
END IF;
DELETE FROM tmp_Dog;
DELETE FROM tmp_Command;
- SELECT * FROM tmp_Understanding_Level;
- DELETE FROM tmp_Obedience_Level;
END IF;
-- Outputs
@@ -605,20 +401,12 @@ BEGIN
-- , t_COMMAND.code
, t_COMMAND.name AS name_command
, t_COMMAND.has_button AS command_has_button
- , t_UNDERSTANDING_LEVEL.id_understanding_level
- , t_UNDERSTANDING_LEVEL.code AS code_understanding_level
- , t_UNDERSTANDING_LEVEL.name AS name_understanding_level
- , t_OBEDIENCE_LEVEL.id_obedience_level
- , t_OBEDIENCE_LEVEL.code AS code_obedience_level
- , t_OBEDIENCE_LEVEL.name AS name_obedience_level
, DOG_COMMAND_LINK.hand_signal_description
, DOG_COMMAND_LINK.notes
, DOG_COMMAND_LINK.active
FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK
INNER JOIN tmp_Dog t_DOG ON DOG_COMMAND_LINK.id_dog = t_DOG.id_dog
INNER JOIN tmp_Command t_COMMAND ON DOG_COMMAND_LINK.id_command = t_COMMAND.id_command
- INNER JOIN tmp_Understanding_Level t_UNDERSTANDING_LEVEL ON DOG_COMMAND_LINK.id_understanding_level = t_UNDERSTANDING_LEVEL.id_understanding_level
- INNER JOIN tmp_Obedience_Level t_OBEDIENCE_LEVEL ON DOG_COMMAND_LINK.id_obedience_level = t_OBEDIENCE_LEVEL.id_obedience_level
;
-- Errors
@@ -639,14 +427,10 @@ BEGIN
IF a_debug = 1 AND v_can_view = 1 THEN
SELECT * FROM tmp_Dog;
SELECT * FROM tmp_Command;
- SELECT * FROM tmp_Understanding_Level;
- SELECT * FROM tmp_Obedience_Level;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
- DROP TEMPORARY TABLE IF EXISTS tmp_Obedience_Level;
- DROP TEMPORARY TABLE IF EXISTS tmp_Understanding_Level;
DROP TEMPORARY TABLE IF EXISTS tmp_Command;
DROP TEMPORARY TABLE IF EXISTS tmp_Dog;
@@ -659,7 +443,7 @@ DELIMITER ;
/*
-CALL parts.p_DOG_get_many_dog_command (
+CALL parts.p_DOG_get_many_dog_command_link (
1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
, 1 -- a_get_all_dog
, 0 -- a_get_inactive_dog
@@ -667,12 +451,6 @@ CALL parts.p_DOG_get_many_dog_command (
, 1 -- a_get_all_command
, 0 -- a_get_inactive_command
, '' -- a_ids_command
- , 1 -- a_get_all_understanding_level
- , 0 -- a_get_inactive_understanding_level
- , '' -- a_ids_understanding_level
- , 1 -- a_get_all_obedience_level
- , 0 -- a_get_inactive_obedience_level
- , '' -- a_ids_obedience_level
, 1 -- a_debug
);
diff --git a/templates/pages/dog/_dog_home.html b/static/MySQL/71109_1_p_dog_test_get_many_command_link.sql
similarity index 100%
rename from templates/pages/dog/_dog_home.html
rename to static/MySQL/71109_1_p_dog_test_get_many_command_link.sql
diff --git a/static/MySQL/9000_populate.sql b/static/MySQL/90000_populate.sql
similarity index 55%
rename from static/MySQL/9000_populate.sql
rename to static/MySQL/90000_populate.sql
index d669235..e67e718 100644
--- a/static/MySQL/9000_populate.sql
+++ b/static/MySQL/90000_populate.sql
@@ -257,6 +257,70 @@ VALUES
)
;
+
+# Unit of Measurement
+INSERT INTO parts.DOG_Unit_Measurement (
+ name_singular, name_plural, symbol, is_base_unit, is_unit_of_distance, is_unit_of_mass, is_unit_of_time, is_unit_of_volume
+)
+VALUES
+ ('metre', 'metres', 'm', 1, 1, 0, 0, 0)
+ , ('millimetre', 'millimetres', 'mm', 0, 1, 0, 0, 0)
+ , ('kilogram', 'kilograms', 'kg', 1, 0, 1, 0, 0)
+ , ('gram', 'grams', 'g', 0, 0, 1, 0, 0)
+ , ('litre', 'litres', 'L', 0, 0, 0, 0, 1)
+ , ('millilitre', 'millilitres', 'mL', 0, 0, 0, 0, 1)
+ , ('item', 'items', 'x', 0, 0, 0, 0, 0)
+ , ('second', 'seconds', 's', 1, 0, 0, 1, 0)
+ , ('hour', 'hours', 'h', 0, 0, 0, 1, 0)
+ , ('day', 'days', 'd', 0, 0, 0, 1, 0)
+ , ('ratio', 'ratios', '/', 0, 0, 0, 0, 0)
+;
+
+# Unit of Measurement Conversion
+INSERT INTO parts.DOG_Unit_Measurement_Conversion (
+ id_unit_derived
+ , id_unit_base
+ , display_order
+ , multiplier_unit_base
+ , increment_unit_base
+ , apply_multiplier_before_increment
+)
+VALUES
+ (
+ 2 -- id_unit_derived
+ , 1 -- id_unit_base
+ , 1 -- display_order
+ , 0.001 -- multiplier_unit_base
+ , 0 -- increment_unit_base
+ , apply_multiplier_before_increment
+ )
+ , (
+ 4 -- id_unit_derived
+ , 3 -- id_unit_base
+ , 1 -- display_order
+ , 0.001 -- multiplier_unit_base
+ , 0 -- increment_unit_base
+ , apply_multiplier_before_increment
+ )
+ , (
+ 6 -- id_unit_derived
+ , 5 -- id_unit_base
+ , 1 -- display_order
+ , 0.001 -- multiplier_unit_base
+ , 0 -- increment_unit_base
+ , apply_multiplier_before_increment
+ )
+ , (
+ 9 -- id_unit_derived
+ , 8 -- id_unit_base
+ , 1 -- display_order
+ , 24 -- multiplier_unit_base
+ , 0 -- increment_unit_base
+ , apply_multiplier_before_increment
+ )
+;
+
+
-- Project-specific tables
INSERT INTO parts.DOG_Dog (
name
@@ -295,6 +359,40 @@ VALUES
)
;
+INSERT INTO parts.DOG_Drive (
+ code
+ , name
+)
+VALUES
+ (
+ 'PREY'
+ , 'Prey'
+ )
+ , (
+ 'PACK'
+ , 'Pack'
+ )
+;
+
+INSERT INTO parts.DOG_Dog_Drive_Link (
+ id_dog
+ , id_drive
+ , dominance_ratio
+)
+VALUES
+ (
+ 1
+ , 1
+ , 0.5
+ )
+ , (
+ 1
+ , 2
+ , 0.5
+ )
+;
+
+/*
INSERT INTO parts.DOG_Understanding_Level (
code
, name
@@ -352,6 +450,7 @@ VALUES
, 'Obeys in all situations'
)
;
+*/
INSERT INTO parts.DOG_Command_Category (
code
@@ -477,14 +576,33 @@ VALUES
;
*/
+INSERT INTO parts.DOG_Command_Modality (
+ code
+ , name
+)
+VALUES
+ (
+ 'VISUAL'
+ , 'Visual signal'
+ )
+ , (
+ 'VERBAL'
+ , 'Verbal signal'
+ )
+ , (
+ 'BUTTON'
+ , 'Button press'
+ )
+;
+
INSERT INTO parts.DOG_Location (
code
, name
)
VALUES
(
- 'LOUNGE'
- , 'Lounge'
+ 'HOME'
+ , 'Home'
)
;
@@ -501,21 +619,6 @@ VALUES
;
*/
-INSERT INTO parts.DOG_Colour (
- code
- , name
-)
-VALUES
- (
- 'RED'
- , 'Red'
- )
- , (
- 'GREEN'
- , 'Green'
- )
-;
-
INSERT INTO parts.DOG_Button_Shape (
code
, name
@@ -534,6 +637,21 @@ VALUES
)
;
+INSERT INTO parts.DOG_Colour (
+ code
+ , name
+)
+VALUES
+ (
+ 'RED'
+ , 'Red'
+ )
+ , (
+ 'GREEN'
+ , 'Green'
+ )
+;
+
/*
INSERT INTO parts.DOG_Image (
id_file_type
@@ -585,63 +703,344 @@ VALUES
;
*/
-INSERT INTO parts.DOG_Drive (
+INSERT INTO parts.DOG_Weather (
code
, name
)
VALUES
(
- 'PREY'
- , 'Prey'
+ 'CLEAR_SUNNY'
+ , 'Sunny and clear'
)
, (
- 'PACK'
- , 'Pack'
+ 'LIGHTLY_CLOUDY_SUNNY'
+ , 'Sunny with some clouds'
+ )
+ , (
+ 'CLOUDY'
+ , 'Cloudy'
+ )
+ , (
+ 'RAINY'
+ , 'Raining'
+ )
+ , (
+ 'SNOWING'
+ , 'Snowing'
+ )
+ , (
+ 'THAWING'
+ , 'Thawing'
)
;
-INSERT INTO parts.DOG_Dog_Drive_Link (
- id_dog
- , id_drive
- , dominance_ratio
+INSERT INTO parts.DOG_Lighting_Level (
+ code
+ , name
)
VALUES
(
- 1
- , 1
- , 0.5
+ 'BRIGHT'
+ , 'Bright'
)
, (
- 1
- , 2
- , 0.5
+ 'MODERATELY_BRIGHT'
+ , 'Moderately Bright'
+ )
+ , (
+ 'DAWN_DUSK'
+ , 'Dawn or Dusk'
+ )
+ , (
+ 'DARK_WITH_SOME_LIGHTING'
+ , 'Dark With Some Lighting'
+ )
+ , (
+ 'DARK'
+ , 'Dark'
)
;
+/*
+INSERT INTO parts.DOG_Assessment (
+ id_weather
+ , id_lighting_level
+ , id_location
+ , id_user_handler
+ , notes
+ , difficulty_level
+ , active
+)
+VALUES
+ (
+ )
+;
+*/
+
+INSERT INTO parts.DOG_Distraction_Type (
+ code
+ , name
+)
+VALUES
+ (
+ 'RESTLESSNESS'
+ , 'Restlessness'
+ )
+ , (
+ 'LIVE_PREY'
+ , 'Live Prey'
+ )
+ , (
+ 'DEAD_PREY'
+ , 'Dead Prey'
+ )
+ , (
+ 'VEHICLES_MACHINES'
+ , 'Vehicles and Machines'
+ )
+ , (
+ 'EXPLOSION'
+ , 'Explosion'
+ )
+ , (
+ 'Treat'
+ , 'Treat'
+ )
+ , (
+ 'TOY'
+ , 'Toy'
+ )
+ , (
+ 'SQUEAKY_TOY'
+ , 'Squeaky Toy'
+ )
+;
+
+INSERT INTO parts.DOG_Distraction_Intensity_Level (
+ code
+ , name
+)
+VALUES
+ (
+ 'NEGLIGIBLE'
+ , 'Negligible'
+ )
+ , (
+ 'MILD'
+ , 'Mild'
+ )
+ , (
+ 'MODERATE'
+ , 'Moderate'
+ )
+ , (
+ 'STRONG'
+ , 'Strong'
+ )
+ , (
+ 'EXTREME'
+ , 'Extreme'
+ )
+;
+
+/*
+INSERT INTO parts.DOG_Distraction (
+ id_assessment
+ , id_distraction_type
+ , id_intensity_level_emotional
+ , id_intensity_level_scent
+ , id_intensity_level_sight
+ , id_intensity_level_sound
+ , id_intensity_level_touch
+ , quantity
+ , proximity_metres
+ , active
+)
+VALUES
+ (
+
+ )
+;
+*/
+
+INSERT INTO parts.DOG_Bribe (
+ code
+ , name
+)
+VALUES
+ (
+ 'TREAT'
+ , 'Treat'
+ )
+ , (
+ 'FAVOURITE_TREAT'
+ , 'Favourite treat'
+ )
+ , (
+ 'TOY'
+ , 'Toy'
+ )
+ , (
+ 'FAVOURITE_TOY'
+ , 'Favourite Toy'
+ )
+ , (
+ 'SQUEAKY_TOY'
+ , 'Squeaky Toy'
+ )
+;
+
+/*
+INSERT INTO parts.DOG_Assessment_Command_Modality_Link (
+ id_assessment
+ , id_command
+ , id_command_modality
+ , id_bribe
+ , distance_from_handler
+ , is_in_sight_of_handler
+ , is_in_scent_range_of_handler
+ , is_in_hearing_range_of_handler
+ , is_on_lead
+ , trial_count
+ , active
+)
+VALUES
+ (
+
+ )
+;
+*/
+
+INSERT INTO parts.DOG_Response_Quality_Metric (
+ id_unit_measurement
+ , code
+ , name
+ , value_min
+ , value_max
+)
+VALUES
+ (
+ 8
+ , 'RESPONSE_TIME'
+ , 'Response Time'
+ , 0
+ , NULL
+ )
+ , (
+ 11
+ , 'ACCURACY_RATIO'
+ , 'Accuracy Ratio'
+ , 0
+ , 1
+ )
+ , (
+ 8
+ , 'COMPLIANCE_DURATION'
+ , 'Compliance Duration'
+ , 0
+ , NULL
+ )
+ , (
+ 11
+ , 'PRECISION_RATIO'
+ , 'Precision Ratio'
+ , 0
+ , 1
+ )
+;
+
+INSERT INTO parts.DOG_Obedience_Level (
+ code
+ , name
+)
+VALUES
+ (
+ 'EAGER'
+ , 'Eager'
+ )
+ , (
+ 'FIRM_LOOK'
+ , 'After Firm Look'
+ )
+ , (
+ 'POWER_POSE'
+ , 'After Power Pose'
+ )
+ , (
+ 'THREATEN_TO_APPROACH'
+ , 'After Threatening to Approach'
+ )
+ , (
+ 'LITTLE_MOVE'
+ , 'After Moving a Few Steps'
+ )
+ , (
+ 'HALF_APPROACH'
+ , 'After Moving Half Way'
+ )
+ , (
+ 'MOST_APPROACH'
+ , 'After Approaching Most of The Way'
+ )
+ , (
+ 'TOUCH_COLLAR'
+ , 'After Touching Collar'
+ )
+ , (
+ 'RUN_AWAY_AND_RETURN'
+ , 'After Running Away And Returning'
+ )
+ , (
+ 'LEAD'
+ , 'After Being Lead by Collar or Lead'
+ )
+ , (
+ 'CHECK_BRIBE'
+ , 'After Check or Bribe'
+ )
+ , (
+ 'CHECKS_BRIBES'
+ , 'After Multiple Checks and/or Bribes'
+ )
+ , (
+ 'REFUSAL'
+ , 'None - Refusal'
+ )
+ , (
+ 'REFUSAL_RUN_AWAY'
+ , 'Refused and Ran Away Refusing to Return'
+ )
+;
/*
Post Excel-insert:
+SELECT COUNT(*) FROM parts.DOG_Command_Temp;
+
+CALL parts.p_DOG_save_command (
+ 'nipples'
+ , (SELECT GUID FROM parts.DOG_Command_Temp COMMAND_TEMP ORDER BY id_temp DESC LIMIT 1)
+ , 1
+ , 1
+);
+
SELECT *
-FROM demo.DOG_Dog;
+FROM parts.DOG_Dog;
/ *
SELECT *
-FROM demo.DOG_Command;
+FROM parts.DOG_Command;
* /
SELECT *
-- DELETE
-FROM demo.DOG_Understanding_Level;
-
-SELECT *
--- DELETE
-FROM demo.DOG_Obedience_Level;
+FROM parts.DOG_Obedience_Level;
/ *
-INSERT INTO demo.DOG_Dog_Command_Link (
+DELETE FROM parts.DOG_Dog_Command_Link;
+INSERT INTO parts.DOG_Dog_Command_Link (
id_dog
, id_command
, id_understanding_level
@@ -652,10 +1051,12 @@ SELECT
DOG.id_dog
, COMMAND.id_command
,
-FROM demo.DOG_Dog DOG
-CROSS JOIN demo.DOG_Command COMMAND
+FROM parts.DOG_Dog DOG
+CROSS JOIN parts.DOG_Command COMMAND
WHERE DOG.name = 'Molly'
* /
+SELECT * FROM parts.DOG_Dog_Command_Link;
+
*/
diff --git a/static/MySQL/deprecated/10701_tbl_DOG_Unit_Measurement_Audit.sql b/static/MySQL/deprecated/10701_tbl_DOG_Unit_Measurement_Audit.sql
new file mode 100644
index 0000000..d0f9f6e
--- /dev/null
+++ b/static/MySQL/deprecated/10701_tbl_DOG_Unit_Measurement_Audit.sql
@@ -0,0 +1,28 @@
+
+# Unit of Measurement Audits
+
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Unit_Measurement_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ id_unit_measurement INT NOT NULL,
+ CONSTRAINT FK_DOG_Unit_Measurement_Audit_id_unit_measurement
+ FOREIGN KEY (id_unit_measurement)
+ REFERENCES DOG_Unit_Measurement(id_unit_measurement)
+ ON UPDATE RESTRICT,
+ name_field VARCHAR(50),
+ value_prev VARCHAR(500),
+ value_new VARCHAR(500),
+ id_change_set INT NOT NULL,
+ CONSTRAINT FK_DOG_Unit_Measurement_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/deprecated/10705_tbl_DOG_Unit_Measurement_Conversion_Audit.sql b/static/MySQL/deprecated/10705_tbl_DOG_Unit_Measurement_Conversion_Audit.sql
new file mode 100644
index 0000000..3f3319b
--- /dev/null
+++ b/static/MySQL/deprecated/10705_tbl_DOG_Unit_Measurement_Conversion_Audit.sql
@@ -0,0 +1,27 @@
+
+# Unit of Measurement Conversion Audits
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Unit_Measurement_Conversion_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS DOG_Unit_Measurement_Conversion_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ id_conversion INT NOT NULL,
+ CONSTRAINT FK_DOG_Unit_Measurement_Conversion_Audit_id_conversion
+ FOREIGN KEY (id_conversion)
+ REFERENCES DOG_Unit_Measurement_Conversion(id_conversion)
+ ON UPDATE RESTRICT,
+ name_field VARCHAR(50),
+ value_prev VARCHAR(500),
+ value_new VARCHAR(500),
+ id_change_set INT NOT NULL,
+ CONSTRAINT FK_DOG_Unit_Measurement_Conversion_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/1213_0_tbl_DOG_Understanding_Level.sql b/static/MySQL/deprecated/1230_tbl_DOG_Visual_Understanding_Level.sql
similarity index 100%
rename from static/MySQL/1213_0_tbl_DOG_Understanding_Level.sql
rename to static/MySQL/deprecated/1230_tbl_DOG_Visual_Understanding_Level.sql
diff --git a/static/MySQL/1213_1_tbl_DOG_Understanding_Level_Audit.sql b/static/MySQL/deprecated/1230_tbl_DOG_Visual_Understanding_Level_Audit.sql
similarity index 100%
rename from static/MySQL/1213_1_tbl_DOG_Understanding_Level_Audit.sql
rename to static/MySQL/deprecated/1230_tbl_DOG_Visual_Understanding_Level_Audit.sql
diff --git a/static/MySQL/1213_2_tbl_DOG_Understanding_Level_Temp.sql b/static/MySQL/deprecated/1232_tbl_DOG_Visual_Understanding_Level_Temp.sql
similarity index 100%
rename from static/MySQL/1213_2_tbl_DOG_Understanding_Level_Temp.sql
rename to static/MySQL/deprecated/1232_tbl_DOG_Visual_Understanding_Level_Temp.sql
diff --git a/static/MySQL/deprecated/1234_tbl_DOG_Verbal_Understanding_Level.sql b/static/MySQL/deprecated/1234_tbl_DOG_Verbal_Understanding_Level.sql
new file mode 100644
index 0000000..9260320
--- /dev/null
+++ b/static/MySQL/deprecated/1234_tbl_DOG_Verbal_Understanding_Level.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Understanding_Level'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Understanding_Level (
+ id_understanding_level INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Understanding_Level_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Understanding_Level_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/deprecated/1235_tbl_DOG_Verbal_Understanding_Level_Audit.sql b/static/MySQL/deprecated/1235_tbl_DOG_Verbal_Understanding_Level_Audit.sql
new file mode 100644
index 0000000..aee6d3e
--- /dev/null
+++ b/static/MySQL/deprecated/1235_tbl_DOG_Verbal_Understanding_Level_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Understanding_Level_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Understanding_Level_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_understanding_level INT NOT NULL
+ , CONSTRAINT FK_DOG_Understanding_Level_Audit_id_understanding_level
+ FOREIGN KEY (id_understanding_level)
+ REFERENCES parts.DOG_Understanding_Level(id_understanding_level)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Understanding_Level_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/deprecated/1236_tbl_DOG_Verbal_Understanding_Level_Temp.sql b/static/MySQL/deprecated/1236_tbl_DOG_Verbal_Understanding_Level_Temp.sql
new file mode 100644
index 0000000..9c71779
--- /dev/null
+++ b/static/MySQL/deprecated/1236_tbl_DOG_Verbal_Understanding_Level_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Understanding_Level_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Understanding_Level_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_understanding_level INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/deprecated/1238_tbl_DOG_Button_Understanding_Level.sql b/static/MySQL/deprecated/1238_tbl_DOG_Button_Understanding_Level.sql
new file mode 100644
index 0000000..9260320
--- /dev/null
+++ b/static/MySQL/deprecated/1238_tbl_DOG_Button_Understanding_Level.sql
@@ -0,0 +1,25 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Understanding_Level'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Understanding_Level (
+ id_understanding_level INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , code VARCHAR(100) NOT NULL
+ , name VARCHAR(250) NOT NULL
+ , active BIT NOT NULL DEFAULT 1
+ , created_on DATETIME
+ , id_user_created_by INT
+ , CONSTRAINT FK_DOG_Understanding_Level_id_user_created_by
+ FOREIGN KEY (id_user_created_by)
+ REFERENCES parts.DOG_User(id_user)
+ , id_change_set INT
+ , CONSTRAINT FK_DOG_Understanding_Level_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/deprecated/1239_tbl_DOG_Button_Understanding_Level_Audit.sql b/static/MySQL/deprecated/1239_tbl_DOG_Button_Understanding_Level_Audit.sql
new file mode 100644
index 0000000..aee6d3e
--- /dev/null
+++ b/static/MySQL/deprecated/1239_tbl_DOG_Button_Understanding_Level_Audit.sql
@@ -0,0 +1,24 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Understanding_Level_Audit'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Understanding_Level_Audit (
+ id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY
+ , id_understanding_level INT NOT NULL
+ , CONSTRAINT FK_DOG_Understanding_Level_Audit_id_understanding_level
+ FOREIGN KEY (id_understanding_level)
+ REFERENCES parts.DOG_Understanding_Level(id_understanding_level)
+ , name_field VARCHAR(100) NOT NULL
+ , value_prev TEXT
+ , value_new TEXT
+ , id_change_set INT NOT NULL
+ , CONSTRAINT FK_DOG_Understanding_Level_Audit_id_change_set
+ FOREIGN KEY (id_change_set)
+ REFERENCES parts.DOG_Dog_Change_Set(id_change_set)
+);
diff --git a/static/MySQL/deprecated/1240_tbl_DOG_Button_Understanding_Level_Temp.sql b/static/MySQL/deprecated/1240_tbl_DOG_Button_Understanding_Level_Temp.sql
new file mode 100644
index 0000000..9c71779
--- /dev/null
+++ b/static/MySQL/deprecated/1240_tbl_DOG_Button_Understanding_Level_Temp.sql
@@ -0,0 +1,18 @@
+
+USE parts;
+
+SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning
+FROM INFORMATION_SCHEMA.TABLES
+WHERE
+ TABLE_SCHEMA = 'parts'
+ AND TABLE_NAME = 'DOG_Understanding_Level_Temp'
+;
+
+CREATE TABLE IF NOT EXISTS parts.DOG_Understanding_Level_Temp (
+ id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
+ , id_understanding_level INT
+ , code VARCHAR(100)
+ , name VARCHAR(250)
+ , active BIT
+ , guid BINARY(36)
+);
diff --git a/static/MySQL/1229_0_tbl_DOG_Personal_Best.sql b/static/MySQL/deprecated/1272_tbl_DOG_Personal_Best.sql
similarity index 100%
rename from static/MySQL/1229_0_tbl_DOG_Personal_Best.sql
rename to static/MySQL/deprecated/1272_tbl_DOG_Personal_Best.sql
diff --git a/static/MySQL/1229_1_tbl_DOG_Personal_Best_Audit.sql b/static/MySQL/deprecated/1273_tbl_DOG_Personal_Best_Audit.sql
similarity index 100%
rename from static/MySQL/1229_1_tbl_DOG_Personal_Best_Audit.sql
rename to static/MySQL/deprecated/1273_tbl_DOG_Personal_Best_Audit.sql
diff --git a/static/MySQL/1229_2_tbl_DOG_Personal_Best_Temp.sql b/static/MySQL/deprecated/1274_tbl_DOG_Personal_Best_Temp.sql
similarity index 100%
rename from static/MySQL/1229_2_tbl_DOG_Personal_Best_Temp.sql
rename to static/MySQL/deprecated/1274_tbl_DOG_Personal_Best_Temp.sql
diff --git a/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql b/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql
new file mode 100644
index 0000000..bd86384
--- /dev/null
+++ b/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql
@@ -0,0 +1,76 @@
+
+# Shop Unit of Measurement
+
+
+
+DROP TRIGGER IF EXISTS before_insert_DOG_Unit_Measurement;
+DROP TRIGGER IF EXISTS before_update_DOG_Unit_Measurement;
+
+
+DELIMITER //
+CREATE TRIGGER before_insert_DOG_Unit_Measurement
+BEFORE INSERT ON DOG_Unit_Measurement
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+ SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM DOG_User WHERE firstname = CURRENT_USER()), -1));
+END //
+DELIMITER ;
+
+
+DELIMITER //
+CREATE TRIGGER before_update_DOG_Unit_Measurement
+BEFORE UPDATE ON DOG_Unit_Measurement
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO DOG_Unit_Measurement_Audit (
+ id_unit_measurement,
+ name_field,
+ value_prev,
+ value_new,
+ id_change_set
+ )
+ # Changed name_singular
+ SELECT NEW.id_unit_measurement, 'name_singular', OLD.name_singular, NEW.name_singular, NEW.id_change_set
+ WHERE NOT OLD.name_singular <=> NEW.name_singular
+ UNION
+ # Changed name_plural
+ SELECT NEW.id_unit_measurement, 'name_plural', OLD.name_plural, NEW.name_plural, NEW.id_change_set
+ WHERE NOT OLD.name_plural <=> NEW.name_plural
+ UNION
+ # Changed symbol
+ SELECT NEW.id_unit_measurement, 'symbol', OLD.symbol, NEW.symbol, NEW.id_change_set
+ WHERE NOT OLD.symbol <=> NEW.symbol
+ UNION
+ # Changed is_base_unit
+ SELECT NEW.id_unit_measurement, 'is_base_unit', OLD.is_base_unit, NEW.is_base_unit, NEW.id_change_set
+ WHERE NOT OLD.is_base_unit <=> NEW.is_base_unit
+ UNION
+ # Changed is_unit_of_distance
+ SELECT NEW.id_unit_measurement, 'is_unit_of_distance', OLD.is_unit_of_distance, NEW.is_unit_of_distance, NEW.id_change_set
+ WHERE NOT OLD.is_unit_of_distance <=> NEW.is_unit_of_distance
+ UNION
+ # Changed is_unit_of_mass
+ SELECT NEW.id_unit_measurement, 'is_unit_of_mass', OLD.is_unit_of_mass, NEW.is_unit_of_mass, NEW.id_change_set
+ WHERE NOT OLD.is_unit_of_mass <=> NEW.is_unit_of_mass
+ UNION
+ # Changed is_unit_of_time
+ SELECT NEW.id_unit_measurement, 'is_unit_of_time', OLD.is_unit_of_time, NEW.is_unit_of_time, NEW.id_change_set
+ WHERE NOT OLD.is_unit_of_time <=> NEW.is_unit_of_time
+ UNION
+ # Changed is_unit_of_volume
+ SELECT NEW.id_unit_measurement, 'is_unit_of_volume', OLD.is_unit_of_volume, NEW.is_unit_of_volume, NEW.id_change_set
+ WHERE NOT OLD.is_unit_of_volume <=> NEW.is_unit_of_volume
+ UNION
+ # Changed active
+ SELECT NEW.id_unit_measurement, 'active', OLD.active, NEW.active, NEW.id_change_set
+ WHERE NOT OLD.active <=> NEW.active
+ ;
+END //
+DELIMITER ;
+
diff --git a/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql b/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql
new file mode 100644
index 0000000..2b364fd
--- /dev/null
+++ b/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql
@@ -0,0 +1,64 @@
+
+# Shop Unit of Measurement Conversion
+
+
+
+DROP TRIGGER IF EXISTS before_insert_DOG_Unit_Measurement_Conversion;
+DROP TRIGGER IF EXISTS before_update_DOG_Unit_Measurement_Conversion;
+
+
+DELIMITER //
+CREATE TRIGGER before_insert_DOG_Unit_Measurement_Conversion
+BEFORE INSERT ON DOG_Unit_Measurement_Conversion
+FOR EACH ROW
+BEGIN
+ SET NEW.created_on := IFNULL(NEW.created_on, NOW());
+ SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM DOG_User WHERE firstname = CURRENT_USER()), -1));
+END //
+DELIMITER ;
+
+
+DELIMITER //
+CREATE TRIGGER before_update_DOG_Unit_Measurement_Conversion
+BEFORE UPDATE ON DOG_Unit_Measurement_Conversion
+FOR EACH ROW
+BEGIN
+ IF OLD.id_change_set <=> NEW.id_change_set THEN
+ SIGNAL SQLSTATE '45000'
+ SET MESSAGE_TEXT = 'New change Set ID must be provided.';
+ END IF;
+
+ INSERT INTO DOG_Unit_Measurement_Conversion_Audit (
+ id_conversion,
+ name_field,
+ value_prev,
+ value_new,
+ id_change_set
+ )
+ # Changed id_unit_derived
+ SELECT NEW.id_conversion, 'id_unit_derived', OLD.id_unit_derived, NEW.id_unit_derived, NEW.id_change_set
+ WHERE NOT OLD.id_unit_derived <=> NEW.id_unit_derived
+ UNION
+ # Changed id_unit_base
+ SELECT NEW.id_conversion, 'id_unit_base', OLD.id_unit_base, NEW.id_unit_base, NEW.id_change_set
+ WHERE NOT OLD.id_unit_base <=> NEW.id_unit_base
+ UNION
+ # Changed multiplier_unit_base
+ SELECT NEW.id_conversion, 'multiplier_unit_base', OLD.multiplier_unit_base, NEW.multiplier_unit_base, NEW.id_change_set
+ WHERE NOT OLD.multiplier_unit_base <=> NEW.multiplier_unit_base
+ UNION
+ # Changed increment_unit_base
+ SELECT NEW.id_conversion, 'active', OLD.increment_unit_base, NEW.increment_unit_base, NEW.id_change_set
+ WHERE NOT OLD.increment_unit_base <=> NEW.increment_unit_base
+ UNION
+ # Changed apply_multiplier_before_increment
+ SELECT NEW.id_conversion, 'apply_multiplier_before_increment', OLD.apply_multiplier_before_increment, NEW.apply_multiplier_before_increment, NEW.id_change_set
+ WHERE NOT OLD.apply_multiplier_before_increment <=> NEW.apply_multiplier_before_increment
+ UNION
+ # Changed active
+ SELECT NEW.id_conversion, 'active', OLD.active, NEW.active, NEW.id_change_set
+ WHERE NOT OLD.active <=> NEW.active
+ ;
+END //
+DELIMITER ;
+
diff --git a/static/MySQL/3213_0_tri_DOG_Understanding_Level.sql b/static/MySQL/deprecated/3213_0_tri_DOG_Understanding_Level.sql
similarity index 100%
rename from static/MySQL/3213_0_tri_DOG_Understanding_Level.sql
rename to static/MySQL/deprecated/3213_0_tri_DOG_Understanding_Level.sql
diff --git a/static/MySQL/3229_0_tri_DOG_Personal_Best.sql b/static/MySQL/deprecated/3229_0_tri_DOG_Personal_Best.sql
similarity index 100%
rename from static/MySQL/3229_0_tri_DOG_Personal_Best.sql
rename to static/MySQL/deprecated/3229_0_tri_DOG_Personal_Best.sql
diff --git a/static/MySQL/deprecated/7213_p_dog_get_many_understanding_level.sql b/static/MySQL/deprecated/7213_p_dog_get_many_understanding_level.sql
new file mode 100644
index 0000000..b07b50c
--- /dev/null
+++ b/static/MySQL/deprecated/7213_p_dog_get_many_understanding_level.sql
@@ -0,0 +1,404 @@
+
+USE parts;
+
+DROP PROCEDURE IF EXISTS parts.p_DOG_get_many_understanding_level;
+
+DELIMITER //
+CREATE PROCEDURE parts.p_DOG_get_many_understanding_level (
+ IN a_id_user INT
+ , IN a_get_all_understanding_level BIT
+ , IN a_get_inactive_understanding_level BIT
+ , IN a_ids_understanding_level TEXT
+ , IN a_codes_understanding_level TEXT
+ , IN a_names_understanding_level TEXT
+ , IN a_debug BIT
+)
+BEGIN
+ DECLARE v_code_type_error_bad_data VARCHAR(100);
+ DECLARE v_code_type_error_no_permission VARCHAR(100);
+ DECLARE v_id_type_error_bad_data INT;
+ DECLARE v_id_type_error_no_permission INT;
+ DECLARE v_has_filter_understanding_level_id BIT;
+ DECLARE v_has_filter_understanding_level_code BIT;
+ DECLARE v_has_filter_understanding_level_name BIT;
+ DECLARE v_guid BINARY(36);
+ DECLARE v_id_permission_understanding_level_view INT;
+ DECLARE v_id_minimum INT;
+ DECLARE v_time_start TIMESTAMP(6);
+ DECLARE v_can_view BIT;
+
+ 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(100) NOT NULL
+ , msg VARCHAR(4000) 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 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 parts.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 parts.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_no_permission LIMIT 1);
+ SET v_id_permission_understanding_level_view := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1);
+
+ SET a_id_user := IFNULL(a_id_user, 0);
+ SET a_get_all_understanding_level := IFNULL(a_get_all_understanding_level, 0);
+ SET a_get_inactive_understanding_level := IFNULL(a_get_inactive_understanding_level, 0);
+ SET a_ids_understanding_level := TRIM(IFNULL(a_ids_understanding_level, ''));
+ SET a_codes_understanding_level := TRIM(IFNULL(a_codes_understanding_level, ''));
+ SET a_names_understanding_level := TRIM(IFNULL(a_names_understanding_level, ''));
+ SET a_debug := IFNULL(a_debug, 0);
+
+ IF a_debug = 1 THEN
+ SELECT
+ a_id_user
+ , a_get_all_understanding_level
+ , a_get_inactive_understanding_level
+ , a_ids_understanding_level
+ , a_codes_understanding_level
+ , a_names_understanding_level
+ , a_debug
+ ;
+
+ SELECT
+ v_id_type_error_bad_data
+ , v_id_type_error_no_permission
+ , v_guid
+ , v_id_permission_understanding_level_view
+ , v_time_start
+ ;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Code;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Understanding_Level;
+
+ CREATE TEMPORARY TABLE tmp_Understanding_Level (
+ id_understanding_level INT NOT NULL
+ , code VARCHAR(100)
+ , name 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(100) NOT NULL
+ , msg VARCHAR(4000) NOT NULL
+ );
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Id;
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Code (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Code;
+
+ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name (
+ substring VARCHAR(4000) NOT NULL
+ , as_int INT NULL
+ );
+ DELETE FROM tmp_Split_Name;
+
+ CALL parts.p_core_validate_guid ( v_guid );
+
+ SET v_has_filter_understanding_level_id = CASE WHEN a_ids_understanding_level = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_understanding_level_code = CASE WHEN a_codes_understanding_level = '' THEN 0 ELSE 1 END;
+ SET v_has_filter_understanding_level_name = CASE WHEN a_names_understanding_level = '' THEN 0 ELSE 1 END;
+
+ -- Understanding_Levels
+ IF v_has_filter_understanding_level_id = 1 THEN
+ CALL parts.p_split(v_guid, a_ids_understanding_level, ',', a_debug);
+
+ INSERT INTO tmp_Split_Id (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF v_has_filter_understanding_level_code = 1 THEN
+ CALL parts.p_split(v_guid, a_codes_understanding_level, ',', a_debug);
+
+ INSERT INTO tmp_Split_Code (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ END IF;
+
+ IF v_has_filter_understanding_level_name = 1 THEN
+ CALL parts.p_split(v_guid, a_names_understanding_level, ',', a_debug);
+
+ INSERT INTO tmp_Split_Name (
+ substring
+ , as_int
+ )
+ SELECT
+ SPLIT_T.substring
+ , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int
+ FROM parts.CORE_Split_Temp SPLIT_T
+ WHERE
+ SPLIT_T.GUID = v_guid
+ AND IFNULL(SPLIT_T.substring, '') <> ''
+ ;
+
+ CALL parts.p_clear_split_temp( v_guid );
+ 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
+ IF EXISTS (
+ SELECT *
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN parts.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT_ID.as_int = UNDERSTANDING_LEVEL.id_understanding_level
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(UNDERSTANDING_LEVEL.id_understanding_level)
+ OR (
+ UNDERSTANDING_LEVEL.active = 0
+ AND a_get_inactive_understanding_level = 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('Invalid or inactive Understanding_Level IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL'))
+ FROM tmp_Split_Id t_SPLIT_ID
+ LEFT JOIN parts.DOG_Understanding_Level UNDERSTANDING_LEVEL ON t_SPLIT_ID.as_int = UNDERSTANDING_LEVEL.id_understanding_level
+ WHERE
+ ISNULL(t_SPLIT_ID.as_int)
+ OR ISNULL(UNDERSTANDING_LEVEL.id_understanding_level)
+ OR (
+ UNDERSTANDING_LEVEL.active = 0
+ AND a_get_inactive_understanding_level = 0
+ )
+ ;
+ /* Don't error on codes or names not found
+ ELSEIF EXISTS (
+ SELECT *
+ */
+ ELSE
+ INSERT INTO tmp_Understanding_Level (
+ id_understanding_level
+ , code
+ , name
+ )
+ SELECT
+ UNDERSTANDING_LEVEL.id_understanding_level
+ , UNDERSTANDING_LEVEL.code
+ , UNDERSTANDING_LEVEL.name
+ FROM parts.DOG_Understanding_Level UNDERSTANDING_LEVEL
+ LEFT JOIN tmp_Split_Id t_SPLIT_ID ON UNDERSTANDING_LEVEL.id_understanding_level = t_SPLIT_ID.as_int
+ LEFT JOIN tmp_Split_Code t_SPLIT_CODE ON UNDERSTANDING_LEVEL.code = t_SPLIT_CODE.substring
+ LEFT JOIN tmp_Split_Name t_SPLIT_NAME ON UNDERSTANDING_LEVEL.name = t_SPLIT_NAME.substring
+ WHERE
+ (
+ a_get_all_understanding_level = 1
+ OR (
+ v_has_filter_understanding_level_id = 1
+ OR v_has_filter_understanding_level_code = 1
+ OR v_has_filter_understanding_level_name = 1
+ )
+ )
+ AND (
+ a_get_inactive_understanding_level = 1
+ OR UNDERSTANDING_LEVEL.active = 1
+ )
+ ;
+ END IF;
+ END IF;
+
+ DELETE FROM tmp_Split_Id;
+ DELETE FROM tmp_Split_Code;
+ DELETE FROM tmp_Split_Name;
+
+
+ -- Permissions
+ IF a_debug = 1 THEN
+ SELECT
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_understanding_level_view
+ , 0 -- a_debug
+ ;
+ END IF;
+
+ CALL parts.p_DOG_calc_user(
+ v_guid
+ , a_id_user
+ , FALSE -- a_get_inactive_user
+ , v_id_permission_understanding_level_view
+ , 0 -- a_debug
+ );
+
+ SELECT
+ IFNULL(CALC_USER_T.has_access, 0)
+ INTO
+ v_can_view
+ FROM parts.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;
+ 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 Understanding_Levels.'
+ )
+ ;
+ END IF;
+
+ CALL parts.p_DOG_clear_calc_user(
+ v_guid
+ , 0 -- a_debug
+ );
+
+ 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_Understanding_Level;
+ END IF;
+
+ DELETE FROM tmp_Understanding_Level;
+ END IF;
+
+ -- Outputs
+ -- Understanding_Levels
+ SELECT
+ t_UNDERSTANDING_LEVEL.id_understanding_level
+ , t_UNDERSTANDING_LEVEL.code
+ , t_UNDERSTANDING_LEVEL.name
+ , UNDERSTANDING_LEVEL.active
+ FROM parts.DOG_Understanding_Level UNDERSTANDING_LEVEL
+ INNER JOIN tmp_Understanding_Level t_UNDERSTANDING_LEVEL ON UNDERSTANDING_LEVEL.id_understanding_level = t_UNDERSTANDING_LEVEL.id_understanding_level
+ ;
+
+ -- 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 AND v_can_view = 1 THEN
+ SELECT * FROM tmp_Understanding_Level;
+ END IF;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Code;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
+ DROP TEMPORARY TABLE IF EXISTS tmp_Understanding_Level;
+
+ IF a_debug = 1 THEN
+ CALL parts.p_core_debug_timing_reporting ( v_time_start );
+ END IF;
+END //
+DELIMITER ;
+
+
+/*
+
+CALL parts.p_DOG_get_many_understanding_level (
+ 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user
+ , 1 -- a_get_all_understanding_level
+ , 0 -- a_get_inactive_understanding_level
+ , '' -- a_ids_understanding_level
+ , '' -- a_codes_understanding_level
+ , '' -- a_names_understanding_level
+ , 1 -- a_debug
+);
+
+*/
\ No newline at end of file
diff --git a/static/MySQL/9001_view.sql b/static/MySQL/deprecated/90001_view.sql
similarity index 100%
rename from static/MySQL/9001_view.sql
rename to static/MySQL/deprecated/90001_view.sql
diff --git a/static/bash/rebuild sql combined.sh b/static/bash/rebuild sql combined.sh
new file mode 100644
index 0000000..67ed77e
--- /dev/null
+++ b/static/bash/rebuild sql combined.sh
@@ -0,0 +1,4 @@
+rm ./static/MySQL/00000_combined.sql
+cat ./static/MySQL/* > ./static/MySQL/00000_combined.sql
+sed -i 's/parts/demo/g' ./static/MySQL/00000_combined.sql
+sed -i 's/ody demo/ody parts/g' ./static/MySQL/00000_combined.sql
\ No newline at end of file
diff --git a/static/js/api.js b/static/js/api.js
index 1a31ca0..eb337e4 100644
--- a/static/js/api.js
+++ b/static/js/api.js
@@ -56,4 +56,38 @@ export default class API {
API.goToUrl(url);
}
+ // specific api calls
+ /* Example:
+ getUsers: () => request('/users'),
+ getUserById: (id) => request(`/users/${id}`),
+ createUser: (userData) => request('/users', 'POST', userData),
+ updateUser: (id, userData) => request(`/users/${id}`, 'PUT', userData),
+ deleteUser: (id) => request(`/users/${id}`, 'DELETE'),
+ */
+ static async loginUser() {
+ let callback = {};
+ callback[flagCallback] = DOM.getHashPageCurrent();
+ return await API.request(hashPageUserLogin, 'POST', callback);
+ }
+
+ /*
+ // store
+ // product categories
+ static async saveCategories(categories, formFilters, comment) {
+ let dataRequest = {};
+ dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);
+ dataRequest[flagProductCategory] = categories;
+ dataRequest[flagComment] = comment;
+ return await API.request(hashSaveStoreProductCategory, 'POST', dataRequest);
+ }
+
+ // products
+ static async saveProducts(products, formFilters, comment) {
+ let dataRequest = {};
+ dataRequest[flagFormFilters] = DOM.convertForm2JSON(formFilters);
+ dataRequest[flagProduct] = products;
+ dataRequest[flagComment] = comment;
+ return await API.request(hashSaveStoreProduct, 'POST', dataRequest);
+ }
+ */
}
diff --git a/static/js/pages/base.js b/static/js/pages/base.js
index e6e24f1..d598eac 100644
--- a/static/js/pages/base.js
+++ b/static/js/pages/base.js
@@ -44,6 +44,7 @@ export default class BasePage {
hookupCommonElements() {
// hookupVideos();
this.hookupLogos();
+ this.hookupNavigation();
this.hookupOverlays();
}
@@ -55,6 +56,78 @@ export default class BasePage {
});
});
}
+
+ hookupNavigation() {
+ this.hookupEventHandler("click", idButtonHamburger, (event, element) => {
+ let overlayHamburger = document.querySelector(idOverlayHamburger);
+ if (overlayHamburger.classList.contains(flagCollapsed)) {
+ overlayHamburger.classList.remove(flagCollapsed);
+ overlayHamburger.classList.add(flagExpanded);
+ } else {
+ overlayHamburger.classList.remove(flagExpanded);
+ overlayHamburger.classList.add(flagCollapsed);
+ }
+ });
+
+ this.hookupButtonsNavHome();
+ this.hookupButtonsNavUserAccount();
+ this.hookupButtonsNavUserLogout();
+ this.hookupButtonsNavUserLogin();
+
+ // this.hookupButtonsNavStoreHome();
+ // this.hookupButtonsNavStoreManufacturingPurchaseOrders();
+ this.hookupButtonsNavAdminHome();
+ }
+ hookupEventHandler(eventType, selector, callback) {
+ Events.initialiseEventHandler(selector, flagInitialised, (element) => {
+ element.addEventListener(eventType, (event) => {
+ event.stopPropagation();
+ callback(event, element);
+ });
+ });
+ }
+ hookupButtonsNavHome() {
+ this.hookupButtonsNav('.' + flagNavHome, hashPageHome);
+ }
+ hookupButtonsNav(buttonSelector, hashPageNav) {
+ this.hookupEventHandler("click", buttonSelector, (event, button) => {
+ this.router.navigateToHash(hashPageNav);
+ });
+ }
+ hookupButtonsNavServices() {
+ this.hookupButtonsNav('.' + flagNavServices, hashPageServices);
+ }
+ hookupButtonsNavUserAccount() {
+ this.hookupButtonsNav('.' + flagNavUserAccount, hashPageUserAccount);
+ }
+ hookupButtonsNavUserLogout() {
+ this.hookupButtonsNav('.' + flagNavUserLogout, hashPageUserLogout);
+ }
+ hookupButtonsNavUserLogin() {
+ this.hookupEventHandler("click", '.' + flagNavUserLogin, (event, navigator) => {
+ event.stopPropagation();
+ this.leave();
+ API.loginUser()
+ .then((response) => {
+ if (response.Success) {
+ window.location.href = response[flagCallback];
+ } else {
+ DOM.alertError("Error", response.Message);
+ }
+ });
+ });
+ }
+ /*
+ hookupButtonsNavDogHome() {
+ this.hookupButtonsNav('.' + flagNavDogHome, hashPageDogHome);
+ }
+ */
+ hookupButtonsNavDogDogCommandLink() {
+ this.hookupButtonsNav('.' + flagNavDogDogCommandLink, hashPageDogDogCommandLink);
+ }
+ hookupButtonsNavAdminHome() {
+ this.hookupButtonsNav('.' + flagNavAdminHome, hashPageAdminHome);
+ }
hookupLogos() {
this.hookupEventHandler("click", "." + flagImageLogo + "," + "." + flagLogo, (event, element) => {
diff --git a/static/js/pages/core/contact-success.js b/static/js/pages/core/contact-success.js
deleted file mode 100644
index 877be19..0000000
--- a/static/js/pages/core/contact-success.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// internal
-import BasePage from "../base.js";
-// vendor
-import { Altcha } from "../../vendor/altcha.js";
-
-export default class PageContactSuccess extends BasePage {
- static hash = hashPageContactSuccess;
-
- constructor(router) {
- super(router);
- }
-
- initialize() {
- this.sharedInitialize();
- }
-}
diff --git a/static/js/pages/core/contact.js b/static/js/pages/core/contact.js
deleted file mode 100644
index 39e4653..0000000
--- a/static/js/pages/core/contact.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// internal
-import BasePage from "../base.js";
-// vendor
-import { Altcha } from "../../vendor/altcha.js";
-
-export default class PageContact extends BasePage {
- static hash = hashPageContact;
-
- constructor(router) {
- super(router);
- }
-
- initialize() {
- this.sharedInitialize();
- this.hookupButtonSubmitFormContactUs();
- }
-
- hookupButtonSubmitFormContactUs() {
- const button = document.querySelector('form input[type="submit"]');
- button.classList.add(flagButton);
- button.classList.add(flagButtonPrimary);
- }
-}
diff --git a/static/js/pages/core/home.js b/static/js/pages/core/home.js
index b6e063e..2e67e04 100644
--- a/static/js/pages/core/home.js
+++ b/static/js/pages/core/home.js
@@ -13,7 +13,7 @@ export default class PageHome extends BasePage {
initialize() {
this.sharedInitialize();
- this.hookupButtonsNavContact();
+ // this.hookupButtonsNav();
}
leave() {
diff --git a/static/js/router.js b/static/js/router.js
index 82a73fc..a47b05f 100644
--- a/static/js/router.js
+++ b/static/js/router.js
@@ -2,14 +2,16 @@
// Pages
// Core
import PageHome from './pages/core/home.js';
-import PageContact from './pages/core/contact.js';
-import PageContactSuccess from './pages/core/contact-success.js';
// Legal
import PageAccessibilityReport from './pages/legal/accessibility_report.js';
import PageAccessibilityStatement from './pages/legal/accessibility_statement.js';
import PageLicense from './pages/legal/license.js';
import PagePrivacyPolicy from './pages/legal/privacy_policy.js';
import PageRetentionSchedule from './pages/legal/retention_schedule.js';
+// User
+// import PageUserLogin from './pages/user/login.js';
+// import PageUserLogout from './pages/user/logout.js';
+// import PageUserAccount from './pages/user/account.js';
import API from './api.js';
import DOM from './dom.js';
@@ -22,13 +24,15 @@ export default class Router {
this.pages = {};
// Core
this.pages[hashPageHome] = { name: 'PageHome', module: PageHome };
- this.pages[hashPageContact] = { name: 'PageContact', module: PageContact };
- this.pages[hashPageContactSuccess] = { name: 'PageContact', module: PageContactSuccess };
// Legal
this.pages[hashPageAccessibilityStatement] = { name: 'PageAccessibilityStatement', module: PageAccessibilityStatement };
this.pages[hashPageDataRetentionSchedule] = { name: 'PageDataRetentionSchedule', module: PageRetentionSchedule };
this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense };
this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy };
+ // User
+ // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' };
+ // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' };
+ // this.pages[hashPageUserAccount] = { name: 'PageUserAccount', module: PageUserAccount }; // pathModule: './pages/user/account.js' };
// Routes
this.routes = {};
// Core
@@ -39,6 +43,10 @@ export default class Router {
this.routes[hashPageDataRetentionSchedule] = (isPopState = false) => this.navigateToHash(hashPageDataRetentionSchedule, isPopState);
this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState);
this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState);
+ // User
+ // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState);
+ // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState);
+ // this.routes[hashPageUserAccount] = (isPopState = false) => this.navigateToHash(hashPageUserAccount, isPopState);
this.initialize();
}
loadPage(hashPage, isPopState = false) {
diff --git a/templates/_shared.html b/templates/_shared.html
deleted file mode 100644
index 8b13789..0000000
--- a/templates/_shared.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/templates/components/dog/_preview_DDL_command.html b/templates/components/dog/_preview_DDL_command.html
new file mode 100644
index 0000000..876bf21
--- /dev/null
+++ b/templates/components/dog/_preview_DDL_command.html
@@ -0,0 +1,15 @@
+
+{% if not is_blank_row %}
+
{{ command.name }}
+{% else %}
+
+{% endif %}
\ No newline at end of file
diff --git a/templates/components/dog/_preview_DDL_dog.html b/templates/components/dog/_preview_DDL_dog.html
new file mode 100644
index 0000000..9599344
--- /dev/null
+++ b/templates/components/dog/_preview_DDL_dog.html
@@ -0,0 +1,15 @@
+
+{% if not is_blank_row %}
+
{{ dog.name }}
+{% else %}
+
+{% endif %}
\ No newline at end of file
diff --git a/templates/components/dog/_row_dog_command_link.html b/templates/components/dog/_row_dog_command_link.html
new file mode 100644
index 0000000..17a4b48
--- /dev/null
+++ b/templates/components/dog/_row_dog_command_link.html
@@ -0,0 +1,38 @@
+
+{% if is_blank_row %}
+
+
+ {% include 'components/dog/_preview_DDL_dog.html' %}
+
+
+ {% include 'components/dog/_preview_DDL_command.html' %}
+
+
+
+
+
+
+
+ {% set active = true %}
+ {% include 'components/dog/_td_active.html' %}
+
+{% else %}
+
+ {% set dog = link.dog %}
+
+ {% include 'components/dog/_preview_DDL_dog.html' %}
+
+ {% set command = link.command %}
+
+ {% include 'components/dog/_preview_DDL_command.html' %}
+
+
+
+
+
+
+
+ {% set active = link.active %}
+ {% include 'components/dog/_td_active.html' %}
+
+{% endif %}
diff --git a/templates/components/dog/_td_active.html b/templates/components/dog/_td_active.html
new file mode 100644
index 0000000..9f72e3e
--- /dev/null
+++ b/templates/components/dog/_td_active.html
@@ -0,0 +1,13 @@
+
+
+{% with _active = (active is not defined or active or active is none) %}
+
+ {#
+
+ #}
+
+
+{% endwith %}
\ No newline at end of file
diff --git a/templates/js/sections/store.js b/templates/js/sections/dog.js
similarity index 100%
rename from templates/js/sections/store.js
rename to templates/js/sections/dog.js
diff --git a/templates/layouts/_dog_shared.html b/templates/layouts/_dog_shared.html
new file mode 100644
index 0000000..59908b3
--- /dev/null
+++ b/templates/layouts/_dog_shared.html
@@ -0,0 +1,31 @@
+{% if block_id == 'block1' %}
+
+
Feckin common block boi
+
+{% elif block_id == 'checkout' %}
+
+
+{% endif %}
\ No newline at end of file
diff --git a/templates/layouts/layout.html b/templates/layouts/layout.html
index 6003944..8d3591d 100644
--- a/templates/layouts/layout.html
+++ b/templates/layouts/layout.html
@@ -112,7 +112,9 @@
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
var flagNavContact = "{{ model.FLAG_NAV_CONTACT }}";
var flagNavHome = "{{ model.FLAG_NAV_HOME }}";
- var flagNavServices = "{{ model.FLAG_NAV_SERVICES }}";
+ var flagNavDogCommand = "{{ model.FLAG_NAV_DOG_COMMAND }}";
+ var flagNavDogDog = "{{ model.FLAG_NAV_DOG_DOG }}";
+ var flagNavDogDogCommandLink = "{{ model.FLAG_NAV_DOG_DOG_COMMAND_LINK }}";
var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}";
var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}";
var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}";
@@ -140,6 +142,7 @@
var hashGetALTCHAChallenge = "{{ model.HASH_ALTCHA_CREATE_CHALLENGE }}";
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
+ var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
@@ -147,6 +150,10 @@
var hashPageHome = "{{ model.HASH_PAGE_HOME }}";
var hashPageLicense = "{{ model.HASH_PAGE_LICENSE }}";
var hashPagePrivacyPolicy = "{{ model.HASH_PAGE_PRIVACY_POLICY }}";
+ var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}";
+ var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}";
+ var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}";
+ var hashPageUserLogout = "{{ model.HASH_PAGE_USER_LOGOUT }}";
var idButtonApplyFilters = "#{{ model.ID_BUTTON_APPLY_FILTERS }}";
var idButtonHamburger = "#{{ model.ID_BUTTON_HAMBURGER }}";
var idCSRFToken = "#{{ model.ID_CSRF_TOKEN }}";
@@ -184,6 +191,99 @@
+
+
Please fill in the form below and we'll get back to you as soon as possible.
-
-
-
-
-
How we use your information
-
If you opt in to marketing communications, we will also use your email address to send you updates about our services, ERPNext features, and relevant industry news. You can unsubscribe from these communications at any time.
-
We retain command submissions for customer service purposes and retain marketing consent records as required by law. For details about how long we keep your information, please see our data retention schedule.
-
For full details about how we handle your personal data, please read our Privacy Policy.
-
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/templates/pages/core/_contact_success.html b/templates/pages/core/_contact_success.html
deleted file mode 100644
index 0e36586..0000000
--- a/templates/pages/core/_contact_success.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends 'layouts/layout.html' %}
-
-{% block page_head %}
-
-{% endblock %}
-
-{% block page_nav_links %}
-{% endblock %}
-
-{% block page_body %}
-
- {% set form = model.form_contact %}
-
-
-
Message Received
-
Thanks for contacting us! We've received your message and will respond within 48 hours.
UK-based ERPNext specialist providing integrated ERP and e-commerce solutions. 5+ years experience implementing systems for builders merchants and automotive companies.
Comprehensive ERP solutions tailored to your business needs
-
-
-
-
Implementation Services
-
Full ERPNext implementation including setup, configuration, and training. We ensure a smooth transition to your new ERP system.
-
-
-
-
Integration & Migration
-
Seamlessly migrate your existing data and integrate ERPNext with your current business applications and workflows.
-
-
-
-
Hosting Services
-
Secure, reliable cloud hosting with regular backups and maintenance to keep your ERP system running smoothly.
-
-
-
-
Custom Extensions
-
Tailored app development and customizations to extend ERPNext functionality according to your specific requirements.
-
-
-
-
-
- {#
-
-
-
Client Success Story
-
See how we've helped other businesses succeed
-
-
-
"The ERPNext implementation has revolutionized our operations. The integrated e-commerce system has streamlined our entire sales process, and the team's support has been exceptional throughout our journey."
+ {% set block_id = 'button_get_in_touch' %}
+ {% include 'components/common/buttons/_buttons_save_cancel.html' %}
+
{% endblock %}
\ No newline at end of file
diff --git a/templates/pages/core/_home_portfolio.html b/templates/pages/core/_home_portfolio.html
new file mode 100644
index 0000000..45f6961
--- /dev/null
+++ b/templates/pages/core/_home_portfolio.html
@@ -0,0 +1,119 @@
+
+
+{% extends 'layouts/layout.html' %}
+
+{% block page_head %}
+
+
+{% endblock %}
+
+{% block page_nav_links %}
+ Services
+ Testimonial
+ Pricing
+ Contact Us
+{% endblock %}
+
+{% block page_body %}
+
+
+
+
Transform Your Business with Modern ERP Solutions
+
UK-based ERPNext specialist providing integrated ERP and e-commerce solutions. 5+ years experience implementing systems for builders merchants and automotive companies.
Comprehensive ERP solutions tailored to your business needs
+
+
+
+
Implementation Services
+
Full ERPNext implementation including setup, configuration, and training. We ensure a smooth transition to your new ERP system.
+
+
+
+
Integration & Migration
+
Seamlessly migrate your existing data and integrate ERPNext with your current business applications and workflows.
+
+
+
+
Hosting Services
+
Secure, reliable cloud hosting with regular backups and maintenance to keep your ERP system running smoothly.
+
+
+
+
Custom Extensions
+
Tailored app development and customizations to extend ERPNext functionality according to your specific requirements.
+
+
+
+
+
+ {#
+
+
+
Client Success Story
+
See how we've helped other businesses succeed
+
+
+
"The ERPNext implementation has revolutionized our operations. The integrated e-commerce system has streamlined our entire sales process, and the team's support has been exceptional throughout our journey."