diff --git a/business_objects/base.py b/business_objects/base.py index 6899d13..781079e 100644 --- a/business_objects/base.py +++ b/business_objects/base.py @@ -63,7 +63,7 @@ class Base(): FLAG_PRIORITY: ClassVar[str] = 'priority' FLAG_REGION: ClassVar[str] = 'region' FLAG_ROWS: ClassVar[str] = 'rows' - FLAG_SEARCH_TEXT: ClassVar[str] = 'search_text' + FLAG_SEARCH: ClassVar[str] = 'search' FLAG_SYMBOL: ClassVar[str] = 'symbol' FLAG_URL: ClassVar[str] = 'url' FLAG_USER: ClassVar[str] = 'authorisedUser' # 'user' already used diff --git a/business_objects/dog/command.py b/business_objects/dog/command.py index 55e6ad7..f5b8155 100644 --- a/business_objects/dog/command.py +++ b/business_objects/dog/command.py @@ -41,13 +41,15 @@ class Command(SQLAlchemy_ABC, Base): def __init__(self): self.id_command = 0 + self.command_category = None self.is_new = False self.has_button = False super().__init__() - def from_db_command(query_row): - _m = 'Command.from_db_command' - command = Command() + @classmethod + def from_db_command(cls, query_row): + _m = f'{cls.__qualname__}.from_db_command' + command = cls() command.id_command = query_row[0] command.id_command_category = query_row[1] command.name = query_row[2] @@ -59,25 +61,27 @@ class Command(SQLAlchemy_ABC, Base): # 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() + @classmethod + def from_db_dog_command_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_dog_command_link' + command = cls() command.id_command = query_row[5] command.id_command_category = query_row[3] 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) + command.can_have_button = av.input_bool(query_row[8], 'can_have_button', _m) + # command.has_button = av.input_bool(query_row[7], 'has_button', _m) # command.notes = query_row[4] - command.active = av.input_bool(True, 'active', _m) + command.active = True # av.input_bool(True, 'active', _m) # command.created_on = query_row[7] + command.command_category = Command_Category.from_db_dog_command_link(query_row) return command @classmethod def from_json(cls, json): - _m = 'Command.from_json' + _m = f'{cls.__qualname__}.from_json' command = cls() - if json is None: return Command + if json is None: return command # Helper_App.console_log(f'{_m}\njson: {json}') command.id_command = -1 command.id_command_category = json[Command_Category.FLAG_COMMAND_CATEGORY] @@ -94,7 +98,7 @@ class Command(SQLAlchemy_ABC, Base): as_json = { **self.get_shared_json_attributes(self) , self.ATTR_ID_COMMAND: self.id_command - , Command_Category.FLAG_COMMAND_CATEGORY: self.id_command_category + , Command_Category.ATTR_ID_COMMAND_CATEGORY: self.id_command_category , self.FLAG_NAME: self.name , self.FLAG_HAND_SIGNAL_DEFAULT_DESCRIPTION: self.hand_signal_default_description , self.FLAG_CAN_HAVE_BUTTON: self.can_have_button @@ -152,48 +156,102 @@ class Command_Temp(db.Model, Base): class Parameters_Command(Get_Many_Parameters_Base): + get_all_command_category: bool + get_inactive_command_category: bool + ids_command_category: str + names_command_category: str get_all_command: bool get_inactive_command: bool ids_command: str names_command: str + hand_signal_default_descriptions_command: str + notes_command: str + require_all_id_search_filters_met: bool + require_any_id_search_filters_met: bool + require_all_non_id_search_filters_met: bool + require_any_non_id_search_filters_met: bool + output_command_categories: bool + output_commands: bool @classmethod def get_default(cls): return cls( - get_all_command = True + get_all_command_category = True + , get_inactive_command_category = False + , ids_command_category = '' + , names_command_category = '' + , get_all_command = True , get_inactive_command = False , ids_command = '' , names_command = '' + , hand_signal_default_descriptions_command = '' + , notes_command = '' + , require_all_id_search_filters_met = True + , require_any_id_search_filters_met = True + , require_all_non_id_search_filters_met = False + , require_any_non_id_search_filters_met = True + , output_command_categories = True + , output_commands = True ) @classmethod def from_json(cls, json): return cls( - get_all_command = json.get('a_get_all_command', False) + get_all_command_category = json.get('a_get_all_command_category', False) + , get_inactive_command_category = json.get('a_get_inactive_command_category', False) + , ids_command_category = json.get('a_ids_command_category', '') + , names_command_category = json.get('a_names_command_category', '') + , get_all_command = json.get('a_get_all_command', False) , get_inactive_command = json.get('a_get_inactive_command', False) , ids_command = json.get('a_ids_command', '') , names_command = json.get('a_names_command', '') + , hand_signal_default_descriptions_command = json.get('a_hand_signal_default_descriptions_command', '') + , notes_command = json.get('a_notes_command', '') + , require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True) + , require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True) + , require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False) + , require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True) + , output_command_categories = json.get('a_output_command_categories', False) + , output_commands = json.get('a_output_commands', False) ) """ @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") + def from_form_filters_dog_command_link(cls, form): + av.val_instance(form, 'form', 'Parameters_Command.from_form_filters_dog_command_link', Filters_Dog_Command_Link) + has_filter_search_text = not (form.search.data == '' or form.search.data is None) + has_filter_command_category = not (has_filter_search_text or form.id_command_category.data == '0' or form.id_command_category.data == '' or form.id_command_category.data is None) + has_filter_command = not (has_filter_search_text or form.id_command.data == '0' or form.id_command.data == '' or form.id_command.data is None) + active_only = av.input_bool(form.active_only.data, "active", "Parameters_Command.from_form_filters_dog_command_link") return cls( - get_all_command = not has_filter_command + get_all_command_category = not has_filter_command_category + , get_inactive_command_category = not active_only + , ids_command_category = form.id_command_category.data if has_filter_command_category else '' + , names_command_category = form.search_text.data if has_filter_search_text else '' + , 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 '' + , ids_command = form.id_command.data if has_filter_command else '' + , names_command = form.search_text.data if has_filter_search_text else '' ) """ - + def to_json(self): return { - 'a_get_all_command': self.get_all_command + 'a_get_all_command_category': self.get_all_command_category + , 'a_get_inactive_command_category': self.get_inactive_command_category + , 'a_ids_command_category': self.ids_command_category + , 'a_names_command_category': self.names_command_category + , 'a_get_all_command': self.get_all_command , 'a_get_inactive_command': self.get_inactive_command , 'a_ids_command': self.ids_command , 'a_names_command': self.names_command + , 'a_hand_signal_default_descriptions_command': self.hand_signal_default_descriptions_command + , 'a_notes_command': self.notes_command + , 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met + , 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met + , 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met + , 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met + , 'a_output_command_categories': self.output_command_categories + , 'a_output_commands': self.output_commands } diff --git a/business_objects/dog/command_category.py b/business_objects/dog/command_category.py index 0aa62d5..f62af64 100644 --- a/business_objects/dog/command_category.py +++ b/business_objects/dog/command_category.py @@ -37,9 +37,21 @@ class Command_Category(SQLAlchemy_ABC, Base): self.is_new = False super().__init__() - def from_db_dog_command_link(query_row): - _m = 'Command_Category.from_db_dog_command_link' - level = Command_Category() + @classmethod + def from_db_command(cls, query_row): + _m = f'{cls.__qualname__}.from_db_command' + category = cls() + category.id_command_category = query_row[0] + category.code = query_row[1] + category.name = query_row[2] + category.active = av.input_bool(query_row[3], 'active', _m) + # command.created_on = query_row[7] + return category + + @classmethod + def from_db_dog_command_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_dog_command_link' + level = cls() level.id_command_category = query_row[3] # level.code = query_row[6] level.name = query_row[4] diff --git a/business_objects/dog/dog.py b/business_objects/dog/dog.py index cb4610f..ff65aef 100644 --- a/business_objects/dog/dog.py +++ b/business_objects/dog/dog.py @@ -42,9 +42,10 @@ class Dog(SQLAlchemy_ABC, Base): self.is_new = False super().__init__() - def from_db_dog(query_row): + @classmethod + def from_db_dog(cls, query_row): _m = 'Dog.from_db_dog' - dog = Dog() + dog = cls() dog.id_dog = query_row[0] dog.name = query_row[1] dog.appearance = query_row[2] @@ -53,9 +54,10 @@ class Dog(SQLAlchemy_ABC, Base): dog.active = av.input_bool(query_row[5], 'active', _m) return dog - def from_db_dog_command_link(query_row): + @classmethod + def from_db_dog_command_link(cls, query_row): _m = 'Dog.from_db_dog_command_link' - dog = Dog() + dog = cls() dog.id_dog = query_row[1] dog.name = query_row[2] """ @@ -142,6 +144,10 @@ class Parameters_Dog(Get_Many_Parameters_Base): get_inactive_dog: bool ids_dog: str names_dog: str + require_all_id_search_filters_met: bool + require_any_id_search_filters_met: bool + require_all_non_id_search_filters_met: bool + require_any_non_id_search_filters_met: bool @classmethod def get_default(cls): @@ -150,6 +156,10 @@ class Parameters_Dog(Get_Many_Parameters_Base): , get_inactive_dog = False , ids_dog = '' , names_dog = '' + , require_all_id_search_filters_met = True + , require_any_id_search_filters_met = True + , require_all_non_id_search_filters_met = False + , require_any_non_id_search_filters_met = True ) @classmethod @@ -159,6 +169,10 @@ class Parameters_Dog(Get_Many_Parameters_Base): , get_inactive_dog = json.get('a_get_inactive_dog', False) , ids_dog = json.get('a_ids_dog', '') , names_dog = json.get('names_dog', '') + , require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True) + , require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True) + , require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False) + , require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True) ) """ @@ -183,5 +197,9 @@ class Parameters_Dog(Get_Many_Parameters_Base): , 'a_get_inactive_dog': self.get_inactive_dog , 'a_ids_dog': self.ids_dog , 'a_names_dog': self.names_dog + , 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met + , 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met + , 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met + , 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met } diff --git a/business_objects/dog/dog_command_link.py b/business_objects/dog/dog_command_link.py index 5ef93de..c43caf3 100644 --- a/business_objects/dog/dog_command_link.py +++ b/business_objects/dog/dog_command_link.py @@ -48,14 +48,15 @@ class Dog_Command_Link(SQLAlchemy_ABC, Base): self.command = None super().__init__() - def from_db_dog_command_link(query_row): + @classmethod + def from_db_dog_command_link(cls, query_row): _m = 'Dog_Command_Link.from_db_dog_command_link' - dog_command_link = Dog_Command_Link() + dog_command_link = cls() 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.hand_signal_description = query_row[8] + dog_command_link.hand_signal_description = query_row[7] 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] @@ -140,58 +141,146 @@ class Dog_Command_Link_Temp(db.Model, Base): class Parameters_Dog_Command_Link(Get_Many_Parameters_Base): + get_all_link: bool + get_inactive_link: bool + ids_link: str get_all_dog: bool get_inactive_dog: bool ids_dog: str + names_dog: str + get_all_command_category: bool + get_inactive_command_category: bool + ids_command_category: str + names_command_category: str get_all_command: bool get_inactive_command: bool ids_command: str + names_command: str + hand_signal_descriptions_link: str + notes_command: str + notes_link: str + require_all_id_search_filters_met: bool + require_any_id_search_filters_met: bool + require_all_non_id_search_filters_met: bool + require_any_non_id_search_filters_met: bool @classmethod def get_default(cls): return cls( - get_all_dog = True + get_all_link = True + , get_inactive_link = False + , ids_link = '' + , get_all_dog = True , get_inactive_dog = False , ids_dog = '' + , names_dog = '' + , get_all_command_category = True + , get_inactive_command_category = False + , ids_command_category = '' + , names_command_category = '' , get_all_command = True , get_inactive_command = False , ids_command = '' + , names_command = '' + , hand_signal_descriptions_link = '' + , notes_command = '' + , notes_link = '' + , require_all_id_search_filters_met = True + , require_any_id_search_filters_met = True + , require_all_non_id_search_filters_met = False + , require_any_non_id_search_filters_met = True ) @classmethod def from_json(cls, json): return cls( - get_all_dog = json.get('a_get_all_dog', False) + get_all_link = json.get('a_get_all_link', False) + , get_inactive_link = json.get('a_get_inactive_link', False) + , ids_link = json.get('a_ids_link', '') + , 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('a_names_dog', '') + , get_all_command_category = json.get('a_get_all_command_category', False) + , get_inactive_command_category = json.get('a_get_inactive_command_category', False) + , ids_command_category = json.get('a_ids_command_category', '') + , names_command_category = json.get('a_names_command_category', '') , get_all_command = json.get('a_get_all_command', False) , get_inactive_command = json.get('a_get_inactive_command', False) , ids_command = json.get('a_ids_command', '') + , names_command = json.get('a_names_command', '') + , hand_signal_descriptions_link = json.get('a_hand_signal_descriptions_link', '') + , notes_command = json.get('a_notes_command', '') + , notes_link = json.get('a_notes_link', '') + , require_all_id_search_filters_met = json.get('a_require_all_id_search_filters_met', True) + , require_any_id_search_filters_met = json.get('a_require_any_id_search_filters_met', True) + , require_all_non_id_search_filters_met = json.get('a_require_all_non_id_search_filters_met', False) + , require_any_non_id_search_filters_met = json.get('a_require_any_non_id_search_filters_met', True) ) @classmethod def from_form_filters_dog_command_link(cls, form): - av.val_instance(form, 'form', 'Parameters_Dog_Command_Link.from_form_filters_dog_command_link', Filters_Dog_Command_Link) + _m = f'{cls.__qualname__}.from_form_filters_dog_command_link' + Helper_App.console_log(_m) + Helper_App.console_log(f'Filters: {form}') + av.val_instance(form, 'form', _m, Filters_Dog_Command_Link) has_filter_search_text = not (form.search.data == '' or form.search.data is None) - has_filter_dog = not (has_filter_search_text or form.id_dog.data == '0' or form.id_dog.data == '' or form.id_dog.data is None) - has_filter_command = not (has_filter_search_text or form.id_command.data == '0' or form.id_command.data == '' or form.id_command.data is None) - active_only = av.input_bool(form.active_only.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 form.search.data if has_filter_search_text 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 form.search.data if has_filter_search_text else '' - ) + has_filter_dog = not (form.id_dog.data == '0' or form.id_dog.data == '' or form.id_dog.data is None) + has_filter_command_category = not (form.id_command_category.data == '0' or form.id_command_category.data == '' or form.id_command_category.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_only.data, "active", _m) + Helper_App.console_log(f''' +has_filter_search_text: {has_filter_search_text} +has_filter_dog: {has_filter_dog} +has_filter_command_category: {has_filter_command_category} +has_filter_command: {has_filter_command} +active_only: {active_only} +''') + filters = cls.get_default() + filters.get_all_link = True + filters.get_inactive_link = not active_only + filters.ids_link = '' + filters.get_all_dog = not has_filter_dog + filters.get_inactive_dog = not active_only + filters.ids_dog = form.id_dog.data if has_filter_dog else '' + filters.names_dog = form.search.data if has_filter_search_text else '' + filters.get_all_command_category = not has_filter_command_category + filters.get_inactive_command_category = not active_only + filters.ids_command_category = form.id_command_category.data if has_filter_command_category else '' + filters.names_command_category = form.search.data if has_filter_search_text else '' + filters.get_all_command = not has_filter_command + filters.get_inactive_command = not active_only + filters.ids_command = form.id_command.data if has_filter_command else '' + filters.names_command = form.search.data if has_filter_search_text else '' + filters.hand_signal_descriptions_link = form.search.data if has_filter_search_text else '' + # filters.notes_command = form.search.data if has_filter_search_text else '' + filters.notes_link = form.search.data if has_filter_search_text else '' + return filters def to_json(self): return { - 'a_get_all_dog': self.get_all_dog + 'a_get_all_link': self.get_all_link + , 'a_get_inactive_link': self.get_inactive_link + , 'a_ids_link': self.ids_link + , '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 + , 'a_get_all_command_category': self.get_all_command_category + , 'a_get_inactive_command_category': self.get_inactive_command_category + , 'a_ids_command_category': self.ids_command_category + , 'a_names_command_category': self.names_command_category , 'a_get_all_command': self.get_all_command , 'a_get_inactive_command': self.get_inactive_command , 'a_ids_command': self.ids_command + , 'a_names_command': self.names_command + , 'a_hand_signal_descriptions_link': self.hand_signal_descriptions_link + , 'a_notes_command': self.notes_command + , 'a_notes_link': self.notes_link + , 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met + , 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met + , 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met + , 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met } + diff --git a/business_objects/dog/obedience_level.py b/business_objects/dog/obedience_level.py index c034aa3..073be74 100644 --- a/business_objects/dog/obedience_level.py +++ b/business_objects/dog/obedience_level.py @@ -37,9 +37,10 @@ class Obedience_Level(SQLAlchemy_ABC, Base): self.is_new = False super().__init__() """ - def from_db_dog_command_link(query_row): - _m = 'Obedience_Level.from_db_dog_command_link' - level = Obedience_Level() + @classmethod + def from_db_dog_command_link(cls, query_row): + _m = f'{cls.__qualname__}.from_db_dog_command_link' + level = cls() level.id_obedience_level = query_row[5] level.code = query_row[6] level.name = query_row[7] @@ -48,7 +49,7 @@ class Obedience_Level(SQLAlchemy_ABC, Base): """ @classmethod def from_json(cls, json): - _m = 'Obedience_Level.from_json' + _m = f'{cls.__qualname__}.from_json' obedience_level = cls() if json is None: return Obedience_Level Helper_App.console_log(f'{_m}\njson: {json}') diff --git a/business_objects/dog/user.py b/business_objects/dog/user.py index ecec869..af2f8ee 100644 --- a/business_objects/dog/user.py +++ b/business_objects/dog/user.py @@ -39,6 +39,7 @@ class User(SQLAlchemy_ABC, Base): self.id_user = 0 self.is_new = False self.can_admin_dog = False + self.can_admin_user = False super().__init__() def from_DB_user(query_row): @@ -50,10 +51,10 @@ class User(SQLAlchemy_ABC, Base): user.surname = query_row[3] user.email = query_row[4] user.is_email_verified = av.input_bool(query_row[5], 'is_email_verified', _m) - user.is_super_user = av.input_bool(query_row[9], 'is_super_user', _m) - user.is_new = av.input_bool(query_row[12], 'is_new', _m) - - user.can_admin_dog = user.is_super_user + user.is_super_user = av.input_bool(query_row[6], 'is_super_user', _m) + user.can_admin_dog = av.input_bool(query_row[7], 'can_admin_dog', _m) + user.can_admin_user = av.input_bool(query_row[8], 'can_admin_user', _m) + user.is_new = av.input_bool(query_row[9], 'is_new', _m) return user @staticmethod @@ -133,9 +134,6 @@ class User_Temp(db.Model, Base): email = db.Column(db.String(250)) is_email_verified = db.Column(db.Boolean) is_super_user = db.Column(db.Boolean) - id_currency_default = db.Column(db.Integer) - id_region_default = db.Column(db.Integer) - is_included_VAT_default = db.Column(db.Boolean) # is_logged_in: bool def __init__(self): @@ -150,36 +148,51 @@ class Parameters_User(Get_Many_Parameters_Base): get_inactive_user: bool ids_user: str ids_user_auth0: str + names_user: str + require_all_id_search_filters_met: bool + require_any_id_search_filters_met: bool + require_all_non_id_search_filters_met: bool + require_any_non_id_search_filters_met: bool - @staticmethod - def from_form(form): + + @classmethod + def from_form(cls, 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 = '', - ) + filters = cls.get_default() + filters.get_all_user = (id_user == '') + filters.get_inactive_user = get_inactive + filters.ids_user = id_user + filters.ids_user_auth0 = '' + filters.require_all_id_search_filters_met = True + filters.require_any_id_search_filters_met = True + filters.require_all_non_id_search_filters_met = False + filters.require_any_non_id_search_filters_met = True + return filters - @staticmethod - def from_user(user): + @classmethod + def from_user(cls, 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, - ) + filters = cls.get_default() + filters.get_all_user = ((user.id_user is None or user.id_user == 0) and user.id_user_auth0 is None) + filters.get_inactive_user = False + filters.ids_user = '' if user.id_user is None else str(user.id_user) + filters.ids_user_auth0 = user.id_user_auth0 + return filters - @staticmethod - def get_default(): - return Parameters_User( - get_all_user = False, - get_inactive_user = False, - ids_user = '', - ids_user_auth0 = '' + @classmethod + def get_default(cls): + return cls( + get_all_user = False + , get_inactive_user = False + , ids_user = '' + , ids_user_auth0 = '' + , names_user = '' + , require_all_id_search_filters_met = True + , require_any_id_search_filters_met = True + , require_all_non_id_search_filters_met = False + , require_any_non_id_search_filters_met = True ) @classmethod @@ -191,6 +204,11 @@ class Parameters_User(Get_Many_Parameters_Base): , 'a_get_inactive_user': self.get_inactive_user , 'a_ids_user': self.ids_user , 'a_ids_user_auth0': self.ids_user_auth0 + , 'a_names_user': self.names_user + , 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met + , 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met + , 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met + , 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met } class User_Permission_Evaluation(db.Model): diff --git a/datastores/datastore_dog.py b/datastores/datastore_dog.py index a432d14..dcc930b 100644 --- a/datastores/datastore_dog.py +++ b/datastores/datastore_dog.py @@ -14,6 +14,7 @@ Datastore for Users # 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.command_category import Command_Category 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 @@ -40,10 +41,7 @@ class DataStore_Dog(DataStore_Base): 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 + , **filters_dog.to_json() , 'a_debug': 0 } Helper_App.console_log(f'argument_dict: {argument_dict}') @@ -80,17 +78,25 @@ class DataStore_Dog(DataStore_Base): 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 + , **filters_command.to_json() , '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 + # Command Categories + result_set_1 = cursor.fetchall() + Helper_App.console_log(f'raw command categories: {result_set_1}') + command_categories = [] + command_category_indexes = {} + for row in result_set_1: + new_command_category = Command_Category.from_db_command(row) + command_category_indexes[new_command_category.id_command_category] = len(command_categories) + command_categories.append(new_command_category) + # Commands + cursor.nextset() result_set_1 = cursor.fetchall() Helper_App.console_log(f'raw commands: {result_set_1}') commands = [] @@ -112,7 +118,7 @@ class DataStore_Dog(DataStore_Base): cls.db_cursor_clear(cursor) - return commands, errors + return command_categories, commands, errors @classmethod def get_many_dog_command_link(cls, filters_dog_command_link): @@ -120,12 +126,7 @@ class DataStore_Dog(DataStore_Base): 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 + , **filters_dog_command_link.to_json() , 'a_debug': 0 } Helper_App.console_log(f'argument_dict: {argument_dict}') @@ -138,6 +139,7 @@ class DataStore_Dog(DataStore_Base): dog_command_links = [] dog_command_link_indexes = {} for row in result_set_1: + # Helper_App.console_log(f'Raw dog command link: {row}') 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) diff --git a/forms/dog/dog_command_link.py b/forms/dog/dog_command_link.py index b6a01d2..bc28f9f 100644 --- a/forms/dog/dog_command_link.py +++ b/forms/dog/dog_command_link.py @@ -13,6 +13,7 @@ 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_category import Command_Category 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 @@ -40,6 +41,11 @@ class Filters_Dog_Command_Link(Form_Base): , choices = [Form_Base.get_select_option_all()] , default = Form_Base.get_select_option_default_value() ) + id_command_category = SelectField( + 'Command Category' + , choices = [Form_Base.get_select_option_all()] + , default = Form_Base.get_select_option_default_value() + ) id_command = SelectField( 'Command' , choices = [Form_Base.get_select_option_all()] @@ -55,19 +61,21 @@ class Filters_Dog_Command_Link(Form_Base): _m = f'{cls.__qualname__}.from_json' Helper_App.console_log(f'{_m}\njson: {json}') filters = cls() - filters.search.data = json[Base.FLAG_SEARCH_TEXT] + filters.search.data = json[Base.FLAG_SEARCH] # 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_category.choices = [(json[Command.ATTR_ID_COMMAND], json[Command.ATTR_ID_COMMAND])] + filters.id_command_category.data = json[Command_Category.ATTR_ID_COMMAND_CATEGORY] # 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_ONLY], Base.FLAG_ACTIVE_ONLY, f'{cls.__name__}.from_json') - # Helper_App.console_log(f'Command: {command}') return filters def to_json(self): return { - Base.FLAG_SEARCH_TEXT: self.search.data - , Dog.FLAG_DOG: self.id_dog.data - , Command.FLAG_COMMAND: self.id_command.data + Base.FLAG_SEARCH: self.search.data + , Dog.ATTR_ID_DOG: self.id_dog.data + , Command_Category.ATTR_ID_COMMAND_CATEGORY: self.id_command_category.data + , Command.ATTR_ID_COMMAND: self.id_command.data , Base.FLAG_ACTIVE_ONLY: self.active_only.data } diff --git a/models/model_view_base.py b/models/model_view_base.py index ba91fb6..5209b17 100644 --- a/models/model_view_base.py +++ b/models/model_view_base.py @@ -20,6 +20,7 @@ Base data model for views 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.business_objects.dog.command_category import Command_Category 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.datastores.datastore_base import DataStore_Base @@ -37,6 +38,7 @@ from typing import ClassVar class Model_View_Base(BaseModel, ABC): ATTR_ID_COMMAND: ClassVar[str] = Command.ATTR_ID_COMMAND + ATTR_ID_COMMAND_CATEGORY: ClassVar[str] = Command_Category.ATTR_ID_COMMAND_CATEGORY ATTR_ID_DOG: ClassVar[str] = Dog.ATTR_ID_DOG ATTR_ID_DOG_COMMAND_LINK: ClassVar[str] = Dog_Command_Link.ATTR_ID_DOG_COMMAND_LINK ATTR_TEXT_COLLAPSED: ClassVar[str] = 'textCollapsed' @@ -68,6 +70,7 @@ class Model_View_Base(BaseModel, ABC): ENDPOINT_PAGE_PRIVACY_POLICY: ClassVar[str] = 'routes_legal.privacy_policy' ENDPOINT_POST_COMMAND: ClassVar[str] = 'routes_core_contact.contact_post' FLAG_ACTIVE: ClassVar[str] = Base.FLAG_ACTIVE + FLAG_ACTIVE_ONLY: ClassVar[str] = Base.FLAG_ACTIVE_ONLY FLAG_ADD: ClassVar[str] = 'add' # FLAG_ADD_DELETE: ClassVar[str] = 'add-delete' FLAG_BOOL_FALSE: ClassVar[str] = 'false' @@ -79,15 +82,16 @@ class Model_View_Base(BaseModel, ABC): FLAG_CALLBACK: ClassVar[str] = 'callback' FLAG_CAPTCHA: ClassVar[str] = 'captcha' FLAG_CARD: ClassVar[str] = 'card' + FLAG_CHECKBOX: ClassVar[str] = 'checkbox' FLAG_CLOSE_TEMPORARY_ELEMENT: ClassVar[str] = 'button-temporary-element-close' FLAG_CODE: ClassVar[str] = Base.FLAG_CODE FLAG_COLLAPSED: ClassVar[str] = 'collapsed' FLAG_COLLAPSIBLE: ClassVar[str] = 'collapsible' FLAG_COMMAND: ClassVar[str] = Command.FLAG_COMMAND + FLAG_COMMAND_CATEGORY: ClassVar[str] = Command_Category.FLAG_COMMAND_CATEGORY FLAG_COLUMN: ClassVar[str] = 'column' FLAG_COMMENT: ClassVar[str] = 'comment' FLAG_CONTAINER: ClassVar[str] = 'container' - FLAG_CONTAINER_CHECKBOX: ClassVar[str] = 'container-checkbox' FLAG_CONTAINER_ICON_AND_LABEL: ClassVar[str] = 'container-icon-label' FLAG_CONTAINER_INPUT: ClassVar[str] = 'container-input' FLAG_CSRF_TOKEN: ClassVar[str] = 'X-CSRFToken' @@ -114,6 +118,7 @@ class Model_View_Base(BaseModel, ABC): FLAG_ICON: ClassVar[str] = "icon" FLAG_IMAGE_LOGO: ClassVar[str] = 'image-logo' FLAG_INITIALISED: ClassVar[str] = 'initialised' + FLAG_IS_CHECKED: ClassVar[str] = 'is_checked' FLAG_LEFT_HAND_STUB: ClassVar[str] = 'lhs' FLAG_LOGO: ClassVar[str] = 'logo' FLAG_MESSAGE: ClassVar[str] = Command.FLAG_MESSAGE @@ -123,7 +128,6 @@ 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_SEARCH_TEXT: ClassVar[str] = Base.FLAG_SEARCH_TEXT FLAG_NAV_ADMIN_HOME: ClassVar[str] = 'navAdminHome' FLAG_NAV_CONTACT: ClassVar[str] = 'navContact' FLAG_NAV_DOG_COMMANDS: ClassVar[str] = 'navDogCommands' @@ -144,6 +148,7 @@ class Model_View_Base(BaseModel, ABC): FLAG_ROWS: ClassVar[str] = Base.FLAG_ROWS FLAG_SAVE: ClassVar[str] = 'save' FLAG_SCROLLABLE: ClassVar[str] = 'scrollable' + FLAG_SEARCH: ClassVar[str] = Base.FLAG_SEARCH FLAG_SLIDER: ClassVar[str] = 'slider' FLAG_STATUS: ClassVar[str] = 'status' FLAG_SUBMIT: ClassVar[str] = 'submit' diff --git a/models/model_view_dog_dog_command_link.py b/models/model_view_dog_dog_command_link.py index 5313b9f..f8ec167 100644 --- a/models/model_view_dog_dog_command_link.py +++ b/models/model_view_dog_dog_command_link.py @@ -29,6 +29,7 @@ from typing import ClassVar class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base): FLAG_HAND_SIGNAL_DESCRIPTION: ClassVar[str] = Dog_Command_Link.FLAG_HAND_SIGNAL_DESCRIPTION filter_dogs: list = None + filter_command_categories: list = None filter_commands: list = None dog_command_links: list = None form_filters: Filters_Dog_Command_Link = None @@ -48,9 +49,11 @@ class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base): 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) + self.filter_command_categories, self.filter_commands, errors = datastore.get_many_command(parameters_filter_command) + Helper_App.console_log(f'Form filters: {self.form_filters}') parameters_filter_dog_command_link = Parameters_Dog_Command_Link.from_form_filters_dog_command_link(self.form_filters) + Helper_App.console_log(f'Query args: {parameters_filter_dog_command_link}') 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}') @@ -58,6 +61,7 @@ class Model_View_Dog_Dog_Command_Link(Model_View_Dog_Base): # Helper_App.console_log(f'links: {self.dog_command_links}') self.form_filters.id_dog.choices += [(str(dog.id_dog), dog.name) for dog in self.filter_dogs] + self.form_filters.id_command_category.choices += [(str(command_category.id_command_category), command_category.name) for command_category in self.filter_command_categories] self.form_filters.id_command.choices += [(str(command.id_command), command.name) for command in self.filter_commands] """ diff --git a/static/MySQL/000000_tmp_command.sql b/static/MySQL/000000_tmp_command.sql new file mode 100644 index 0000000..4055477 --- /dev/null +++ b/static/MySQL/000000_tmp_command.sql @@ -0,0 +1,15 @@ + +CALL demo.p_dog_get_many_command ( + 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_command_category + , 0 -- a_get_inactive_command_category + , '' -- a_ids_command_category + , '' -- a_names_command_category + , 1 -- a_get_all_command + , 0 -- a_get_inactive_command + , '' -- a_ids_command + , '' -- a_names_command + , 1 -- a_output_command_categories + , 1 -- a_output_commands + , 0 -- a_debug +); diff --git a/static/MySQL/00000_combined.sql b/static/MySQL/00000_combined.sql index 02dc52f..672688d 100644 --- a/static/MySQL/00000_combined.sql +++ b/static/MySQL/00000_combined.sql @@ -1,39 +1,42 @@ - + USE demo; -DROP PROCEDURE IF EXISTS demo.p_dog_get_many_dog_command; -DROP PROCEDURE IF EXISTS demo.p_dog_get_many_dog_command_link; +-- Clear previous proc +DROP PROCEDURE IF EXISTS p_dog_get_many_user; + DELIMITER // -CREATE PROCEDURE demo.p_dog_get_many_dog_command_link ( - 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_get_all_command_category BIT - , IN a_get_inactive_command_category BIT - , IN a_ids_command_category TEXT - , IN a_names_command_category TEXT - , IN a_get_all_command BIT - , IN a_get_inactive_command BIT - , IN a_ids_command TEXT - , IN a_names_command TEXT +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 TEXT + , IN a_ids_user_auth0 TEXT + , IN a_names_user TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_debug BIT ) BEGIN - DECLARE v_code_type_error_bad_data VARCHAR(100); - DECLARE v_code_type_error_no_permission VARCHAR(100); - DECLARE v_code_type_error_warning VARCHAR(100); - DECLARE v_id_type_error_bad_data INT; - DECLARE v_id_type_error_no_permission INT; - DECLARE v_id_type_error_warning INT; - DECLARE v_has_filter_dog BIT; + DECLARE v_code_type_error_bad_data VARCHAR(50); DECLARE v_guid BINARY(36); - DECLARE v_id_permission_dog_view INT; + DECLARE v_has_filter_user_auth0_id BIT; + DECLARE v_has_filter_user_id BIT; + DECLARE v_has_filter_user_name BIT; + DECLARE v_id_access_level_admin INT; + DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; + DECLARE v_id_permission_dog_admin INT; + DECLARE v_id_permission_user INT; + DECLARE v_id_permission_user_admin INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_ids_permission_required VARCHAR(4000); + DECLARE v_is_new BIT; + DECLARE v_rank_max INT; DECLARE v_time_start TIMESTAMP(6); - DECLARE v_can_view BIT; DECLARE exit handler for SQLEXCEPTION BEGIN @@ -49,7 +52,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -81,378 +84,609 @@ BEGIN DROP TABLE IF EXISTS tmp_Msg_Error; END; - + SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); + SET v_id_access_level_admin := (SELECT id_access_level FROM demo.DOG_Access_Level WHERE code = 'ADMIN' LIMIT 1); + SET v_id_access_level_view := (SELECT id_access_level FROM demo.DOG_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_id_permission_dog_admin := (SELECT id_permission FROM demo.DOG_Permission WHERE code = 'DOG_ADMIN' LIMIT 1); + SET v_id_permission_user := (SELECT id_permission FROM demo.DOG_Permission WHERE code = 'USER_VIEW' LIMIT 1); + SET v_id_permission_user_admin := (SELECT id_permission FROM demo.DOG_Permission WHERE code = 'USER_ADMIN' LIMIT 1); SET v_code_type_error_bad_data := 'BAD_DATA'; - SET v_code_type_error_no_permission := 'NO_PERMISSION'; - SET v_code_type_error_warning := 'WARNING'; - 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_type_error_warning := (SELECT ERROR_TYPE.id_type FROM demo.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_warning LIMIT 1); - SET v_id_permission_dog_view := (SELECT PERMISSION.id_permission FROM demo.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_VIEW' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM demo.CORE_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_ids_permission_required := CONCAT(v_id_permission_user, ',', v_id_permission_user_admin, ',', v_id_permission_dog_admin); + SET v_is_new := FALSE; - 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_category := IFNULL(a_get_all_command_category, 0); - -- SET a_get_inactive_command_category := IFNULL(a_get_inactive_command_category, 0); - -- SET a_ids_command_category := TRIM(IFNULL(a_ids_command_category, '')); - -- 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_user := IFNULL(a_get_all_user, 1); + SET a_get_inactive_user := IFNULL(a_get_inactive_user, 0); + SET a_ids_user := TRIM(IFNULL(a_ids_user, '')); + SET a_ids_user_auth0 := TRIM(IFNULL(a_ids_user_auth0, '')); + SET a_names_user := TRIM(IFNULL(a_names_user, '')); + SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); SET a_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN - SELECT - a_id_user - , a_get_all_dog - , a_get_inactive_dog - , a_ids_dog - , a_names_dog - , a_get_all_command_category - , a_get_inactive_command_category - , a_ids_command_category - , a_names_command_category - , a_get_all_command - , a_get_inactive_command - , a_ids_command - , a_names_command - , a_debug + SELECT + a_id_user + , a_id_user_auth0 + , a_get_all_user + , a_get_inactive_user + , a_ids_user + , a_ids_user_auth0 + , a_names_user + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met + , a_debug ; - - SELECT - v_id_type_error_bad_data - , v_id_type_error_no_permission - , v_id_type_error_warning - , 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_Split_Name; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Auth0_Id; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Command; - DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category; - DROP TEMPORARY TABLE IF EXISTS tmp_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_User; - CREATE TEMPORARY TABLE tmp_Dog ( - id_dog INT NOT NULL - , name VARCHAR(250) - , appearance VARCHAR(1000) - , mass_kg DECIMAL(7, 3) - , notes TEXT - , active BIT + CREATE TEMPORARY TABLE tmp_User ( + id_user INT NULL + , can_admin_dog BIT NULL + , can_admin_user BIT NULL + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); - CREATE TEMPORARY TABLE tmp_Command_Category ( - id_command_category INT NOT NULL - , code VARCHAR(100) - , name VARCHAR(250) - , active BIT - ); - - CREATE TEMPORARY TABLE tmp_Command ( - id_command INT NOT NULL - , id_command_category INT NOT NULL - , name VARCHAR(250) - , hand_signal_default_description TEXT - , can_have_button BIT - , notes TEXT - , active BIT - ); - - 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 tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NOT NULL + , code VARCHAR(100) NOT NULL + , msg TEXT 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_Auth0_Id ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Auth0_Id; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Name; + + IF ISNULL(a_id_user) AND NOT ISNULL(a_id_user_auth0) THEN + SET a_id_user := (SELECT U.id_user FROM demo.DOG_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1); + END IF; + + IF + ISNULL(a_id_user) + AND ISNULL(a_id_user_auth0) + THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('User ID required for authorisation.') + ) + ; + END IF; + + SET v_has_filter_user_id := CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END; + SET v_has_filter_user_auth0_id := CASE WHEN a_ids_user_auth0 = '' THEN 0 ELSE 1 END; + SET v_has_filter_user_name := CASE WHEN a_names_user = '' THEN 0 ELSE 1 END; + + IF a_debug = 1 THEN + SELECT + v_has_filter_user_id + , v_has_filter_user_auth0_id + , v_has_filter_user_name + ; + END IF; + + -- User IDs + IF v_has_filter_user_id = 1 THEN + CALL demo.p_core_split(v_guid, a_ids_user, ',', FALSE); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Id ( + substring + , as_int + ) + SELECT + substring + , CAST(substring AS DECIMAL(10,0)) AS as_int + FROM demo.CORE_Split_Temp + WHERE + GUID = v_guid + AND IFNULL(substring, '') != '' + ; + + CALL demo.p_core_clear_split( v_guid ); + + IF EXISTS ( + SELECT * + FROM tmp_Split_Id t_SPLIT_ID + LEFT JOIN demo.DOG_User USER ON t_SPLIT_ID.as_int = USER.id_user + WHERE + ISNULL(t_SPLIT_ID.as_int) + OR ISNULL(USER.id_user) + OR USER.active = 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive User IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split_Id t_SPLIT_ID + LEFT JOIN demo.DOG_User U ON t_SPLIT_ID.as_int = USER.id_user + WHERE + ISNULL(t_SPLIT_ID.as_int) + OR ISNULL(USER.id_user) + OR USER.active = 0 + ; + END IF; + END IF; + + -- Auth0 User IDs + IF v_has_filter_user_auth0_id = 1 THEN + CALL demo.p_core_split(v_guid, a_ids_user_auth0, ',', FALSE); + + INSERT INTO tmp_Split_Auth0_Id ( + substring + ) + SELECT + substring + FROM demo.CORE_Split_Temp + WHERE + GUID = v_guid + AND IFNULL(substring, '') != '' + ; + + CALL demo.p_core_clear_split( v_guid ); + + IF EXISTS ( + SELECT * + FROM tmp_Split_Auth0_Id t_SPLIT_AUTH0 + LEFT JOIN demo.DOG_User USER ON t_SPLIT_AUTH0.substring = USER.id_user_auth0 + WHERE + ISNULL(t_SPLIT_AUTH0.substring) + OR ISNULL(USER.id_user_auth0) + OR USER.active = 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive Auth0 User IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_AUTH0.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split_Auth0_Id t_SPLIT_AUTH0 + LEFT JOIN demo.DOG_User USER ON t_SPLIT_AUTH0.substring = USER.id_user_auth0 + WHERE + ISNULL(t_SPLIT_AUTH0.substring) + OR ISNULL(USER.id_user_auth0) + OR USER.active = 0 + ; + END IF; + END IF; + + -- User Names + IF v_has_filter_user_name = 1 THEN + CALL demo.p_core_split(v_guid, a_names_user, ',', FALSE); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Name ( + substring + ) + SELECT + substring + FROM demo.CORE_Split_Temp + WHERE + GUID = v_guid + AND IFNULL(substring, '') != '' + ; + + CALL demo.p_core_clear_split( v_guid ); + END IF; + + IF + v_has_filter_user_id = 1 + OR v_has_filter_user_auth0_id = 1 + THEN + INSERT INTO tmp_User ( + id_user + , does_meet_id_filters + , does_meet_non_id_filters + ) + WITH + User_Id_Filter AS ( + SELECT USER.id_user + FROM tmp_Split_Id t_SPLIT_ID + INNER JOIN demo.DOG_User USER ON t_SPLIT_ID.as_int = USER.id_user + ) + , User_Auth0_Id_Filter AS ( + SELECT USER.id_user + FROM tmp_Split_Auth0_Id t_SPLIT_AUTH0 + INNER JOIN demo.DOG_User USER ON t_SPLIT_AUTH0.substring = USER.id_user_auth0 + ) + , User_Name_Filter AS ( + SELECT USER.id_user + FROM tmp_Split_Name t_SPLIT_NAME + INNER JOIN demo.DOG_User USER ON CONCAT(USER.firstname, ' ', USER.surname) LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') + WHERE IFNULL(t_SPLIT_NAME.substring, '') <> '' + ) + , User_Filters AS ( + SELECT + USER_COMBINED.id_user + , MAX(USER_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(USER_COMBINED.does_meet_auth0_id_filter) AS does_meet_auth0_id_filter + , MAX(USER_COMBINED.does_meet_name_filter) AS does_meet_name_filter + FROM ( + SELECT + ID_FILTER.id_user + , 1 AS does_meet_id_filter + , 0 AS does_meet_auth0_id_filter + , 0 AS does_meet_name_filter + FROM User_Id_Filter ID_FILTER + UNION + SELECT + AUTH0_ID_FILTER.id_user + , 0 AS does_meet_id_filter + , 1 AS does_meet_auth0_id_filter + , 0 AS does_meet_name_filter + FROM User_Auth0_Id_Filter AUTH0_ID_FILTER + UNION + SELECT + NAME_FILTER.id_user + , 0 AS does_meet_id_filter + , 0 AS does_meet_auth0_id_filter + , 1 AS does_meet_name_filter + FROM User_Name_Filter NAME_FILTER + ) USER_COMBINED + GROUP BY USER_COMBINED.id_user + ) + SELECT + USER.id_user + , CASE WHEN + ( + v_has_filter_user_id = 0 + AND v_has_filter_user_auth0_id = 0 + ) + OR IFNULL(USER_FILTERS.does_meet_id_filter, 0) = 1 + OR IFNULL(USER_FILTERS.does_meet_auth0_id_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_user_name = 0 + ) + OR IFNULL(USER_FILTERS.does_meet_name_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters + FROM demo.DOG_User USER + LEFT JOIN User_Filters USER_FILTERS ON USER.id_user = USER_FILTERS.id_user + WHERE + ( + a_get_all_user = 1 + OR ( + v_has_filter_user_id = 1 + AND USER_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_user_auth0_id = 1 + AND USER_FILTERS.does_meet_auth0_id_filter = 1 + ) + OR ( + v_has_filter_user_id = 1 + AND USER_FILTERS.does_meet_id_filter = 1 + ) + ) + AND ( + a_get_inactive_user = 1 + OR USER.active = 1 + ) + ; + END IF; + + DELETE FROM tmp_Split_Id; + DELETE FROM tmp_Split_Auth0_Id; + DELETE FROM tmp_Split_Name; + + IF a_debug = 1 THEN + SELECT 'After get all Users'; + SELECT * FROM tmp_User; + END IF; + + -- Filter records + 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 + DELETE t_USER + FROM tmp_User t_USER + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND t_USER.does_meet_id_filters = 0 + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND t_USER.does_meet_non_id_filters = 0 + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND t_USER.does_meet_id_filters = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND t_USER.does_meet_non_id_filters = 0 + ) + ; + END IF; + + IF a_debug = 1 THEN + SELECT 'After filter Users'; + SELECT * FROM tmp_User; + END IF; + + -- Calculated fields + -- Can admin dog + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + v_guid -- guid + , a_id_user -- ids_user + , FALSE -- get_inactive_user + , v_id_permission_dog_admin -- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM demo.DOG_Calc_User_Temp; + END IF; + + CALL demo.p_dog_calc_user( + v_guid -- guid + , a_id_user -- ids_user + , FALSE -- get_inactive_user + , v_id_permission_dog_admin -- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * FROM demo.DOG_Calc_User_Temp WHERE GUID = v_guid; + END IF; + + UPDATE tmp_User t_U + INNER JOIN demo.DOG_Calc_User_Temp CUT + ON CUT.GUID = v_guid + AND t_U.id_user = CUT.id_user + SET t_U.can_admin_dog = CUT.can_admin + ; + + CALL demo.p_dog_clear_calc_user( v_guid, FALSE ); + END IF; + + -- Can admin user + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT + v_guid -- 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 + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM demo.DOG_Calc_User_Temp; + END IF; + + CALL demo.p_dog_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 + , 0 -- a_show_errors + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * FROM demo.DOG_Calc_User_Temp WHERE GUID = v_guid; + END IF; + + UPDATE tmp_User t_U + INNER JOIN demo.DOG_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_dog_clear_calc_user( v_guid, FALSE ); + END IF; -- 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_guid - , a_id_user -- a_ids_user - , FALSE -- a_get_inactive_user - , v_id_permission_dog_view -- a_ids_permission - , 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 Dogs and Commands.' - ) - ; - END IF; - - CALL demo.p_dog_clear_calc_user( - v_guid - , 0 -- a_debug - ); - - -- Call Dog Calc - IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN - SELECT - v_guid -- a_guid - , a_id_user -- a_id_user - , a_get_all_dog -- a_get_all_dog - , a_get_inactive_dog -- a_get_inactive_dog - , a_ids_dog -- a_ids_dog - , a_names_dog -- a_names_dog - , 0 -- a_show_errors - , 0 -- a_debug - ; + 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 + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM demo.DOG_Calc_User_Temp; END IF; - CALL demo.p_dog_calc_dog( - v_guid -- a_guid - , a_id_user -- a_id_user - , a_get_all_dog -- a_get_all_dog - , a_get_inactive_dog -- a_get_inactive_dog - , a_ids_dog -- a_ids_dog - , a_names_dog -- a_names_dog - , 0 -- a_show_errors + CALL demo.p_dog_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 + , 0 -- a_show_errors , 0 -- a_debug - ); - - INSERT INTO tmp_Dog ( - id_dog - , name - , appearance - , mass_kg - , notes - , active - ) - SELECT - DOG_T.id_dog - , DOG_T.name - , DOG_T.appearance - , DOG_T.mass_kg - , DOG_T.notes - , DOG_T.active - FROM demo.DOG_Dog_Temp DOG_T - WHERE DOG_T.GUID = v_guid - ; + ); IF a_debug = 1 THEN - SELECT * FROM tmp_Dog; - END IF; - END IF; - - -- Call Command Calc - IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN - IF a_debug = 1 THEN - SELECT - v_guid -- a_guid - , a_id_user -- a_id_user - , a_get_all_command_category - , a_get_inactive_command_category - , a_ids_command_category - , a_names_command_category - , a_get_all_command -- a_get_all_command - , a_get_inactive_command -- a_get_inactive_command - , a_ids_command -- a_ids_command - , a_names_command -- a_names_command - , 0 -- a_show_errors - , 0 -- a_debug - ; + SELECT * FROM demo.DOG_Calc_User_Temp WHERE GUID = v_guid; END IF; - CALL demo.p_dog_calc_command ( - v_guid -- a_guid - , a_id_user -- a_id_user - , a_get_all_command_category - , a_get_inactive_command_category - , a_ids_command_category - , a_names_command_category - , a_get_all_command -- a_get_all_command - , a_get_inactive_command -- a_get_inactive_command - , a_ids_command -- a_ids_command - , a_names_command -- a_names_command - , 0 -- a_show_errors - , 0 -- a_debug - ); - - INSERT INTO tmp_Command_Category ( - id_command_category - , code - , name - , active - ) - SELECT - COMMAND_CATEGORY_T.id_command_category - , COMMAND_CATEGORY_T.code - , COMMAND_CATEGORY_T.name - , COMMAND_CATEGORY_T.active - FROM demo.DOG_Command_Category_Temp COMMAND_CATEGORY_T - WHERE COMMAND_CATEGORY_T.GUID = v_guid - ; - - INSERT INTO tmp_Command ( - id_command - , id_command_category - , name - , hand_signal_default_description - , can_have_button - , notes - , active - ) - SELECT - COMMAND_T.id_command - , COMMAND_T.id_command_category - , COMMAND_T.name - , COMMAND_T.hand_signal_default_description - , COMMAND_T.can_have_button - , COMMAND_T.notes - , COMMAND_T.active - FROM demo.DOG_Command_Temp COMMAND_T - WHERE COMMAND_T.GUID = v_guid - ; - - IF a_debug = 1 THEN - SELECT * FROM tmp_Command_Category; - SELECT * FROM tmp_Command; + IF NOT EXISTS ( + SELECT can_view + FROM demo.DOG_Calc_User_Temp CUT + WHERE + CUT.GUID = v_guid + AND can_view = 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('You do not have view permissions for ', (SELECT name FROM demo.DOG_Permission P INNER JOIN demo.DOG_Calc_User_Temp CUT ON P.id_permission = CUT.id_permission_required WHERE GUID = v_guid AND IFNULL(can_view, 0) = 0 LIMIT 1)) + ) + ; + ELSE + SET a_debug := a_debug; END IF; - END IF; - + + CALL demo.p_dog_clear_calc_user( v_guid, FALSE ); + END IF; + - -- Filter outputs IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN - SELECT * FROM tmp_Dog; - SELECT * FROM tmp_Command; - SELECT * FROM tmp_Command_Category; + SELECT * FROM tmp_Dog_Calc_Dog; END IF; - DELETE FROM tmp_Dog; - DELETE FROM tmp_Command; - DELETE FROM tmp_Command_Category; + DELETE FROM tmp_Dog_Calc_Dog; 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_CATEGORY.name AS name_command_category - , t_COMMAND.id_command - , t_COMMAND.name AS name_command - -- , t_COMMAND.has_button AS command_has_button - , COALESCE(DOG_COMMAND_LINK.hand_signal_description, t_COMMAND.hand_signal_default_description) AS hand_signal_description_command - , t_COMMAND.can_have_button AS can_have_button_command - , 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_Command_Category t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + + -- 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.is_super_user + , t_U.can_admin_dog + , t_U.can_admin_user + , v_is_new AS is_new + FROM tmp_User t_U + INNER JOIN demo.DOG_User U ON t_U.id_user = U.id_user ; - -- Errors + # Errors SELECT t_ERROR.id_error - , t_ERROR.id_type + , 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 + , 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_Command_Category; - END IF; - - DROP TEMPORARY TABLE IF EXISTS tmp_Split; - DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - DROP TEMPORARY TABLE IF EXISTS tmp_Command; - DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category; - DROP TEMPORARY TABLE IF EXISTS tmp_Dog; + INNER JOIN demo.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; IF a_debug = 1 THEN - CALL demo.p_core_debug_timing_reporting ( v_time_start ); + SELECT * FROM tmp_User; + END IF; + + -- Clean up + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Auth0_Id; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_User; + + 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.DOG_Calc_User_Temp; +delete FROM demo.DOG_Calc_User_Temp; -CALL demo.p_dog_get_many_dog_command_link ( - 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_dog - , 0 -- a_get_inactive_dog - , '' -- a_ids_dog - , 1 -- a_get_all_command_category - , 0 -- a_get_inactive_command_category - , '' -- a_ids_command_category - , 1 -- a_get_all_command - , 0 -- a_get_inactive_command - , '' -- a_ids_command - , 1 -- a_debug +SELECT * +FROM demo.DOG_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 + , '' -- a_names_user + , 1 -- :a_require_all_id_search_filters_met, + , 1 -- :a_require_any_id_search_filters_met, + , 0 -- :a_require_all_non_id_search_filters_met, + , 1 -- :a_require_any_non_id_search_filters_met, + , 0 -- a_debug ); -CALL demo.p_dog_get_many_dog_command_link ( - 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user - , 1 -- a_get_all_dog - , 0 -- a_get_inactive_dog - , '' -- a_ids_dog - , '' -- a_names_dog - , 1 -- a_get_all_command_category - , 0 -- a_get_inactive_command_category - , '' -- a_ids_command_category - , '' -- a_names_command_category - , 0 -- a_get_all_command - , 0 -- a_get_inactive_command - , '2' -- a_ids_command - , '2' -- a_names_command - , 1 -- a_debug -); - -*/ \ No newline at end of file +*/ diff --git a/static/MySQL/00001_destroy.sql b/static/MySQL/00001_destroy.sql index bb1243a..90a1904 100644 --- a/static/MySQL/00001_destroy.sql +++ b/static/MySQL/00001_destroy.sql @@ -192,7 +192,7 @@ DROP PROCEDURE IF EXISTS parts.p_command_clear_calc_command; DROP PROCEDURE IF EXISTS parts.p_dog_clear_calc_user; DROP PROCEDURE IF EXISTS parts.p_dog_calc_user; -DROP PROCEDURE IF EXISTS parts.p_clear_split_temp; +DROP PROCEDURE IF EXISTS parts.p_core_clear_split; /* DROP PROCEDURE IF EXISTS parts.p_core_clear_split_key_value_pair_csv; diff --git a/static/MySQL/10530_tbl_DOG_Calc_User_Temp.sql b/static/MySQL/10530_tbl_DOG_Calc_User_Temp.sql index 2ac3c5c..f31472e 100644 --- a/static/MySQL/10530_tbl_DOG_Calc_User_Temp.sql +++ b/static/MySQL/10530_tbl_DOG_Calc_User_Temp.sql @@ -1,6 +1,8 @@ USE parts; +-- DROP TABLE IF EXISTS demo.DOG_Calc_User_Temp; + SELECT CONCAT('WARNING: Table ', TABLE_SCHEMA, '.', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE @@ -11,12 +13,12 @@ WHERE CREATE TABLE IF NOT EXISTS parts.DOG_Calc_User_Temp ( guid BINARY(36) NOT NULL , id_user INT - , id_permission_required INT NOT NULL - , CONSTRAINT FK_DOG_Calc_User_Temp_id_permission_required - FOREIGN KEY (id_permission_required) - REFERENCES parts.DOG_Permission (id_permission) - , priority_access_level_required INT NOT NULL + , id_permission_required INT + , priority_access_level_required INT , is_super_user BIT , priority_access_level_user INT , has_access BIT + , can_view BIT + , can_edit BIT + , can_admin BIT ); \ No newline at end of file diff --git a/static/MySQL/11003_tbl_DOG_Dog_Temp.sql b/static/MySQL/11003_tbl_DOG_Dog_Temp.sql index 1b7705b..befe992 100644 --- a/static/MySQL/11003_tbl_DOG_Dog_Temp.sql +++ b/static/MySQL/11003_tbl_DOG_Dog_Temp.sql @@ -17,4 +17,6 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Dog_Temp ( , notes TEXT , active BIT , guid BINARY(36) + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); diff --git a/static/MySQL/11102_tbl_DOG_Command_Category_Temp.sql b/static/MySQL/11102_tbl_DOG_Command_Category_Temp.sql index ad64d87..cc6fc0c 100644 --- a/static/MySQL/11102_tbl_DOG_Command_Category_Temp.sql +++ b/static/MySQL/11102_tbl_DOG_Command_Category_Temp.sql @@ -15,4 +15,6 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Command_Category_Temp ( , name VARCHAR(250) , active BIT , guid BINARY(36) + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); \ No newline at end of file diff --git a/static/MySQL/11106_tbl_DOG_Command_Temp.sql b/static/MySQL/11106_tbl_DOG_Command_Temp.sql index 65bf367..977b45e 100644 --- a/static/MySQL/11106_tbl_DOG_Command_Temp.sql +++ b/static/MySQL/11106_tbl_DOG_Command_Temp.sql @@ -18,6 +18,8 @@ CREATE TABLE IF NOT EXISTS parts.DOG_Command_Temp ( , notes TEXT , active BIT , guid BINARY(36) + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT , name_command_category VARCHAR(250) ); diff --git a/static/MySQL/70516_p_dog_create_new_user_auth0.sql b/static/MySQL/70516_p_dog_create_new_user_auth0.sql new file mode 100644 index 0000000..d419d99 --- /dev/null +++ b/static/MySQL/70516_p_dog_create_new_user_auth0.sql @@ -0,0 +1,563 @@ + +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_code_type_error_bad_data VARCHAR(50); + DECLARE v_guid BINARY(36); + DECLARE v_has_filter_user BIT; + DECLARE v_has_filter_user_auth0 BIT; + DECLARE v_id_access_level_admin INT; + DECLARE v_id_access_level_view INT; + DECLARE v_id_minimum INT; + DECLARE v_id_permission_dog_admin INT; + DECLARE v_id_permission_user INT; + DECLARE v_id_permission_user_admin INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_ids_permission_required VARCHAR(4000); + DECLARE v_is_new BIT; + DECLARE v_rank_max INT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(100) NOT NULL + , msg TEXT NOT NULL + ); + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + MET.id_type + , @errno + , @text + FROM parts.CORE_Msg_Error_Type MET + WHERE MET.code = 'MYSQL_ERROR' + ; + + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + DROP TABLE IF EXISTS tmp_Msg_Error; + END; + + SET v_time_start := CURRENT_TIMESTAMP(6); + SET v_guid := UUID(); + SET v_id_access_level_admin := (SELECT id_access_level FROM parts.DOG_Access_Level WHERE code = 'ADMIN' LIMIT 1); + SET v_id_access_level_view := (SELECT id_access_level FROM parts.DOG_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_id_permission_dog_admin := (SELECT id_permission FROM parts.DOG_Permission WHERE code = 'DOG_ADMIN' LIMIT 1); + SET v_id_permission_user := (SELECT id_permission FROM parts.DOG_Permission WHERE code = 'USER_VIEW' LIMIT 1); + SET v_id_permission_user_admin := (SELECT id_permission FROM parts.DOG_Permission WHERE code = 'USER_ADMIN' LIMIT 1); + SET v_code_type_error_bad_data := 'BAD_DATA'; + SET v_id_type_error_bad_data := (SELECT id_type FROM parts.CORE_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_ids_permission_required := CONCAT(v_id_permission_user, ',', v_id_permission_user_admin, ',', v_id_permission_dog_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_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_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_dog BIT NULL + , can_admin_user BIT NULL + ); + + CREATE TEMPORARY TABLE tmp_Msg_Error ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NOT NULL + , code VARCHAR(100) NOT NULL + , msg TEXT NOT NULL + ); + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split; + + IF ISNULL(a_id_user) AND NOT ISNULL(a_id_user_auth0) THEN + SET a_id_user := (SELECT U.id_user FROM parts.DOG_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1); + END IF; + + IF ISNULL(a_id_user) THEN + IF NOT ISNULL(a_id_user_auth0) THEN + INSERT INTO parts.DOG_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 parts.DOG_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_type_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 parts.p_core_split(v_guid, a_ids_user, ',', FALSE); + + SET sql_mode = ''; + + DELETE FROM tmp_Split; + + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CAST(substring AS DECIMAL(10,0)) AS as_int + FROM parts.Split_Temp + WHERE 1=1 + AND GUID = v_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL parts.p_core_clear_split( 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 parts.DOG_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 ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive User IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN parts.DOG_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 parts.DOG_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 parts.p_core_split(v_guid, a_ids_user_auth0, ',', FALSE); + + DELETE FROM tmp_Split; + + INSERT INTO tmp_Split ( + substring + ) + SELECT + substring + FROM parts.Split_Temp + WHERE + GUID = v_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL parts.p_core_clear_split( 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 parts.DOG_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 ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_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 parts.DOG_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 parts.DOG_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; + + -- Can admin dog + 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_dog_admin -- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM parts.DOG_Calc_User_Temp; + END IF; + + CALL parts.p_dog_calc_user( + v_guid -- guid + , a_id_user -- ids_user + , FALSE -- get_inactive_user + , v_id_permission_dog_admin -- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = v_guid; + END IF; + + UPDATE tmp_User t_U + INNER JOIN parts.DOG_Calc_User_Temp CUT + ON CUT.GUID = v_guid + AND t_U.id_user = CUT.id_user + SET t_U.can_admin_dog = CUT.can_admin + ; + + CALL parts.p_dog_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 + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM parts.DOG_Calc_User_Temp; + END IF; + + CALL parts.p_dog_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 + , 0 -- a_show_errors + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = v_guid; + END IF; + + UPDATE tmp_User t_U + INNER JOIN parts.DOG_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 parts.p_dog_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 + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM parts.DOG_Calc_User_Temp; + END IF; + + CALL parts.p_dog_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 + , 0 -- a_show_errors + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = v_guid; + END IF; + + IF NOT EXISTS ( + SELECT can_view + FROM parts.DOG_Calc_User_Temp CUT + WHERE + CUT.GUID = v_guid + AND can_view = 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('You do not have view permissions for ', (SELECT name FROM parts.DOG_Permission P INNER JOIN parts.DOG_Calc_User_Temp CUT ON P.id_permission = CUT.id_permission_required WHERE GUID = v_guid AND IFNULL(can_view, 0) = 0 LIMIT 1)) + ) + ; + ELSE + SET a_debug := a_debug; + END IF; + + CALL parts.p_dog_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.is_super_user + , t_U.can_admin_dog + , t_U.can_admin_user + , v_is_new AS is_new + FROM tmp_User t_U + INNER JOIN parts.DOG_User U ON t_U.id_user = U.id_user + ; + + # Errors + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + IF a_debug = 1 THEN + SELECT * FROM tmp_User; + END IF; + + -- Clean up + DROP TEMPORARY TABLE IF EXISTS tmp_User; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + + /* + DELETE FROM parts.DOG_Calc_User_Temp + WHERE GUID = v_guid; + */ + + IF a_debug = 1 THEN + CALL parts.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 parts.DOG_Calc_User_Temp; +delete FROM parts.DOG_Calc_User_Temp; + +SELECT * +FROM parts.DOG_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 + , 0 -- a_debug +); + +*/ diff --git a/static/MySQL/70516_p_dog_get_many_user.sql b/static/MySQL/70516_p_dog_get_many_user.sql index 1c8a743..3903897 100644 --- a/static/MySQL/70516_p_dog_get_many_user.sql +++ b/static/MySQL/70516_p_dog_get_many_user.sql @@ -11,44 +11,101 @@ CREATE PROCEDURE p_dog_get_many_user ( , 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_ids_user TEXT + , IN a_ids_user_auth0 TEXT + , IN a_names_user TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_debug BIT ) BEGIN + DECLARE v_code_type_error_bad_data VARCHAR(50); + DECLARE v_guid BINARY(36); + DECLARE v_has_filter_user_auth0_id BIT; + DECLARE v_has_filter_user_id BIT; + DECLARE v_has_filter_user_name BIT; DECLARE v_id_access_level_admin INT; DECLARE v_id_access_level_view INT; + DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_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_ids_permission_required VARCHAR(4000); + DECLARE v_is_new BIT; DECLARE v_rank_max INT; DECLARE v_time_start TIMESTAMP(6); - DECLARE v_is_new 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 TEXT NOT NULL + ); + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + MET.id_type + , @errno + , @text + FROM parts.CORE_Msg_Error_Type MET + WHERE MET.code = 'MYSQL_ERROR' + ; + + SELECT + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + + DROP TABLE IF EXISTS tmp_Msg_Error; + END; SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); - SET v_id_access_level_admin := (SELECT id_access_level FROM parts.Shop_Access_Level WHERE code = 'ADMIN' LIMIT 1); - SET v_id_access_level_view := (SELECT id_access_level FROM parts.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); - SET v_id_permission_dog_admin := (SELECT id_permission FROM parts.Shop_Permission WHERE code = 'DOG_ADMIN' LIMIT 1); - SET v_id_permission_user := (SELECT id_permission FROM parts.Shop_Permission WHERE code = 'USER_VIEW' LIMIT 1); - SET v_id_permission_user_admin := (SELECT id_permission FROM parts.Shop_Permission WHERE code = 'USER_ADMIN' LIMIT 1); - SET v_code_error_bad_data := (SELECT code FROM parts.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); - SET v_id_type_error_bad_data := (SELECT id_type FROM parts.Shop_Msg_Error_Type WHERE code = v_code_error_bad_data LIMIT 1); + SET v_id_access_level_admin := (SELECT id_access_level FROM parts.DOG_Access_Level WHERE code = 'ADMIN' LIMIT 1); + SET v_id_access_level_view := (SELECT id_access_level FROM parts.DOG_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_id_permission_dog_admin := (SELECT id_permission FROM parts.DOG_Permission WHERE code = 'DOG_ADMIN' LIMIT 1); + SET v_id_permission_user := (SELECT id_permission FROM parts.DOG_Permission WHERE code = 'USER_VIEW' LIMIT 1); + SET v_id_permission_user_admin := (SELECT id_permission FROM parts.DOG_Permission WHERE code = 'USER_ADMIN' LIMIT 1); + SET v_code_type_error_bad_data := 'BAD_DATA'; + SET v_id_type_error_bad_data := (SELECT id_type FROM parts.CORE_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); SET v_ids_permission_required := CONCAT(v_id_permission_user, ',', v_id_permission_user_admin, ',', v_id_permission_dog_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_names_user := TRIM(IFNULL(a_names_user, '')); + SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); SET a_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN @@ -57,251 +114,341 @@ BEGIN , 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_names_user + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met , a_debug ; END IF; - DROP TEMPORARY TABLE IF EXISTS tmp_User; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Auth0_Id; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_User; CREATE TEMPORARY TABLE tmp_User ( - id_user INT NULL - , rank_user INT NULL + id_user INT NULL , can_admin_dog BIT NULL , can_admin_user BIT NULL + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); 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 + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NOT NULL + , code VARCHAR(100) NOT NULL + , msg TEXT NOT NULL ); - CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( - substring 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_Auth0_Id ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Auth0_Id; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Name ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Name; IF ISNULL(a_id_user) AND NOT ISNULL(a_id_user_auth0) THEN - SET a_id_user := (SELECT U.id_user FROM parts.Shop_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1); -- LIKE CONCAT('%', a_id_user_auth0, '%') LIMIT 1); + SET a_id_user := (SELECT U.id_user FROM parts.DOG_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1); END IF; - IF ISNULL(a_id_user) THEN - IF NOT ISNULL(a_id_user_auth0) THEN - INSERT INTO parts.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 parts.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; + IF + ISNULL(a_id_user) + AND ISNULL(a_id_user_auth0) + THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('User ID required for authorisation.') + ) + ; 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; + SET v_has_filter_user_id := CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END; + SET v_has_filter_user_auth0_id := CASE WHEN a_ids_user_auth0 = '' THEN 0 ELSE 1 END; + SET v_has_filter_user_name := CASE WHEN a_names_user = '' THEN 0 ELSE 1 END; IF a_debug = 1 THEN SELECT - v_has_filter_user - , v_has_filter_user_auth0 + v_has_filter_user_id + , v_has_filter_user_auth0_id + , v_has_filter_user_name ; END IF; -- User IDs - IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user = 1) THEN + IF v_has_filter_user_id = 1 THEN CALL parts.p_core_split(v_guid, a_ids_user, ',', FALSE); - - DELETE FROM tmp_Split; + + SET sql_mode = ''; - INSERT INTO tmp_Split ( - substring + INSERT INTO tmp_Split_Id ( + substring , as_int ) SELECT - substring - , CONVERT(substring, DECIMAL(10,0)) AS as_int - FROM parts.Split_Temp - WHERE 1=1 - AND GUID = v_guid - AND NOT ISNULL(substring) - AND substring != '' + substring + , CAST(substring AS DECIMAL(10,0)) AS as_int + FROM parts.CORE_Split_Temp + WHERE + GUID = v_guid + AND IFNULL(substring, '') != '' ; CALL parts.p_core_clear_split( 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 parts.Shop_User U ON t_S.as_int = U.id_user + FROM tmp_Split_Id t_SPLIT_ID + LEFT JOIN parts.DOG_User USER ON t_SPLIT_ID.as_int = USER.id_user WHERE - ISNULL(t_S.as_int) - OR ISNULL(U.id_user) + ISNULL(t_SPLIT_ID.as_int) + OR ISNULL(USER.id_user) + OR USER.active = 0 ) THEN INSERT INTO tmp_Msg_Error ( - -- guid, - id_type, - code, - msg + 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 parts.Shop_User U ON t_S.as_int = U.id_user + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive User IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_ID.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split_Id t_SPLIT_ID + LEFT JOIN parts.DOG_User U ON t_SPLIT_ID.as_int = USER.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 parts.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 - ) + ISNULL(t_SPLIT_ID.as_int) + OR ISNULL(USER.id_user) + OR USER.active = 0 ; 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 + IF v_has_filter_user_auth0_id = 1 THEN CALL parts.p_core_split(v_guid, a_ids_user_auth0, ',', FALSE); - - DELETE FROM tmp_Split; - INSERT INTO tmp_Split ( + INSERT INTO tmp_Split_Auth0_Id ( substring ) SELECT substring - FROM parts.Split_Temp - WHERE 1=1 - AND GUID = v_guid - AND NOT ISNULL(substring) - AND substring != '' + FROM parts.CORE_Split_Temp + WHERE + GUID = v_guid + AND IFNULL(substring, '') != '' + ; + + CALL parts.p_core_clear_split( v_guid ); + + IF EXISTS ( + SELECT * + FROM tmp_Split_Auth0_Id t_SPLIT_AUTH0 + LEFT JOIN parts.DOG_User USER ON t_SPLIT_AUTH0.substring = USER.id_user_auth0 + WHERE + ISNULL(t_SPLIT_AUTH0.substring) + OR ISNULL(USER.id_user_auth0) + OR USER.active = 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive Auth0 User IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT_AUTH0.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split_Auth0_Id t_SPLIT_AUTH0 + LEFT JOIN parts.DOG_User USER ON t_SPLIT_AUTH0.substring = USER.id_user_auth0 + WHERE + ISNULL(t_SPLIT_AUTH0.substring) + OR ISNULL(USER.id_user_auth0) + OR USER.active = 0 + ; + END IF; + END IF; + + -- User Names + IF v_has_filter_user_name = 1 THEN + CALL parts.p_core_split(v_guid, a_names_user, ',', FALSE); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Name ( + substring + ) + SELECT + substring + FROM parts.CORE_Split_Temp + WHERE + GUID = v_guid + AND IFNULL(substring, '') != '' ; CALL parts.p_core_clear_split( 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 parts.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 parts.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 parts.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 + v_has_filter_user_id = 1 + OR v_has_filter_user_auth0_id = 1 + THEN + INSERT INTO tmp_User ( + id_user + , does_meet_id_filters + , does_meet_non_id_filters + ) + WITH + User_Id_Filter AS ( + SELECT USER.id_user + FROM tmp_Split_Id t_SPLIT_ID + INNER JOIN parts.DOG_User USER ON t_SPLIT_ID.as_int = USER.id_user + ) + , User_Auth0_Id_Filter AS ( + SELECT USER.id_user + FROM tmp_Split_Auth0_Id t_SPLIT_AUTH0 + INNER JOIN parts.DOG_User USER ON t_SPLIT_AUTH0.substring = USER.id_user_auth0 + ) + , User_Name_Filter AS ( + SELECT USER.id_user + FROM tmp_Split_Name t_SPLIT_NAME + INNER JOIN parts.DOG_User USER ON CONCAT(USER.firstname, ' ', USER.surname) LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') + WHERE IFNULL(t_SPLIT_NAME.substring, '') <> '' + ) + , User_Filters AS ( + SELECT + USER_COMBINED.id_user + , MAX(USER_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(USER_COMBINED.does_meet_auth0_id_filter) AS does_meet_auth0_id_filter + , MAX(USER_COMBINED.does_meet_name_filter) AS does_meet_name_filter + FROM ( + SELECT + ID_FILTER.id_user + , 1 AS does_meet_id_filter + , 0 AS does_meet_auth0_id_filter + , 0 AS does_meet_name_filter + FROM User_Id_Filter ID_FILTER + UNION + SELECT + AUTH0_ID_FILTER.id_user + , 0 AS does_meet_id_filter + , 1 AS does_meet_auth0_id_filter + , 0 AS does_meet_name_filter + FROM User_Auth0_Id_Filter AUTH0_ID_FILTER + UNION + SELECT + NAME_FILTER.id_user + , 0 AS does_meet_id_filter + , 0 AS does_meet_auth0_id_filter + , 1 AS does_meet_name_filter + FROM User_Name_Filter NAME_FILTER + ) USER_COMBINED + GROUP BY USER_COMBINED.id_user + ) + SELECT + USER.id_user + , CASE WHEN + ( + v_has_filter_user_id = 0 + AND v_has_filter_user_auth0_id = 0 + ) + OR IFNULL(USER_FILTERS.does_meet_id_filter, 0) = 1 + OR IFNULL(USER_FILTERS.does_meet_auth0_id_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_user_name = 0 + ) + OR IFNULL(USER_FILTERS.does_meet_name_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters + FROM parts.DOG_User USER + LEFT JOIN User_Filters USER_FILTERS ON USER.id_user = USER_FILTERS.id_user + WHERE + ( + a_get_all_user = 1 + OR ( + v_has_filter_user_id = 1 + AND USER_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_user_auth0_id = 1 + AND USER_FILTERS.does_meet_auth0_id_filter = 1 + ) + OR ( + v_has_filter_user_id = 1 + AND USER_FILTERS.does_meet_id_filter = 1 + ) + ) + AND ( + a_get_inactive_user = 1 + OR USER.active = 1 + ) + ; + END IF; + + DELETE FROM tmp_Split_Id; + DELETE FROM tmp_Split_Auth0_Id; + DELETE FROM tmp_Split_Name; IF a_debug = 1 THEN + SELECT 'After get all Users'; SELECT * FROM tmp_User; END IF; + -- Filter records + 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 + DELETE t_USER + FROM tmp_User t_USER + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND t_USER.does_meet_id_filters = 0 + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND t_USER.does_meet_non_id_filters = 0 + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND t_USER.does_meet_id_filters = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND t_USER.does_meet_non_id_filters = 0 + ) + ; + END IF; + + IF a_debug = 1 THEN + SELECT 'After filter Users'; + SELECT * FROM tmp_User; + END IF; + + -- Calculated fields -- Can admin dog - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT v_guid -- guid @@ -309,10 +456,10 @@ BEGIN , FALSE -- get_inactive_user , v_id_permission_dog_admin -- ids_permission , v_id_access_level_admin -- ids_access_level - , '' -- ids_product + , 0 -- a_show_errors , 0 -- a_debug ; - SELECT * FROM parts.Shop_Calc_User_Temp; + SELECT * FROM parts.DOG_Calc_User_Temp; END IF; CALL parts.p_dog_calc_user( @@ -321,16 +468,16 @@ BEGIN , FALSE -- get_inactive_user , v_id_permission_dog_admin -- ids_permission , v_id_access_level_admin -- ids_access_level - , '' -- ids_product + , 0 -- a_show_errors , 0 -- a_debug ); IF a_debug = 1 THEN - SELECT * FROM parts.Shop_Calc_User_Temp WHERE GUID = v_guid; + SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = v_guid; END IF; UPDATE tmp_User t_U - INNER JOIN parts.Shop_Calc_User_Temp CUT + INNER JOIN parts.DOG_Calc_User_Temp CUT ON CUT.GUID = v_guid AND t_U.id_user = CUT.id_user SET t_U.can_admin_dog = CUT.can_admin @@ -340,7 +487,7 @@ BEGIN END IF; -- Can admin user - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT v_guid -- guid @@ -348,10 +495,10 @@ BEGIN , FALSE -- get_inactive_user , v_id_permission_user_admin -- ids_permission , v_id_access_level_admin -- ids_access_level - , '' -- ids_product + , 0 -- a_show_errors , 0 -- a_debug ; - SELECT * FROM parts.Shop_Calc_User_Temp; + SELECT * FROM parts.DOG_Calc_User_Temp; END IF; CALL parts.p_dog_calc_user( @@ -360,16 +507,16 @@ BEGIN , FALSE -- get_inactive_user , v_id_permission_user_admin -- ids_permission , v_id_access_level_admin -- ids_access_level - , '' -- ids_product + , 0 -- a_show_errors , 0 -- a_debug ); IF a_debug = 1 THEN - SELECT * FROM parts.Shop_Calc_User_Temp WHERE GUID = v_guid; + SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = v_guid; END IF; UPDATE tmp_User t_U - INNER JOIN parts.Shop_Calc_User_Temp CUT + INNER JOIN parts.DOG_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 @@ -379,7 +526,7 @@ BEGIN END IF; -- Permissions - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT v_guid -- guid @@ -387,10 +534,10 @@ BEGIN , FALSE -- get_inactive_user , v_ids_permission_required -- ids_permission , v_id_access_level_view -- ids_access_level - , '' -- ids_product + , 0 -- a_show_errors , 0 -- a_debug ; - SELECT * FROM parts.Shop_Calc_User_Temp; + SELECT * FROM parts.DOG_Calc_User_Temp; END IF; CALL parts.p_dog_calc_user( @@ -399,37 +546,33 @@ BEGIN , FALSE -- get_inactive_user , v_ids_permission_required -- ids_permission , v_id_access_level_view -- ids_access_level - , '' -- ids_product + , 0 -- a_show_errors , 0 -- a_debug ); IF a_debug = 1 THEN - SELECT * FROM parts.Shop_Calc_User_Temp WHERE GUID = v_guid; + SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = v_guid; END IF; IF NOT EXISTS ( SELECT can_view - FROM parts.Shop_Calc_User_Temp CUT - WHERE 1=1 - AND CUT.GUID = v_guid + FROM parts.DOG_Calc_User_Temp CUT + WHERE + 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 + 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 parts.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 parts.Shop_Permission WHERE FIND_IN_SET(v_id_permission_user, id_permission) > 0)) - CONCAT('You do not have view permissions for ', (SELECT name FROM parts.Shop_Permission P INNER JOIN parts.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 + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('You do not have view permissions for ', (SELECT name FROM parts.DOG_Permission P INNER JOIN parts.DOG_Calc_User_Temp CUT ON P.id_permission = CUT.id_permission_required WHERE GUID = v_guid AND IFNULL(can_view, 0) = 0 LIMIT 1)) ) ; ELSE - -- INSERT INTO SET a_debug := a_debug; END IF; @@ -437,6 +580,14 @@ BEGIN END IF; + IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN + IF a_debug = 1 THEN + SELECT * FROM tmp_Dog_Calc_Dog; + END IF; + + DELETE FROM tmp_Dog_Calc_Dog; + END IF; + -- Returns /* NULL record required for flask sql_alchemy to detect result set */ IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN @@ -447,48 +598,45 @@ BEGIN SELECT - U.id_user + 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_dog , t_U.can_admin_user , v_is_new AS is_new FROM tmp_User t_U - INNER JOIN parts.Shop_User U ON t_U.id_user = U.id_user + INNER JOIN parts.DOG_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 parts.Shop_Msg_Error_Type MET - ON t_ME.id_type = MET.id_type + t_ERROR.id_error + , t_ERROR.id_type + , t_ERROR.code + , ERROR_TYPE.name + , ERROR_TYPE.description + , ERROR_TYPE.is_breaking_error + , ERROR_TYPE.background_colour + , ERROR_TYPE.text_colour + , t_ERROR.msg + FROM tmp_Msg_Error t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type ; - IF a_debug = 1 THEN SELECT * FROM tmp_User; END IF; -- Clean up - DROP TEMPORARY TABLE IF EXISTS tmp_User; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Auth0_Id; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; - - /* - DELETE FROM parts.Shop_Calc_User_Temp - WHERE GUID = v_guid; - */ + DROP TEMPORARY TABLE IF EXISTS tmp_User; IF a_debug = 1 THEN CALL parts.p_debug_timing_reporting ( v_time_start ); @@ -518,13 +666,12 @@ CALL p_dog_get_many_user ( , 'auth0|6582b95c895d09a70ba10fef' # a_ids_user_auth0 , 0 -- a_debug );*/ - /* -select * FROM parts.Shop_Calc_User_Temp; -delete FROM parts.Shop_Calc_User_Temp; +select * FROM parts.DOG_Calc_User_Temp; +delete FROM parts.DOG_Calc_User_Temp; SELECT * -FROM parts.Shop_USER; +FROM parts.DOG_USER; CALL p_dog_get_many_user( NULL -- :a_id_user, @@ -534,6 +681,12 @@ CALL p_dog_get_many_user( -- , 0 -- :a_get_first_user_only, , NULL -- :a_ids_user, , 'auth0|6582b95c895d09a70ba10fef' -- :a_ids_user_auth0 + , '' -- a_names_user + , 1 -- :a_require_all_id_search_filters_met, + , 1 -- :a_require_any_id_search_filters_met, + , 0 -- :a_require_all_non_id_search_filters_met, + , 1 -- :a_require_any_non_id_search_filters_met, + , 0 -- a_debug ); */ diff --git a/static/MySQL/70518_p_dog_save_user.sql b/static/MySQL/70518_p_dog_save_user.sql index ee8478c..96488a2 100644 --- a/static/MySQL/70518_p_dog_save_user.sql +++ b/static/MySQL/70518_p_dog_save_user.sql @@ -33,8 +33,8 @@ BEGIN 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 + , code VARCHAR(100) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( id_type @@ -81,8 +81,8 @@ BEGIN 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 + code VARCHAR(100) NOT NULL, + msg TEXT NOT NULL ); -- Get data from Temp table @@ -191,6 +191,29 @@ BEGIN , v_id_access_level_edit -- ID Access Level , NULL -- IDs Product ); + -- replace with below + IF a_debug = 1 THEN + SELECT + v_guid -- guid + , a_id_user -- ids_user + , FALSE -- get_inactive_user + , v_id_permission_dog_admin -- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ; + SELECT * FROM parts.DOG_Calc_User_Temp; + END IF; + + CALL parts.p_dog_calc_user( + v_guid -- guid + , a_id_user -- ids_user + , FALSE -- get_inactive_user + , v_id_permission_dog_admin -- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug + ); SET v_can_admin_user := ( SELECT IFNULL(UE_T.can_edit, 0) = 1 diff --git a/static/MySQL/70530_p_dog_calc_user.sql b/static/MySQL/70530_p_dog_calc_user.sql index ac1a5b8..a0a4321 100644 --- a/static/MySQL/70530_p_dog_calc_user.sql +++ b/static/MySQL/70530_p_dog_calc_user.sql @@ -1,142 +1,210 @@ -USE parts; - -DROP PROCEDURE IF EXISTS parts.p_dog_user_eval; -DROP PROCEDURE IF EXISTS parts.p_dog_calc_user; +-- Clear previous proc +DROP PROCEDURE IF EXISTS p_dog_user_eval; +DROP PROCEDURE IF EXISTS p_dog_calc_user; DELIMITER // -CREATE PROCEDURE parts.p_dog_calc_user ( +CREATE PROCEDURE p_dog_calc_user ( IN a_guid BINARY(36) , IN a_ids_user TEXT , IN a_get_inactive_user BIT - , IN a_ids_permission VARCHAR(4000) + , IN a_ids_permission TEXT + , IN a_ids_access_level TEXT + , IN a_show_errors BIT , IN a_debug BIT ) BEGIN + DECLARE v_code_type_error_bad_data VARCHAR(200); + DECLARE v_code_type_error_no_permission VARCHAR(200); DECLARE v_has_filter_permission BIT; DECLARE v_has_filter_user BIT; + DECLARE v_has_filter_access_level BIT; + DECLARE v_id_access_level INT; + DECLARE v_id_access_level_view INT; DECLARE v_id_permission INT; - DECLARE v_time_start TIMESTAMP(6); - DECLARE v_ids_row_delete VARCHAR(500); - DECLARE v_code_type_error_bad_data VARCHAR(250); - DECLARE v_id_type_error_bad_data INT; - DECLARE v_code_type_error_no_permission VARCHAR(250); DECLARE v_id_permission_required INT; - DECLARE v_priority_access_level_required INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_ids_row_delete VARCHAR(500); DECLARE v_priority_access_level_view INT; + DECLARE v_priority_access_level_edit INT; + DECLARE v_priority_access_level_admin INT; + DECLARE v_priority_access_level INT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_User ( + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(100) NOT NULL + , msg TEXT NOT NULL + ); + + INSERT INTO tmp_Msg_Error_Calc_User ( + 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_Calc_User 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_Calc_User; + END; SET v_time_start := CURRENT_TIMESTAMP(6); - SET v_code_type_error_bad_data := (SELECT code FROM parts.CORE_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_code_type_error_bad_data := 'BAD_DATA'; SET v_id_type_error_bad_data := (SELECT id_type FROM parts.CORE_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); - SET v_code_type_error_no_permission := (SELECT code FROM parts.CORE_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); - SET v_priority_access_level_view := (SELECT priority FROM parts.DOG_Access_Level WHERE code = 'VIEW' LIMIT 1); - CALL parts.p_core_validate_guid ( a_guid ); + SET v_code_type_error_no_permission := (SELECT code FROM parts.CORE_Msg_Error_Type WHERE id_type = 2); + + CALL parts.p_validate_guid ( a_guid ); SET a_ids_user := TRIM(IFNULL(a_ids_user, '')); SET a_get_inactive_user := IFNULL(a_get_inactive_user, 0); SET a_ids_permission := TRIM(IFNULL(a_ids_permission, '')); + SET a_ids_access_level := TRIM(IFNULL(a_ids_access_level, '')); + SET a_show_errors := IFNULL(a_show_errors, 0); SET a_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN - SELECT 'Arguments'; SELECT a_guid , a_ids_user , a_get_inactive_user , a_ids_permission + , a_ids_access_level + , a_show_errors , a_debug ; - SELECT 'Derived variables'; - SELECT - v_code_type_error_bad_data - , v_code_type_error_no_permission - , v_id_type_error_bad_data - , v_priority_access_level_view - , v_time_start - ; END IF; - DROP TABLE IF EXISTS tmp_Calc_User; - DROP TABLE IF EXISTS tmp_User_Calc_User; + -- Clear previous proc results DROP TABLE IF EXISTS tmp_Split_Calc_User; + DROP TABLE IF EXISTS tmp_Msg_Error_Calc_User; + DROP TABLE IF EXISTS tmp_User_Calc_User; + DROP TABLE IF EXISTS tmp_Calc_User; + -- Permanent Table CREATE TEMPORARY TABLE tmp_Calc_User ( id_row INT PRIMARY KEY AUTO_INCREMENT NOT NULL - , id_user INT NULL + , id_user INT , id_permission_required INT NOT NULL , priority_access_level_required INT NOT NULL - , is_super_user BIT NULL - , priority_access_level_user INT NULL - , has_access BIT + , is_super_user BIT + , priority_access_level_user INT + , can_view BIT + , can_edit BIT + , can_admin BIT ); CREATE TEMPORARY TABLE tmp_User_Calc_User ( - id_user INT NOT NULL + id_user INT NOT NULL , is_super_user BIT NOT NULL - -- , id_access_level INT , priority_access_level INT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_User ( - display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Calc_User ( - substring VARCHAR(4000) NOT NULL + substring VARCHAR(4000) NOT NULL , as_int INT NULL ); DELETE FROM tmp_Split_Calc_User; - - SET v_has_filter_user = CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END; - SET a_ids_permission = REPLACE(a_ids_permission, '|', ','); - SET v_has_filter_permission = CASE WHEN a_ids_permission = '' THEN 0 ELSE 1 END; - -- SET v_id_access_level_view = (SELECT id_access_level FROM parts.DOG_Access_Level WHERE code = 'VIEW' LIMIT 1); - - - -- Permission IDs - IF NOT v_has_filter_permission THEN - INSERT INTO tmp_Msg_Error_Calc_User ( - id_type - , code - , msg - ) - SELECT - v_id_type_error_bad_data - , v_code_type_error_bad_data - , 'Permission ID required.' - ; - ELSE - CALL parts.p_core_split(a_guid, a_ids_permission, ',', a_debug); + SET v_has_filter_user = CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END; + SET v_has_filter_permission = CASE WHEN a_ids_permission = '' THEN 0 ELSE 1 END; + SET v_has_filter_access_level = CASE WHEN a_ids_access_level = '' THEN 0 ELSE 1 END; + SET v_id_access_level_view = (SELECT id_access_level FROM parts.DOG_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_priority_access_level_view = (SELECT priority FROM parts.DOG_Access_Level WHERE id_access_level = v_id_access_level_view); + SET v_priority_access_level_edit = (SELECT priority FROM parts.DOG_Access_Level WHERE code = 'EDIT' LIMIT 1); + SET v_priority_access_level_admin = (SELECT priority FROM parts.DOG_Access_Level WHERE code = 'ADMIN' LIMIT 1); + + IF a_debug = 1 THEN + SELECT + v_priority_access_level_view + , v_priority_access_level_edit + , v_priority_access_level_admin + ; + END IF; + + # Access levels + IF v_has_filter_access_level = 1 THEN + IF a_debug = 1 THEN + SELECT + 'p_core_split' + , a_guid + , a_ids_access_level + , ',' + , a_debug + ; + END IF; + + CALL parts.p_core_clear_split( a_guid ); + CALL parts.p_core_split(a_guid, a_ids_access_level, ',', a_debug); + + DELETE FROM tmp_Split_Calc_User; INSERT INTO tmp_Split_Calc_User ( substring , as_int ) SELECT - substring - , CONVERT(substring, DECIMAL(10,0)) AS as_int - FROM parts.CORE_Split_Temp - WHERE - GUID = a_guid - AND NOT ISNULL(substring) - AND substring != '' + SPLIT_T.substring + , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) -- AS as_int + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') != '' ; + + IF a_debug = 1 THEN + SELECT 'Access Levels split', a_ids_access_level; + SELECT * + FROM tmp_Split_Calc_User; + END IF; CALL parts.p_core_clear_split( a_guid ); - -- Invalid or inactive + # Invalid IDs IF EXISTS ( - SELECT PERM.id_permission - FROM tmp_Split_Calc_User t_S - LEFT JOIN parts.DOG_Permission PERM ON t_S.as_int = PERM.id_permission - WHERE - ISNULL(t_S.as_int) - OR ISNULL(PERM.id_permission) - OR PERM.active = 0 - ) THEN + SELECT t_SPLIT.substring + FROM tmp_Split_Calc_User t_SPLIT + LEFT JOIN parts.DOG_Access_Level ACCESS_LEVEL ON t_SPLIT.as_int = ACCESS_LEVEL.id_access_level + WHERE + ISNULL(t_SPLIT.as_int) + OR ISNULL(ACCESS_LEVEL.id_access_level) + OR ACCESS_LEVEL.active = 0 + ) THEN INSERT INTO tmp_Msg_Error_Calc_User ( id_type , code @@ -145,69 +213,141 @@ BEGIN SELECT v_id_type_error_bad_data , v_code_type_error_bad_data - , CONCAT('Invalid or inactive permission IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) - FROM tmp_Split_Calc_User t_S - LEFT JOIN parts.DOG_Permission PERM ON t_S.as_int = PERM.id_permission + , CONCAT('Invalid or inactive access level IDs: ', GROUP_CONCAT(t_SPLIT.substring SEPARATOR ',')) + FROM tmp_Split_Calc_User t_SPLIT + LEFT JOIN parts.DOG_Access_Level ACCESS_LEVEL ON t_SPLIT.as_int = ACCESS_LEVEL.id_access_level WHERE - ISNULL(t_S.as_int) - OR ISNULL(PERM.id_permission) - OR PERM.active = 0 + ISNULL(t_SPLIT.as_int) + OR ISNULL(ACCESS_LEVEL.id_access_level) + OR ACCESS_LEVEL.active = 0 + ; + + SET v_has_filter_access_level = 0; + ELSE + SET v_id_access_level := ( + SELECT ACCESS_LEVEL.id_access_level + FROM tmp_Split_Calc_User t_SPLIT + INNER JOIN parts.DOG_Access_Level ACCESS_LEVEL + ON t_SPLIT.as_int = ACCESS_LEVEL.id_access_level + AND ACCESS_LEVEL.active = 1 + ORDER BY ACCESS_LEVEL.priority ASC + LIMIT 1 + ); + END IF; + END IF; + DELETE FROM tmp_Split_Calc_User; + + IF ISNULL(v_id_access_level) THEN + SET v_id_access_level = v_id_access_level_view; + END IF; + + SET v_priority_access_level := (SELECT priority FROM parts.DOG_Access_Level WHERE id_access_level = v_id_access_level LIMIT 1); + + -- Permission IDs + IF v_has_filter_permission = 1 THEN + CALL parts.p_core_clear_split( a_guid ); + CALL parts.p_core_split(a_guid, a_ids_permission, ',', a_debug); + + DELETE FROM tmp_Split_Calc_User; + INSERT INTO tmp_Split_Calc_User ( + 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 + GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') != '' + ; + + IF a_debug = 1 THEN + SELECT 'Permissions split', a_ids_permission; + SELECT * + FROM tmp_Split_Calc_User; + END IF; + + CALL parts.p_core_clear_split( a_guid ); + + # Invalid or inactive + IF EXISTS (SELECT PERMISSION.id_permission FROM tmp_Split_Calc_User t_SPLIT LEFT JOIN parts.DOG_Permission PERMISSION ON t_SPLIT.as_int = PERMISSION.id_permission WHERE ISNULL(t_SPLIT.as_int) OR ISNULL(PERMISSION.id_permission) OR PERMISSION.active = 0) THEN + INSERT INTO tmp_Msg_Error_Calc_User ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('Invalid or inactive permission IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ','), 'NULL')) + FROM tmp_Split_Calc_User t_SPLIT + LEFT JOIN parts.DOG_Permission PERMISSION ON t_SPLIT.as_int = PERMISSION.id_permission + WHERE + ISNULL(t_SPLIT.as_int) + OR ISNULL(PERMISSION.id_permission) + OR PERMISSION.active = 0 ; ELSE - SELECT - PERM.id_permission - , PERM.id_access_level_required - INTO - v_id_permission_required - , v_priority_access_level_required - FROM tmp_Split_Calc_User t_S - LEFT JOIN parts.DOG_Permission PERM ON t_S.as_int = PERM.id_permission - INNER JOIN parts.DOG_Access_Level AL ON PERM.id_access_level_required = AL.id_access_level - ORDER BY AL.priority ASC - LIMIT 1 - ; - - IF ISNULL(v_id_permission_required) THEN - INSERT INTO tmp_Msg_Error_Calc_User ( - id_type - , code - , msg - ) - SELECT - v_id_type_error_bad_data - , v_code_type_error_bad_data - , 'Valid Permission ID required.' - ; - END IF; + SET v_id_permission_required := ( + SELECT PERMISSION.id_permission + FROM tmp_Split_Calc_User t_SPLIT + INNER JOIN parts.DOG_Permission PERMISSION ON t_SPLIT.as_int = PERMISSION.id_permission + INNER JOIN parts.DOG_Access_Level ACCESS_LEVEL ON PERMISSION.id_access_level_required = ACCESS_LEVEL.id_access_level + ORDER BY ACCESS_LEVEL.priority ASC + LIMIT 1 + ); END IF; END IF; DELETE FROM tmp_Split_Calc_User; - IF a_debug = 1 THEN - SELECT v_id_permission_required; - END IF; - - -- Users + # Users + CALL parts.p_core_clear_split( a_guid ); CALL parts.p_core_split(a_guid, a_ids_user, ',', a_debug); + DELETE FROM tmp_Split_Calc_User; INSERT INTO tmp_Split_Calc_User ( substring , as_int ) SELECT - substring + substring , CONVERT(substring, DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp - WHERE - GUID = a_guid + WHERE + GUID = a_guid AND NOT ISNULL(substring) AND substring != '' ; + + IF a_debug = 1 THEN + SELECT 'Users split', a_ids_user; + SELECT * + FROM tmp_Split_Calc_User; + END IF; CALL parts.p_core_clear_split( a_guid ); + + IF a_debug = 1 THEN + SELECT v_id_permission_required, v_id_access_level, v_priority_access_level; + SELECT * FROM tmp_User_Calc_User; + SELECT * FROM tmp_Msg_Error_Calc_User; + END IF; - -- Invalid or inactive - IF EXISTS (SELECT U.id_user FROM tmp_Split_Calc_User t_S LEFT JOIN parts.DOG_User U ON t_S.as_int = U.id_user WHERE ISNULL(t_S.as_int) OR ISNULL(U.id_user) OR (a_get_inactive_user = 0 AND U.active = 0)) THEN + # Invalid or inactive + IF EXISTS ( + SELECT USER.id_user + FROM tmp_Split_Calc_User t_SPLIT + LEFT JOIN parts.DOG_User USER ON t_SPLIT.as_int = USER.id_user + WHERE + ISNULL(t_SPLIT.as_int) + OR ISNULL(USER.id_user) + OR ( + a_get_inactive_user = 0 + AND USER.active = 0 + ) + ) + THEN INSERT INTO tmp_Msg_Error_Calc_User ( id_type , code @@ -216,88 +356,72 @@ BEGIN SELECT v_id_type_error_bad_data , v_code_type_error_bad_data - , CONCAT('Invalid or inactive user IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) - FROM tmp_Split_Calc_User t_S - LEFT JOIN parts.DOG_User U ON t_S.as_int = U.id_user + , CONCAT('Invalid or inactive user IDs: ', IFNULL(GROUP_CONCAT(t_SPLIT.substring SEPARATOR ','), 'NULL')) + FROM tmp_Split_Calc_User t_SPLIT + LEFT JOIN parts.DOG_User USER ON t_SPLIT.as_int = USER.id_user WHERE - ISNULL(t_S.as_int) - OR ISNULL(U.id_user) + ISNULL(t_SPLIT.as_int) + OR ISNULL(USER.id_user) OR ( a_get_inactive_user = 0 - AND U.active = 0 + AND USER.active = 0 ) ; ELSE IF NOT EXISTS (SELECT * FROM tmp_Split_Calc_User) THEN - INSERT INTO tmp_Split_Calc_User (substring, as_int) + INSERT INTO tmp_Split_Calc_User ( substring, as_int ) VALUES ( '', NULL ); END IF; - IF a_debug = 1 THEN - SELECT * - FROM tmp_Split_Calc_User; - END IF; - INSERT INTO tmp_User_Calc_User ( id_user , is_super_user , priority_access_level ) SELECT - U.id_user - , IFNULL(U.is_super_user, 0) AS is_super_user - , IFNULL(MIN(AL_U.priority), v_priority_access_level_view) AS priority_access_level - FROM tmp_Split_Calc_User t_S - INNER JOIN parts.DOG_User U ON t_S.as_int = U.id_user - LEFT JOIN parts.DOG_User_Role_Link URL - ON U.id_user = URL.id_user - AND URL.active - LEFT JOIN parts.DOG_Role_Permission_Link RPL - ON URL.id_role = RPL.id_role - AND RPL.active - LEFT JOIN parts.DOG_Access_Level AL_U - ON RPL.id_access_level = AL_U.id_access_level - AND AL_U.active - GROUP BY U.id_user + USER.id_user + , IFNULL(USER.is_super_user, 0) AS is_super_user + , IFNULL(MIN(ACCESS_LEVEL.priority), v_priority_access_level_view) AS priority_access_level + FROM tmp_Split_Calc_User t_SPLIT + INNER JOIN parts.DOG_User USER ON t_SPLIT.as_int = USER.id_user + LEFT JOIN parts.DOG_User_Role_Link USER_ROLE_LINK + ON USER.id_user = USER_ROLE_LINK.id_user + AND USER_ROLE_LINK.active + LEFT JOIN parts.DOG_Role_Permission_Link ROLE_PERMISSION_LINK + ON USER_ROLE_LINK.id_role = ROLE_PERMISSION_LINK.id_role + AND ROLE_PERMISSION_LINK.active + LEFT JOIN parts.DOG_Access_Level ACCESS_LEVEL + ON ROLE_PERMISSION_LINK.id_access_level = ACCESS_LEVEL.id_access_level + AND ACCESS_LEVEL.active + GROUP BY USER.id_user ; - - IF a_debug = 1 THEN - SELECT - t_UCU.id_user - , v_id_permission_required - , v_priority_access_level_required - , t_UCU.priority_access_level AS priority_access_level_user - , t_UCU.is_super_user AS is_super_user - FROM tmp_User_Calc_User t_UCU - ; - END IF; INSERT INTO tmp_Calc_User ( id_user , id_permission_required , priority_access_level_required , priority_access_level_user - , is_super_user + , is_super_user ) SELECT - t_UCU.id_user + t_USER.id_user , v_id_permission_required - , v_priority_access_level_required - , t_UCU.priority_access_level AS priority_access_level_user - , t_UCU.is_super_user AS is_super_user - FROM tmp_User_Calc_User t_UCU + , v_priority_access_level AS priority_access_level_required + , t_USER.is_super_user AS is_super_user + , t_USER.priority_access_level AS priority_access_level_user + FROM tmp_User_Calc_User t_USER ; + + # SET v_has_filter_user = EXISTS ( SELECT * FROM tmp_User_Calc_User LIMIT 1 ); END IF; DELETE FROM tmp_Split_Calc_User; - -- Calculated fields - UPDATE tmp_Calc_User t_CU + UPDATE tmp_Calc_User t_CALC_USER SET - t_CU.has_access = ( - (t_CU.is_super_user = 1) - OR (t_CU.priority_access_level_user <= t_CU.priority_access_level_required) - ) + t_CALC_USER.can_view = t_CALC_USER.is_super_user = 1 OR (t_CALC_USER.priority_access_level_user <= v_priority_access_level_view AND t_CALC_USER.priority_access_level_user <= t_CALC_USER.priority_access_level_required) + , t_CALC_USER.can_edit = t_CALC_USER.is_super_user = 1 OR (t_CALC_USER.priority_access_level_user <= v_priority_access_level_edit AND t_CALC_USER.priority_access_level_user <= t_CALC_USER.priority_access_level_required) + , t_CALC_USER.can_admin = t_CALC_USER.is_super_user = 1 OR (t_CALC_USER.priority_access_level_user <= v_priority_access_level_admin AND t_CALC_USER.priority_access_level_user <= t_CALC_USER.priority_access_level_required) ; -- Export data to staging table @@ -308,23 +432,46 @@ BEGIN , id_user , id_permission_required , priority_access_level_required - , priority_access_level_user , is_super_user - , has_access + , priority_access_level_user + , has_access + , can_view + , can_edit + , can_admin ) SELECT a_guid - , t_CU.id_user - , t_CU.id_permission_required - , t_CU.priority_access_level_required - , t_CU.priority_access_level_user - , t_CU.is_super_user - , t_CU.has_access - FROM tmp_Calc_User t_CU + , t_CALC_USER.id_user + , t_CALC_USER.id_permission_required + , t_CALC_USER.priority_access_level_required + , t_CALC_USER.is_super_user + , t_CALC_USER.priority_access_level_user + , CASE WHEN t_CALC_USER.priority_access_level_user <= t_CALC_USER.priority_access_level_required THEN 1 ELSE 0 END AS has_access + , t_CALC_USER.can_view + , t_CALC_USER.can_edit + , t_CALC_USER.can_admin + FROM tmp_Calc_User t_CALC_USER ; COMMIT; END IF; + -- Errors + IF a_show_errors = 1 THEN + 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_Calc_User t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + END IF; + IF a_debug = 1 THEN SELECT * FROM tmp_Msg_Error_Calc_User; SELECT * FROM tmp_Calc_User; @@ -334,9 +481,10 @@ BEGIN END IF; -- Clean up - DROP TABLE IF EXISTS tmp_Calc_User; + DROP TABLE IF EXISTS tmp_Split_Calc_User; + DROP TABLE IF EXISTS tmp_Msg_Error_Calc_User; DROP TABLE IF EXISTS tmp_User_Calc_User; - DELETE FROM tmp_Split_Calc_User; + DROP TABLE IF EXISTS tmp_Calc_User; IF a_debug = 1 THEN CALL parts.p_debug_timing_reporting( v_time_start ); @@ -348,29 +496,45 @@ DELIMITER ; CALL parts.p_dog_calc_user ( 'chips ' -- a_guid - , 1 -- a_ids_user - , 0 -- a_get_inactive_user - , '2' -- a_ids_permission - , '1' -- a_ids_access_level - , 0 -- a_debug + , 1 -- a_ids_user + , 0 -- a_get_inactive_user + , '2' -- a_ids_permission + , '1' -- a_ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug ); CALL parts.p_dog_calc_user ( 'chips ' -- a_guid - , 1 -- a_ids_user - , 0 -- a_get_inactive_user - , '2' -- a_ids_permission - , '1' -- a_ids_access_level - , 0 -- a_debug + , 1 -- a_ids_user + , 0 -- a_get_inactive_user + , '2' -- a_ids_permission + , '1' -- a_ids_access_level + , 0 -- a_show_errors + , 0 -- a_debug ); +SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = 'chips '; +DELETE FROM parts.DOG_Calc_User_Temp WHERE GUID = 'chips '; + +*/ + + +-- SELECT * FROM parts.DOG_Calc_User_Temp; +SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = 'chips '; +CALL parts.p_dog_clear_calc_user ( 'chips ', 0 ); +-- SELECT * FROM parts.DOG_Calc_User_Temp; +DROP TABLE IF EXISTS tmp_Msg_Error_Calc_User; + +CALL parts.p_dog_calc_user( + 'chips '-- a_guid + , '1' -- a_ids_user + , 0 -- a_get_inactive_user + , '8' -- a_ids_permission + , '1' -- a_ids_access_level + , 1 -- a_show_errors + , 0 -- a_debug +); +SELECT * FROM parts.DOG_Calc_User_Temp WHERE GUID = 'chips '; +CALL parts.p_dog_clear_calc_user ( 'chips ', 0 ); +DROP TABLE IF EXISTS tmp_Msg_Error_Calc_User; -DELETE FROM demo.DOG_Calc_User_Temp; -CALL demo.p_dog_calc_user ( - 'chips ' -- a_guid - , 1 -- a_ids_user - , 0 -- a_get_inactive_user - , '7' -- a_ids_permission - , 0 -- a_debug -); -SELECT * FROM demo.DOG_Calc_User_Temp; -*/ \ No newline at end of file diff --git a/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql b/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql index a15a3c0..edd4bd2 100644 --- a/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql +++ b/static/MySQL/70700_p_DOG_get_many_unit_measurement.sql @@ -39,5 +39,5 @@ CALL p_dog_get_many_unit_measurement ( ); select * -from dog_unit_measurement +from parts.dog_unit_measurement */ diff --git a/static/MySQL/71001_p_dog_calc_dog.sql b/static/MySQL/71001_p_dog_calc_dog.sql index 64fdb8d..77bdb19 100644 --- a/static/MySQL/71001_p_dog_calc_dog.sql +++ b/static/MySQL/71001_p_dog_calc_dog.sql @@ -11,6 +11,10 @@ CREATE PROCEDURE parts.p_dog_calc_dog ( , IN a_get_inactive_dog BIT , IN a_ids_dog TEXT , IN a_names_dog TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_show_errors BIT , IN a_debug BIT ) @@ -20,6 +24,7 @@ BEGIN DECLARE v_code_type_error_no_permission VARCHAR(100); DECLARE v_has_filter_dog_id BIT; DECLARE v_has_filter_dog_name BIT; + DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_view INT; DECLARE v_id_type_error_bad_data INT; @@ -40,7 +45,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error_Calc_Dog ( @@ -79,7 +84,7 @@ BEGIN 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); CALL parts.p_core_validate_guid ( a_guid ); @@ -88,6 +93,10 @@ BEGIN 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_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); SET a_show_errors := IFNULL(a_show_errors, 0); SET a_debug := IFNULL(a_debug, 0); @@ -99,6 +108,10 @@ BEGIN , a_get_inactive_dog , a_ids_dog , a_names_dog + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met , a_show_errors , a_debug ; @@ -118,13 +131,15 @@ BEGIN CREATE TEMPORARY TABLE tmp_Dog_Calc_Dog ( id_dog INT NOT NULL + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Dog ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id_Calc_Dog ( @@ -145,6 +160,23 @@ BEGIN -- Dogs IF v_has_filter_dog_id = 1 THEN CALL parts.p_core_split(a_guid, a_ids_dog, ',', a_debug); + + SET sql_mode = ''; + + IF a_debug = 1 THEN + SELECT * + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + SELECT COUNT(*) AS count_split_ids + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + END IF; INSERT INTO tmp_Split_Id_Calc_Dog ( substring @@ -152,7 +184,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = a_guid @@ -164,6 +196,23 @@ BEGIN IF v_has_filter_dog_name = 1 THEN CALL parts.p_core_split(a_guid, a_names_dog, ',', a_debug); + + SET sql_mode = ''; + + IF a_debug = 1 THEN + SELECT * + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + SELECT COUNT(*) AS count_split_names + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + END IF; INSERT INTO tmp_Split_Name_Calc_Dog ( substring @@ -171,7 +220,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = a_guid @@ -180,6 +229,15 @@ BEGIN CALL parts.p_core_clear_split( a_guid ); END IF; + + IF a_debug = 1 THEN + SELECT * + FROM tmp_Split_Id_Calc_Dog + ; + SELECT * + FROM tmp_Split_Name_Calc_Dog + ; + END IF; IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Dog 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 ( @@ -214,78 +272,70 @@ BEGIN ) ; /* 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_Calc_Dog ( - 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 - ) - ; + ELSEIF EXISTS () */ ELSE INSERT INTO tmp_Dog_Calc_Dog ( id_dog + , does_meet_id_filters + , does_meet_non_id_filters ) WITH Dog_Id_Filter AS ( SELECT DOG.id_dog FROM tmp_Split_Id_Calc_Dog t_SPLIT_ID - RIGHT JOIN parts.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog - WHERE t_SPLIT_ID.as_int IS NOT NULL + INNER JOIN parts.DOG_Dog DOG ON t_SPLIT_ID.as_int = DOG.id_dog ) , Dog_Name_Filter AS ( SELECT DOG.id_dog FROM tmp_Split_Name_Calc_Dog t_SPLIT_NAME - RIGHT JOIN parts.DOG_Dog DOG ON DOG.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') - WHERE - t_SPLIT_NAME.substring IS NOT NULL - AND t_SPLIT_NAME.substring <> '' + INNER JOIN parts.DOG_Dog DOG ON DOG.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') + WHERE IFNULL(t_SPLIT_NAME.substring, '') <> '' ) , Dog_Filters AS ( - SELECT DISTINCT DOG_COMBINED.id_dog + SELECT + DOG_COMBINED.id_dog + , MAX(DOG_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(DOG_COMBINED.does_meet_name_filter) AS does_meet_name_filter FROM ( - SELECT DOG_ID_FILTER.id_dog FROM Dog_Id_Filter DOG_ID_FILTER + SELECT + DOG_ID_FILTER.id_dog + , 1 AS does_meet_id_filter + , 0 AS does_meet_name_filter + FROM Dog_Id_Filter DOG_ID_FILTER UNION - SELECT DOG_NAME_FILTER.id_dog FROM Dog_Name_Filter DOG_NAME_FILTER + SELECT + DOG_NAME_FILTER.id_dog + , 0 AS does_meet_id_filter + , 1 AS does_meet_name_filter + FROM Dog_Name_Filter DOG_NAME_FILTER ) DOG_COMBINED + GROUP BY DOG_COMBINED.id_dog ) SELECT DOG.id_dog + , CASE WHEN + v_has_filter_dog_id = 0 + OR IFNULL(DOG_FILTERS.does_meet_id_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_dog_name = 0 + ) + OR IFNULL(DOG_FILTERS.does_meet_name_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters FROM parts.DOG_Dog DOG LEFT JOIN Dog_Filters DOG_FILTERS ON DOG.id_dog = DOG_FILTERS.id_dog WHERE ( a_get_all_dog = 1 + OR ( + v_has_filter_dog_id = 1 + AND DOG_FILTERS.does_meet_id_filter = 1 + ) OR ( - ( - v_has_filter_dog_id = 1 - OR v_has_filter_dog_name = 1 - ) - AND DOG_FILTERS.id_dog IS NOT NULL + v_has_filter_dog_name = 1 + AND DOG_FILTERS.does_meet_name_filter = 1 ) ) AND ( @@ -299,23 +349,50 @@ BEGIN DELETE FROM tmp_Split_Id_Calc_Dog; DELETE FROM tmp_Split_Name_Calc_Dog; + -- Filter records + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Dog 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 + DELETE t_DOG + FROM tmp_Dog_Calc_Dog t_DOG + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND t_DOG.does_meet_id_filters = 0 + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND t_DOG.does_meet_non_id_filters = 0 + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND t_DOG.does_meet_id_filters = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND t_DOG.does_meet_non_id_filters = 0 + ) + ; + END IF; -- Permissions IF a_debug = 1 THEN SELECT - a_guid - , a_id_user + a_guid -- a_guid + , a_id_user -- a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ; END IF; CALL parts.p_dog_calc_user( - a_guid - , a_id_user + a_guid -- a_guid + , a_id_user -- a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); @@ -345,7 +422,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - , 'You do not have permission to view Commands.' + , 'You do not have permission to view Dog.' ) ; END IF; @@ -364,7 +441,7 @@ BEGIN END IF; -- Outputs - -- Commands + -- Dogs INSERT INTO parts.DOG_Dog_Temp ( guid , id_dog @@ -373,6 +450,9 @@ BEGIN , mass_kg , notes , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT a_guid @@ -382,24 +462,29 @@ BEGIN , DOG.mass_kg , DOG.notes , DOG.active + + , t_DOG.does_meet_id_filters + , t_DOG.does_meet_non_id_filters FROM parts.DOG_Dog DOG INNER JOIN tmp_Dog_Calc_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_Calc_Dog t_ERROR - INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type - ; + IF a_show_errors = 1 THEN + 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_Calc_Dog t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + END IF; IF a_debug = 1 AND v_can_view = 1 THEN SELECT * FROM tmp_Dog_Calc_Dog; @@ -427,10 +512,30 @@ CALL parts.p_dog_calc_dog ( , 0 -- a_get_inactive_dog , '' -- a_ids_dog , '' -- a_names_dog + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met , 1 -- a_show_errors , 1 -- a_debug ); + +CALL parts.p_dog_calc_dog ( + 'slips ' -- a_guid + , 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_dog + , 0 -- a_get_inactive_dog + , '' -- a_ids_dog + , 'pat' -- a_names_dog + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug +); + SELECT * FROM parts.DOG_Dog_Temp ; diff --git a/static/MySQL/71001_p_dog_get_many_dog.sql b/static/MySQL/71001_p_dog_get_many_dog.sql index 133920e..9a869b3 100644 --- a/static/MySQL/71001_p_dog_get_many_dog.sql +++ b/static/MySQL/71001_p_dog_get_many_dog.sql @@ -10,6 +10,10 @@ CREATE PROCEDURE parts.p_dog_get_many_dog ( , IN a_get_inactive_dog BIT , IN a_ids_dog TEXT , IN a_names_dog TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_debug BIT ) BEGIN @@ -17,8 +21,7 @@ BEGIN DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); DECLARE v_guid BINARY(36); - DECLARE v_has_filter_dog_id BIT; - DECLARE v_has_filter_dog_name BIT; + DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_view INT; DECLARE v_id_type_error_bad_data INT; @@ -39,7 +42,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -79,12 +82,19 @@ BEGIN 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); SET a_id_user := IFNULL(a_id_user, 0); + /* SET a_get_all_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_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); + */ SET a_debug := IFNULL(a_debug, 0); IF a_debug = 1 THEN @@ -94,6 +104,10 @@ BEGIN , a_get_inactive_dog , a_ids_dog , a_names_dog + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met , a_debug ; @@ -116,34 +130,41 @@ BEGIN , mass_kg DECIMAL(7, 3) , notes TEXT , active BIT + + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); 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 + , msg TEXT NOT NULL ); -- Permissions IF a_debug = 1 THEN SELECT - v_guid - , a_id_user + v_guid -- guid + , a_id_user -- ids_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view - , 0 -- a_debug + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug ; END IF; CALL parts.p_dog_calc_user( - v_guid - , a_id_user + v_guid-- guid + , a_id_user -- ids_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view - , 0 -- a_debug + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors + , a_debug -- a_debug ); - + SELECT IFNULL(CALC_USER_T.has_access, 0) INTO @@ -193,6 +214,10 @@ BEGIN , a_get_inactive_dog -- a_get_inactive_dog , a_ids_dog -- a_ids_dog , a_names_dog -- a_names_dog + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ; @@ -205,6 +230,10 @@ BEGIN , a_get_inactive_dog -- a_get_inactive_dog , a_ids_dog -- a_ids_dog , a_names_dog -- a_names_dog + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ); @@ -216,6 +245,9 @@ BEGIN , mass_kg , notes , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT DOG_T.id_dog @@ -224,6 +256,9 @@ BEGIN , DOG_T.mass_kg , DOG_T.notes , DOG_T.active + + , DOG_T.does_meet_id_filters + , DOG_T.does_meet_non_id_filters FROM parts.DOG_Dog_Temp DOG_T WHERE DOG_T.GUID = v_guid ; @@ -251,6 +286,9 @@ BEGIN , DOG_T.mass_kg , DOG_T.notes , DOG_T.active + + , DOG_T.does_meet_id_filters + , DOG_T.does_meet_non_id_filters FROM parts.DOG_Dog_Temp DOG_T ; @@ -296,6 +334,23 @@ CALL parts.p_dog_get_many_dog ( , 0 -- a_get_inactive_dog , '' -- a_ids_dog , '' -- a_names_dog + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 1 -- a_debug +); + +CALL demo.p_dog_get_many_dog ( + 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_dog + , 0 -- a_get_inactive_dog + , '' -- a_ids_dog + , 'pat' -- a_names_dog + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met , 1 -- a_debug ); diff --git a/static/MySQL/71003_p_dog_save_command.sql b/static/MySQL/71003_p_dog_save_command.sql index b2fb104..312cf5f 100644 --- a/static/MySQL/71003_p_dog_save_command.sql +++ b/static/MySQL/71003_p_dog_save_command.sql @@ -11,14 +11,16 @@ CREATE PROCEDURE parts.p_dog_save_command ( 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_dog_admin INT; - DECLARE v_id_permission_dog_new INT; - DECLARE v_id_change_set INT; - DECLARE v_time_start TIMESTAMP(6); DECLARE v_can_admin BIT; DECLARE v_can_create BIT; + DECLARE v_code_type_error_bad_data VARCHAR(100); + DECLARE v_id_access_level_admin INT; + DECLARE v_id_access_level_create INT; + DECLARE v_id_change_set INT; + DECLARE v_id_permission_dog_admin INT; + DECLARE v_id_permission_dog_new INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_time_start TIMESTAMP(6); DECLARE exit handler for SQLEXCEPTION BEGIN @@ -34,7 +36,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -72,6 +74,7 @@ BEGIN SET v_id_type_error_bad_data := (SELECT ERROR_TYPE.id_type FROM parts.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_bad_data LIMIT 1); SET v_id_permission_dog_admin := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_ADMIN' LIMIT 1); SET v_id_permission_dog_new := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_CREATE' LIMIT 1); + SET v_id_access_level_admin := (SELECT PERMISSION.id_permission FROM parts.DOG_Permission PERMISSION WHERE PERMISSION.code = 'DOG_CREATE' LIMIT 1); CALL parts.p_core_validate_guid ( a_guid ); @@ -95,7 +98,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); @@ -219,11 +222,14 @@ BEGIN ; END IF; + -- Can Admin CALL parts.p_dog_calc_user( a_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_admin + , v_id_permission_dog_admin-- ids_permission + , v_id_access_level_admin -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); @@ -241,11 +247,14 @@ BEGIN , 0 -- a_debug ); + -- Can Create CALL parts.p_dog_calc_user( a_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_new + , v_id_permission_dog_new-- ids_permission + , v_id_access_level_create -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); diff --git a/static/MySQL/71104_p_dog_calc_command.sql b/static/MySQL/71104_p_dog_calc_command.sql index 3a1e0b0..d4351c2 100644 --- a/static/MySQL/71104_p_dog_calc_command.sql +++ b/static/MySQL/71104_p_dog_calc_command.sql @@ -15,6 +15,12 @@ CREATE PROCEDURE parts.p_dog_calc_command ( , IN a_get_inactive_command BIT , IN a_ids_command TEXT , IN a_names_command TEXT + , IN a_hand_signal_default_descriptions_command TEXT + , IN a_notes_command TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_show_errors BIT , IN a_debug BIT ) @@ -22,10 +28,13 @@ BEGIN DECLARE v_can_view BIT; DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); - DECLARE v_has_filter_command_id BIT; - DECLARE v_has_filter_command_name BIT; DECLARE v_has_filter_command_category_id BIT; DECLARE v_has_filter_command_category_name BIT; + DECLARE v_has_filter_command_hand_signal_default_description BIT; + DECLARE v_has_filter_command_id BIT; + DECLARE v_has_filter_command_name BIT; + DECLARE v_has_filter_command_notes BIT; + DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_view INT; DECLARE v_id_type_error_bad_data INT; @@ -46,7 +55,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error_Calc_Command ( @@ -85,6 +94,7 @@ BEGIN 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); CALL parts.p_core_validate_guid ( a_guid ); @@ -98,6 +108,12 @@ BEGIN 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_hand_signal_default_descriptions_command := TRIM(IFNULL(a_hand_signal_default_descriptions_command, '')); + SET a_notes_command := TRIM(IFNULL(a_notes_command, '')); + SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); SET a_show_errors := IFNULL(a_show_errors, 0); SET a_debug := IFNULL(a_debug, 0); @@ -113,6 +129,12 @@ BEGIN , a_get_inactive_command , a_ids_command , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met , a_show_errors , a_debug ; @@ -125,25 +147,33 @@ BEGIN ; END IF; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Notes_Calc_Command; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Hand_Signal_Default_Description_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Calc_Command; + DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category_Calc_Command; - CREATE TEMPORARY TABLE tmp_Command_Calc_Command_Category ( + CREATE TEMPORARY TABLE tmp_Command_Category_Calc_Command ( id_command_category INT NOT NULL + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE tmp_Command_Calc_Command ( id_command INT NOT NULL , id_command_category INT NOT NULL + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + , does_command_category_already_exist_in_temp_table BIT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error_Calc_Command ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id_Calc_Command ( @@ -158,14 +188,30 @@ BEGIN ); DELETE FROM tmp_Split_Name_Calc_Command; + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Hand_Signal_Default_Description_Calc_Command ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Hand_Signal_Default_Description_Calc_Command; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Notes_Calc_Command ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Notes_Calc_Command; + SET v_has_filter_command_category_id = CASE WHEN a_ids_command_category = '' THEN 0 ELSE 1 END; SET v_has_filter_command_category_name = CASE WHEN a_names_command_category = '' THEN 0 ELSE 1 END; 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; + SET v_has_filter_command_hand_signal_default_description = CASE WHEN a_hand_signal_default_descriptions_command = '' THEN 0 ELSE 1 END; + SET v_has_filter_command_notes = CASE WHEN a_notes_command = '' THEN 0 ELSE 1 END; -- Command Categories IF v_has_filter_command_category_id = 1 THEN CALL parts.p_core_split(a_guid, a_ids_command_category, ',', a_debug); + + SET sql_mode = ''; INSERT INTO tmp_Split_Id_Calc_Command ( substring @@ -173,7 +219,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = a_guid @@ -185,6 +231,8 @@ BEGIN IF v_has_filter_command_category_name = 1 THEN CALL parts.p_core_split(a_guid, a_names_command_category, ',', a_debug); + + SET sql_mode = ''; INSERT INTO tmp_Split_Name_Calc_Command ( substring @@ -192,7 +240,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = a_guid @@ -235,41 +283,12 @@ BEGIN ) ; /* Don't error on names not found - ELSEIF EXISTS ( - SELECT * - FROM tmp_Split t_SPLIT - LEFT JOIN parts.DOG_Command_Category COMMAND_CATEGORY ON t_SPLIT.as_int = COMMAND_CATEGORY.id_command_category - WHERE - ISNULL(t_SPLIT.as_int) - OR ISNULL(COMMAND_CATEGORY.id_command_category) - OR ( - COMMAND_CATEGORY.active = 0 - AND a_get_inactive_command_category = 0 - ) - ) THEN - INSERT INTO tmp_Msg_Error_Calc_Command ( - 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 parts.DOG_Command_Category COMMAND_CATEGORY ON t_SPLIT.as_int = COMMAND_CATEGORY.id_command_category - WHERE - ISNULL(t_SPLIT.as_int) - OR ISNULL(COMMAND_CATEGORY.id_command_category) - OR ( - COMMAND_CATEGORY.active = 0 - AND a_get_inactive_command_category = 0 - ) - ; */ ELSE - INSERT INTO tmp_Command_Calc_Command_Category ( + INSERT INTO tmp_Command_Category_Calc_Command ( id_command_category + , does_meet_id_filters + , does_meet_non_id_filters ) WITH Command_Category_Id_Filter AS ( @@ -287,26 +306,49 @@ BEGIN AND t_SPLIT_NAME.substring <> '' ) , Command_Category_Filters AS ( - SELECT DISTINCT COMMAND_CATEGORY_COMBINED.id_command_category + SELECT + COMMAND_CATEGORY_COMBINED.id_command_category + , MAX(IFNULL(COMMAND_CATEGORY_COMBINED.does_meet_id_filter, 0)) AS does_meet_id_filter + , MAX(IFNULL(COMMAND_CATEGORY_COMBINED.does_meet_name_filter, 0)) AS does_meet_name_filter FROM ( - SELECT COMMAND_CATEGORY_ID_FILTER.id_command_category FROM Command_Category_Id_Filter COMMAND_CATEGORY_ID_FILTER + SELECT + COMMAND_CATEGORY_ID_FILTER.id_command_category + , 1 AS does_meet_id_filter + , 0 AS does_meet_name_filter + FROM Command_Category_Id_Filter COMMAND_CATEGORY_ID_FILTER UNION - SELECT COMMAND_CATEGORY_NAME_FILTER.id_command_category FROM Command_Category_Name_Filter COMMAND_CATEGORY_NAME_FILTER + SELECT + COMMAND_CATEGORY_NAME_FILTER.id_command_category + , 0 AS does_meet_id_filter + , 1 AS does_meet_name_filter + FROM Command_Category_Name_Filter COMMAND_CATEGORY_NAME_FILTER ) COMMAND_CATEGORY_COMBINED + GROUP BY COMMAND_CATEGORY_COMBINED.id_command_category ) SELECT COMMAND_CATEGORY.id_command_category + , CASE WHEN + v_has_filter_command_category_id = 0 + OR COMMAND_CATEGORY_FILTERS.does_meet_id_filter = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_command_category_name = 0 + ) + OR COMMAND_CATEGORY_FILTERS.does_meet_name_filter = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters FROM parts.DOG_Command_Category COMMAND_CATEGORY LEFT JOIN Command_Category_Filters COMMAND_CATEGORY_FILTERS ON COMMAND_CATEGORY.id_command_category = COMMAND_CATEGORY_FILTERS.id_command_category WHERE ( a_get_all_command_category = 1 + OR ( + v_has_filter_command_category_id = 1 + AND COMMAND_CATEGORY_FILTERS.does_meet_id_filter = 1 + ) OR ( - ( - v_has_filter_command_category_id = 1 - OR v_has_filter_command_category_name = 1 - ) - AND COMMAND_CATEGORY_FILTERS.id_command_category IS NOT NULL + v_has_filter_command_category_name = 1 + AND COMMAND_CATEGORY_FILTERS.does_meet_name_filter = 1 ) ) AND ( @@ -323,6 +365,8 @@ BEGIN -- Commands IF v_has_filter_command_id = 1 THEN CALL parts.p_core_split(a_guid, a_ids_command, ',', a_debug); + + SET sql_mode = ''; INSERT INTO tmp_Split_Id_Calc_Command ( substring @@ -330,7 +374,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = a_guid @@ -342,6 +386,8 @@ BEGIN IF v_has_filter_command_name = 1 THEN CALL parts.p_core_split(a_guid, a_names_command, ',', a_debug); + + SET sql_mode = ''; INSERT INTO tmp_Split_Name_Calc_Command ( substring @@ -349,7 +395,49 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + + CALL parts.p_core_clear_split( a_guid ); + END IF; + + IF v_has_filter_command_hand_signal_default_description = 1 THEN + CALL parts.p_core_split(a_guid, a_hand_signal_default_descriptions_command, ',', a_debug); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Hand_Signal_Default_Description_Calc_Command ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int + FROM parts.CORE_Split_Temp SPLIT_T + WHERE + SPLIT_T.GUID = a_guid + AND IFNULL(SPLIT_T.substring, '') <> '' + ; + + CALL parts.p_core_clear_split( a_guid ); + END IF; + + IF v_has_filter_command_notes = 1 THEN + CALL parts.p_core_split(a_guid, a_notes_command, ',', a_debug); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Notes_Calc_Command ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = a_guid @@ -391,112 +479,434 @@ BEGIN AND a_get_inactive_command = 0 ) ; - /* Don't error on names not found - ELSEIF EXISTS ( - SELECT * - FROM tmp_Split t_SPLIT - LEFT JOIN parts.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_Calc_Command ( - 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 parts.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 - ) - ; + /* Don't error on names, hand signals, or notes not found + ELSEIF EXISTS () */ ELSE + IF a_debug = 1 THEN + SELECT 'Command Filters'; + WITH + Command_Id_Filter AS ( + SELECT COMMAND.id_command + FROM tmp_Split_Id_Calc_Command t_SPLIT_ID + INNER JOIN parts.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command + ) + , Command_Name_Filter AS ( + SELECT COMMAND.id_command + FROM tmp_Split_Name_Calc_Command t_SPLIT_NAME + INNER JOIN parts.DOG_Command COMMAND ON COMMAND.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') + WHERE + t_SPLIT_NAME.substring IS NOT NULL + AND t_SPLIT_NAME.substring <> '' + ) + , Command_Hand_Signal_Default_Description_Filter AS ( + SELECT COMMAND.id_command + FROM tmp_Split_Hand_Signal_Default_Description_Calc_Command t_SPLIT_HSDD + INNER JOIN parts.DOG_Command COMMAND ON COMMAND.hand_signal_default_description LIKE CONCAT('%', t_SPLIT_HSDD.substring, '%') + WHERE + t_SPLIT_HSDD.substring IS NOT NULL + AND t_SPLIT_HSDD.substring <> '' + ) + , Command_Notes_Filter AS ( + SELECT COMMAND.id_command + FROM tmp_Split_Notes_Calc_Command t_SPLIT_NOTES + INNER JOIN parts.DOG_Command COMMAND ON COMMAND.notes LIKE CONCAT('%', t_SPLIT_NOTES.substring, '%') + WHERE + t_SPLIT_NOTES.substring IS NOT NULL + AND t_SPLIT_NOTES.substring <> '' + ) + , Command_Filters AS ( + SELECT + COMMAND_COMBINED.id_command + , MAX(COMMAND_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(COMMAND_COMBINED.does_meet_name_filter) AS does_meet_name_filter + , MAX(COMMAND_COMBINED.does_meet_hand_signal_default_description_filter) AS does_meet_hand_signal_default_description_filter + , MAX(COMMAND_COMBINED.does_meet_notes_filter) AS does_meet_notes_filter + FROM ( + SELECT + COMMAND_ID_FILTER.id_command + , 1 AS does_meet_id_filter + , 0 AS does_meet_name_filter + , 0 AS does_meet_hand_signal_default_description_filter + , 0 AS does_meet_notes_filter + FROM Command_Id_Filter COMMAND_ID_FILTER + UNION + SELECT + COMMAND_NAME_FILTER.id_command + , 0 AS does_meet_id_filter + , 1 AS does_meet_name_filter + , 0 AS does_meet_hand_signal_default_description_filter + , 0 AS does_meet_notes_filter + FROM Command_Name_Filter COMMAND_NAME_FILTER + UNION + SELECT + COMMAND_HSDD_FILTER.id_command + , 0 AS does_meet_id_filter + , 0 AS does_meet_name_filter + , 1 AS does_meet_hand_signal_default_description_filter + , 0 AS does_meet_notes_filter + FROM Command_Hand_Signal_Default_Description_Filter COMMAND_HSDD_FILTER + UNION + SELECT + COMMAND_NOTES_FILTER.id_command + , 0 AS does_meet_id_filter + , 0 AS does_meet_name_filter + , 0 AS does_meet_hand_signal_default_description_filter + , 1 AS does_meet_notes_filter + FROM Command_Notes_Filter COMMAND_NOTES_FILTER + ) COMMAND_COMBINED + GROUP BY COMMAND_COMBINED.id_command + ) + SELECT + COMMAND.id_command + , COMMAND.id_command_category + , CASE WHEN + v_has_filter_command_id = 0 + OR COMMAND_FILTERS.does_meet_id_filter = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters + , CASE WHEN + ( + v_has_filter_command_name = 0 + AND v_has_filter_command_hand_signal_default_description = 0 + AND v_has_filter_command_notes = 0 + ) + OR COMMAND_FILTERS.does_meet_name_filter = 1 + OR COMMAND_FILTERS.does_meet_hand_signal_default_description_filter = 1 + OR COMMAND_FILTERS.does_meet_notes_filter = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN t_COMMAND_CATEGORY.id_command_category IS NULL THEN 0 ELSE 1 END AS does_command_category_already_exist_in_temp_table + FROM parts.DOG_Command COMMAND + INNER JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + LEFT JOIN Command_Filters COMMAND_FILTERS ON COMMAND.id_command = COMMAND_FILTERS.id_command + WHERE + ( + a_get_all_command = 1 + OR ( + v_has_filter_command_id = 1 + AND COMMAND_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_command_name = 1 + AND COMMAND_FILTERS.does_meet_name_filter = 1 + ) + OR ( + v_has_filter_command_hand_signal_default_description = 1 + AND COMMAND_FILTERS.does_meet_hand_signal_default_description_filter = 1 + ) + OR ( + v_has_filter_command_notes = 1 + AND COMMAND_FILTERS.does_meet_notes_filter = 1 + ) + ) + AND ( + a_get_inactive_command = 1 + OR COMMAND.active = 1 + ) + ; + END IF; INSERT INTO tmp_Command_Calc_Command ( id_command , id_command_category + , does_meet_id_filters + , does_meet_non_id_filters + , does_command_category_already_exist_in_temp_table ) WITH - Command_Id_Filter AS ( + Command_Id_Filter AS ( SELECT COMMAND.id_command FROM tmp_Split_Id_Calc_Command t_SPLIT_ID - RIGHT JOIN parts.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command - WHERE t_SPLIT_ID.as_int IS NOT NULL + INNER JOIN parts.DOG_Command COMMAND ON t_SPLIT_ID.as_int = COMMAND.id_command ) , Command_Name_Filter AS ( SELECT COMMAND.id_command FROM tmp_Split_Name_Calc_Command t_SPLIT_NAME - RIGHT JOIN parts.DOG_Command COMMAND ON COMMAND.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') + INNER JOIN parts.DOG_Command COMMAND ON COMMAND.name LIKE CONCAT('%', t_SPLIT_NAME.substring, '%') WHERE t_SPLIT_NAME.substring IS NOT NULL AND t_SPLIT_NAME.substring <> '' ) - , Command_Filters AS ( - SELECT DISTINCT COMMAND_COMBINED.id_command - FROM ( - SELECT COMMAND_ID_FILTER.id_command FROM Command_Id_Filter COMMAND_ID_FILTER - UNION - SELECT COMMAND_NAME_FILTER.id_command FROM Command_Name_Filter COMMAND_NAME_FILTER - ) COMMAND_COMBINED + , Command_Hand_Signal_Default_Description_Filter AS ( + SELECT COMMAND.id_command + FROM tmp_Split_Hand_Signal_Default_Description_Calc_Command t_SPLIT_HSDD + INNER JOIN demo.DOG_Command COMMAND ON COMMAND.hand_signal_default_description LIKE CONCAT('%', t_SPLIT_HSDD.substring, '%') + WHERE + t_SPLIT_HSDD.substring IS NOT NULL + AND t_SPLIT_HSDD.substring <> '' ) - SELECT - COMMAND.id_command + , Command_Notes_Filter AS ( + SELECT COMMAND.id_command + FROM tmp_Split_Notes_Calc_Command t_SPLIT_NOTES + INNER JOIN demo.DOG_Command COMMAND ON COMMAND.notes LIKE CONCAT('%', t_SPLIT_NOTES.substring, '%') + WHERE + t_SPLIT_NOTES.substring IS NOT NULL + AND t_SPLIT_NOTES.substring <> '' + ) + , Command_Filters AS ( + SELECT + COMMAND_COMBINED.id_command + , MAX(COMMAND_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(COMMAND_COMBINED.does_meet_name_filter) AS does_meet_name_filter + , MAX(COMMAND_COMBINED.does_meet_hand_signal_default_description_filter) AS does_meet_hand_signal_default_description_filter + , MAX(COMMAND_COMBINED.does_meet_notes_filter) AS does_meet_notes_filter + FROM ( + SELECT + COMMAND_ID_FILTER.id_command + , 1 AS does_meet_id_filter + , 0 AS does_meet_name_filter + , 0 AS does_meet_hand_signal_default_description_filter + , 0 AS does_meet_notes_filter + FROM Command_Id_Filter COMMAND_ID_FILTER + UNION + SELECT + COMMAND_NAME_FILTER.id_command + , 0 AS does_meet_id_filter + , 1 AS does_meet_name_filter + , 0 AS does_meet_hand_signal_default_description_filter + , 0 AS does_meet_notes_filter + FROM Command_Name_Filter COMMAND_NAME_FILTER + UNION + SELECT + COMMAND_HSDD_FILTER.id_command + , 0 AS does_meet_id_filter + , 0 AS does_meet_name_filter + , 1 AS does_meet_hand_signal_default_description_filter + , 0 AS does_meet_notes_filter + FROM Command_Hand_Signal_Default_Description_Filter COMMAND_HSDD_FILTER + UNION + SELECT + COMMAND_NOTES_FILTER.id_command + , 0 AS does_meet_id_filter + , 0 AS does_meet_name_filter + , 0 AS does_meet_hand_signal_default_description_filter + , 1 AS does_meet_notes_filter + FROM Command_Notes_Filter COMMAND_NOTES_FILTER + ) COMMAND_COMBINED + GROUP BY COMMAND_COMBINED.id_command + ) + SELECT + COMMAND.id_command , COMMAND.id_command_category - FROM parts.DOG_Command COMMAND - INNER JOIN tmp_Command_Calc_Command_Category t_COMMAND_CATEGORY ON COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + , CASE WHEN + v_has_filter_command_id = 0 + OR IFNULL(COMMAND_FILTERS.does_meet_id_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_command_name = 0 + AND v_has_filter_command_hand_signal_default_description = 0 + AND v_has_filter_command_notes = 0 + ) + OR IFNULL(COMMAND_FILTERS.does_meet_name_filter, 0) = 1 + OR IFNULL(COMMAND_FILTERS.does_meet_hand_signal_default_description_filter, 0) = 1 + OR IFNULL(COMMAND_FILTERS.does_meet_notes_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters + , CASE WHEN t_COMMAND_CATEGORY.id_command_category IS NULL THEN 0 ELSE 1 END AS does_command_category_already_exist_in_temp_table + FROM parts.DOG_Command COMMAND + INNER JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category LEFT JOIN Command_Filters COMMAND_FILTERS ON COMMAND.id_command = COMMAND_FILTERS.id_command - WHERE + WHERE ( - a_get_all_command = 1 - OR ( - ( - v_has_filter_command_id = 1 - OR v_has_filter_command_name = 1 - ) - AND COMMAND_FILTERS.id_command IS NOT NULL - ) - ) - AND ( - a_get_inactive_command = 1 - OR COMMAND.active = 1 - ) + a_get_all_command = 1 + OR ( + v_has_filter_command_id = 1 + AND COMMAND_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_command_name = 1 + AND COMMAND_FILTERS.does_meet_name_filter = 1 + ) + OR ( + v_has_filter_command_hand_signal_default_description = 1 + AND COMMAND_FILTERS.does_meet_hand_signal_default_description_filter = 1 + ) + OR ( + v_has_filter_command_notes = 1 + AND COMMAND_FILTERS.does_meet_notes_filter = 1 + ) + ) + AND ( + a_get_inactive_command = 1 + OR COMMAND.active = 1 + ) ; END IF; END IF; DELETE FROM tmp_Split_Id_Calc_Command; DELETE FROM tmp_Split_Name_Calc_Command; + DELETE FROM tmp_Split_Hand_Signal_Default_Description_Calc_Command; + DELETE FROM tmp_Split_Notes_Calc_Command; + + IF a_debug = 1 THEN + SELECT 'After get Commands and Categories'; + SELECT * FROM tmp_Command_Category_Calc_Command; + SELECT * FROM tmp_Command_Calc_Command; + END IF; + -- Missing Categories + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Command 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_require_all_id_search_filters_met = 0 + AND a_require_all_non_id_search_filters_met = 0 + THEN + INSERT INTO tmp_Command_Category_Calc_Command ( + id_command_category + , does_meet_id_filters + , does_meet_non_id_filters + ) + SELECT DISTINCT + COMMAND_CATEGORY.id_command_category + , 0 AS does_meet_id_filters + , 0 AS does_meet_non_id_filters + FROM parts.DOG_Command_Category COMMAND_CATEGORY + INNER JOIN tmp_Command_Calc_Command t_COMMAND + ON COMMAND_CATEGORY.id_command_category = t_COMMAND.id_command_category + AND t_COMMAND.does_command_category_already_exist_in_temp_table = 0 + ; + END IF; + END IF; + + -- Filter records + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error_Calc_Command 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 + DELETE t_COMMAND + FROM tmp_Command_Calc_Command t_COMMAND + LEFT JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND ( + t_COMMAND.does_meet_id_filters = 0 + OR t_COMMAND_CATEGORY.does_meet_id_filters = 0 + ) + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND ( + t_COMMAND.does_meet_non_id_filters = 0 + OR t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + ) + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND t_COMMAND.does_meet_id_filters = 0 + AND t_COMMAND_CATEGORY.does_meet_id_filters = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND t_COMMAND.does_meet_non_id_filters = 0 + AND t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + ) + ; + + IF a_debug = 1 THEN + WITH + Category_And_Best_Command AS ( + SELECT + t_COMMAND.id_command_category + , MAX(IFNULL(t_COMMAND.does_meet_id_filters, 0)) AS does_meet_id_filters + , MAX(IFNULL(t_COMMAND.does_meet_non_id_filters, 0)) AS does_meet_non_id_filters + FROM tmp_Command_Calc_Command t_COMMAND + GROUP BY t_COMMAND.id_command_category + ) + SELECT * + FROM tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY + LEFT JOIN Category_And_Best_Command CATEGORY_BEST ON t_COMMAND_CATEGORY.id_command_category = CATEGORY_BEST.id_command_category + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND ( + CATEGORY_BEST.does_meet_id_filters = 0 + OR t_COMMAND_CATEGORY.does_meet_id_filters = 0 + ) + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND ( + CATEGORY_BEST.does_meet_non_id_filters = 0 + OR t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + ) + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND CATEGORY_BEST.does_meet_id_filters = 0 + AND t_COMMAND_CATEGORY.does_meet_id_filters = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND CATEGORY_BEST.does_meet_non_id_filters = 0 + AND t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + ) + ; + END IF; + + WITH + Category_And_Best_Command AS ( + SELECT + t_COMMAND.id_command_category + , MAX(IFNULL(t_COMMAND.does_meet_id_filters, 0)) AS does_meet_id_filters + , MAX(IFNULL(t_COMMAND.does_meet_non_id_filters, 0)) AS does_meet_non_id_filters + FROM tmp_Command_Calc_Command t_COMMAND + GROUP BY t_COMMAND.id_command_category + ) + DELETE t_COMMAND_CATEGORY + FROM tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY + LEFT JOIN Category_And_Best_Command CATEGORY_BEST ON t_COMMAND_CATEGORY.id_command_category = CATEGORY_BEST.id_command_category + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND ( + IFNULL(CATEGORY_BEST.does_meet_id_filters, 0) = 0 + OR t_COMMAND_CATEGORY.does_meet_id_filters = 0 + ) + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND ( + IFNULL(CATEGORY_BEST.does_meet_non_id_filters, 0) = 0 + OR t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + ) + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND IFNULL(CATEGORY_BEST.does_meet_id_filters, 0) = 0 + AND t_COMMAND_CATEGORY.does_meet_id_filters = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND IFNULL(CATEGORY_BEST.does_meet_non_id_filters, 0) = 0 + AND t_COMMAND_CATEGORY.does_meet_non_id_filters = 0 + ) + ; + END IF; + + IF a_debug = 1 THEN + SELECT 'After filter Commands and Categories'; + SELECT * FROM tmp_Command_Category_Calc_Command; + SELECT * FROM tmp_Command_Calc_Command; + END IF; + -- Permissions IF a_debug = 1 THEN SELECT - a_guid - , a_id_user + a_guid -- a_guid + , a_id_user -- a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ; END IF; CALL parts.p_dog_calc_user( - a_guid - , a_id_user + a_guid -- a_guid + , a_id_user -- a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); @@ -535,13 +945,26 @@ BEGIN a_guid , 0 -- a_debug ); + + IF a_debug = 1 THEN + SELECT 'Before non-permitted data deletion'; + SELECT * FROM tmp_Command_Category_Calc_Command; + SELECT * FROM tmp_Command_Calc_Command; + SELECT * FROM tmp_Msg_Error_Calc_Command; + END IF; IF EXISTS(SELECT * FROM tmp_Msg_Error_Calc_Command 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_Category_Calc_Command; SELECT * FROM tmp_Command_Calc_Command; END IF; DELETE FROM tmp_Command_Calc_Command; + DELETE FROM tmp_Command_Category_Calc_Command; + END IF; + + IF a_debug = 1 THEN + SELECT 'After non-permitted data deletion'; END IF; -- Outputs @@ -553,6 +976,9 @@ BEGIN , code , name , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT a_guid @@ -560,8 +986,11 @@ BEGIN , COMMAND_CATEGORY.code , COMMAND_CATEGORY.name , COMMAND_CATEGORY.active + + , t_COMMAND_CATEGORY.does_meet_id_filters + , t_COMMAND_CATEGORY.does_meet_non_id_filters FROM parts.DOG_Command_Category COMMAND_CATEGORY - INNER JOIN tmp_Command_Calc_Command_Category t_COMMAND_CATEGORY ON COMMAND_CATEGORY.id_command_category = t_COMMAND_CATEGORY.id_command_category + INNER JOIN tmp_Command_Category_Calc_Command t_COMMAND_CATEGORY ON COMMAND_CATEGORY.id_command_category = t_COMMAND_CATEGORY.id_command_category ; -- Commands @@ -574,45 +1003,56 @@ BEGIN , can_have_button , notes , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT a_guid , t_COMMAND.id_command - , t_COMMAND_CATEGORY.id_command_category + , t_COMMAND.id_command_category , COMMAND.name , COMMAND.hand_signal_default_description , COMMAND.can_have_button , COMMAND.notes , COMMAND.active + + , t_COMMAND.does_meet_id_filters + , t_COMMAND.does_meet_non_id_filters FROM parts.DOG_Command COMMAND INNER JOIN tmp_Command_Calc_Command t_COMMAND ON COMMAND.id_command = t_COMMAND.id_command - INNER JOIN tmp_Command_Calc_Command_Category t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category ; COMMIT; -- Errors - SELECT - t_ERROR.id_error - , t_ERROR.id_type - , t_ERROR.code - , ERROR_TYPE.name - , ERROR_TYPE.description - , ERROR_TYPE.is_breaking_error - , ERROR_TYPE.background_colour - , ERROR_TYPE.text_colour - , t_ERROR.msg - FROM tmp_Msg_Error_Calc_Command t_ERROR - INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type - ; - + IF a_show_errors = 1 THEN + 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_Calc_Command t_ERROR + INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type + ; + END IF; + IF a_debug = 1 AND v_can_view = 1 THEN + SELECT * FROM tmp_Command_Category_Calc_Command; SELECT * FROM tmp_Command_Calc_Command; END IF; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Notes_Calc_Command; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Hand_Signal_Default_Description_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Split_Name_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error_Calc_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Calc_Command; + DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category_Calc_Command; IF a_debug = 1 THEN CALL parts.p_core_debug_timing_reporting ( v_time_start ); @@ -635,17 +1075,67 @@ CALL parts.p_dog_calc_command ( , 0 -- a_get_inactive_command , '' -- a_ids_command , '' -- a_names_command - , 1 -- a_show_errors - , 1 -- a_debug + , '' -- a_hand_signal_default_descriptions_command + , '' -- a_notes_command + , 0 -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met + , 0 -- a_show_errors + , 0 -- a_debug ); +CALL parts.p_dog_calc_command ( + 'slips ' -- a_guid + , 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_command_category + , 0 -- a_get_inactive_command_category + , '' -- a_ids_command_category + , 'pat,point' -- a_names_command_category + , 1 -- a_get_all_command + , 0 -- a_get_inactive_command + , '' -- a_ids_command + , 'pat,point' -- a_names_command + , 'pat,point' -- a_hand_signal_default_descriptions_command + , 'pat,point' -- a_notes_command + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 1 -- a_show_errors + , 0 -- a_debug +); +SELECT * +FROM parts.DOG_Command_Category_Temp +; SELECT * FROM parts.DOG_Command_Temp ; - +/* +SELECT * +FROM parts.DOG_Command_Category_Temp CC +WHERE + CC.does_meet_id_filters + AND CC.does_meet_non_id_filters +; +SELECT * +FROM parts.DOG_Command_Temp C +WHERE + C.does_meet_id_filters + AND C.does_meet_non_id_filters +; +*/ CALL parts.p_dog_clear_calc_command ( 'slips ' -- a_guid , 1 -- debug ); -*/ \ No newline at end of file +DELETE +FROM parts.DOG_Command_Category_Temp +; + +DELETE +FROM parts.DOG_Command_Temp +; + +*/ diff --git a/static/MySQL/71104_p_dog_clear_calc_command.sql b/static/MySQL/71104_p_dog_clear_calc_command.sql index 25875a3..b58f9e0 100644 --- a/static/MySQL/71104_p_dog_clear_calc_command.sql +++ b/static/MySQL/71104_p_dog_clear_calc_command.sql @@ -17,6 +17,11 @@ BEGIN START TRANSACTION; + DELETE COMMAND_CATEGORY_T + FROM parts.DOG_Command_Category_Temp COMMAND_CATEGORY_T + WHERE COMMAND_CATEGORY_T.GUID = a_guid + ; + DELETE COMMAND_T FROM parts.DOG_Command_Temp COMMAND_T WHERE COMMAND_T.GUID = a_guid diff --git a/static/MySQL/71104_p_dog_get_many_command.sql b/static/MySQL/71104_p_dog_get_many_command.sql index 5d5ff71..6e70455 100644 --- a/static/MySQL/71104_p_dog_get_many_command.sql +++ b/static/MySQL/71104_p_dog_get_many_command.sql @@ -14,6 +14,12 @@ CREATE PROCEDURE parts.p_dog_get_many_command ( , IN a_get_inactive_command BIT , IN a_ids_command TEXT , IN a_names_command TEXT + , IN a_hand_signal_default_descriptions_command TEXT + , IN a_notes_command TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_output_command_categories BIT , IN a_output_commands BIT , IN a_debug BIT @@ -23,10 +29,7 @@ BEGIN DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); DECLARE v_guid BINARY(36); - DECLARE v_has_filter_command_id BIT; - DECLARE v_has_filter_command_name BIT; - DECLARE v_has_filter_command_category_id BIT; - DECLARE v_has_filter_command_category_name BIT; + DECLARE v_id_access_level_view INT; DECLARE v_id_minimum INT; DECLARE v_id_permission_dog_view INT; DECLARE v_id_type_error_bad_data INT; @@ -47,7 +50,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -87,6 +90,7 @@ BEGIN 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); SET a_id_user := IFNULL(a_id_user, 0); /* @@ -98,6 +102,12 @@ BEGIN 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_hand_signal_default_descriptions_command := TRIM(IFNULL(a_hand_signal_default_descriptions_command, '')); + SET a_notes_command := TRIM(IFNULL(a_notes_command, '')); + SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); */ SET a_output_command_categories := IFNULL(a_output_command_categories, 0); SET a_output_commands := IFNULL(a_output_commands, 0); @@ -114,6 +124,12 @@ BEGIN , a_get_inactive_command , a_ids_command , a_names_command + , a_hand_signal_default_descriptions_command + , a_notes_command + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met , a_output_command_categories , a_output_commands , a_debug @@ -137,6 +153,9 @@ BEGIN , code VARCHAR(100) , name VARCHAR(250) , active BIT + + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); CREATE TEMPORARY TABLE tmp_Command ( @@ -147,13 +166,16 @@ BEGIN , can_have_button BIT , notes TEXT , active BIT + + , does_meet_id_filters BIT + , does_meet_non_id_filters BIT ); 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 + , msg TEXT NOT NULL ); -- Permissions @@ -162,7 +184,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ; END IF; @@ -171,7 +195,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); @@ -209,7 +235,7 @@ BEGIN END IF; CALL parts.p_dog_clear_calc_user( - v_guid + v_guid , 0 -- a_debug ); @@ -218,7 +244,7 @@ BEGIN IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT - v_guid -- a_guid + v_guid -- a_guid , a_id_user -- a_id_user , a_get_all_command_category , a_get_inactive_command_category @@ -228,13 +254,19 @@ BEGIN , a_get_inactive_command -- a_get_inactive_command , a_ids_command -- a_ids_command , a_names_command -- a_names_command + , a_hand_signal_default_descriptions_command -- a_hand_signal_default_descriptions_command + , a_notes_command -- a_notes_command + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ; END IF; CALL parts.p_dog_calc_command ( - v_guid -- a_guid + v_guid -- a_guid , a_id_user -- a_id_user , a_get_all_command_category , a_get_inactive_command_category @@ -244,21 +276,40 @@ BEGIN , a_get_inactive_command -- a_get_inactive_command , a_ids_command -- a_ids_command , a_names_command -- a_names_command + , a_hand_signal_default_descriptions_command -- a_hand_signal_default_descriptions_command + , a_notes_command -- a_notes_command + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ); + IF a_debug = 1 THEN + SELECT COUNT(*) FROM parts.DOG_Command_Category_Temp; + SELECT * FROM parts.DOG_Command_Category_Temp; + SELECT COUNT(*) FROM parts.DOG_Command_Temp; + SELECT * FROM parts.DOG_Command_Temp; + END IF; + INSERT INTO tmp_Command_Category ( id_command_category , code , name , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT COMMAND_CATEGORY_T.id_command_category , COMMAND_CATEGORY_T.code , COMMAND_CATEGORY_T.name , COMMAND_CATEGORY_T.active + + , COMMAND_CATEGORY_T.does_meet_id_filters + , COMMAND_CATEGORY_T.does_meet_non_id_filters FROM parts.DOG_Command_Category_Temp COMMAND_CATEGORY_T WHERE COMMAND_CATEGORY_T.GUID = v_guid ; @@ -271,6 +322,9 @@ BEGIN , can_have_button , notes , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT COMMAND_T.id_command @@ -280,12 +334,17 @@ BEGIN , COMMAND_T.can_have_button , COMMAND_T.notes , COMMAND_T.active + + , COMMAND_T.does_meet_id_filters + , COMMAND_T.does_meet_non_id_filters FROM parts.DOG_Command_Temp COMMAND_T WHERE COMMAND_T.GUID = v_guid ; IF a_debug = 1 THEN + SELECT COUNT(*) FROM tmp_Command_Category; SELECT * FROM tmp_Command_Category; + SELECT COUNT(*) FROM tmp_Command; SELECT * FROM tmp_Command; END IF; END IF; @@ -310,6 +369,9 @@ BEGIN , t_COMMAND_CATEGORY.code , t_COMMAND_CATEGORY.name , t_COMMAND_CATEGORY.active + + , t_COMMAND_CATEGORY.does_meet_id_filters + , t_COMMAND_CATEGORY.does_meet_non_id_filters FROM tmp_Command_Category t_COMMAND_CATEGORY ; END IF; @@ -324,6 +386,9 @@ BEGIN , t_COMMAND.can_have_button , t_COMMAND.notes , t_COMMAND.active + + , t_COMMAND.does_meet_id_filters + , t_COMMAND.does_meet_non_id_filters FROM tmp_Command t_COMMAND ; END IF; @@ -347,7 +412,7 @@ BEGIN SELECT * FROM tmp_Command; END IF; - CALL parts.p_dog_clear_calc_dog( + CALL parts.p_dog_clear_calc_command( v_guid -- a_guid , 0 -- a_debug ); @@ -375,6 +440,34 @@ CALL parts.p_dog_get_many_command ( , 0 -- a_get_inactive_command , '' -- a_ids_command , '' -- a_names_command + , '' -- a_hand_signal_default_descriptions_command + , '' -- a_notes_command + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 1 -- a_output_command_categories + , 1 -- a_output_commands + , 1 -- a_debug +); + + +CALL demo.p_dog_get_many_command ( + 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_command_category + , 0 -- a_get_inactive_command_category + , '' -- a_ids_command_category + , 'pat,point' -- a_names_command_category + , 1 -- a_get_all_command + , 0 -- a_get_inactive_command + , '' -- a_ids_command + , 'pat,point' -- a_names_command + , 'pat,point' -- a_hand_signal_default_descriptions_command + , 'pat,point' -- a_notes_command + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met , 1 -- a_output_command_categories , 1 -- a_output_commands , 1 -- a_debug diff --git a/static/MySQL/71108_p_dog_get_many_dog_command_link.sql b/static/MySQL/71108_p_dog_get_many_dog_command_link.sql index 8533414..0f12b50 100644 --- a/static/MySQL/71108_p_dog_get_many_dog_command_link.sql +++ b/static/MySQL/71108_p_dog_get_many_dog_command_link.sql @@ -7,6 +7,9 @@ DROP PROCEDURE IF EXISTS parts.p_dog_get_many_dog_command_link; DELIMITER // CREATE PROCEDURE parts.p_dog_get_many_dog_command_link ( IN a_id_user INT + , IN a_get_all_link BIT + , IN a_get_inactive_link BIT + , IN a_ids_link TEXT , IN a_get_all_dog BIT , IN a_get_inactive_dog BIT , IN a_ids_dog TEXT @@ -19,12 +22,30 @@ CREATE PROCEDURE parts.p_dog_get_many_dog_command_link ( , IN a_get_inactive_command BIT , IN a_ids_command TEXT , IN a_names_command TEXT + , IN a_hand_signal_descriptions_link TEXT + , IN a_notes_command TEXT + , IN a_notes_link TEXT + , IN a_require_all_id_search_filters_met BIT + , IN a_require_any_id_search_filters_met BIT + , IN a_require_all_non_id_search_filters_met BIT + , IN a_require_any_non_id_search_filters_met BIT , IN a_debug BIT ) BEGIN DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); DECLARE v_code_type_error_warning VARCHAR(100); + DECLARE v_has_filter_command_category_id BIT; + DECLARE v_has_filter_command_category_name BIT; + DECLARE v_has_filter_command_id BIT; + DECLARE v_has_filter_command_name BIT; + DECLARE v_has_filter_command_notes BIT; + DECLARE v_has_filter_dog_id BIT; + DECLARE v_has_filter_dog_name BIT; + DECLARE v_has_filter_link_hand_signal_description BIT; + DECLARE v_has_filter_link_id BIT; + DECLARE v_has_filter_link_notes BIT; + DECLARE v_id_access_level_view INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; DECLARE v_id_type_error_warning INT; @@ -49,7 +70,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -91,8 +112,12 @@ BEGIN 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_type_error_warning := (SELECT ERROR_TYPE.id_type FROM parts.CORE_Msg_Error_Type ERROR_TYPE WHERE ERROR_TYPE.code = v_code_type_error_warning 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); SET a_id_user := IFNULL(a_id_user, 0); + SET a_get_all_link := IFNULL(a_get_all_link, 0); + SET a_get_inactive_link := IFNULL(a_get_inactive_link, 0); + SET a_ids_link := TRIM(IFNULL(a_ids_link, '')); -- 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, '')); @@ -102,11 +127,33 @@ 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_names_command := TRIM(IFNULL(a_names_command, '')); + -- SET a_notes_command := TRIM(IFNULL(a_notes_command, '')); + SET a_hand_signal_descriptions_link := TRIM(IFNULL(a_hand_signal_descriptions_link, '')); + SET a_notes_link := TRIM(IFNULL(a_notes_link, '')); + SET a_require_all_id_search_filters_met := IFNULL(a_require_all_id_search_filters_met, 1); + SET a_require_any_id_search_filters_met := IFNULL(a_require_any_id_search_filters_met, 1); + SET a_require_all_non_id_search_filters_met := IFNULL(a_require_all_non_id_search_filters_met, 0); + SET a_require_any_non_id_search_filters_met := IFNULL(a_require_any_non_id_search_filters_met, 1); SET a_debug := IFNULL(a_debug, 0); + SET 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; + SET v_has_filter_command_category_id = CASE WHEN a_ids_command_category = '' THEN 0 ELSE 1 END; + SET v_has_filter_command_category_name = CASE WHEN a_names_command_category = '' THEN 0 ELSE 1 END; + 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; + SET v_has_filter_link_hand_signal_description = CASE WHEN a_hand_signal_descriptions_link = '' THEN 0 ELSE 1 END; + SET v_has_filter_command_notes = CASE WHEN a_notes_command = '' THEN 0 ELSE 1 END; + SET v_has_filter_link_id = CASE WHEN a_ids_link = '' THEN 0 ELSE 1 END; + SET v_has_filter_link_notes = CASE WHEN a_notes_link = '' THEN 0 ELSE 1 END; + IF a_debug = 1 THEN SELECT a_id_user + , a_get_all_link + , a_get_inactive_link + , a_ids_link , a_get_all_dog , a_get_inactive_dog , a_ids_dog @@ -119,6 +166,12 @@ BEGIN , a_get_inactive_command , a_ids_command , a_names_command + , a_hand_signal_descriptions_link + , a_notes_link + , a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met , a_debug ; @@ -130,13 +183,42 @@ BEGIN , v_id_permission_dog_view , v_time_start ; + + SELECT + v_has_filter_dog_id + , v_has_filter_dog_name + , v_has_filter_command_category_id + , v_has_filter_command_category_name + , v_has_filter_command_id + , v_has_filter_command_name + , v_has_filter_link_hand_signal_description + , v_has_filter_command_notes + , v_has_filter_link_id + , v_has_filter_link_notes + ; END IF; - DROP TEMPORARY TABLE IF EXISTS tmp_Split; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Notes_Calc_Dog_Command_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Dog_Command_Link; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category; DROP TEMPORARY TABLE IF EXISTS tmp_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Dog_Command_Link; + + CREATE TEMPORARY TABLE tmp_Dog_Command_Link ( + id_link INT NOT NULL + , id_dog INT NOT NULL + , id_command INT NOT NULL + , hand_signal_description TEXT + , notes TEXT + , active BIT + + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL + -- , has_button + ); CREATE TEMPORARY TABLE tmp_Dog ( id_dog INT NOT NULL @@ -145,6 +227,9 @@ BEGIN , mass_kg DECIMAL(7, 3) , notes TEXT , active BIT + + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE tmp_Command_Category ( @@ -152,6 +237,9 @@ BEGIN , code VARCHAR(100) , name VARCHAR(250) , active BIT + + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE tmp_Command ( @@ -162,15 +250,36 @@ BEGIN , can_have_button BIT , notes TEXT , active BIT + + , does_meet_id_filters BIT NOT NULL + , does_meet_non_id_filters BIT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id_Calc_Dog_Command_Link ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Id_Calc_Dog_Command_Link; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Notes_Calc_Dog_Command_Link ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split_Notes_Calc_Dog_Command_Link; + -- Permissions IF a_debug = 1 THEN @@ -178,7 +287,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_dog_view + , v_id_permission_dog_view -- A_ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ; END IF; @@ -188,6 +299,8 @@ BEGIN , a_id_user -- a_ids_user , FALSE -- a_get_inactive_user , v_id_permission_dog_view -- a_ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); @@ -223,32 +336,41 @@ BEGIN END IF; CALL parts.p_dog_clear_calc_user( - v_guid + v_guid , 0 -- a_debug ); + -- Call Dog Calc IF NOT EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT - v_guid -- a_guid + v_guid -- a_guid , a_id_user -- a_id_user , a_get_all_dog -- a_get_all_dog , a_get_inactive_dog -- a_get_inactive_dog , a_ids_dog -- a_ids_dog , a_names_dog -- a_names_dog + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ; END IF; CALL parts.p_dog_calc_dog( - v_guid -- a_guid + v_guid -- a_guid , a_id_user -- a_id_user , a_get_all_dog -- a_get_all_dog , a_get_inactive_dog -- a_get_inactive_dog , a_ids_dog -- a_ids_dog , a_names_dog -- a_names_dog + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ); @@ -260,6 +382,9 @@ BEGIN , mass_kg , notes , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT DOG_T.id_dog @@ -268,6 +393,9 @@ BEGIN , DOG_T.mass_kg , DOG_T.notes , DOG_T.active + + , DOG_T.does_meet_id_filters + , DOG_T.does_meet_non_id_filters FROM parts.DOG_Dog_Temp DOG_T WHERE DOG_T.GUID = v_guid ; @@ -291,6 +419,12 @@ BEGIN , a_get_inactive_command -- a_get_inactive_command , a_ids_command -- a_ids_command , a_names_command -- a_names_command + , '' -- a_hand_signal_descriptions_link + , a_notes_command -- a_notes_command + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ; @@ -307,6 +441,12 @@ BEGIN , a_get_inactive_command -- a_get_inactive_command , a_ids_command -- a_ids_command , a_names_command -- a_names_command + , '' -- a_hand_signal_descriptions_link + , a_notes_command -- a_notes_command + , a_require_all_id_search_filters_met -- a_require_all_id_search_filters_met + , 0 -- a_require_any_id_search_filters_met -- a_require_any_id_search_filters_met + , a_require_all_non_id_search_filters_met -- a_require_all_non_id_search_filters_met + , 0 -- a_require_any_non_id_search_filters_met -- a_require_any_non_id_search_filters_met , 0 -- a_show_errors , 0 -- a_debug ); @@ -316,12 +456,18 @@ BEGIN , code , name , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT COMMAND_CATEGORY_T.id_command_category , COMMAND_CATEGORY_T.code , COMMAND_CATEGORY_T.name , COMMAND_CATEGORY_T.active + + , COMMAND_CATEGORY_T.does_meet_id_filters + , COMMAND_CATEGORY_T.does_meet_non_id_filters FROM parts.DOG_Command_Category_Temp COMMAND_CATEGORY_T WHERE COMMAND_CATEGORY_T.GUID = v_guid ; @@ -334,6 +480,9 @@ BEGIN , can_have_button , notes , active + + , does_meet_id_filters + , does_meet_non_id_filters ) SELECT COMMAND_T.id_command @@ -343,6 +492,9 @@ BEGIN , COMMAND_T.can_have_button , COMMAND_T.notes , COMMAND_T.active + + , COMMAND_T.does_meet_id_filters + , COMMAND_T.does_meet_non_id_filters FROM parts.DOG_Command_Temp COMMAND_T WHERE COMMAND_T.GUID = v_guid ; @@ -353,39 +505,299 @@ BEGIN END IF; END IF; + -- Dog Command Links + 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 v_has_filter_link_id = 1 THEN + CALL parts.p_core_split(v_guid, a_ids_link, ',', a_debug); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Id_Calc_Dog_Command_Link ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS 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_core_clear_split( v_guid ); + END IF; + + IF v_has_filter_link_hand_signal_description = 1 THEN + CALL parts.p_core_split(v_guid, a_hand_signal_descriptions_link, ',', a_debug); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS 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_core_clear_split( v_guid ); + END IF; + + IF v_has_filter_link_notes = 1 THEN + CALL parts.p_core_split(v_guid, a_notes_link, ',', a_debug); + + SET sql_mode = ''; + + INSERT INTO tmp_Split_Notes_Calc_Dog_Command_Link ( + substring + , as_int + ) + SELECT + SPLIT_T.substring + , CAST(SPLIT_T.substring AS 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_core_clear_split( v_guid ); + END IF; + + INSERT INTO tmp_Dog_Command_Link ( + id_link + , id_dog + , id_command + , hand_signal_description + , notes + , active + + , does_meet_id_filters + , does_meet_non_id_filters + ) + WITH + Link_Id_Filter AS ( + SELECT DOG_COMMAND_LINK.id_link + FROM tmp_Split_Id_Calc_Dog_Command_Link t_SPLIT_ID + INNER JOIN parts.DOG_Dog_Command_Link DOG_COMMAND_LINK ON t_SPLIT_ID.as_int = DOG_COMMAND_LINK.id_link + ) + , Links_With_Hand_Signal_Descriptions AS ( + SELECT + DOG_COMMAND_LINK.id_link + , COALESCE(DOG_COMMAND_LINK.hand_signal_description, COMMAND.hand_signal_default_description) AS hand_signal_description + FROM parts.DOG_Dog_Command_Link DOG_COMMAND_LINK + INNER JOIN parts.DOG_Command COMMAND ON DOG_COMMAND_LINK.id_command = COMMAND.id_command + ) + , Link_Hand_Signal_Description_Filter AS ( + SELECT + LINK_HAND_SIGNAL_DESCRIPTIONS.id_link + , 1 AS does_meet_hand_signal_description_filter + FROM tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link t_SPLIT_HSD + INNER JOIN Links_With_Hand_Signal_Descriptions LINK_HAND_SIGNAL_DESCRIPTIONS + ON LINK_HAND_SIGNAL_DESCRIPTIONS.hand_signal_description LIKE CONCAT('%', t_SPLIT_HSD.substring, '%') + WHERE + t_SPLIT_HSD.substring IS NOT NULL + AND t_SPLIT_HSD.substring <> '' + ) + , Link_Notes_Filter AS ( + SELECT + DOG_COMMAND_LINK.id_link + , 1 AS does_meet_notes_filter + FROM tmp_Split_Notes_Calc_Dog_Command_Link t_SPLIT_NOTES + INNER JOIN parts.DOG_Dog_Command_Link DOG_COMMAND_LINK ON DOG_COMMAND_LINK.notes LIKE CONCAT('%', t_SPLIT_NOTES.substring, '%') + WHERE + t_SPLIT_NOTES.substring IS NOT NULL + AND t_SPLIT_NOTES.substring <> '' + ) + , Link_Filters AS ( + SELECT + LINK_COMBINED.id_link + , MAX(LINK_COMBINED.does_meet_id_filter) AS does_meet_id_filter + , MAX(LINK_COMBINED.does_meet_hand_signal_description_filter) AS does_meet_hand_signal_description_filter + , MAX(LINK_COMBINED.does_meet_notes_filter) AS does_meet_notes_filter + FROM ( + SELECT + LINK_ID_FILTER.id_link + , 1 AS does_meet_id_filter + , 0 AS does_meet_hand_signal_description_filter + , 0 AS does_meet_notes_filter + FROM Link_Id_Filter LINK_ID_FILTER + UNION + SELECT + LINK_HSD_FILTER.id_link + , 0 AS does_meet_id_filter + , 1 AS does_meet_hand_signal_description_filter + , 0 AS does_meet_notes_filter + FROM Link_Hand_Signal_Description_Filter LINK_HSD_FILTER + UNION + SELECT + LINK_NOTES_FILTER.id_link + , 0 AS does_meet_id_filter + , 0 AS does_meet_hand_signal_description_filter + , 1 AS does_meet_notes_filter + FROM Link_Notes_Filter LINK_NOTES_FILTER + ) LINK_COMBINED + GROUP BY LINK_COMBINED.id_link + ) + SELECT + DOG_COMMAND_LINK.id_link AS id_dog_command_link + , t_DOG.id_dog + , t_COMMAND.id_command + , LINK_HAND_SIGNAL_DESCRIPTIONS.hand_signal_description AS hand_signal_description_command + , DOG_COMMAND_LINK.notes + , DOG_COMMAND_LINK.active + , CASE WHEN + v_has_filter_link_id = 0 + OR IFNULL(LINK_FILTERS.does_meet_id_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_id_filters + , CASE WHEN + ( + v_has_filter_link_hand_signal_description = 0 + AND v_has_filter_link_notes = 0 + ) + OR IFNULL(LINK_FILTERS.does_meet_hand_signal_description_filter, 0) = 1 + OR IFNULL(LINK_FILTERS.does_meet_notes_filter, 0) = 1 + THEN 1 ELSE 0 END AS does_meet_non_id_filters + 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_Command_Category t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + LEFT JOIN Link_Filters LINK_FILTERS ON DOG_COMMAND_LINK.id_link = LINK_FILTERS.id_link + INNER JOIN Links_With_Hand_Signal_Descriptions LINK_HAND_SIGNAL_DESCRIPTIONS ON DOG_COMMAND_LINK.id_link = LINK_HAND_SIGNAL_DESCRIPTIONS.id_link + WHERE + ( + a_get_all_link = 1 + OR ( + v_has_filter_link_id = 1 + AND LINK_FILTERS.does_meet_id_filter = 1 + ) + OR ( + v_has_filter_link_hand_signal_description = 1 + AND LINK_FILTERS.does_meet_hand_signal_description_filter = 1 + ) + OR ( + v_has_filter_link_notes = 1 + AND LINK_FILTERS.does_meet_notes_filter = 1 + ) + ) + AND ( + a_get_inactive_link = 1 + OR DOG_COMMAND_LINK.active = 1 + ) + ; + END IF; + + DELETE FROM tmp_Split_Id_Calc_Dog_Command_Link; + DELETE FROM tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link; + DELETE FROM tmp_Split_Notes_Calc_Dog_Command_Link; + IF a_debug = 1 THEN + SELECT 'After get Links'; + SELECT * FROM tmp_Dog; + SELECT * FROM tmp_Command_Category; + SELECT * FROM tmp_Command; + SELECT * FROM tmp_Dog_Command_Link; + END IF; + + -- Filter records + 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 + DELETE t_DOG_COMMAND_LINK + FROM tmp_Dog_Command_Link t_DOG_COMMAND_LINK + LEFT JOIN tmp_Dog t_DOG ON t_DOG_COMMAND_LINK.id_dog = t_DOG.id_dog + LEFT JOIN tmp_Command t_COMMAND ON t_DOG_COMMAND_LINK.id_command = t_COMMAND.id_command + LEFT JOIN tmp_Command_Category t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + WHERE + ( + a_require_all_id_search_filters_met = 1 + AND ( + IFNULL(t_DOG_COMMAND_LINK.does_meet_id_filters, 0) = 0 + OR IFNULL(t_DOG.does_meet_id_filters, 0) = 0 + OR IFNULL(t_COMMAND.does_meet_id_filters, 0) = 0 + OR IFNULL(t_COMMAND_CATEGORY.does_meet_id_filters, 0) = 0 + ) + ) + OR ( + a_require_all_non_id_search_filters_met = 1 + AND ( + IFNULL(t_DOG_COMMAND_LINK.does_meet_non_id_filters, 0) = 0 + OR IFNULL(t_DOG.does_meet_non_id_filters, 0) = 0 + OR IFNULL(t_COMMAND.does_meet_non_id_filters, 0) = 0 + OR IFNULL(t_COMMAND_CATEGORY.does_meet_non_id_filters, 0) = 0 + ) + ) + OR ( + a_require_any_id_search_filters_met = 1 + AND IFNULL(t_DOG_COMMAND_LINK.does_meet_id_filters, 0) = 0 + AND IFNULL(t_DOG.does_meet_id_filters, 0) = 0 + AND IFNULL(t_COMMAND.does_meet_id_filters, 0) = 0 + AND IFNULL(t_COMMAND_CATEGORY.does_meet_id_filters, 0) = 0 + ) + OR ( + a_require_any_non_id_search_filters_met = 1 + AND IFNULL(t_DOG_COMMAND_LINK.does_meet_non_id_filters, 0) = 0 + AND IFNULL(t_DOG.does_meet_non_id_filters, 0) = 0 + AND IFNULL(t_COMMAND.does_meet_non_id_filters, 0) = 0 + AND IFNULL(t_COMMAND_CATEGORY.does_meet_non_id_filters, 0) = 0 + ) + ; + END IF; + + IF a_debug = 1 THEN + SELECT 'After filter Links'; + SELECT * FROM tmp_Dog; + SELECT * FROM tmp_Command_Category; + SELECT * FROM tmp_Command; + SELECT * FROM tmp_Dog_Command_Link; + END IF; + -- Filter outputs IF EXISTS(SELECT * FROM tmp_Msg_Error t_ERROR INNER JOIN parts.CORE_Msg_Error_Type ERROR_TYPE ON t_ERROR.id_type = ERROR_TYPE.id_type WHERE ERROR_TYPE.is_breaking_error = 1 LIMIT 1) THEN IF a_debug = 1 THEN SELECT * FROM tmp_Dog; SELECT * FROM tmp_Command; SELECT * FROM tmp_Command_Category; + SELECT * FROM tmp_Dog_Command_Link; END IF; DELETE FROM tmp_Dog; DELETE FROM tmp_Command; DELETE FROM tmp_Command_Category; + DELETE FROM tmp_Dog_Command_Link; END IF; -- Outputs - -- Commands + -- Dog Command Links SELECT - DOG_COMMAND_LINK.id_link AS id_dog_command_link - , t_DOG.id_dog + t_DOG_COMMAND_LINK.id_link AS id_dog_command_link + , t_DOG_COMMAND_LINK.id_dog , t_DOG.name AS name_dog - , t_COMMAND.id_command_category + , t_COMMAND_CATEGORY.id_command_category , t_COMMAND_CATEGORY.name AS name_command_category - , t_COMMAND.id_command + , t_DOG_COMMAND_LINK.id_command , t_COMMAND.name AS name_command - -- , t_COMMAND.has_button AS command_has_button - , COALESCE(DOG_COMMAND_LINK.hand_signal_description, t_COMMAND.hand_signal_default_description) AS hand_signal_description_command + , t_DOG_COMMAND_LINK.hand_signal_description AS hand_signal_description , t_COMMAND.can_have_button AS can_have_button_command - , DOG_COMMAND_LINK.notes - , DOG_COMMAND_LINK.active + , t_DOG_COMMAND_LINK.notes + , t_DOG_COMMAND_LINK.active + , t_DOG_COMMAND_LINK.does_meet_id_filters + , t_DOG_COMMAND_LINK.does_meet_non_id_filters + , t_DOG.does_meet_id_filters AS does_meet_dog_id_search_filters + , t_DOG.does_meet_non_id_filters AS does_meet_dog_non_id_search_filters + , t_COMMAND_CATEGORY.does_meet_id_filters AS does_meet_command_category_id_search_filters + , t_COMMAND_CATEGORY.does_meet_non_id_filters AS does_meet_command_category_non_id_search_filters + , t_COMMAND.does_meet_id_filters AS does_meet_command_id_search_filters + , t_COMMAND.does_meet_non_id_filters AS does_meet_command_non_id_search_filters 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_Command_Category t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category + INNER JOIN tmp_Dog_Command_Link t_DOG_COMMAND_LINK ON DOG_COMMAND_LINK.id_link = t_DOG_COMMAND_LINK.id_link + LEFT JOIN tmp_Dog t_DOG ON DOG_COMMAND_LINK.id_dog = t_DOG.id_dog + LEFT JOIN tmp_Command t_COMMAND ON DOG_COMMAND_LINK.id_command = t_COMMAND.id_command + LEFT JOIN tmp_Command_Category t_COMMAND_CATEGORY ON t_COMMAND.id_command_category = t_COMMAND_CATEGORY.id_command_category ; -- Errors @@ -409,11 +821,14 @@ BEGIN SELECT * FROM tmp_Command_Category; END IF; - DROP TEMPORARY TABLE IF EXISTS tmp_Split; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Notes_Calc_Dog_Command_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Hand_Signal_Description_Calc_Dog_Command_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Id_Calc_Dog_Command_Link; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Command; DROP TEMPORARY TABLE IF EXISTS tmp_Command_Category; DROP TEMPORARY TABLE IF EXISTS tmp_Dog; + DROP TEMPORARY TABLE IF EXISTS tmp_Dog_Command_Link; IF a_debug = 1 THEN CALL parts.p_core_debug_timing_reporting ( v_time_start ); @@ -426,20 +841,9 @@ DELIMITER ; 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 - , '' -- a_ids_dog - , 1 -- a_get_all_command_category - , 0 -- a_get_inactive_command_category - , '' -- a_ids_command_category - , 1 -- a_get_all_command - , 0 -- a_get_inactive_command - , '' -- a_ids_command - , 1 -- a_debug -); - -CALL parts.p_dog_get_many_dog_command_link ( - 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_link + , 0 -- a_get_inactive_link + , '' -- a_ids_link , 1 -- a_get_all_dog , 0 -- a_get_inactive_dog , '' -- a_ids_dog @@ -452,7 +856,41 @@ CALL parts.p_dog_get_many_dog_command_link ( , 0 -- a_get_inactive_command , '2' -- a_ids_command , '2' -- a_names_command + , 'pat' -- a_hand_signal_descriptions_link + , 'pat' -- a_notes_command + , 'pat' -- a_notes_link + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met , 1 -- a_debug ); +CALL parts.p_dog_get_many_dog_command_link ( + 1 -- 'auth0|6582b95c895d09a70ba10fef', -- a_id_user + , 1 -- a_get_all_link + , 0 -- a_get_inactive_link + , '' -- a_ids_link + , 1 -- a_get_all_dog + , 0 -- a_get_inactive_dog + , '' -- a_ids_dog + , 'pat,point' -- a_names_dog + , 1 -- a_get_all_command_category + , 0 -- a_get_inactive_command_category + , '' -- a_ids_command_category + , 'pat,point' -- a_names_command_category + , 1 -- a_get_all_command + , 0 -- a_get_inactive_command + , '' -- a_ids_command + , 'pat,point' -- a_names_command + , 'pat,point' -- a_hand_signal_descriptions_link + , 'pat,point' -- a_notes_command + , 'pat,point' -- a_notes_link + , 1 -- a_require_all_id_search_filters_met + , 1 -- a_require_any_id_search_filters_met + , 0 -- a_require_all_non_id_search_filters_met + , 1 -- a_require_any_non_id_search_filters_met + , 0 -- a_debug +); + */ \ No newline at end of file diff --git a/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql b/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql index bd86384..4a76061 100644 --- a/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql +++ b/static/MySQL/deprecated/30700_tri_DOG_Unit_Measurement.sql @@ -9,18 +9,18 @@ DROP TRIGGER IF EXISTS before_update_DOG_Unit_Measurement; DELIMITER // CREATE TRIGGER before_insert_DOG_Unit_Measurement -BEFORE INSERT ON DOG_Unit_Measurement +BEFORE INSERT ON parts.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)); + SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT U.id_user FROM parts.DOG_User U WHERE U.firstname = CURRENT_USER()), -1)); END // DELIMITER ; DELIMITER // CREATE TRIGGER before_update_DOG_Unit_Measurement -BEFORE UPDATE ON DOG_Unit_Measurement +BEFORE UPDATE ON parts.DOG_Unit_Measurement FOR EACH ROW BEGIN IF OLD.id_change_set <=> NEW.id_change_set THEN @@ -28,12 +28,12 @@ BEGIN 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 + INSERT INTO parts.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 diff --git a/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql b/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql index 2b364fd..3610ab3 100644 --- a/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql +++ b/static/MySQL/deprecated/30704_tri_DOG_Unit_Measurement_Conversion.sql @@ -9,18 +9,18 @@ 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 +BEFORE INSERT ON parts.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)); + SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT U.id_user FROM parts.DOG_User U WHERE U.firstname = CURRENT_USER()), -1)); END // DELIMITER ; DELIMITER // CREATE TRIGGER before_update_DOG_Unit_Measurement_Conversion -BEFORE UPDATE ON DOG_Unit_Measurement_Conversion +BEFORE UPDATE ON parts.DOG_Unit_Measurement_Conversion FOR EACH ROW BEGIN IF OLD.id_change_set <=> NEW.id_change_set THEN @@ -28,12 +28,12 @@ BEGIN 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 + INSERT INTO parts.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 diff --git a/static/MySQL/deprecated/71104_p_dog_get_many_command.sql b/static/MySQL/deprecated/71104_p_dog_get_many_command.sql index 8093e4a..02e634f 100644 --- a/static/MySQL/deprecated/71104_p_dog_get_many_command.sql +++ b/static/MySQL/deprecated/71104_p_dog_get_many_command.sql @@ -13,17 +13,18 @@ CREATE PROCEDURE parts.p_dog_get_many_command ( , IN a_debug BIT ) BEGIN + DECLARE v_can_view BIT; DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); - DECLARE v_id_type_error_bad_data INT; - DECLARE v_id_type_error_no_permission INT; + DECLARE v_guid BINARY(36); 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_access_level_view INT; DECLARE v_id_minimum INT; + DECLARE v_id_permission_command_view INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; DECLARE v_time_start TIMESTAMP(6); - DECLARE v_can_view BIT; DECLARE exit handler for SQLEXCEPTION BEGIN @@ -39,7 +40,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -79,6 +80,7 @@ BEGIN 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); SET a_id_user := IFNULL(a_id_user, 0); SET a_get_all_command := IFNULL(a_get_all_command, 0); @@ -120,7 +122,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id ( @@ -150,7 +152,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = v_guid @@ -169,7 +171,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = v_guid @@ -252,7 +254,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_command_view + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ; END IF; @@ -261,7 +265,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_command_view + , v_id_permission_command_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); 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 index dc6489c..d0d309a 100644 --- a/static/MySQL/deprecated/7213_p_dog_get_many_understanding_level.sql +++ b/static/MySQL/deprecated/7213_p_dog_get_many_understanding_level.sql @@ -16,6 +16,7 @@ CREATE PROCEDURE parts.p_dog_get_many_understanding_level ( BEGIN DECLARE v_code_type_error_bad_data VARCHAR(100); DECLARE v_code_type_error_no_permission VARCHAR(100); + DECLARE v_id_access_level_view INT; DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; DECLARE v_has_filter_understanding_level_id BIT; @@ -41,7 +42,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); INSERT INTO tmp_Msg_Error ( @@ -81,6 +82,7 @@ BEGIN 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 v_id_access_level_view := (SELECT ACCESS_LEVEL.id_access_level FROM parts.DOG_Access_Level ACCESS_LEVEL WHERE ACCESS_LEVEL.code = 'VIEW' LIMIT 1); SET a_id_user := IFNULL(a_id_user, 0); SET a_get_all_understanding_level := IFNULL(a_get_all_understanding_level, 0); @@ -126,7 +128,7 @@ BEGIN id_error INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NULL , code VARCHAR(100) NOT NULL - , msg VARCHAR(4000) NOT NULL + , msg TEXT NOT NULL ); CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split_Id ( @@ -163,7 +165,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = v_guid @@ -182,7 +184,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = v_guid @@ -201,7 +203,7 @@ BEGIN ) SELECT SPLIT_T.substring - , CONVERT(SPLIT_T.substring, DECIMAL(10,0)) AS as_int + , CAST(SPLIT_T.substring AS DECIMAL(10,0)) AS as_int FROM parts.CORE_Split_Temp SPLIT_T WHERE SPLIT_T.GUID = v_guid @@ -289,7 +291,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_understanding_level_view + , v_id_permission_understanding_level_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ; END IF; @@ -298,7 +302,9 @@ BEGIN v_guid , a_id_user , FALSE -- a_get_inactive_user - , v_id_permission_understanding_level_view + , v_id_permission_understanding_level_view -- ids_permission + , v_id_access_level_view -- ids_access_level + , 0 -- a_show_errors , 0 -- a_debug ); diff --git a/static/css/layouts/header.css b/static/css/layouts/header.css index f73093f..50e0e9e 100644 --- a/static/css/layouts/header.css +++ b/static/css/layouts/header.css @@ -117,17 +117,51 @@ header { } #formFilters .container-input input { - max-width: 5vh; + width: 10vh; + max-width: 10vh; +} +#formFilters .container-input input { + height: 1.7vh; +} +#formFilters .container-input select { + height: 2vh; } -#formFilters .container-input.filter.active { +#formFilters .container-input.filter.active_only { width: 8vh; } +#formFilters .container-input.filter.active_only input { + display: none; +} +#formFilters .container-input.filter.active_only svg.active_only { + height: 2vh; + fill: var(--colour-text-background); + background-color: var(--colour-accent); + border: 1px solid var(--colour-accent); + width: 2vh; + border-radius: 0.5vh; +} +#formFilters .container-input.filter.active_only svg.active_only.is_checked { + fill: var(--colour-primary); + /* + background-color: var(--colour-accent); + border: 1px solid var(--colour-accent); + */ +} #formFilters .container-input.filter.is_not_empty { width: 12vh; } -button.collapsed { +#formFilters button { + padding: 0.5vh 0.75vh; + background-color: var(--colour-accent); + color: var(--colour-primary); + font-weight: bold; + border-radius: 0.75vh; + border: 2px solid var(--colour-primary); +} + +#formFilters button.collapsed { display: block; opacity: 0; } diff --git a/static/css/main.css b/static/css/main.css index 83649c5..9853ebc 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -203,10 +203,6 @@ img.header-logo { margin-top: 0; } -.container-input:not(:nth-child(3)) > label { - margin-top: 1vh; -} - .container-input > input, .container-input > textarea { border: 2px solid var(--colour-primary); padding: 1vh; diff --git a/static/css/pages/dog/dog_command_links.css b/static/css/pages/dog/dog_command_links.css index 491d5ec..d8bfb2d 100644 --- a/static/css/pages/dog/dog_command_links.css +++ b/static/css/pages/dog/dog_command_links.css @@ -39,12 +39,22 @@ } */ -td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { + td > input +, td > select +, td > textarea +, .container-input > input +, .container-input > select +, .container-input > textarea +{ border: 2px solid var(--colour-primary); border-radius: 0.5vh; } -#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { + #tableMain tbody tr td table thead tr th.id_variation_type +, #tableMain tbody tr td table tbody tr td.id_variation_type +, #tableMain tbody tr td table thead tr th.id_variation +, #tableMain tbody tr td table tbody tr td.id_variation +{ width: 47.5%; } diff --git a/static/js/dom.js b/static/js/dom.js index bea7348..c9e9336 100644 --- a/static/js/dom.js +++ b/static/js/dom.js @@ -19,10 +19,11 @@ export default class DOM { } static setElementValueCurrent(element, data) { DOM.setElementAttributeValueCurrent(element, data); + let tagName = element.tagName.toUpperCase(); if (element.type === "checkbox") { element.checked = data; } - else if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') { + else if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') { element.value = data; } else { @@ -109,6 +110,7 @@ export default class DOM { if (!Validation.isEmpty(element)) { + let tagName = element.tagName.toUpperCase(); if (element.type === "checkbox") { returnVal = element.checked; } @@ -117,15 +119,18 @@ export default class DOM { returnVal = getDatePickerDate(element, adjust4DayLightSavings); } */ - else if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') { + else if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') { returnVal = element.value; } - else if (element.tagName === 'BUTTON' && element.classList.contains(flagActive)) { + else if (tagName === 'BUTTON' && element.classList.contains(flagActive)) { returnVal = element.classList.contains(flagDelete); } - else if (element.tagName === 'TD') { + else if (tagName === 'TD') { returnVal = DOM.getElementAttributeValueCurrent(element); } + else if (tagName == 'SVG' && element.classList.contains(flagCheckbox)) { + returnVal = (element.classList.contains(flagIsChecked)) + } else { returnVal = element.textContent; } diff --git a/static/js/pages/base_table.js b/static/js/pages/base_table.js index a9e9327..00ed716 100644 --- a/static/js/pages/base_table.js +++ b/static/js/pages/base_table.js @@ -61,9 +61,35 @@ export default class TableBasePage extends BasePage { } sharedHookupFilters() { this.hookupButtonApplyFilters(); + this.hookupSearchTextFilter(); } hookupFilterActive() { - this.hookupFilter(flagActive); + let filterSelector = idFormFilters + ' #' + flagActiveOnly; + let filterActiveOld = document.querySelector(filterSelector); + filterActiveOld.removeAttribute('id'); + let parentDiv = filterActiveOld.parentElement; + let isChecked = (DOM.getElementAttributeValuePrevious(parentDiv) == "True"); + let filterActiveNew = document.querySelector(idFormFilters + ' div.' + flagActiveOnly + '.' + flagContainerInput + ' svg.' + flagActiveOnly); + filterActiveNew.setAttribute('id', flagActiveOnly); + if (isChecked) filterActiveNew.classList.add(flagIsChecked); + + this.hookupEventHandler("click", filterSelector, (event, filterActive) => { + console.log({ filterActive }); + console.log({ [filterActive.tagName]: filterActive.tagName }); + let svgElement = (filterActive.tagName.toUpperCase() == 'SVG') ? filterActive : filterActive.parentElement; + let wasChecked = svgElement.classList.contains(flagIsChecked); + if (wasChecked) { + svgElement.classList.remove(flagIsChecked); + } + else { + svgElement.classList.add(flagIsChecked); + } + return TableBasePage.isDirtyFilter(svgElement); + }); + let filter = document.querySelector(filterSelector); + let filterValuePrevious = DOM.getElementValueCurrent(filter); + filter.setAttribute(attrValueCurrent, filterValuePrevious); + filter.setAttribute(attrValuePrevious, filterValuePrevious); } hookupFilter(filterFlag, handler = (event, filter) => { return TableBasePage.isDirtyFilter(filter); }) { let filterSelector = idFormFilters + ' #' + filterFlag; @@ -91,6 +117,9 @@ export default class TableBasePage extends BasePage { this.callFilterTableContent(); }); } + hookupSearchTextFilter() { + this.hookupFilter(flagSearch); + } /* getAndLoadFilteredTableContent = () => { this.callFilterTableContent() @@ -225,12 +254,13 @@ export default class TableBasePage extends BasePage { this.initialiseRowNew(tbody, row); tbody.appendChild(row); this.hookupTableMain(); + this.postInitialiseRowNewCallback(tbody); } initialiseRowNew(tbody, row) { if (this.constructor === TableBasePage) { throw new Error("Subclass of TableBasePage must implement method initialiseRowNew()."); } - row.classList.remove(flagRowNew); + // row.classList.remove(flagRowNew); } hookupTableMain() { if (this.constructor === TableBasePage) { @@ -253,6 +283,11 @@ export default class TableBasePage extends BasePage { }); _rowBlank.setAttribute(this.constructor.attrIdRowObject, -1 - countRows); } + postInitialiseRowNewCallback(tbody) { + if (this.constructor === TableBasePage) { + throw new Error("Subclass of TableBasePage must implement method postInitialiseRowNewCallback(tbody)."); + } + } initialiseSliderDisplayOrderRowNew(tbody, row) { // let tdSelector = ':scope > tr > td.' + flagDisplayOrder; // let tbody = document.querySelector('table' + (Validation.isEmpty(flagTable) ? '' : '.' + flagTable) + ' > tbody'); @@ -518,8 +553,100 @@ export default class TableBasePage extends BasePage { this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagCollapsed); } + hookupFieldsCommandCategory() { + this.hookupTableCellDdlPreviews( + idTableMain + ' td.' + flagCommandCategory + , Utils.getListFromDict(filterCommandCategories) + , (cellSelector) => { this.hookupCommandCategoryDdls(cellSelector); } + ); + } + hookupCommandCategoryDdls(ddlSelector) { + this.hookupChangeHandlerTableCells(ddlSelector, (event, element) => { this.handleChangeCommandCategoryDdl(event, element); }); + } + handleChangeCommandCategoryDdl(event, ddlCategory) { + let idCommandCategoryOld = DOM.getElementAttributeValueCurrent(ddlCategory); + this.handleChangeNestedElementCellTable(event, ddlCategory); + let idCommandCategoryNew = DOM.getElementAttributeValueCurrent(ddlCategory); + if (idCommandCategoryOld == idCommandCategoryNew) return; + let row = DOM.getRowFromElement(ddlCategory); + let tdCommand = row.querySelector('td.' + flagCommand); + tdCommand.dispatchEvent(new Event('click')); + let ddlCommand = row.querySelector('td.' + flagCommand + ' select'); + ddlCommand.innerHTML = ''; + ddlCommand.appendChild(DOM.createOption(null)); + let optionJson, option; + Utils.getListFromDict(filterCommands).forEach((command) => { + if (idCommandCategoryNew != '0' && command[attrIdCommandCategory] != idCommandCategoryNew) return; + optionJson = BusinessObjects.getOptionJsonFromObjectJson(command); + option = DOM.createOption(optionJson); + ddlCommand.appendChild(option); + }); + this.handleChangeNestedElementCellTable(event, ddlCommand); + } hookupFieldsCommand() { - this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCommand, Utils.getListFromDict(filterCommands)); + let cellSelector = idTableMain + ' td.' + flagCommand; + this.hookupEventHandler("click", cellSelector, (event, td) => { + let parentTr = td.parentElement; + let tdCommandCategory = parentTr.querySelector('td.' + flagCommandCategory); + let idCommandCategoryRow = DOM.getElementAttributeValueCurrent(tdCommandCategory); + let idCommandCategoryFilter = this.getIdCommandCategoryFilter(); + let filterCommandList = Utils.getListFromDict(filterCommands); + let commandsInCategory = filterCommandList.filter(command => + ( + command[attrIdCommandCategory] == idCommandCategoryRow + ) + && ( + command[attrIdCommandCategory] == idCommandCategoryFilter + || idCommandCategoryFilter == 0 + ) + ); + console.log({ tdCommandCategory, idCommandCategoryRow, filterCommandList, commandsInCategory }); + console.log(filterCommandList); + this.handleClickTableCellDdlPreview( + event + , td + , commandsInCategory + , cellSelector + , (cellSelector) => { this.hookupTableCellDdls( + cellSelector + , (event, element) => { this.handleChangeNestedElementCellTable(event, element); } + ); } + ); + }); + this.hookupTableCellDdls(cellSelector + ' select'); + } + getIdCommandCategoryFilter() { + let formFilters = this.getFormFilters(); + let commandCategoryFilter = formFilters.querySelector('#' + attrIdCommandCategory); + let commandFilter = formFilters.querySelector('#' + attrIdCommand); + let idCommandCategory = 0; + let valueCurrentCommandCategoryFilter = DOM.getElementAttributeValueCurrent(commandCategoryFilter); + console.log({ valueCurrentCommandCategoryFilter }); + if (valueCurrentCommandCategoryFilter == "") { + let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter); + if (valueCurrentCommandFilter != "") { + let command = filterCommands[valueCurrentCommandFilter]; + idCommandCategory = command[attrIdCommandCategory]; + } + } else { + idCommandCategory = Number(valueCurrentCommandCategoryFilter); + } + return idCommandCategory; + } + getHasCommandCategoryFilter() { + let idCommandCategoryFilter = this.getIdCommandCategoryFilter(); + return !(Validation.isEmpty(idCommandCategoryFilter) || idCommandCategoryFilter == 0); + } + getIdCommandFilter() { + let formFilters = this.getFormFilters(); + let commandFilter = formFilters.querySelector('#' + attrIdCommand); + let valueCurrentCommandFilter = DOM.getElementAttributeValueCurrent(commandFilter); + let idCommand = Number(valueCurrentCommandFilter); + return idCommand; + } + getHasCommandFilter() { + let idCommandFilter = this.getIdCommandFilter(); + return !(Validation.isEmpty(idCommandFilter) || idCommandFilter == 0); } hookupFieldsDog() { this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagDog, Utils.getListFromDict(filterDogs)); diff --git a/static/js/pages/dog/dog_command_links.js b/static/js/pages/dog/dog_command_links.js index 66c658b..30630a8 100644 --- a/static/js/pages/dog/dog_command_links.js +++ b/static/js/pages/dog/dog_command_links.js @@ -25,17 +25,21 @@ export default class PageDogDogCommandLinks extends TableBasePage { hookupFilters() { this.sharedHookupFilters(); this.hookupFilterDog(); + this.hookupFilterCommandCategory(); this.hookupFilterCommand(); + this.hookupFilterActive(); } hookupFilterDog() { this.hookupFilter(attrIdDog); - /*, (event, filterDog) => { + } + hookupFilterCommandCategory() { + this.hookupFilter(attrIdCommandCategory, (event, filterCommandCategory) => { // loadDogCommandLinks(); - // let wasDirtyFilter = filterDog.classList.contains(flagDirty); - PageDogDogCommandLinks.isDirtyFilter(filterDog); - let isDirtyFilter = filterDog.classList.contains(flagDirty); - let idDog = DOM.getElementValueCurrent(filterDog); - let commands = dogs[idDog]; + // let wasDirtyFilter = filterCommandCategory.classList.contains(flagDirty); + PageDogDogCommandLinks.isDirtyFilter(filterCommandCategory); + let isDirtyFilter = filterCommandCategory.classList.contains(flagDirty); + let idCommandCategory = DOM.getElementValueCurrent(filterCommandCategory); + let commands = filterCommands.filter(command => command[attrIdCommandCategory] == idCommandCategory); let filterCommand = document.querySelector(idFormFilters + ' .' + flagCommand); let idCommandPrevious = filterCommand.getAttribute(attrValuePrevious); filterCommand.innerHTML = ''; @@ -48,8 +52,8 @@ export default class PageDogDogCommandLinks extends TableBasePage { filterCommand.appendChild(option); }); filterCommand.dispatchEvent(new Event('change')); + return isDirtyFilter; }); - */ } hookupFilterCommand() { this.hookupFilter(attrIdCommand); @@ -119,7 +123,7 @@ export default class PageDogDogCommandLinks extends TableBasePage { let tdCommand = row.querySelector('td.' + flagCommand); let inputHandSignalDescription = row.querySelector('td.' + flagHandSignalDescription + ' textarea'); let inputNotes = row.querySelector('td.' + flagNotes + ' textarea'); - let buttonActive = row.querySelector(':scope > td.' + flagActive + ' button'); + let buttonActive = row.querySelector('td.' + flagActive + ' .' + flagActive); let jsonRow = {}; jsonRow[attrIdDogCommandLink] = row.getAttribute(attrIdDogCommandLink); @@ -131,40 +135,69 @@ export default class PageDogDogCommandLinks extends TableBasePage { return jsonRow; } initialiseRowNew(tbody, row) { - this.initialiseRowNewDdlsDogAndCommand(row); /* + this.initialiseRowNewDdlsDog(row); + this.initialiseRowNewDdlsCommandCategory(row); + this.initialiseRowNewDdlsCommand(row); + this.initialiseRowNewDdlsDogAndCommand(row); let checkboxIsSubscription = row.querySelector('td.' + flagIsSubscription + ' input'); let checkboxDoesExpireFasterOnceUnsealed = row.querySelector('td.' + flagDoesExpireFasterOnceUnsealed + ' input'); this.handleChangeCheckboxDoesExpireFasterOnceUnsealed(null, checkboxDoesExpireFasterOnceUnsealed); this.handleChangeCheckboxIsSubscription(null, checkboxIsSubscription); */ } - initialiseRowNewDdlsDogAndCommand(row) { + initialiseRowNewDdlsDog(row) { let ddlDogFilter = document.querySelector(idFormFilters + ' #' + attrIdDog); let idDogFilter = DOM.getElementValueCurrent(ddlDogFilter); let hasDogFilter = !(Validation.isEmpty(idDogFilter) || idDogFilter == '0'); - let ddlCommandFilter = document.querySelector(idFormFilters + ' #' + attrIdCommand); - let idCommandFilter = DOM.getElementValueCurrent(ddlCommandFilter); - let hasCommandFilter = !(Validation.isEmpty(idCommandFilter) || idCommandFilter == '0'); + if (_verbose) { + console.log("initialiseRowNew: ", row); + console.log({ ddlDogFilter, idDogFilter, hasDogFilter }); + } + if (!hasDogFilter) return; + let ddlDog = row.querySelector('td.' + flagDog + ' select'); + DOM.setElementValuesCurrentAndPrevious(ddlDog, idDogFilter); + this.handleChangeDogDdl(null, ddlDog); + } + initialiseRowNewDdlsCommandCategory(row) { + let idCommandCategoryFilter = this.getIdCommandCategoryFilter(); + let hasCommandCategoryFilter = this.getHasCommandCategoryFilter(); + if (_verbose) { + console.log("initialiseRowNew: ", row); + console.log({ddlDogFilter, idDogFilter, hasDogFilter, idCommandCategoryFilter, hasCommandCategoryFilter}); + } + if (!hasCommandCategoryFilter) return; + let ddlCommandCategory = row.querySelector('td.' + flagCommandCategory + ' select'); + DOM.setElementValuesCurrentAndPrevious(ddlCommandCategory, idCommandCategoryFilter); + } + initialiseRowNewDdlsCommand(row) { + let idCommandFilter = this.getIdCommandFilter(); + let hasCommandFilter = this.getHasCommandFilter(); if (_verbose) { console.log("initialiseRowNew: ", row); console.log({ddlDogFilter, idDogFilter, hasDogFilter, ddlCommandFilter, idCommandFilter, hasCommandFilter}); } - if (!hasDogFilter && !hasCommandFilter) return; - if (hasDogFilter) { - let ddlDog = row.querySelector('td.' + flagDog + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlDog, idDogFilter); - this.handleChangeDogDdl(null, ddlDog); - } - if (hasCommandFilter) { - let ddlCommand = row.querySelector('td.' + flagCommand + ' select'); - DOM.setElementValuesCurrentAndPrevious(ddlCommand, idCommandFilter); - } + if (!hasCommandFilter) return; + let ddlCommand = row.querySelector('td.' + flagCommand + ' select'); + DOM.setElementValuesCurrentAndPrevious(ddlCommand, idCommandFilter); + } + postInitialiseRowNewCallback(tbody) { + let newRows = tbody.querySelectorAll('tr.' + flagRowNew); + let newestRow = newRows[newRows.length - 1]; + let clickableElementsSelector = [ + 'td.' + flagDog + ' div.' + flagDog + , ',td.' + flagCommandCategory + ' div.' + flagCommandCategory + , ',td.' + flagCommand + ' div.' + flagCommand + ].join(''); + newestRow.querySelectorAll(clickableElementsSelector).forEach((clickableElement) => { + clickableElement.click(); + }); } hookupTableMain() { super.hookupTableMain(); this.hookupFieldsDog(); + this.hookupFieldsCommandCategory(); this.hookupFieldsCommand(); this.hookupTextareasHandSignalDescription(); this.hookupTextareasNotes(); diff --git a/templates/components/common/buttons/_icon_checkbox.html b/templates/components/common/buttons/_icon_checkbox.html new file mode 100644 index 0000000..fa5b35d --- /dev/null +++ b/templates/components/common/buttons/_icon_checkbox.html @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/templates/components/dog/_preview_DDL_command.html b/templates/components/dog/_preview_DDL_command.html index 876bf21..0052cdd 100644 --- a/templates/components/dog/_preview_DDL_command.html +++ b/templates/components/dog/_preview_DDL_command.html @@ -1,15 +1,2 @@ -{% if not is_blank_row %} -
{{ command.name }}
-{% else %} - -{% endif %} \ No newline at end of file +
{% if not is_blank_row %}{{ command.name }}{% endif %}
diff --git a/templates/components/dog/_preview_DDL_command_category.html b/templates/components/dog/_preview_DDL_command_category.html new file mode 100644 index 0000000..bac1fa5 --- /dev/null +++ b/templates/components/dog/_preview_DDL_command_category.html @@ -0,0 +1,2 @@ + +
{% if not is_blank_row %}{{ command_category.name }}{% endif %}
diff --git a/templates/components/dog/_preview_DDL_dog.html b/templates/components/dog/_preview_DDL_dog.html index 9599344..f10037b 100644 --- a/templates/components/dog/_preview_DDL_dog.html +++ b/templates/components/dog/_preview_DDL_dog.html @@ -1,15 +1,2 @@ -{% if not is_blank_row %} -
{{ dog.name }}
-{% else %} - -{% endif %} \ No newline at end of file +
{% if not is_blank_row %}{{ dog.name }}{% endif %}
diff --git a/templates/components/dog/_row_dog_command_link.html b/templates/components/dog/_row_dog_command_link.html index 17a4b48..92927a2 100644 --- a/templates/components/dog/_row_dog_command_link.html +++ b/templates/components/dog/_row_dog_command_link.html @@ -4,6 +4,9 @@ {% include 'components/dog/_preview_DDL_dog.html' %} + + {% include 'components/dog/_preview_DDL_command_category.html' %} + {% include 'components/dog/_preview_DDL_command.html' %} @@ -19,11 +22,15 @@ {% else %} {% set dog = link.dog %} - + {% include 'components/dog/_preview_DDL_dog.html' %} + {% set command_category = link.command.command_category %} + + {% include 'components/dog/_preview_DDL_command_category.html' %} + {% set command = link.command %} - + {% include 'components/dog/_preview_DDL_command.html' %} diff --git a/templates/components/dog/deprecated/_preview_DDL_command.html b/templates/components/dog/deprecated/_preview_DDL_command.html new file mode 100644 index 0000000..9be09a8 --- /dev/null +++ b/templates/components/dog/deprecated/_preview_DDL_command.html @@ -0,0 +1,21 @@ + +
{% if not is_blank_row %}{{ command.name }}{% endif %}
+ +{# + { % if not is_blank_row % } +
{ { command.name } }
+ { % else % } + + { % endif % } +#} diff --git a/templates/components/dog/deprecated/_preview_DDL_command_category.html b/templates/components/dog/deprecated/_preview_DDL_command_category.html new file mode 100644 index 0000000..25d018c --- /dev/null +++ b/templates/components/dog/deprecated/_preview_DDL_command_category.html @@ -0,0 +1,21 @@ + +
{% if not is_blank_row %}{{ command_category.name }}{% endif %}
+ +{# + { % if not is_blank_row % } +
{ { command_category.name } }
+ { % else % } + + { % endif % } +#} \ No newline at end of file diff --git a/templates/components/dog/deprecated/_preview_DDL_dog.html b/templates/components/dog/deprecated/_preview_DDL_dog.html new file mode 100644 index 0000000..8f5d2ab --- /dev/null +++ b/templates/components/dog/deprecated/_preview_DDL_dog.html @@ -0,0 +1,21 @@ + +
{% if not is_blank_row %}{{ dog.name }}{% endif %}
+ +{# + { % if not is_blank_row % } +
{ { dog.name } }
+ { % else % } + + { % endif % } +#} \ No newline at end of file diff --git a/templates/layouts/layout.html b/templates/layouts/layout.html index 13dc2ee..d6b8831 100644 --- a/templates/layouts/layout.html +++ b/templates/layouts/layout.html @@ -39,6 +39,7 @@ var attrIdAccessLevel = "{{ model.ATTR_ID_ACCESS_LEVEL }}"; var attrIdCurrency = "{{ model.ATTR_ID_CURRENCY }}"; var attrIdCommand = "{{ model.ATTR_ID_COMMAND }}"; + var attrIdCommandCategory = "{{ model.ATTR_ID_COMMAND_CATEGORY }}"; var attrIdDog = "{{ model.ATTR_ID_DOG }}"; var attrIdDogCommandLink = "{{ model.ATTR_ID_DOG_COMMAND_LINK }}"; var attrTextCollapsed = "{{ model.ATTR_TEXT_COLLAPSED }}"; @@ -65,6 +66,7 @@ var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}"; var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}"; var flagActive = "{{ model.FLAG_ACTIVE }}"; + var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}"; var flagAdd = "{{ model.FLAG_ADD }}"; var flagAddress = "{{ model.FLAG_ADDRESS }}"; var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}"; @@ -74,16 +76,18 @@ var flagCallback = "{{ model.FLAG_CALLBACK }}"; var flagCancel = "{{ model.FLAG_CANCEL }}"; var flagCard = "{{ model.FLAG_CARD }}"; + var flagCheckbox = "{{ model.FLAG_CHECKBOX }}"; var flagCity = "{{ model.FLAG_CITY }}"; var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}"; var flagCode = "{{ model.FLAG_CODE }}"; var flagCollapsed = "{{ model.FLAG_COLLAPSED }}"; var flagCollapsible = "{{ model.FLAG_COLLAPSIBLE }}"; var flagColumn = "{{ model.FLAG_COLUMN }}"; + var flagCommand = "{{ model.FLAG_COMMAND }}"; + var flagCommandCategory = "{{ model.FLAG_COMMAND_CATEGORY }}"; var flagComment = "{{ model.FLAG_COMMENT }}"; // var flagContactUs = "{{ model.FLAG_CONTACT_US }}"; var flagContainer = "{{ model.FLAG_CONTAINER }}"; - var flagContainerCheckbox = "{{ model.FLAG_CONTAINER_CHECKBOX }}"; var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}"; var flagCounty = "{{ model.FLAG_COUNTY }}"; var flagCsrfToken = "{{ model.FLAG_CSRF_TOKEN }}"; @@ -94,6 +98,7 @@ var flagDialog = "{{ model.FLAG_DIALOG }}"; var flagDirty = "{{ model.FLAG_DIRTY }}"; var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}"; + var flagDog = "{{ model.FLAG_DOG }}"; var flagDragging = "dragging"; var flagDragOver = "drag-over"; var flagEdit = "{{ model.FLAG_EDIT }}"; @@ -107,6 +112,7 @@ var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}"; var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}"; var flagInitialised = "{{ model.FLAG_INITIALISED }}"; + var flagIsChecked = "{{ model.FLAG_IS_CHECKED }}"; // var flagItems = "{{ model.FLAG_ITEMS }}"; // var flagKeyPrimary = "{{ model.FLAG_KEY_PRIMARY }}"; var flagLeftHandStub = "{{ model.FLAG_LEFT_HAND_STUB }}"; @@ -143,6 +149,7 @@ var flagRows = "{{ model.FLAG_ROWS }}"; var flagSave = "{{ model.FLAG_SAVE }}"; var flagScrollable = "{{ model.FLAG_SCROLLABLE }}"; + var flagSearch = "{{ model.FLAG_SEARCH }}"; var flagSlider = "{{ model.FLAG_SLIDER }}"; var flagStatus = "{{ model.FLAG_STATUS }}"; var flagSubmit = "{{ model.FLAG_SUBMIT }}"; diff --git a/templates/pages/dog/_dog_command_links.html b/templates/pages/dog/_dog_command_links.html index e410f61..b96436f 100644 --- a/templates/pages/dog/_dog_command_links.html +++ b/templates/pages/dog/_dog_command_links.html @@ -7,6 +7,13 @@ {{ model.form_filters.hidden_tag() }}
+
{{ model.form_filters.id_dog.label }} {{ model.form_filters.id_dog() }} @@ -14,6 +21,13 @@

{{ error }}

{% endfor %}
+
+ {{ model.form_filters.id_command_category.label }} + {{ model.form_filters.id_command_category() }} + {% for error in model.form_filters.id_command_category.errors %} +

{{ error }}

+ {% endfor %} +
{{ model.form_filters.id_command.label }} {{ model.form_filters.id_command() }} @@ -21,12 +35,14 @@

{{ error }}

{% endfor %}
-
+
{{ model.form_filters.active_only.label }} {{ model.form_filters.active_only() }} {% for error in model.form_filters.active_only.errors %}

{{ error }}

{% endfor %} + {% set class_name = model.FLAG_FILTER + ' ' + model.FLAG_ACTIVE_ONLY + ' ' + model.FLAG_CHECKBOX %} + {% include 'components/common/buttons/_icon_checkbox.html' %}
@@ -38,6 +54,7 @@ Dog + Command Category Command Hand Signal Notes @@ -64,6 +81,7 @@