diff --git a/specifyweb/backend/context/app_resource.py b/specifyweb/backend/context/app_resource.py index ef01e17058b..d374ff4af76 100644 --- a/specifyweb/backend/context/app_resource.py +++ b/specifyweb/backend/context/app_resource.py @@ -36,6 +36,19 @@ "invertebrate": "invertebrate", "geology": "geology", } +DISCIPLINE_NAMES = { + 'fish': 'Ichthyology', + 'herpetology': 'Herpetology', + 'paleobotany': 'Paleobotany', + 'invertpaleo': 'Invertebrate Paleontology', + 'vertpaleo': 'Vertebrate Paleontology', + 'bird': 'Ornithology', + 'mammal': 'Mammalogy', + 'insect': 'Entomology', + 'botany': 'Botany', + 'invertebrate': 'Invertebrate Zoology', + 'geology': 'Geology', +} FORM_RESOURCE_EXCLUDED_LST = [ "fish/fishbase.views.xml", diff --git a/specifyweb/specify/management/commands/run_key_migration_functions.py b/specifyweb/specify/management/commands/run_key_migration_functions.py index 6209a0d0094..83a14b9e7bc 100644 --- a/specifyweb/specify/management/commands/run_key_migration_functions.py +++ b/specifyweb/specify/management/commands/run_key_migration_functions.py @@ -74,6 +74,8 @@ def fix_schema_config(stdout: WriteToStdOut | None = None): usc.add_quantities_gift, # specify 0032 usc.update_paleo_desc, # specify 0033 usc.update_accession_date_fields # specify 0034 + usc.create_discipline_type_picklist # specify 0042 + usc.update_discipline_type_splocalecontaineritem # specify specify 0042 ] log_and_run(funcs, stdout) diff --git a/specifyweb/specify/migration_utils/update_schema_config.py b/specifyweb/specify/migration_utils/update_schema_config.py index 775299a8d07..cf69b4066df 100644 --- a/specifyweb/specify/migration_utils/update_schema_config.py +++ b/specifyweb/specify/migration_utils/update_schema_config.py @@ -1397,3 +1397,68 @@ def revert_version_required(apps): for table, fields in MIGRATION_0035_FIELDS.items(): for field in fields: update_table_field_schema_config_params(table, discipline.id, field, updated_config_params, apps) + +# ########################################## +# Used in 0042_discipline_type_picklist.py +# ########################################## + +from specifyweb.backend.context.app_resource import DISCIPLINE_NAMES + +DISCIPLINE_TYPE_PICKLIST_NAME = 'DisciplineType' + +def create_discipline_type_picklist(apps): + Collection = apps.get_model('specify', 'Collection') + Picklist = apps.get_model('specify', 'Picklist') + Picklistitem = apps.get_model('specify', 'Picklistitem') + + # Create a discipline type picklist for each collection + for collection in Collection.objects.all(): + picklist, created = Picklist.objects.get_or_create( + name=DISCIPLINE_TYPE_PICKLIST_NAME, + type=0, + collection=collection, + defaults={ + "issystem": True, + "readonly": True, + "sizelimit": -1, + "sorttype": 1, + } + ) + # If the picklist doesn't exist, create a new one + if created: + ordinal = 1 + items = [] + for value, title in DISCIPLINE_NAMES.items(): + items.append( + Picklistitem( + picklist=picklist, + ordinal=ordinal, + value=value, + title=title, + ) + ) + ordinal += 1 + Picklistitem.objects.bulk_create(items) + +def revert_discipline_type_picklist(apps): + Picklist = apps.get_model('specify', 'Picklist') + + Picklist.objects.filter(name=DISCIPLINE_TYPE_PICKLIST_NAME).delete() + +def update_discipline_type_splocalecontaineritem(apps): + Splocalecontaineritem = apps.get_model("specify", "Splocalecontaineritem") + + Splocalecontaineritem.objects.filter( + container__name="discipline", + container__schematype=0, + name="type", + ).update(picklistname=DISCIPLINE_TYPE_PICKLIST_NAME, isrequired=True) + +def revert_discipline_type_splocalecontaineritem(apps): + Splocalecontaineritem = apps.get_model("specify", "Splocalecontaineritem") + + Splocalecontaineritem.objects.filter( + container__name="discipline", + container__schematype=0, + name="type", + ).update(picklistname=None, isrequired=None) diff --git a/specifyweb/specify/migrations/0042_discipline_type_picklist.py b/specifyweb/specify/migrations/0042_discipline_type_picklist.py new file mode 100644 index 00000000000..f75d72aeb45 --- /dev/null +++ b/specifyweb/specify/migrations/0042_discipline_type_picklist.py @@ -0,0 +1,23 @@ +from django.db import migrations +from specifyweb.specify.migration_utils import update_schema_config as usc + +class Migration(migrations.Migration): + dependencies = [ + ('specify', '0041_add_missing_schema_after_reorganization'), + ] + + def apply_migration(apps, schema_editor): + usc.create_discipline_type_picklist(apps) + usc.update_discipline_type_splocalecontaineritem(apps) + + def revert_migration(apps, schema_editor): + usc.revert_discipline_type_picklist(apps) + usc.revert_discipline_type_splocalecontaineritem(apps) + + operations = [ + migrations.RunPython( + apply_migration, + revert_migration, + atomic=True, + ), + ]