Merge lp:~salgado/django-group-access/refactor into lp:django-group-access

Proposed by Guilherme Salgado
Status: Merged
Merged at revision: 4
Proposed branch: lp:~salgado/django-group-access/refactor
Merge into: lp:django-group-access
Diff against target: 50 lines (+16/-14)
1 file modified
models.py (+16/-14)
To merge this branch: bzr merge lp:~salgado/django-group-access/refactor
Reviewer Review Type Date Requested Status
Nicola Heald Pending
Review via email: mp+76075@code.launchpad.net

Description of the change

This one refactors accessible_by_user() so that subclasses can add new filters.

This way I can write a custom AccessManager which lets anyone see non-private objects. Something like

class CustomObjectsManager(AccessManager):

    def _get_accessible_by_user_filter_rules(self, user):
        rules = super(
            CustomObjectsManager, self)._get_accessible_by_user_filter_rules(
                user)
        return rules | models.Q(is_private=False)

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'models.py'
--- models.py 2011-09-19 15:04:00 +0000
+++ models.py 2011-09-19 17:22:26 +0000
@@ -8,9 +8,7 @@
8 def get_for_owner(self, user):8 def get_for_owner(self, user):
9 return self.filter(owner=user)9 return self.filter(owner=user)
1010
11 def accessible_by_user(self, user):11 def _get_accessible_by_user_filter_rules(self, user):
12 if AccessGroup.objects.filter(members=user, supergroup=True).count():
13 return self.all()
14 if hasattr(self.model, 'access_relation'):12 if hasattr(self.model, 'access_relation'):
15 acr = getattr(self.model, 'access_relation')13 acr = getattr(self.model, 'access_relation')
16 k = '%s__access_groups__in' % acr14 k = '%s__access_groups__in' % acr
@@ -19,20 +17,24 @@
19 no_related_records = {k: True}17 no_related_records = {k: True}
20 k = '%s__owner' % acr18 k = '%s__owner' % acr
21 direct_owner_dict = {k: user}19 direct_owner_dict = {k: user}
22 available = self.filter(20 return (
23 models.Q(**access_groups_dict) |21 models.Q(**access_groups_dict) |
24 models.Q(**direct_owner_dict) |22 models.Q(**direct_owner_dict) |
25 models.Q(**no_related_records)).distinct()23 models.Q(**no_related_records))
26 # Although this extra .filter() call seems redundant it turns out
27 # to be a huge performance optimization. Without it the ORM will
28 # join on the related tables and .distinct() them, which killed
29 # performance in HEXR leading to 30+ seconds to load a page.
30 return self.filter(pk__in=available)
31 else:24 else:
32 available = self.filter(25 user_groups = AccessGroup.objects.filter(members=user)
33 access_groups__in=AccessGroup.objects.filter(members=user))26 return (models.Q(access_groups__in=user_groups) |
34 return self.filter(27 models.Q(owner=user))
35 models.Q(pk__in=available) | models.Q(owner=user))28
29 def accessible_by_user(self, user):
30 if AccessGroup.objects.filter(members=user, supergroup=True).count():
31 return self.all()
32 rules = self._get_accessible_by_user_filter_rules(user)
33 # Although this extra .filter() call seems redundant it turns out
34 # to be a huge performance optimization. Without it the ORM will
35 # join on the related tables and .distinct() them, which killed
36 # performance in HEXR leading to 30+ seconds to load a page.
37 return self.filter(pk__in=self.filter(rules).distinct())
3638
3739
38class AccessGroup(models.Model):40class AccessGroup(models.Model):

Subscribers

People subscribed via source and target branches