django-authority/src/authority/models.py
2009-06-08 12:00:44 +02:00

76 lines
3 KiB
Python

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.contrib.auth.models import User, Group
from django.utils.translation import ugettext_lazy as _
class AlreadyHasPermission(Exception):
"""Defining exception for an already existing permission"""
def __init__(self, user_or_group, name, obj=None):
self.user_or_group = user_or_group
self.perm_name = name
self.obj = obj
def __str__(self):
if self.obj:
return "%s has already permission:\"%s\" on %s" % (self.user_or_group,
self.perm_name,
self.obj)
return "%s has already permission:\"%s\"" % (self.user_or_group,
self.perm_name)
class DoesNotHavePermission(Exception):
"""Defining exception for an already existing permission"""
def __init__(self, user_or_group, name, obj=None):
self.user_or_group = user_or_group
self.perm_name = name
self.obj = obj
def __str__(self):
if self.obj:
return "%s has not permission:\"%s\" on %s" % (self.user_or_group,
self.perm_name,
self.obj)
return "%s has not permission:\"%s\" " % (self.user_or_group,
self.perm_name)
class PermissionManager(models.Manager):
def permissions_for_object(self, obj):
object_type = ContentType.objects.get_for_model(obj)
return self.filter(content_type__pk=object_type.id,
object_id=obj.id)
class Permission(models.Model):
"""
A granular permission model, per-object permission in other words.
This kind of permission is associated with a user/group and an object
of any content type.
"""
codename = models.CharField(_('codename'), max_length=100)
content_type = models.ForeignKey(ContentType, related_name="row_permissions")
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
user = models.ForeignKey(User, null=True, blank=True, related_name='granted_permissions')
group = models.ForeignKey(Group, null=True, blank=True)
creator = models.ForeignKey(User, null=True, blank=True, related_name='created_permissions')
objects = PermissionManager()
def __unicode__(self):
return "%s.%s" % (self.content_type.app_label, self.codename)
class Meta:
verbose_name = _('permission')
verbose_name_plural = _('permissions')
permissions = (
('change_foreign_permissions', 'Can change foreign permissions'),
('delete_foreign_permissions', 'Can delete foreign permissions'),
)
from authority import autodiscover
autodiscover()