class Profile(models.Model): user = models.OneToOneField(User) name = models.CharField(max_length=255, blank=True) url = models.URLField(blank=True) company = models.CharField(max_length=255, blank=True) location = models.CharField(max_length=255, blank=True) gravatar = models.EmailField(blank=True) _participating = models.IntegerField() _watching = models.IntegerField() @property def participating(self): return BitwiseSet(self, '_pmap', Notification) if hasattr(self, '_pmap'): return self._pmap self._pmap = BitwiseSet(Notification, self, '_participating') for permission, value in Notification.choices: if self._participating & value: self._pmap.add(getattr(Notification, permission)) return self._pmap @participating.setter def participating(self, permission_set): self._participating = 0 for value in permission_set: self._participating |= value @property def watching(self): return BitwiseSet(self, '_wmap', Notification) if hasattr(self, '_wmap'): return self._wmap self._wmap = BitwiseSet(Notification, self, '_watching') for permission, value in Notification.choices: if self._watching & value: self._wmap.add(getattr(Notification, permission)) return self._wmap @watching.setter def watching(self, permission_set): self._watching = 0 for value in permission_set: self._watching |= value
class Group(models.Model): name = models.CharField(max_length=255, db_index=True) organization = models.ForeignKey('Organization', related_name='groups') _permissions = models.IntegerField() def __unicode__(self): return self.name @classmethod def builtins(cls, organization): names = ('Admin', 'User', 'Test', 'Manager', 'Developer') return cls.objects.filter(name__in=names, organization=organization) @classmethod def create_builtins(cls, organization): groups = (cls.AdminGroup, cls.UserGroup, cls.TestGroup, cls.DeveloperGroup, cls.ManagerGroup) for get_or_create_group in groups: get_or_create_group(organization) return cls.builtins(organization) @classmethod def get_or_create_from_permission(cls, name, organization, exclude=[]): permissions = Permission.permission_as_int(exclude=exclude) admin = {'name': name, 'organization': organization, '_permissions': permissions} return cls.objects.get_or_create(**admin) @classmethod def AdminGroup(cls, org): return cls.get_or_create_from_permission('Admin', org, exclude=[]) @classmethod def UserGroup(cls, org): exclude = ('add_project', 'delete_project', 'add_member', 'remove_member', 'commit') return cls.get_or_create_from_permission('User', org, exclude=exclude) @classmethod def TestGroup(cls, org): exclude = ('add_project', 'delete_project', 'add_member', 'remove_member', 'commit') return cls.get_or_create_from_permission('Test', org, exclude=exclude) @classmethod def DeveloperGroup(cls, org): exc = ('add_member', 'remove_member', 'delete_project') return cls.get_or_create_from_permission('Developer', org, exclude=exc) @classmethod def ManagerGroup(cls, org): exc = ('add_member', 'remove_member') return cls.get_or_create_from_permission('Manager', org, exclude=exc) @property def permissions(self): if hasattr(self, '_permission_mapping'): return self._permission_mapping self._permission_mapping = BitwiseSet(Permission, self, '_permissions') for permission, value in Permission.choices: if self._permissions & value: self._permission_mapping.add(getattr(Permission, permission)) return self._permission_mapping @permissions.setter def permissions(self, permission_set): self._permissions = 0 for value in permission_set: self._permissions |= value