From 1b7f94394626f4434b4a0dce96ce0f2df0845d3c Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 17 Oct 2023 21:33:23 +1100 Subject: [PATCH] Prefetch RuleSet objects for group (#5725) * Prefetch RuleSet objects for group - Prevent multiple unnecessary db queries * Tweak * Default to previous behavior * Revert closer to original --- InvenTree/users/models.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/InvenTree/users/models.py b/InvenTree/users/models.py index a2c8b01453..7f92a1f62c 100644 --- a/InvenTree/users/models.py +++ b/InvenTree/users/models.py @@ -420,16 +420,23 @@ def update_group_roles(group, debug=False): if permission_string not in permissions_to_add: permissions_to_delete.add(permission_string) + # Pre-fetch all the RuleSet objects + rulesets = { + r.name: r for r in RuleSet.objects.filter(group=group).prefetch_related('group') + } + # Get all the rulesets associated with this group for r in RuleSet.RULESET_CHOICES: rulename = r[0] - try: - ruleset = RuleSet.objects.get(group=group, name=rulename) - except RuleSet.DoesNotExist: - # Create the ruleset with default values (if it does not exist) - ruleset = RuleSet.objects.create(group=group, name=rulename) + if rulename in rulesets: + ruleset = rulesets[rulename] + else: + try: + ruleset = RuleSet.objects.get(group=group, name=rulename) + except RuleSet.DoesNotExist: + ruleset = RuleSet.objects.create(group=group, name=rulename) # Which database tables does this RuleSet touch? models = ruleset.get_models()