From 340718bd3a4f56a257dd4285da178751d9cf84d2 Mon Sep 17 00:00:00 2001 From: Christopher Long Date: Sat, 29 Jul 2006 16:00:23 +0000 Subject: [PATCH] [per-object-permissions] Very basic integration of RLPs into admin interface. git-svn-id: http://code.djangoproject.com/svn/django/branches/per-object-permissions@3486 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../admin/media/js/row_level_permission.js | 160 ++++++++++++++++++ .../admin/row_level_perm_manipulator.py | 138 +++++++++++++++ .../admin/templates/admin/change_form.html | 8 +- .../templates/admin/row_level_permission.html | 79 +++++++++ .../templatetags/row_level_permission.py | 37 ++++ django/contrib/admin/urls.py | 6 + django/contrib/admin/utils.py | 11 ++ django/contrib/admin/views/main.py | 19 +++ .../admin/views/row_level_permissions.py | 105 ++++++++++++ 9 files changed, 562 insertions(+), 1 deletion(-) create mode 100644 django/contrib/admin/media/js/row_level_permission.js create mode 100644 django/contrib/admin/row_level_perm_manipulator.py create mode 100644 django/contrib/admin/templates/admin/row_level_permission.html create mode 100644 django/contrib/admin/templatetags/row_level_permission.py create mode 100644 django/contrib/admin/views/row_level_permissions.py diff --git a/django/contrib/admin/media/js/row_level_permission.js b/django/contrib/admin/media/js/row_level_permission.js new file mode 100644 index 0000000000..66e9d395be --- /dev/null +++ b/django/contrib/admin/media/js/row_level_permission.js @@ -0,0 +1,160 @@ +/** + * @author clong + */ + //dojo.require("dojo.io.*"); + //dojo.require("dojo.event.*"); + //dojo.require("dojo.lfx.*"); + //dojo.require("dojo.widget.*"); + //dojo.require("dojo.json"); + +function addButtonPressed(obj_ct, obj_id) +{ + return; + dojo.io.bind({ + url: "/rlp/add/"+obj_ct+"/"+obj_id+"/ajax/", + handler: addCallback, + formNode: dojo.byId('addRLPForm') + }); +} + +function addCallback(type, data, evt) +{ + if (type == 'error') + alert('Error when retrieving data from the server!'); + else + { + dictData = dojo.json.evalJson(data); + if(dictData.result == false) + { + //outputError(dictData.text); + return; + } + alert("Success!"); + //outputMsg(dictData.text); + //dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [184, 204, 228], 1000).play(); + } +} + +function applyButtonPressed(id) +{ +return; + strArray = id.split("/"); + dojo.io.bind({ + url: "/rlp/change/"+id+'/ajax/', + handler: editCallback, + formNode: dojo.byId('editRLPForm-'+strArray[1]) + }); +} + +function editCallback(type, data, evt) +{ + if (type == 'error') + alert('Error when retrieving data from the server!'); + else + { + dictData = dojo.json.evalJson(data); + if(dictData.result == false) + { + outputError(dictData.text); + dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [255, 0, 0], 1000).play(); + alert("Error"); + return; + } + outputMessage(dictData.text); + dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [184, 204, 228], 1000).play(); + } +} + +function deleteRLP(id) +{ +return; + var confirm_ans = confirm("Are you sure?"); + if(confirm_ans) + { + dojo.io.bind({ + url: '/rlp/delete/'+id+'/ajax', + handler: deleteCallback, + mimetype: 'text/json' + }); + } +} + +function deleteCallback(type, data, evt) +{ + if (type == 'error') + alert('Error when retrieving data from the server!'); + else + { + dictData = dojo.json.evalJson(data); + if(dictData.result == false) + { + //outputError(dictData.text); + dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [255, 0, 0], 1000).play(); + return; + } + outputMessage(dictData.text); + var row = dojo.byId('editRLP-'+dictData.id); + var fadeOut = dojo.lfx.fadeOut(row, 1000, null, function(n) { + var table = dojo.byId('rlpTable'); + table.deleteRow(row.rowIndex); + }); + dojo.lfx.html.highlight(row, [255, 0, 0], 500).play(1500); + fadeOut.play(); + } +} + +function copyToNew(id) +{ + var newForm = document.addRLPForm; + var form = dojo.byId("editRLPForm-"+id); + newForm.owner.selectedIndex = form.owner.selectedIndex; + newForm.perm.selectedIndex = form.perm.selectedIndex; + newForm.negative.checked = form.negative.checked; +} + +function outputErrors(errs) +{ + var output = genOutput('errors', errs); + dojo.lfx.html.highlight(output, [240, 0, 0], 3000).play(); +} + +function outputMessage(messages) +{ + var output = genOutput('messages', messages); + dojo.lfx.html.highlight(output, [184, 204, 228], 3000).play(); +} + +function genOutput(id, str) +{ + var list = document.createElement("ul"); + list.id = id; + var txt = document.createTextNode(str); + var ele = document.createElement("li"); + ele.appendChild(txt); + list.appendChild(ele); + var output = dojo.byId('output'); + removeChildrenFromNode(output); + output.appendChild(list); + return output; +} + + +function removeChildrenFromNode(node) +{ + + while (node.hasChildNodes()) + { + node.removeChild(node.firstChild); + } +} + + +function init() +{ + for(var i=0; i {% endif %} - + + +{% if rlp_form_list %} +{% include "admin/row_level_permission.html" %} +{% endif %} + + {% endblock %} diff --git a/django/contrib/admin/templates/admin/row_level_permission.html b/django/contrib/admin/templates/admin/row_level_permission.html new file mode 100644 index 0000000000..bb62c78a52 --- /dev/null +++ b/django/contrib/admin/templates/admin/row_level_permission.html @@ -0,0 +1,79 @@ +{% load i18n admin_modify %} +{% include_admin_script "js/row_level_permission.js" %} + + + + + + + + + + + + + + + + + + + + + + +{% if rlp_form_list %} +{% load row_level_permission %} +{% for o in rlp_form_list %} + + + + + + + + +{% endfor %} +{% else %} + +{% endif %} + +
+{% trans "Owner" %} + +{% trans "Permission" %} + +{% trans "Negative" %} + +{% trans "Options" %} +
+{% trans "Add Permissions" %} +
+

