Changeset 7431d13


Ignore:
Timestamp:
Nov 17, 2013, 3:59:33 AM (12 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, stable, stage
Children:
88843ac
Parents:
00ec3e4
git-author:
Alex Dehnert <adehnert@…> (11/17/13 03:55:11)
git-committer:
Alex Dehnert <adehnert@…> (11/17/13 03:59:33)
Message:

Add Group.admin_groups method (ASA-#181)

This adds a Group.admin_groups method, which can be used to find the groups
that a user is an admin of (where "admin" is defined as "has a specified
permission [default: admin_group] via an OfficerRole?).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asadb/groups/models.py

    r00ec3e4 r7431d13  
     1import collections
    12import datetime
    23import filecmp
     
    1415from django.db.models import Q
    1516from django.core.validators import RegexValidator
    16 from django.contrib.auth.models import User
     17from django.contrib.auth.models import User, Permission
     18from django.contrib.contenttypes.models import ContentType
    1719from django.template.defaultfilters import slugify
    1820
     
    112114        current_officers = OfficeHolder.current_holders.filter(person=username)
    113115        users_groups = Group.objects.filter(officeholder__in=current_officers).distinct()
     116
     117    @staticmethod
     118    def admin_groups(username, codename='admin_group'):
     119        holders = OfficeHolder.current_holders.filter_perm(codename=codename).filter(person=username)
     120        users_groups = Group.objects.filter(officeholder__in=holders).distinct()
    114121        return users_groups
    115122
     
    395402
    396403    @classmethod
     404    def getRolesGrantingPerm(cls, perm=None, model=Group, codename=None, ):
     405        """Get all OfficerRole objects granting a permission
     406
     407        Either `perm` or `codename` must be supplied, but not both. If
     408        `codename` is provided (and `perm` is None), then `perm` the
     409        permission corresponding to `model` (default: `Group`) and `codename`
     410        will be found and used."""
     411
     412        if perm is None:
     413            ct = ContentType.objects.get_for_model(model)
     414            print ct
     415            print Permission.objects.filter(content_type=ct)
     416            perm = Permission.objects.get(content_type=ct, codename=codename)
     417
     418        Q_user = Q(user_permissions=perm)
     419        Q_group = Q(groups__permissions=perm)
     420        users = User.objects.filter(Q_user|Q_group)
     421        roles = cls.objects.filter(grant_user__in=users)
     422        return roles
     423
     424    @classmethod
    397425    def retrieve(cls, slug, ):
    398426        return cls.objects.get(slug=slug)
     427
    399428reversion.register(OfficerRole)
    400429
     
    407436        )
    408437
     438    def filter_perm(self, perm=None, model=Group, codename=None, ):
     439        roles = OfficerRole.getRolesGrantingPerm(perm=perm, model=model, codename=codename)
     440        return self.get_query_set().filter(role__in=roles)
     441
    409442class OfficeHolder(models.Model):
    410443    EXPIRE_OFFSET   = datetime.timedelta(seconds=1)
     
    433466    def __repr__(self, ):
    434467        return str(self)
     468
    435469reversion.register(OfficeHolder)
    436470
Note: See TracChangeset for help on using the changeset viewer.