2009-07-23 05:33:34 +00:00
from datetime import datetime
2009-06-08 10:00:44 +00:00
from django . db import models
from django . contrib . contenttypes . models import ContentType
from django . contrib . contenttypes import generic
2015-11-10 20:45:10 +00:00
from django . contrib . auth . models import Group
2009-06-08 10:00:44 +00:00
from django . utils . translation import ugettext_lazy as _
2009-07-09 23:07:20 +00:00
2015-11-10 20:45:10 +00:00
from authority . compat import user_model_label
2009-06-11 23:11:06 +00:00
from authority . managers import PermissionManager
2013-06-11 22:26:41 +00:00
2009-06-08 10:00:44 +00:00
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 ' )
2015-11-10 20:45:10 +00:00
user = models . ForeignKey ( user_model_label , null = True , blank = True , related_name = ' granted_permissions ' )
2009-06-08 10:00:44 +00:00
group = models . ForeignKey ( Group , null = True , blank = True )
2015-11-10 20:45:10 +00:00
creator = models . ForeignKey ( user_model_label , null = True , blank = True , related_name = ' created_permissions ' )
2009-06-08 10:00:44 +00:00
2009-07-23 05:33:34 +00:00
approved = models . BooleanField ( _ ( ' approved ' ) , default = False , help_text = _ ( " Designates whether the permission has been approved and treated as active. Unselect this instead of deleting permissions. " ) )
date_requested = models . DateTimeField ( _ ( ' date requested ' ) , default = datetime . now )
date_approved = models . DateTimeField ( _ ( ' date approved ' ) , blank = True , null = True )
2009-07-22 15:05:07 +00:00
2009-06-08 10:00:44 +00:00
objects = PermissionManager ( )
def __unicode__ ( self ) :
2009-06-11 23:11:06 +00:00
return self . codename
2009-06-08 10:00:44 +00:00
class Meta :
2009-07-22 15:05:07 +00:00
unique_together = ( " codename " , " object_id " , " content_type " , " user " , " group " )
2009-06-08 10:00:44 +00:00
verbose_name = _ ( ' permission ' )
verbose_name_plural = _ ( ' permissions ' )
permissions = (
( ' change_foreign_permissions ' , ' Can change foreign permissions ' ) ,
( ' delete_foreign_permissions ' , ' Can delete foreign permissions ' ) ,
2009-07-23 05:33:34 +00:00
( ' approve_permission_requests ' , ' Can approve permission requests ' ) ,
2009-06-08 10:00:44 +00:00
)
2009-07-22 15:05:07 +00:00
2009-07-23 05:33:34 +00:00
def save ( self , * args , * * kwargs ) :
# Make sure the approval date is always set
if self . approved and not self . date_approved :
self . date_approved = datetime . now ( )
super ( Permission , self ) . save ( * args , * * kwargs )
2009-07-22 15:05:07 +00:00
2009-07-23 05:33:34 +00:00
def approve ( self , creator ) :
2009-07-22 15:05:07 +00:00
"""
Approve granular permission request setting a Permission entry as
approved = True for a specific action from an user on an object instance .
"""
2009-07-23 05:33:34 +00:00
self . approved = True
self . creator = creator
2009-07-22 15:05:07 +00:00
self . save ( )