+ {{ new_rlp_form.owner }} +

+
+

+ {{ new_rlp_form.perm }} +

+
+

+ {{ new_rlp_form.negative }} +

+
+ +
+{% trans "Current Permissions" %} +
+{{ o.form.owner }} + +{{ o.form.perm }} + +{{ o.form.negative }} + + + +
+{% trans 'Delete' %} | +{% trans 'Copy to New' %} +
No row level permissions
\ No newline at end of file diff --git a/django/contrib/admin/templatetags/row_level_permission.py b/django/contrib/admin/templatetags/row_level_permission.py new file mode 100644 index 0000000000..edbd6e09a0 --- /dev/null +++ b/django/contrib/admin/templatetags/row_level_permission.py @@ -0,0 +1,37 @@ +import sha +from django.contrib.contenttypes.models import ContentType +from django import template +from django.conf import settings + +register = template.Library() + +#Based off work by Ian Holsman +#http://svn.zyons.python-hosting.com/trunk/zilbo/common/utils/templatetags/media.py +class objref_class(template.Node): + """ return a object reference to a given object """ + def __init__(self, obj): + self.object_name= obj + + def render(self, context): + object_id = template.resolve_variable( self.object_name, context ) + c_obj = ContentType.objects.get_for_model( object_id ).id + #c_obj = get_content_type_id( object_id ) + return "%s/%d/%s" % ( c_obj, object_id.id, sha.new("%s/%d" % (c_obj, object_id.id) + settings.SECRET_KEY).hexdigest()) + +#Based off work by Ian Holsman +#http://svn.zyons.python-hosting.com/trunk/zilbo/common/utils/templatetags/media.py +def objref(parser, token): + """ + {% objref %} + """ + bits = token.contents.split() + tok="" + if len(bits) > 2: + raise template.TemplateSyntaxError, "'objref' statements must be 'objref ': %s" % token.contents + if len(bits) == 2: + tok = bits[1] + else: + tok = "object" + return objref_class(tok) + +register.tag('objref', objref) \ No newline at end of file diff --git a/django/contrib/admin/urls.py b/django/contrib/admin/urls.py index bd894d8de1..bbdfedf087 100644 --- a/django/contrib/admin/urls.py +++ b/django/contrib/admin/urls.py @@ -28,6 +28,11 @@ urlpatterns = patterns('', # ('^doc/templates/$', 'django.views.admin.doc.template_index'), ('^doc/templates/(?P