mirror of
https://github.com/django/django.git
synced 2025-07-05 02:09:13 +00:00
[per-object-permissions] Renamed the attribute in RLPs to be model instead of type
git-svn-id: http://code.djangoproject.com/svn/django/branches/per-object-permissions@3518 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
68072fa75c
commit
aba82ef36b
@ -32,15 +32,15 @@ class ChangeRLPManipulator(forms.Manipulator):
|
|||||||
owner = MultipleObjSelectField.returnObject(new_data['owner'])
|
owner = MultipleObjSelectField.returnObject(new_data['owner'])
|
||||||
owner_ct = ContentType.objects.get_for_model(owner)
|
owner_ct = ContentType.objects.get_for_model(owner)
|
||||||
|
|
||||||
model_ct = rlp.type_ct
|
model_ct = rlp.model_ct
|
||||||
model = model_ct.get_object_for_this_type (pk=rlp.type_id)
|
model = model_ct.get_object_for_this_type (pk=rlp.model_id)
|
||||||
|
|
||||||
perm = Permission.objects.get(pk=new_data['perm'])
|
perm = Permission.objects.get(pk=new_data['perm'])
|
||||||
|
|
||||||
|
|
||||||
field_name_list = ('owner_ct', 'owner_id', 'type_ct', 'type_id', 'permission')
|
field_name_list = ('owner_ct', 'owner_id', 'model_ct', 'model_id', 'permission')
|
||||||
field_data = owner_ct.id
|
field_data = owner_ct.id
|
||||||
all_data = {'owner_id':owner.id, 'type_ct_id':model_ct.id, 'type_id':model.id, 'permission_id':perm.id}
|
all_data = {'owner_id':owner.id, 'model_ct_id':model_ct.id, 'model_id':model.id, 'permission_id':perm.id}
|
||||||
manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data)
|
manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data)
|
||||||
|
|
||||||
rlp.owner = owner
|
rlp.owner = owner
|
||||||
@ -74,9 +74,9 @@ class AddRLPManipulator(ChangeRLPManipulator):
|
|||||||
for i in new_data.getlist('perm'):
|
for i in new_data.getlist('perm'):
|
||||||
perm = Permission.objects.get(pk=i)
|
perm = Permission.objects.get(pk=i)
|
||||||
|
|
||||||
field_name_list = ('owner_ct', 'owner_id', 'type_ct', 'type_id', 'permission')
|
field_name_list = ('owner_ct', 'owner_id', 'model_ct', 'model_id', 'permission')
|
||||||
field_data = ct.id
|
field_data = ct.id
|
||||||
all_data = {'owner_id':owner.id, 'type_ct_id':self.ct.id, 'type_id':self.obj_instance.id, 'permission_id':perm.id}
|
all_data = {'owner_id':owner.id, 'model_ct_id':self.ct.id, 'model_id':self.obj_instance.id, 'permission_id':perm.id}
|
||||||
manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data)
|
manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data)
|
||||||
|
|
||||||
rlp = RowLevelPermission.objects.create_row_level_permission(self.obj_instance, owner, perm, negative=new_data['negative'])
|
rlp = RowLevelPermission.objects.create_row_level_permission(self.obj_instance, owner, perm, negative=new_data['negative'])
|
||||||
|
@ -67,7 +67,10 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
{% if new_rlp_form %}
|
{% if new_rlp_form %}
|
||||||
|
<h1>{% trans "Row Level Permissions" %}</h1>
|
||||||
|
<div>
|
||||||
{% include "admin/row_level_permission.html" %}
|
{% include "admin/row_level_permission.html" %}
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
{% load i18n admin_modify %}
|
{% load i18n admin_modify %}
|
||||||
|
{% include_admin_script "js/ajax/prototype.js" %}
|
||||||
|
{% include_admin_script "js/ajax/scriptaculous.js" %}
|
||||||
{% include_admin_script "js/row_level_permission.js" %}
|
{% include_admin_script "js/row_level_permission.js" %}
|
||||||
<table id="rlpTable">
|
<table id="rlpTable">
|
||||||
<tr class="header">
|
<tr class="header">
|
||||||
@ -15,7 +17,7 @@
|
|||||||
{% trans "Options" %}
|
{% trans "Options" %}
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
<form id="addRLPForm" method="POST" name="addRLPForm" action="../../../auth/row_level_permission/add/{{ content_type_id }}/{{ object_id }}/" onSubmit="addButtonPressed({{ obj_ct }}, {{ obj_id }}); return false;">
|
<form id="addRLPForm" method="POST" name="addRLPForm" action="../../../auth/row_level_permission/add/{{ content_type_id }}/{{ object_id }}/" onSubmit="addButtonPressed({{ content_type_id }}, {{ object_id }}); return false;">
|
||||||
<tr>
|
<tr>
|
||||||
<th colspan=4>
|
<th colspan=4>
|
||||||
{% trans "Add Permissions" %}
|
{% trans "Add Permissions" %}
|
||||||
@ -73,7 +75,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<tr><td>No row level permissions</td></tr>
|
<tr><td colspan=4><em>No row level permissions</em></td></tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</TBODY>
|
</TBODY>
|
||||||
</table>
|
</table>
|
@ -11,12 +11,12 @@ def delete_row_level_permission(request, ct_id, rlp_id, hash, ajax=None):
|
|||||||
msg = {}
|
msg = {}
|
||||||
if utils.verify_objref_hash(ct_id, rlp_id, hash):
|
if utils.verify_objref_hash(ct_id, rlp_id, hash):
|
||||||
rlp = get_object_or_404(RowLevelPermission, pk=rlp_id)
|
rlp = get_object_or_404(RowLevelPermission, pk=rlp_id)
|
||||||
ct = rlp.type_ct
|
ct = rlp.model_ct
|
||||||
obj = rlp.type
|
obj = rlp.model
|
||||||
opts = rlp._meta
|
opts = rlp._meta
|
||||||
if not request.user.has_perm(opts.app_label + '.' + opts.get_delete_permission()):
|
if not request.user.has_perm(opts.app_label + '.' + opts.get_delete_permission()):
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
if not request.user.has_perm(obj._meta.app_label + '.' + obj._meta.get_change_permission()()):
|
if not request.user.has_perm(obj._meta.app_label + '.' + obj._meta.get_change_permission()):
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
rlp.delete()
|
rlp.delete()
|
||||||
msg = {"result":True, "text":_("Row level permission was successful deleted"), "id":rlp_id}
|
msg = {"result":True, "text":_("Row level permission was successful deleted"), "id":rlp_id}
|
||||||
@ -92,7 +92,7 @@ def change_row_level_permission(request, ct_id, rlp_id, hash, ajax=None):
|
|||||||
if not request.user.has_perm(opts.app_label + '.' + opts.get_add_permission()):
|
if not request.user.has_perm(opts.app_label + '.' + opts.get_add_permission()):
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
|
|
||||||
object_model = rlp.type_ct.model_class()
|
object_model = rlp.model_ct.model_class()
|
||||||
if not request.user.has_perm(object_model._meta.app_label + '.' + object_model._meta.get_change_permission()):
|
if not request.user.has_perm(object_model._meta.app_label + '.' + object_model._meta.get_change_permission()):
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
|
|
||||||
@ -111,4 +111,4 @@ def change_row_level_permission(request, ct_id, rlp_id, hash, ajax=None):
|
|||||||
if ajax:
|
if ajax:
|
||||||
return HttpResponse(simplejson.dumps(msg), 'text/javascript')
|
return HttpResponse(simplejson.dumps(msg), 'text/javascript')
|
||||||
request.user.message_set.create(message=msg['text'])
|
request.user.message_set.create(message=msg['text'])
|
||||||
return HttpResponseRedirect("../../../../../../%s/%s/%s" % (object_model._meta.app_label, object_model._meta.module_name , str(rlp.type_id)))
|
return HttpResponseRedirect("../../../../../../%s/%s/%s" % (object_model._meta.app_label, object_model._meta.module_name , str(rlp.model_id)))
|
@ -48,27 +48,28 @@ class Permission(models.Model):
|
|||||||
return "%s | %s" % (self.content_type, self.name)
|
return "%s | %s" % (self.content_type, self.name)
|
||||||
|
|
||||||
class RowLevelPermissionManager(models.Manager):
|
class RowLevelPermissionManager(models.Manager):
|
||||||
def create_row_level_permission(self, object_instance, owner, permission, negative=False):
|
def create_row_level_permission(self, model_instance, owner, permission, negative=False):
|
||||||
if isinstance(permission, str):
|
if isinstance(permission, str):
|
||||||
permission = Permission.objects.get(codename__exact=permission)
|
permission = Permission.objects.get(codename__exact=permission)
|
||||||
type_ct=ContentType.objects.get_for_model(object_instance)
|
model_ct=ContentType.objects.get_for_model(model_instance)
|
||||||
if type_ct != permission.content_type:
|
if model_ct != permission.content_type:
|
||||||
raise TypeError, "Invalid value: Permission content type(%s) and object content type(%s) do not match" % (permission.content_type, type_ct)
|
raise TypeError, "Invalid value: Permission content type(%s) and object content type(%s) do not match" % (permission.content_type, type_ct)
|
||||||
|
|
||||||
rowLvlPerm = self.model(type_id=object_instance.id, type_ct=ContentType.objects.get_for_model(object_instance),
|
rowLvlPerm = self.model(model_id=model_instance.id, model_ct=model_ct,
|
||||||
owner_id=owner.id, owner_ct=ContentType.objects.get_for_model(owner),
|
owner_id=owner.id, owner_ct=ContentType.objects.get_for_model(owner),
|
||||||
permission=permission, negative=negative)
|
permission=permission, negative=negative)
|
||||||
rowLvlPerm.save()
|
rowLvlPerm.save()
|
||||||
return rowLvlPerm
|
return rowLvlPerm
|
||||||
|
|
||||||
def create_default_row_permissions(self, type, owner, change=True, delete=True, negChange=False, negDel=False):
|
def create_default_row_permissions(self, model_instance, owner, change=True, delete=True, negChange=False, negDel=False):
|
||||||
ret_dict = {}
|
ret_dict = {}
|
||||||
|
model_ct = ContentType.objects.get_for_model(model_instance)
|
||||||
if change:
|
if change:
|
||||||
change_str = "change_%s" % (ContentType.objects.get_for_model(type))
|
change_str = "change_%s" % (model_ct)
|
||||||
ret_dict[change_str]=self.create_row_level_permission(type, owner, change_str, negative=negChange)
|
ret_dict[change_str]=self.create_row_level_permission(model_instance, owner, change_str, negative=negChange)
|
||||||
if delete:
|
if delete:
|
||||||
delete_str = "delete_%s" % (ContentType.objects.get_for_model(type))
|
delete_str = "delete_%s" % (model_ct)
|
||||||
ret_dict[delete_str]=self.create_row_level_permission(type, owner, delete_str, negative=negDel)
|
ret_dict[delete_str]=self.create_row_level_permission(model_instance, owner, delete_str, negative=negDel)
|
||||||
return ret_dict
|
return ret_dict
|
||||||
|
|
||||||
class RowLevelPermission(models.Model):
|
class RowLevelPermission(models.Model):
|
||||||
@ -76,14 +77,14 @@ class RowLevelPermission(models.Model):
|
|||||||
This uses generic relations to minimize the number of tables, and connects to the
|
This uses generic relations to minimize the number of tables, and connects to the
|
||||||
permissions table using a many to one relation.
|
permissions table using a many to one relation.
|
||||||
"""
|
"""
|
||||||
type_id = models.PositiveIntegerField("'Type' ID")
|
model_id = models.PositiveIntegerField("'Model' ID")
|
||||||
type_ct = models.ForeignKey(ContentType, verbose_name="'Type' content type", related_name="type_ct")
|
model_ct = models.ForeignKey(ContentType, verbose_name="'Model' content type", related_name="model_ct")
|
||||||
owner_id = models.PositiveIntegerField("'Owner' ID")
|
owner_id = models.PositiveIntegerField("'Owner' ID")
|
||||||
owner_ct = models.ForeignKey(ContentType, verbose_name="'Owner' content type", related_name="owner_ct")
|
owner_ct = models.ForeignKey(ContentType, verbose_name="'Owner' content type", related_name="owner_ct")
|
||||||
negative = models.BooleanField()
|
negative = models.BooleanField()
|
||||||
permission = models.ForeignKey(Permission)
|
permission = models.ForeignKey(Permission)
|
||||||
|
|
||||||
type = models.GenericForeignKey(fk_field='type_id', ct_field='type_ct')
|
model = models.GenericForeignKey(fk_field='model_id', ct_field='model_ct')
|
||||||
owner = models.GenericForeignKey(fk_field='owner_id', ct_field='owner_ct')
|
owner = models.GenericForeignKey(fk_field='owner_id', ct_field='owner_ct')
|
||||||
|
|
||||||
objects = RowLevelPermissionManager()
|
objects = RowLevelPermissionManager()
|
||||||
@ -91,14 +92,14 @@ class RowLevelPermission(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('row level permission')
|
verbose_name = _('row level permission')
|
||||||
verbose_name_plural = _('row level permissions')
|
verbose_name_plural = _('row level permissions')
|
||||||
unique_together = (('type_ct', 'type_id', 'owner_id', 'owner_ct', 'permission'),)
|
unique_together = (('model_ct', 'model_id', 'owner_id', 'owner_ct', 'permission'),)
|
||||||
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s | %s:%s | %s:%s" % (self.permission, self.owner_ct, self.owner, self.type_ct, self.type)
|
return "%s | %s:%s | %s:%s" % (self.permission, self.owner_ct, self.owner, self.model_ct, self.model)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "%s | %s:%s | %s:%s" % (self.permission, self.owner_ct, self.owner, self.type_ct, self.type)
|
return "%s | %s:%s | %s:%s" % (self.permission, self.owner_ct, self.owner, self.model_ct, self.model)
|
||||||
|
|
||||||
|
|
||||||
class Group(models.Model):
|
class Group(models.Model):
|
||||||
|
@ -63,7 +63,7 @@ class ModelBase(type):
|
|||||||
|
|
||||||
if getattr(new_class._meta, 'row_level_permissions', None):
|
if getattr(new_class._meta, 'row_level_permissions', None):
|
||||||
from django.contrib.auth.models import RowLevelPermission
|
from django.contrib.auth.models import RowLevelPermission
|
||||||
gen_rel = django.db.models.GenericRelation(RowLevelPermission, object_id_field="type_id", content_type_field="type_ct")
|
gen_rel = django.db.models.GenericRelation(RowLevelPermission, object_id_field="model_id", content_type_field="model_ct")
|
||||||
new_class.add_to_class("row_level_permissions", gen_rel)
|
new_class.add_to_class("row_level_permissions", gen_rel)
|
||||||
|
|
||||||
new_class._prepare()
|
new_class._prepare()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user