Batch Edit, Workbench, Query Builder backend improvements#4929
Batch Edit, Workbench, Query Builder backend improvements#4929realVinayak wants to merge 77 commits intoproductionfrom
Conversation
Bumps [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) from 1.2.11 to 1.3.0. - [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases) - [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/master/CHANGES) - [Commits](https://github.com/sqlalchemy/sqlalchemy/commits) Signed-off-by: dependabot[bot] <support@github.com>
…nship in tree ranks
-- will continue adding
It was a bad idea originally, the first time.
| @@ -177,33 +181,33 @@ def from_stringid(cls, stringid, is_relation): | |||
| extracted_fieldname, date_part = extract_date_part(field_name) | |||
| field = node.get_field(extracted_fieldname, strict=False) | |||
|
|
|||
There was a problem hiding this comment.
Yikes, you're quite brave for merging production in this branch. Most of the code looks not too bad. Except this one, where I thought some insider info will be necessary.
I know getting rid of TreeRankQuery seems like an easy way, but trust me, TreeRankQuery makes batch-edit very simple. Don't take my word for it. Go to the sibling file batch_edit.py, and you'll see just how minimal changes were necessary to support dataset construction when trees are selected. (IIRC, there are like just 3 places, quite isolated from an abstraction perspective).
Here's the idea behind TreeRankQuery. Basically, each rank is considered as a relationship from tree to itself. So, Kingdom is a to-one relationship from Taxon to Taxon. So, when user selects Collectionobject -> Determination -> Taxon (species, fullname), join path becomes
determination, taxon, species, fullname
Pros
- No need for tree_rank and tree_field fields.
- It's quite easy to test if join path ends with relationship (just check the last field is relationship or not). You'd previously also have to think about tree_rank and tree_field.
- The code, before this merge, already constructs correct queries for something like
determination, taxon, species, createdby, firstname, effectively allowing relationships from tree ranks. Try doing that with tree_rank and tree_field! - Most importantly (/s), it makes batch-edit quite simple. For every row, batch-edit dataset construction needs to look at what the IDs are. When you have TreeRankQuery, tree ranks are effectively just like any other relationship.
Cons:
- Hard to merge from production, which is a valid reason
There was a problem hiding this comment.
Thanks! I was reluctant to merge prod here initially but the alternative seemed to be a bigger headache. I'll look into incorporating TreeRankQuery in the PR that follows #5417
* Enable trees in queries * Use query construct code from #4929 * Update unit test * Remove param_count * Display tree name in query error * Update TreeRankQuery to fix implicit ORs - see: #6196 (comment) * Allow removing last row in Batch Edit * Make a missing rank info dialog which proceeds to dataset creation * Augment tree queries with missing ranks for batch edit * Lint code with ESLint and Prettier Triggered by 65f7d21 on branch refs/heads/issue-6127 * Adjust apply_batch_edit_pack for multiple trees * Add a discipline type in tests * Un-enforce TreeRankRecord in upload plan * Add loading action to missing ranks dialog * Move table name to same line in missing fields dialog * Handle case when rank name has spaces * Add a close button to missing ranks dialog * Fix frontend missing field calculation * Fix frontend to many tree error * Lint code with ESLint and Prettier Triggered by 9407376 on branch refs/heads/issue-6127 * Restrict to manys only for tree fields * Fix multiple rank in row error * Fix navigator * Fix tests * Group missing ranks by tree * Lint code with ESLint and Prettier Triggered by 7f2149d on branch refs/heads/issue-6127 * Pass filtered treedef ids to the backend - Adds checkboxes to tree names in missing ranks dialog - Splits the main batch edit file into 4 smaller files * Lint code with ESLint and Prettier Triggered by 1c29ec9 on branch refs/heads/issue-6127 * Filter trees used when rewriting batch edit dataset * Fix tests * Use TreeRankRecord in upload plan * Remove unused string * Fix visual order - For multiple trees, columns will be grouped by tree first * Revert "Fix visual order" This reverts commit a8a2ad6. * Flag to-many in tree only queries * Lint code with ESLint and Prettier Triggered by f36521c on branch refs/heads/issue-6127 * Enable nested to-many in Workbench (#6216) * Enable nested to-many in Workbench * Update test * Add upload plan changes * Update tests * Lint code with ESLint and Prettier Triggered by 82033cd on branch refs/heads/issue-2331 * Fix tests * Lint code with ESLint and Prettier Triggered by f0822bf on branch refs/heads/issue-2331 * Lint code with ESLint and Prettier Triggered by f27581b on branch refs/heads/issue-2331 * Lint code with ESLint and Prettier Triggered by cc1f85b on branch refs/heads/issue-6127 * Check for lowercase tree table names when rewriting tree rank row plan * Handle None rank * Fix tree column order * Fix tests * Revert back to sort columns
* Enable trees in queries * Use query construct code from #4929 * Update unit test * Enable nested to-many in Workbench * Update test * Remove param_count * Display tree name in query error * Add upload plan changes * Update tests * Lint code with ESLint and Prettier Triggered by 82033cd on branch refs/heads/issue-2331 * Update TreeRankQuery to fix implicit ORs - see: #6196 (comment) * Allow removing last row in Batch Edit * Make a missing rank info dialog which proceeds to dataset creation * Augment tree queries with missing ranks for batch edit * Lint code with ESLint and Prettier Triggered by 65f7d21 on branch refs/heads/issue-6127 * Adjust apply_batch_edit_pack for multiple trees * Add a discipline type in tests * Enable relationships * Lint code with ESLint and Prettier Triggered by 350ee9c on branch refs/heads/issue-6126 * Enable data mapper and batch edit preferences * Fix localizations * Consider remote to ones as to many in upload plan * Add remote to ones method * Un-enforce TreeRankRecord in upload plan * Add loading action to missing ranks dialog * Move table name to same line in missing fields dialog * Handle case when rank name has spaces * Add a close button to missing ranks dialog * Fix frontend missing field calculation * Fix frontend to many tree error * Lint code with ESLint and Prettier Triggered by 9407376 on branch refs/heads/issue-6127 * Restrict to manys only for tree fields * Avoid cloning to-ones when committing - This was caused because we treat remote to-ones as to-many in the upload plan (affects COGs) * Fix to many for tree in relationships * Change revert to rollback in pref localization * Use TreeRankRecord in upload plan * Fix multiple rank in row error * Fix multiple rank in row error * Fix navigator * Fix tests * Group missing ranks by tree * Lint code with ESLint and Prettier Triggered by 7f2149d on branch refs/heads/issue-6127 * Pass filtered treedef ids to the backend - Adds checkboxes to tree names in missing ranks dialog - Splits the main batch edit file into 4 smaller files * Lint code with ESLint and Prettier Triggered by 1c29ec9 on branch refs/heads/issue-6127 * Filter trees used when rewriting batch edit dataset * Fix tests * Use TreeRankRecord in upload plan * Remove unused string * Fix visual order - For multiple trees, columns will be grouped by tree first * Revert "Fix visual order" This reverts commit a8a2ad6. * Fix tests * Lint code with ESLint and Prettier Triggered by f0822bf on branch refs/heads/issue-2331 * Handle (any rank) mapping for Batch Edit upload plans * Lint code with ESLint and Prettier Triggered by 3945527 on branch refs/heads/issue-6126 * Disable spauditlog for BE * Add title when batch edit is disabled * Fix deleted cells for many-to-one dependents * Use variant permissions for creating record sets * Fix undefined name error - Using tables doesn't work when the data hasn't loaded correctly * Disable changing batch edit prefs after upload * Add validation error for scope change * Add localization for other WB errors * Lint code with ESLint and Prettier Triggered by 34a3459 on branch refs/heads/issue-6126 * Remove description for null record - Removed for UX reasons. Users do not need to manually remove null record strings * Ensure at least 1 to-many column gets added to batch edit datasets * Flag to-many in tree only queries * Lint code with ESLint and Prettier Triggered by f36521c on branch refs/heads/issue-6127 * Lint code with ESLint and Prettier Triggered by 0647fa6 on branch refs/heads/issue-6126 * Enable nested to-many in Workbench (#6216) * Enable nested to-many in Workbench * Update test * Add upload plan changes * Update tests * Lint code with ESLint and Prettier Triggered by 82033cd on branch refs/heads/issue-2331 * Fix tests * Lint code with ESLint and Prettier Triggered by f0822bf on branch refs/heads/issue-2331 * Lint code with ESLint and Prettier Triggered by f27581b on branch refs/heads/issue-2331 * Lint code with ESLint and Prettier Triggered by cc1f85b on branch refs/heads/issue-6127 * Disable editing any rank tree relationships * Check for lowercase tree table names when rewriting tree rank row plan * Lint code with ESLint and Prettier Triggered by 633a7da on branch refs/heads/issue-6126 * Handle None rank * Batch edit: Disable editing dataset after rollback (#6428) * Add rolledback to SpDataset * Lint code with ESLint and Prettier Triggered by 7d2a86d on branch refs/heads/issue-6390 * Add text to indicate dataset cannot be edited * Make hot columns readonly based on context * Lint code with ESLint and Prettier Triggered by dcbb593 on branch refs/heads/issue-6390 * Reorder migration * Fix tree column order * Fix tests * Fix tests * Upgrade celery version (#6437) * Add rolledback to SpDataset * Lint code with ESLint and Prettier Triggered by 7d2a86d on branch refs/heads/issue-6390 * Add text to indicate dataset cannot be edited * Make hot columns readonly based on context * Lint code with ESLint and Prettier Triggered by dcbb593 on branch refs/heads/issue-6390 * Reorder migration * Upgrade celery and its dependencies * Revert back to sort columns * Enable matched and changed when readonly * Add missing import * Re-add lost code
* Enable trees in queries * Use query construct code from #4929 * Update unit test * Enable nested to-many in Workbench * Update test * Remove param_count * Display tree name in query error * Add upload plan changes * Update tests * Lint code with ESLint and Prettier Triggered by 82033cd on branch refs/heads/issue-2331 * Update TreeRankQuery to fix implicit ORs - see: #6196 (comment) * Allow removing last row in Batch Edit * Make a missing rank info dialog which proceeds to dataset creation * Augment tree queries with missing ranks for batch edit * Lint code with ESLint and Prettier Triggered by 65f7d21 on branch refs/heads/issue-6127 * Adjust apply_batch_edit_pack for multiple trees * Add a discipline type in tests * Enable relationships * Lint code with ESLint and Prettier Triggered by 350ee9c on branch refs/heads/issue-6126 * Enable data mapper and batch edit preferences * Fix localizations * Consider remote to ones as to many in upload plan * Add remote to ones method * Un-enforce TreeRankRecord in upload plan * Add loading action to missing ranks dialog * Move table name to same line in missing fields dialog * Handle case when rank name has spaces * Add a close button to missing ranks dialog * Fix frontend missing field calculation * Fix frontend to many tree error * Lint code with ESLint and Prettier Triggered by 9407376 on branch refs/heads/issue-6127 * Restrict to manys only for tree fields * Avoid cloning to-ones when committing - This was caused because we treat remote to-ones as to-many in the upload plan (affects COGs) * Fix to many for tree in relationships * Change revert to rollback in pref localization * Use TreeRankRecord in upload plan * Fix multiple rank in row error * Fix multiple rank in row error * Fix navigator * Fix tests * Group missing ranks by tree * Lint code with ESLint and Prettier Triggered by 7f2149d on branch refs/heads/issue-6127 * Pass filtered treedef ids to the backend - Adds checkboxes to tree names in missing ranks dialog - Splits the main batch edit file into 4 smaller files * Lint code with ESLint and Prettier Triggered by 1c29ec9 on branch refs/heads/issue-6127 * Filter trees used when rewriting batch edit dataset * Fix tests * Use TreeRankRecord in upload plan * Remove unused string * Fix visual order - For multiple trees, columns will be grouped by tree first * Revert "Fix visual order" This reverts commit a8a2ad6. * Fix tests * Lint code with ESLint and Prettier Triggered by f0822bf on branch refs/heads/issue-2331 * Handle (any rank) mapping for Batch Edit upload plans * Lint code with ESLint and Prettier Triggered by 3945527 on branch refs/heads/issue-6126 * Disable spauditlog for BE * Add title when batch edit is disabled * Fix deleted cells for many-to-one dependents * Use variant permissions for creating record sets * Fix undefined name error - Using tables doesn't work when the data hasn't loaded correctly * Disable changing batch edit prefs after upload * Add validation error for scope change * Add localization for other WB errors * Lint code with ESLint and Prettier Triggered by 34a3459 on branch refs/heads/issue-6126 * Remove description for null record - Removed for UX reasons. Users do not need to manually remove null record strings * Ensure at least 1 to-many column gets added to batch edit datasets * Flag to-many in tree only queries * Lint code with ESLint and Prettier Triggered by f36521c on branch refs/heads/issue-6127 * Lint code with ESLint and Prettier Triggered by 0647fa6 on branch refs/heads/issue-6126 * Enable nested to-many in Workbench (#6216) * Enable nested to-many in Workbench * Update test * Add upload plan changes * Update tests * Lint code with ESLint and Prettier Triggered by 82033cd on branch refs/heads/issue-2331 * Fix tests * Lint code with ESLint and Prettier Triggered by f0822bf on branch refs/heads/issue-2331 * Lint code with ESLint and Prettier Triggered by f27581b on branch refs/heads/issue-2331 * Lint code with ESLint and Prettier Triggered by cc1f85b on branch refs/heads/issue-6127 * Disable editing any rank tree relationships * Add rolledback to SpDataset * Lint code with ESLint and Prettier Triggered by 7d2a86d on branch refs/heads/issue-6390 * Add text to indicate dataset cannot be edited * Make hot columns readonly based on context * Lint code with ESLint and Prettier Triggered by dcbb593 on branch refs/heads/issue-6390 * Check for lowercase tree table names when rewriting tree rank row plan * Lint code with ESLint and Prettier Triggered by 633a7da on branch refs/heads/issue-6126 * Reorder migration * Handle None rank * Fix result cell link in Batch Edit and Workbench * Lint code with ESLint and Prettier Triggered by 4b40eec on branch refs/heads/issue-6164 * Remove auto height * Remove duplicate imports * Lint code with ESLint and Prettier Triggered by 19e6c3e on branch refs/heads/issue-6164
Some backend improvements
Workbench
Query Builder
Checklist
and self-explanatory (or properly documented)
Testing instructions
Batch-editing
Implementation and design
Testing Instructions
Make a query with columns in the base table, and select relationships to edit. In the current, I am using CO with the base table. There are 4 different types of relationships, in general.
Fields
Modifying any field is possible, other than nodenumber, fullname, and highestchildnodenumber. If some fields get updated, only those fields are highlighted
To-one dependent (for ex. collectionobjectattribute)
These relationships get directly updated, and are not matched. If the to-one is not in the db, it'll create one.
This also includes collectingevent when embedded.
Test cases to consider:
To-many dependent (for ex. determinations)
Same as to-one dependent. These relationships get directly updated. If the corresponding record is not present, a new one gets created.
Test cases to consider:
To-one independent (for ex. cataloger)
These relationships get matched, and uploaded (if match is not found). During upload, it performs a clone of the record (cloning all the non-unique fields, and dependents). The clone takes into account relationships also mapped. That is, if agent needs to be cloned, and you have mapped agentspecialty, it'll take the agentspecialty mapped (rather than cloning previous's agentspecialty).
Test cases to consider:
To-many independent
Same as to-many dependent. The only difference is that we always perform an update (we don't delete these). If a mapped record is not present, it'll create one, without any matching.
Test cases to consider:
Trees
There are two different routes to perform tree updates.
Workbench method:
If you want to modify a specific rank, or say reassign species for determination, you'd want to add a specific rank in the query. In this case, it always matches and uploads (and possibly clone), so we don't have updates.
In the query builder, it'll enforce that you select complete branch of the tree. That is, if your query contains rank "species", and "genus", it'll demand you to add ranks all the way down from "genus" to "species". If used part of a relationship, it'll demand going the way down from "genus" to the lowest rank in the tree.
Update method:
If in the query builder, there is no visible tree rank field, it allows direct modifications (and, thus, updates) to the tree table. This will be useful if you want to, say, update remarks for ones that match name "ploia"
In both of the above methods, fullname, nodenumber, highestchildnodenumber is completely readonly.
Results
There are 4 new different type of results;
NoChange
Reported when the record was meant to updated, but no change occurred. That is, all the values from the db were the same. This is not visible to the user.
Updated
Reported when the record's fields were changed. This does not consider relationships (they are reported with different result)
Deleted
Reported when a record is deleted. Happens when a dependent's cells are all empty.
MatchedAndChanged
Reported when a to-one independent was matched to another record, different than the current one.
Preferences
There are three different preference options.
Remote Preferenences (2)
Defer For Match
Set by
sp7.batchEdit.deferForMatch.This preference controls whether database fields are included for matching or not. Defaults to false.Defer For Null
Set by
sp7.batchEdit.deferForNull.This preference controls whether database fields are included for determining if the record is null or not. For dependents, null records are deleted, so this preference is used to control the caution batch-edit followsUser Preferenences (1)
Number of query rows
Determines how many number of query results are used for batch-edit. Defaults to 5000.
Rollbacks
Rollbacks are complicated to perform. In the current design, whenever user creates a batch-edit dataset, via the query builder, it makes two datasets. User can only see one of them. The second is a "backer" of the first, and contains a FK to the first (so we can find backer of a dataset later). When rollback is requested, for every row in the main one, we find the original row in the backer, and perform the regular batch-edit update on it. Essentially, it applies original snapshot.
This is highly experimental, so it is recommended to always take a backup of the db, but this should work in a good amount of cases.
Misc