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

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

View File

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