Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
2a5eda8
fix:reverse_hide_component_fields to be set to Falses
CarolineDenis May 29, 2026
e8466af
fix: Do not dedupe localized strings across all languages
CarolineDenis May 29, 2026
25bf8b2
fix: Simplify MultipleObjectsReturned
CarolineDenis May 29, 2026
063a7c6
Fix: Use db_alias for migration db connexion
CarolineDenis May 29, 2026
6cc5ffa
Fix: flips existing row back to isDatabaseConstraint=True
CarolineDenis May 29, 2026
1ee0f1e
@CarolineDenis
CarolineDenis May 29, 2026
f0dd766
Fix: verify existing user permissions
CarolineDenis May 29, 2026
6dfe4eb
Fix: Remove the use of f-string
CarolineDenis May 29, 2026
8893687
fix: prevent incorrect reuse when pairing tree defs and disciplines
CarolineDenis May 29, 2026
32e2972
fix: remove exclusion so partially migrated disciplines are repaired
CarolineDenis May 29, 2026
6d1403c
Fix: Update splocalecontainer items
CarolineDenis May 29, 2026
d60939d
Fix: Remove shadowing import in geo migration
CarolineDenis May 29, 2026
470d99d
Fix: Revert relative age migration instead of applying again
CarolineDenis May 29, 2026
befb73b
Fix fix order of revert migration in tectonic migration
CarolineDenis May 29, 2026
8a1e35b
Fix: Indentation
CarolineDenis May 29, 2026
82bb520
Fix: Use deterministic ordering before positional pairing
CarolineDenis May 29, 2026
8edb112
Fix: Log only on debug
CarolineDenis May 29, 2026
efc8228
Fix: Fix age type
CarolineDenis May 29, 2026
2366664
Fix: Improve logger
CarolineDenis May 29, 2026
4c0f9f8
Fix: Remove unecessary param in def migration
CarolineDenis May 29, 2026
fac87e9
Fix: Remove projects from legacy tests
CarolineDenis May 29, 2026
c8663e9
Fix: Change settings import
CarolineDenis May 29, 2026
a940612
Fix:Incomplete field initialization in conditional createt
CarolineDenis May 29, 2026
4e1d45a
Fix: Incomplete field initialization in conditional create
CarolineDenis May 29, 2026
e228051
Fix: Put model name in lower case for consistency and reversability
CarolineDenis May 29, 2026
aff97b8
Fix: Revert chnages
CarolineDenis May 29, 2026
1e13637
Fix: Remove double id rank
CarolineDenis May 29, 2026
624deee
Fix: Indentation
CarolineDenis May 29, 2026
cd740a7
Fix: Add strict=False to allow diff length
CarolineDenis May 29, 2026
05f6298
Fix: Remove duplicate
CarolineDenis May 29, 2026
cf79196
Fix: Remove using from geo migration
CarolineDenis May 29, 2026
c341f55
Fix: Bring back legacy project test
CarolineDenis May 29, 2026
72414b6
Fix: Remove values_list() in favor of .all
CarolineDenis May 29, 2026
7112c84
fix: stop shadowing catnum unique in collection function for migration
melton-jason Jun 2, 2026
eda65ab
refactor: improve readability of condition when enabling editable uni…
melton-jason Jun 2, 2026
6e37e1e
fix: simplify fix_global_rules helper function
melton-jason Jun 3, 2026
48face1
fix: use manager over base manager for tree patches
melton-jason Jun 3, 2026
fdfe21b
fix: remove check for old newly created DBs in specify 7
melton-jason Jun 3, 2026
96bf0cc
fix: bring back is_sp6_user_permissions_migrated
melton-jason Jun 3, 2026
cfad41f
fix: change ordering of admin checks to evaluate more common first
melton-jason Jun 3, 2026
2e1835e
fix: remove unused query
melton-jason Jun 3, 2026
f4d6491
refactor: use defaults in get_or_create for Roles
melton-jason Jun 3, 2026
f792d5e
chore: add refactor note
melton-jason Jun 3, 2026
91aaf38
refactor: move DEBUG check into log_sqlalchemy_query
melton-jason Jun 3, 2026
6b4d796
fix: remove unused log_sqlalchemy_query function
melton-jason Jun 3, 2026
ab8320b
fix: incorrect Discipline -> tectonicunittreedef pairing when resolvi…
melton-jason Jun 3, 2026
4196c1e
refactor: optimize fix_taxon_treedef_discipline_links to one query
melton-jason Jun 3, 2026
6e1902e
refactor: move fix_tectonic_links to TectonicUnit file
melton-jason Jun 3, 2026
39ec012
fix: forward tectonic unit migration functions
melton-jason Jun 4, 2026
9f9df79
fix: use Migrator user for all run_key_migration operations
melton-jason Jun 5, 2026
a95bc71
perf: reduce set_discipline_for_taxon_treedefs to single DB hit
melton-jason Jun 5, 2026
1136e52
refactor: collapse default tectonicunit ranks to tuple
melton-jason Jun 5, 2026
5418c64
fix: simplify and move reverse tectonic root node migration
melton-jason Jun 5, 2026
419d69b
fix: handle case when businessrule app is not ready but migrations ar…
melton-jason Jun 5, 2026
19f5c1a
refactor: move reverse migration to migration file
melton-jason Jun 5, 2026
9ddf13e
fix: account for custom Tectonic Trees when reverting migration
melton-jason Jun 5, 2026
3396fe4
fix: handle case when root node is synonymized in reverse migration
melton-jason Jun 8, 2026
3d178cf
Merge branch 'v7_12_0_7_base' into issue-8124-8126-fix-7660-7682-2-af…
melton-jason Jun 10, 2026
c037340
Refactor: Create SchemaReader for schema migration related functions
CarolineDenis Jun 15, 2026
a641227
Refactor: Create SchemaWriter for schema writing functions
CarolineDenis Jun 15, 2026
93002be
Refactor: Rename update_Schema_config to migrationHelper
CarolineDenis Jun 15, 2026
b6964a7
Refactor: Fix Import
CarolineDenis Jun 15, 2026
915f36a
Refactor: Create a deduplication file
CarolineDenis Jun 15, 2026
a2c9f1c
Refactor: Change import
CarolineDenis Jun 15, 2026
0d42508
Fix: Remove imports
CarolineDenis Jun 15, 2026
e803671
Refactor: Remove imports
CarolineDenis Jun 15, 2026
6a507dc
Refactor: Renaming
CarolineDenis Jun 15, 2026
e9df668
Refactor: Avoid circular imports
CarolineDenis Jun 15, 2026
1c65df5
Fix: Normalize revert filters to match the forward writes
CarolineDenis Jun 15, 2026
8e71136
Refactor: Compartimentalize migration helpers
CarolineDenis Jun 15, 2026
722e1c7
Refactor: Compartimentalize sp7_Schema_config_field to their own migr…
CarolineDenis Jun 15, 2026
919267c
feat: delete TectonicUnit tree in reverse migration
melton-jason Jun 15, 2026
b1608c2
Refactor: Import change
CarolineDenis Jun 15, 2026
8382581
Refactor: Remove usc imports
CarolineDenis Jun 15, 2026
4de042b
Cleaning
CarolineDenis Jun 15, 2026
f9fe47e
fix: use TectonicUnit QuerySet instead of manager
melton-jason Jun 15, 2026
4a5d1b4
Refactor: Add init file to migration helper app
CarolineDenis Jun 16, 2026
e269935
fix: Imports
CarolineDenis Jun 16, 2026
9b7eb9b
fix: Imports
CarolineDenis Jun 16, 2026
4f93c13
fix: Typo
CarolineDenis Jun 16, 2026
f002c2f
Refactor: Remove usc from run key migration
CarolineDenis Jun 16, 2026
14b6b4e
Test: Test new python path for github Ci
CarolineDenis Jun 16, 2026
0c05cef
fix: consider changes to DisciplineType schema item in reverse migration
melton-jason Jun 16, 2026
948873c
refactor: optimize DisciplineType Picklist creation for scale
melton-jason Jun 16, 2026
c40f93d
fix: use DisciplineType picklist for newly created Disciplines
melton-jason Jun 16, 2026
91589ea
fix: create DisciplineType PickList when creating Collection
melton-jason Jun 16, 2026
0ad7489
chore: remove temp_models file
melton-jason Jun 16, 2026
cbbcc03
Revert yml chnages
CarolineDenis Jun 17, 2026
4c752cc
Revert
CarolineDenis Jun 17, 2026
a81195a
fix: deduplication.py case sensitivity
CarolineDenis Jun 17, 2026
f3d2b89
Merge remote-tracking branch 'origin/issue-8124-8126-fix-7660-7682-2-…
CarolineDenis Jun 17, 2026
e4ae06e
Ensure SP7_DEBUG variable is set correctly
CarolineDenis Jun 17, 2026
2eb531c
fix: imports in update_schema_config file
melton-jason Jun 17, 2026
af06fed
fix: remove extra update_schema_config file
melton-jason Jun 17, 2026
4a208b1
fix: remove unused file/definition
CarolineDenis Jun 18, 2026
0be0c12
fix: imports and performance for 0004 migration
melton-jason Jun 18, 2026
34aaccb
chore: add bug comment for irrevirsible migration
melton-jason Jun 18, 2026
8093c2a
chore: reformat helper functions
melton-jason Jun 22, 2026
601c0d6
chore: correct migration helper names for clarity
melton-jason Jun 22, 2026
0399624
fix: create SpLocaleItemStr records when creating Schema Config recor…
melton-jason Jun 22, 2026
7f9a8e2
chore: remove redundant objects and further compartmentalize
melton-jason Jun 23, 2026
f4b6656
fix: typo in UserRole description
melton-jason Jun 23, 2026
170b732
chore: fix indentation of comment
melton-jason Jun 23, 2026
ddb8a78
fix: typo in field name for 0023
melton-jason Jun 23, 2026
cd84f91
fix: specify 'en' language in 0033 migration and optimize
melton-jason Jun 23, 2026
92ab2bf
fix: only consider non-workbench schema items in 0023 reverse
melton-jason Jun 23, 2026
b7518ff
fix: 0027 revert not matching fields (also optimize)
melton-jason Jun 23, 2026
374d5cf
fix: only modify en locale strings and optimize 0027
melton-jason Jun 23, 2026
04392d9
refactor: simplify 0027 revert schema config changes
melton-jason Jun 23, 2026
4f1494e
chore: add refactor comments to 0017 for improvement feasability
melton-jason Jun 23, 2026
6b70846
fix: field lists being lowered in 0021 migration
melton-jason Jun 23, 2026
63b2693
refactor: optimizations
melton-jason Jun 23, 2026
0a618d4
fix: add 0040 migration updates to SchemaConfig default file
melton-jason Jun 23, 2026
cd1ff89
Merge branch 'issue-8124-8126-fix-7660-7682-2-after-review-2' into is…
melton-jason Jun 23, 2026
7cbc57d
fix: use correct case for table labels and descriptions
melton-jason Jun 24, 2026
9ceac77
fix: use correct Picklist Type when filtering in migration
melton-jason Jun 24, 2026
d7f2382
Merge pull request #8223 from specify/issue-8058
CarolineDenis Jun 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions config/common/global_picklists.json
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,85 @@
{ "title": "Fossil record", "value": "Fossil record" },
{ "title": "Radiometric (adjacent)", "value": "Radiometric (adjacent)" }
]
},
{
"name": "DisciplineType",
"formatter": null,
"issystem": true,
"readonly": true,
"sizelimit": -1,
"sorttype": 1,
"tablename": null,
"type": 0,
"version": 0,
"items": [
{
"ordinal": 1,
"title": "Ichthyology",
"value": "fish",
"version": 0
},
{
"ordinal": 2,
"title": "Herpetology",
"value": "herpetology",
"version": 0
},
{
"ordinal": 3,
"title": "Paleobotany",
"value": "paleobotany",
"version": 0
},
{
"ordinal": 4,
"title": "Invertebrate Paleontology",
"value": "invertpaleo",
"version": 0
},
{
"ordinal": 5,
"title": "Vertebrate Paleontology",
"value": "vertpaleo",
"version": 0
},
{
"ordinal": 6,
"title": "Ornithology",
"value": "bird",
"version": 0
},
{
"ordinal": 7,
"title": "Mammalogy",
"value": "mammal",
"version": 0
},
{
"ordinal": 8,
"title": "Entomology",
"value": "insect",
"version": 0
},
{
"ordinal": 9,
"title": "Botany",
"value": "botany",
"version": 0
},
{
"ordinal": 10,
"title": "Invertebrate Zoology",
"value": "invertebrate",
"version": 0
},
{
"ordinal": 11,
"title": "Geology",
"value": "geology",
"version": 0
}
]
}
]
}
58 changes: 57 additions & 1 deletion config/common/schema_localization_en.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"ageuncertainty": {"name": "Age Uncertainty", "desc": "Age Uncertainty", "format": null, "ishidden": false, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null},
"collectiondate": {"name": "Collection Date", "desc": "Collection Date", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Date", "isrequired": false, "weblinkname": null},
"collectionobject": {"name": "Collection Object", "desc": "Collection Object", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": true, "weblinkname": null},
"component": {"name": "Component", "desc": "Component", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null},
"createdbyagent": {"name": "Created By Agent", "desc": "Created By Agent", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null},
"date1": {"name": "Date1", "desc": "Date1", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Date", "isrequired": false, "weblinkname": null},
"date2": {"name": "Date2", "desc": "Date2", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Date", "isrequired": false, "weblinkname": null},
Expand Down Expand Up @@ -2062,6 +2063,60 @@
"name": "Common Name Tx Citation",
"desc": "Common Name Tx Citation"
},
"component": {
"items": {
"absoluteages": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "OneToMany", "isrequired": false, "weblinkname": null, "name": "Absolute Ages", "desc": "Absolute Ages"},
"catalognumber": {"format": null, "ishidden": false, "isuiformatter": null, "picklistname": null, "type": "java.lang.String", "isrequired": false, "weblinkname": null, "name": "Catalog Number", "desc": "User-assigned identifier for the component"},
"collectionobject": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": true, "weblinkname": null, "name": "Collection Object", "desc": "Collection Object"},
"createdbyagent": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null, "name": "Created By Agent", "desc": "Created By Agent"},
"identifiedby": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null, "name": "Identified By", "desc": "Identified By"},
"identifieddate": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Calendar", "isrequired": false, "weblinkname": null, "name": "Identified Date", "desc": "Identified Date"},
"integer1": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Integer1", "desc": "Integer1"},
"integer2": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Integer2", "desc": "Integer2"},
"integer3": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Integer3", "desc": "Integer3"},
"integer4": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Integer4", "desc": "Integer4"},
"integer5": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Integer5", "desc": "Integer5"},
"integer6": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Integer6", "desc": "Integer6"},
"modifiedbyagent": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null, "name": "Modified By Agent", "desc": "Modified By Agent"},
"name": {"format": null, "ishidden": false, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null, "name": "Name", "desc": "The name from a taxon tree corresponding to the chosen type."},
"number1": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null, "name": "Number1", "desc": "Number1"},
"number2": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null, "name": "Number2", "desc": "Number2"},
"number3": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null, "name": "Number3", "desc": "Number3"},
"number4": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null, "name": "Number4", "desc": "Number4"},
"number5": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null, "name": "Number5", "desc": "Number5"},
"number6": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null, "name": "Number6", "desc": "Number6"},
"proportion": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Proportion", "desc": "Specify the proportion of the component relative to the whole."},
"relativeages": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "OneToMany", "isrequired": false, "weblinkname": null, "name": "Relative Ages", "desc": "Relative Ages"},
"role": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.String", "isrequired": false, "weblinkname": null, "name": "Role", "desc": "Define the role or purpose of the component in the overall collection."},
"text1": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Text1", "desc": "Text1"},
"text2": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Text2", "desc": "Text2"},
"text3": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Text3", "desc": "Text3"},
"text4": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Text4", "desc": "Text4"},
"text5": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Text5", "desc": "Text5"},
"text6": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Text6", "desc": "Text6"},
"timestampcreated": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.sql.Timestamp", "isrequired": true, "weblinkname": null, "name": "Timestamp Created", "desc": "Timestamp Created"},
"timestampmodified": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.sql.Timestamp", "isrequired": false, "weblinkname": null, "name": "Timestamp Modified", "desc": "Timestamp Modified"},
"type": {"format": null, "ishidden": false, "isuiformatter": null, "picklistname": "CollectionObjectType", "type": "ManyToOne", "isrequired": true, "weblinkname": null, "name": "Type", "desc": "Determines the valid options for component names."},
"uniqueidentifier": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.String", "isrequired": false, "weblinkname": null, "name": "Unique Identifier", "desc": "Uniquely identifies each component record"},
"verbatimname": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null, "name": "Verbatim Name", "desc": "The original name printed or associated with the component."},
"version": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Integer", "isrequired": false, "weblinkname": null, "name": "Version", "desc": "Version"},
"yesno1": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Boolean", "isrequired": false, "weblinkname": null, "name": "Yes No1", "desc": "Yes No1"},
"yesno2": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Boolean", "isrequired": false, "weblinkname": null, "name": "Yes No2", "desc": "Yes No2"},
"yesno3": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Boolean", "isrequired": false, "weblinkname": null, "name": "Yes No3", "desc": "Yes No3"},
"yesno4": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Boolean", "isrequired": false, "weblinkname": null, "name": "Yes No4", "desc": "Yes No4"},
"yesno5": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Boolean", "isrequired": false, "weblinkname": null, "name": "Yes No5", "desc": "Yes No5"},
"yesno6": {"format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.lang.Boolean", "isrequired": false, "weblinkname": null, "name": "Yes No6", "desc": "Yes No6"}
},
"format": null,
"ishidden": false,
"isuiformatter": null,
"picklistname": null,
"type": null,
"aggregator": null,
"defaultui": null,
"name": "Component",
"desc": "Component"
},
"conservdescription": {
"items": {
"backgroundinfo": {"name": "Background Info", "desc": "Any background information on the object.", "format": null, "ishidden": false, "isuiformatter": false, "picklistname": null, "type": "text", "isrequired": false, "weblinkname": null},
Expand Down Expand Up @@ -2497,7 +2552,7 @@
"taxontreedef": {"name": "Taxon Tree Def", "desc": "Taxon Tree Def", "format": null, "ishidden": true, "isuiformatter": false, "picklistname": null, "type": null, "isrequired": false, "weblinkname": null},
"timestampcreated": {"name": "Timestamp Created", "desc": "Timestamp Created", "format": null, "ishidden": true, "isuiformatter": false, "picklistname": null, "type": null, "isrequired": false, "weblinkname": null},
"timestampmodified": {"name": "Timestamp Modified", "desc": "Timestamp Modified", "format": null, "ishidden": true, "isuiformatter": false, "picklistname": null, "type": null, "isrequired": false, "weblinkname": null},
"type": {"name": "Type", "desc": "Type", "format": null, "ishidden": false, "isuiformatter": false, "picklistname": null, "type": null, "isrequired": false, "weblinkname": null},
"type": {"name": "Type", "desc": "Type", "format": null, "ishidden": false, "isuiformatter": false, "picklistname": "DisciplineType", "type": null, "isrequired": false, "weblinkname": null},
"usergroups": {"name": "User Groups", "desc": "User Groups", "format": null, "ishidden": true, "isuiformatter": false, "picklistname": null, "type": null, "isrequired": false, "weblinkname": null},
"version": {"name": "Version", "desc": "Version", "format": null, "ishidden": true, "isuiformatter": false, "picklistname": null, "type": null, "isrequired": false, "weblinkname": null}
},
Expand Down Expand Up @@ -5288,6 +5343,7 @@
"ageuncertainty": {"name": "Age Uncertainty", "desc": "Age Uncertainty", "format": null, "ishidden": false, "isuiformatter": null, "picklistname": null, "type": "java.math.BigDecimal", "isrequired": false, "weblinkname": null},
"collectiondate": {"name": "Collection Date", "desc": "Collection Date", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Date", "isrequired": false, "weblinkname": null},
"collectionobject": {"name": "Collection Object", "desc": "Collection Object", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": true, "weblinkname": null},
"component": {"name": "Component", "desc": "Component", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null},
"createdbyagent": {"name": "Created By Agent", "desc": "Created By Agent", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "ManyToOne", "isrequired": false, "weblinkname": null},
"date1": {"name": "Date1", "desc": "Date1", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Date", "isrequired": false, "weblinkname": null},
"date2": {"name": "Date2", "desc": "Date2", "format": null, "ishidden": true, "isuiformatter": null, "picklistname": null, "type": "java.util.Date", "isrequired": false, "weblinkname": null},
Expand Down
62 changes: 11 additions & 51 deletions specifyweb/backend/businessrules/migration_utils.py
Original file line number Diff line number Diff line change
@@ -1,71 +1,31 @@
from typing import Tuple, List

from specifyweb.backend.businessrules.uniqueness_rules import create_uniqueness_rule


def catnum_rule_editable(apps, schema_editor=None):
""" Find any CollectionObject catalogNumber must be unique to Collection
rules which are readonly on the frontend (have isDatabaseConstraint=True)
and set their isDatabaseConstraint=False.

Generally should be run only after migration businessrules/0003 has been
applied
"""
UniquenessRule = apps.get_model("businessrules", "UniquenessRule")

model_rules = UniquenessRule.objects.filter(modelName="Collectionobject", isDatabaseConstraint=True)

catalog_number_rules: List[int] = []
for rule in model_rules:
model_rules = UniquenessRule.objects.filter(
modelName="Collectionobject",
isDatabaseConstraint=True
)

catalog_number_rules: list[int] = []
for rule in model_rules:
rule_fields = rule.uniquenessrulefield_set.all()

fields = rule_fields.filter(isScope=False)
scopes = rule_fields.filter(isScope=True)

# We're only interested in the rule "CollectionObject catalogNumber
# We're only interested in the rule "CollectionObject catalogNumber
# must be unique to Collection"
# We check for length of fields and scopes because get() raises an
# We check for length of fields and scopes because get() raises an
# exception if more than one result is returned
if (len(fields) == 1 and len(scopes) == 1) and (fields.get().fieldPath.lower() == "catalognumber" and scopes.get().fieldPath.lower() == "collection"):
catalog_number_rules.append(rule.id)

rules_to_update = UniquenessRule.objects.filter(id__in=catalog_number_rules)
rules_to_update.update(isDatabaseConstraint=False)


def catnum_rule_uneditable(apps, schema_editor=None):
""" Find any CollectionObject catalogNumber must be unique to Collection
rules which are editable on the frontend (have isDatabaseConstraint=False)
and set their isDatabaseConstraint=True.

Generally should be run when migration businessrules/0003 is being reverted
"""
Discipline = apps.get_model("specify", "Discipline")
UniquenessRule = apps.get_model("businessrules", "UniquenessRule")

for discipline in Discipline.objects.all():
model_rules = UniquenessRule.objects.filter(modelName="Collectionobject", discipline_id=discipline.id, isDatabaseConstraint=False)

has_catalognumber_rule = False
for rule in model_rules:
rule_fields = rule.uniquenessrulefield_set.all()

fields = rule_fields.filter(isScope=False)
scopes = rule_fields.filter(isScope=True)

# We're only interested in the rule "CollectionObject catalogNumber
# must be unique to Collection"
# We check for length of fields and scopes because get() raises an
# exception if more than one result is returned
if (len(fields) == 1 and len(scopes) == 1) and (fields.get().fieldPath.lower() == "catalognumber" and scopes.get().fieldPath.lower() == "collection"):
has_catalognumber_rule = True

if not has_catalognumber_rule:
create_uniqueness_rule(
model_name="Collectionobject",
discipline=discipline,
is_database_constraint=True,
fields=["catalogNumber"],
scopes=["collection"],
registry=apps,
)
Loading
Loading