Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 61d7b85

Browse files
authored
Merge pull request #165 from somewes/develop
fix entity group is_active param logic
2 parents 6a258a7 + 2b568d5 commit 61d7b85

File tree

5 files changed

+69
-10
lines changed

5 files changed

+69
-10
lines changed

entity/models.py

+27-8
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,14 @@ def get_membership_cache(self, group_ids=None, is_active=True):
321321
:rtype: dict
322322
"""
323323
membership_queryset = EntityGroupMembership.objects.filter(
324-
Q(entity__isnull=True) | (Q(entity__isnull=False) & Q(entity__is_active=is_active))
324+
# Select all memberships that are defined by a sub entity kind only
325+
Q(entity__isnull=True) |
326+
# Select memberships that define a single entity (null kind) and respect active flag
327+
(Q(entity__isnull=False) & Q(sub_entity_kind__isnull=True) & Q(entity__is_active=is_active)) |
328+
# Select memberships that are all of a kind under an entity and only query active supers
329+
(Q(entity__isnull=False) & Q(sub_entity_kind__isnull=False) & Q(entity__is_active=True))
325330
)
331+
326332
if is_active is None:
327333
membership_queryset = EntityGroupMembership.objects.all()
328334

@@ -387,7 +393,10 @@ def get_all_entities(self, membership_cache=None, entities_by_kind=None, return_
387393
membership_cache = EntityGroup.objects.get_membership_cache([self.id], is_active=is_active)
388394

389395
if entities_by_kind is None:
390-
entities_by_kind = entities_by_kind or get_entities_by_kind(membership_cache=membership_cache)
396+
entities_by_kind = entities_by_kind or get_entities_by_kind(
397+
membership_cache=membership_cache,
398+
is_active=is_active,
399+
)
391400

392401
# Build set of all entity ids for this group
393402
entity_ids = set()
@@ -584,19 +593,29 @@ def get_entities_by_kind(membership_cache=None, is_active=True):
584593
kinds_with_all.add(entity_kind_id)
585594

586595
# Get entities for 'all'
587-
all_entities_for_types = Entity.objects.filter(
588-
entity_kind_id__in=kinds_with_all
589-
).values_list('id', 'entity_kind_id')
596+
all_entities_for_types = Entity.all_objects.filter(
597+
entity_kind_id__in=kinds_with_all,
598+
)
599+
if is_active is not None:
600+
all_entities_for_types = all_entities_for_types.filter(is_active=is_active)
601+
602+
all_entities_for_types = all_entities_for_types.values_list('id', 'entity_kind_id')
590603

591604
# Add entity ids to entity kind's all list
592605
for id, entity_kind_id in all_entities_for_types:
593606
entities_by_kind[entity_kind_id]['all'].append(id)
594607

595-
# Get relationships
608+
# Get relationships for memberships defined by all of a kind under a super
596609
relationships = EntityRelationship.objects.filter(
597610
super_entity_id__in=super_ids,
598-
sub_entity__entity_kind_id__in=kinds_with_supers
599-
).values_list(
611+
sub_entity__entity_kind_id__in=kinds_with_supers,
612+
)
613+
614+
# Make sure to respect the active flag for the sub entities under the supers
615+
if is_active is not None:
616+
relationships = relationships.filter(sub_entity__is_active=is_active)
617+
618+
relationships = relationships.values_list(
600619
'super_entity_id', 'sub_entity_id', 'sub_entity__entity_kind_id'
601620
)
602621

entity/tests/model_tests.py

+38
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,7 @@ def test_get_all_entities_active(self):
10301030
turn_off_syncing()
10311031

10321032
account_type = ContentType.objects.get_for_model(Account)
1033+
team_type = ContentType.objects.get_for_model(Team)
10331034

10341035
# Set up teams
10351036
teams = Team.objects.bulk_create([
@@ -1069,6 +1070,43 @@ def test_get_all_entities_active(self):
10691070
[account_entities[3], None],
10701071
])
10711072

1073+
# Group 0 consists of an inactive account (0) and 3 actives (1-3)
10721074
self.assertEqual(len(entity_groups[0].get_all_entities()), 3)
10731075
self.assertEqual(len(entity_groups[0].get_all_entities(is_active=False)), 1)
10741076
self.assertEqual(len(entity_groups[0].get_all_entities(is_active=None)), 4)
1077+
1078+
# Check the same thing for an entity group defined by a super entity and sub entity kind
1079+
team_entities = list(Entity.all_objects.filter(entity_type=team_type).order_by('entity_id'))
1080+
entity_groups[1].bulk_add_entities([
1081+
[team_entities[0], account_entities[0].entity_kind]
1082+
])
1083+
1084+
# Team 0 has accounts 0, 3, 6, 9, 12, 15, 18
1085+
# account 0 is inactive
1086+
self.assertEqual(len(entity_groups[1].get_all_entities()), 6)
1087+
self.assertEqual(len(entity_groups[1].get_all_entities(is_active=False)), 1)
1088+
self.assertEqual(len(entity_groups[1].get_all_entities(is_active=None)), 7)
1089+
1090+
entity_ids = list(entity_groups[1].get_all_entities())
1091+
1092+
# Make 3 more of them inactive
1093+
entity_ids = [
1094+
entity_id
1095+
for entity_id in entity_ids[0:3]
1096+
]
1097+
Entity.objects.filter(id__in=entity_ids).update(is_active=False)
1098+
self.assertEqual(len(entity_groups[1].get_all_entities()), 3)
1099+
self.assertEqual(len(entity_groups[1].get_all_entities(is_active=False)), 4)
1100+
self.assertEqual(len(entity_groups[1].get_all_entities(is_active=None)), 7)
1101+
1102+
# Set a super to inactive and make sure the active subs are ignored
1103+
team_entities = list(Entity.all_objects.filter(entity_type=team_type).order_by('entity_id'))
1104+
entity_groups[2].bulk_add_entities([
1105+
[team_entities[1], account_entities[0].entity_kind]
1106+
])
1107+
Entity.objects.filter(id=team_entities[1].id).update(is_active=False)
1108+
1109+
# Nothing should be returned because the super is inactive which makes the group invalid
1110+
self.assertEqual(len(entity_groups[2].get_all_entities()), 0)
1111+
self.assertEqual(len(entity_groups[2].get_all_entities(is_active=False)), 0)
1112+
self.assertEqual(len(entity_groups[2].get_all_entities(is_active=None)), 7)

entity/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '5.1.0'
1+
__version__ = '5.1.1'

release_notes.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## Release Notes
22

3+
- 5.1.1:
4+
- Fix logic holes related to the active flag when generating entity group cache
35
- 5.1.0:
46
- Add decorator to suppress entity syncing
57
- 5.0.2:

setup.cfg

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
max-line-length = 120
33
exclude = build,docs,venv,env,*.egg,migrations,south_migrations
44
max-complexity = 15
5-
ignore = E402,E722
5+
ignore = E402,E722,W504
66

77
[bdist_wheel]
88
universal = 1

0 commit comments

Comments
 (0)