Skip to content

Commit

Permalink
check rank item count
Browse files Browse the repository at this point in the history
  • Loading branch information
acwhite211 committed May 13, 2024
1 parent 0a47ccf commit 175144c
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 0 deletions.
8 changes: 8 additions & 0 deletions specifyweb/businessrules/rules/tree_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ def cannot_delete_root_treedefitem(sender, obj):
"node": {
"id": obj.id
}})
elif is_tree_rank_empty(sender, obj):
raise TreeBusinessRuleException(
"cannot delete tree rank containing items",
{"tree": obj.__class__.__name__,
"localizationKey": 'deletingNonEmptyTreeRank',
"node": {
"id": obj.id
}})
pre_tree_rank_deletion(sender, obj)
verify_rank_parent_chain_integrity(obj, RankOperation.DELETED)

Expand Down
26 changes: 26 additions & 0 deletions specifyweb/specify/tree_ranks.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,32 @@
'lithostrat': (LITHO_STRAT_RANKS, LITHO_STRAT_INCREMENT),
}

TREE_RANK_TO_ITEM_MAP = {
'Taxontreedefitem': 'Taxon',
'Geographytreedefitem': 'Geography',
'Storagetreedefitem': 'Storage',
'Geologictimeperiodtreedefitem': 'Geologictimeperiod',
'Lithostrattreedefitem': 'Lithostrat'
}

def get_tree_item_model(tree_rank_model_name):
tree_item_model_name = TREE_RANK_TO_ITEM_MAP.get(tree_rank_model_name.title(), None)
if not tree_item_model_name:
return None
return getattr(spmodels, tree_item_model_name, None)

def tree_rank_count(tree_rank_model_name, tree_rank_id) -> int:
tree_item_model = get_tree_item_model(tree_rank_model_name)
if not tree_item_model:
return 0
return tree_item_model.objects.filter(definitionitem_id=tree_rank_id).count()

def is_tree_rank_empty(tree_rank_model, tree_rank) -> bool:
tree_item_model = get_tree_item_model(tree_rank_model.__name__)
if not tree_item_model:
return False
return tree_item_model.objects.filter(definitionitem=tree_rank).count() == 0

def post_tree_rank_save(tree_def_item_model, new_rank):
tree_def = new_rank.treedef
parent_rank = new_rank.parent
Expand Down
9 changes: 9 additions & 0 deletions specifyweb/specify/tree_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from specifyweb.businessrules.exceptions import BusinessRuleException
from specifyweb.permissions.permissions import PermissionTarget, \
PermissionTargetAction, check_permission_targets
from specifyweb.specify.tree_ranks import tree_rank_count
from specifyweb.stored_queries import models
from . import tree_extras
from .api import get_object_or_404, obj_to_data, toJson
Expand Down Expand Up @@ -290,6 +291,14 @@ def repair_tree(request, tree):
tree_extras.renumber_tree(table)
tree_extras.validate_tree_numbering(table)

@login_maybe_required
@require_GET
def tree_rank_item_count(request, tree, rankid):
"""Returns the number of items in the tree rank with id <rank_id>."""
tree_rank_model_name = tree if tree.endswith('treedefitem') else tree + 'treedefitem'
rank = get_object_or_404(tree_rank_model_name, id=rankid)
count = tree_rank_count(tree, rank.id)
return HttpResponse(toJson(count), content_type='application/json')

class TaxonMutationPT(PermissionTarget):
resource = "/tree/edit/taxon"
Expand Down

0 comments on commit 175144c

Please sign in to comment.