diff options
| -rw-r--r-- | django/contrib/admin/media/js/row_level_permission.js | 387 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_form.html | 3 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/row_level_permission.html | 132 | ||||
| -rw-r--r-- | django/contrib/admin/utils.py | 12 | ||||
| -rw-r--r-- | django/contrib/admin/views/main.py | 3 | ||||
| -rw-r--r-- | django/contrib/admin/views/row_level_permissions.py | 5 |
6 files changed, 355 insertions, 187 deletions
diff --git a/django/contrib/admin/media/js/row_level_permission.js b/django/contrib/admin/media/js/row_level_permission.js index 66e9d395be..ac01e34295 100644 --- a/django/contrib/admin/media/js/row_level_permission.js +++ b/django/contrib/admin/media/js/row_level_permission.js @@ -1,160 +1,245 @@ -/** - * @author clong - */ - //dojo.require("dojo.io.*"); - //dojo.require("dojo.event.*"); - //dojo.require("dojo.lfx.*"); - //dojo.require("dojo.widget.*"); - //dojo.require("dojo.json"); +var add_row_level_permission = { + init: function() { + // Grab the elements we’ll need. + add_row_level_permission.form = document.getElementById("addRLPForm"); + add_row_level_permission.results_div = document.getElementById("rlpResults"); -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' - }); - } -} + // This is so we can fade it in later. + YAHOO.util.Dom.setStyle(add_row_level_permission.results_div, "opacity", 0); + + // Hijack the form. + YAHOO.util.Event.addListener(add_row_level_permission.form, "submit", add_row_level_permission.submit_func); + }, + + submit_func: function(e) { + YAHOO.util.Event.preventDefault(e); + + //TODO: Remove any error messages here + + YAHOO.util.Connect.setForm(add_row_level_permission.form); + + //Temporarily disable the form. + for(var i=0; i<add_row_level_permission.form.elements.length; i++) { + add_row_level_permission.form.elements[i].disabled = true; + } + var cObj = YAHOO.util.Connect.asyncRequest("POST", + add_row_level_permission.form.action+"?ajax" , + add_row_level_permission.ajax_callback); + }, + + ajax_callback: { + success: function(o) { + var response_obj = eval('(' + o.responseText + ')'); + // Set up the animation on the results div. + var result_fade_out = null; + if(response_obj.result) { + result_fade_out = row_level_permission.output_success(response_obj.text, add_row_level_permission.results_div); + var results=response_obj.results + var new_rows = []; + var table = row_level_permission.edit_table; + for(var i=0; i<results.length; i++) { + row = add_row_level_permission.add_rlp_row(results[i].id, results[i].permission, results[i].hash); + var row_fade_in = new YAHOO.util.Anim(row, { + opacity: { from: 0, to: 100 } + }, 1, YAHOO.util.Easing.easeOut); + row_fade_in.onStart.subscribe(function() { + table.appendChild(row); + }); + row_fade_in.animate(); + } + } else { + result_fade_out = row_level_permission.output_error(response_obj.text, + add_row_level_permission.results_div); + } + for(var i=0; i<add_row_level_permission.form.elements.length; i++) + add_row_level_permission.form.elements[i].disabled = false; + result_fade_out.animate(); + }, + + failure: function(o) { + alert('An error has occurred'); + for(var i=0; i<add_row_level_permission.form.elements.length; i++) + add_row_level_permission.form.elements[i].disabled = false; + } + }, + + add_rlp_row: function(id, permission, hash) { + var emptyRow = document.getElementById('empty_editRLP'); + var newRow = emptyRow.cloneNode(true); + var form = YAHOO.util.Dom.getElementsByClassName('editRLPForm', 'form', newRow); + form=form[0]; + form.owner.options.selectedIndex = add_row_level_permission.form.owner.selectedIndex; + form.perm.options.selectedIndex = row_level_permission.find_in_select(form.perm, permission); + form.negative.checked =add_row_level_permission.form.negative.checked; + form.id = "editRLPForm-"+id; + newRow.id = "editRLP-"+id; + + var delete_link = YAHOO.util.Dom.getElementsByClassName('deleteLink', 'a', form); + delete_link = delete_link[0]; + delete_link.href = "../../../auth/row_level_permission/"+hash+"/delete/"; + + var copy_link = YAHOO.util.Dom.getElementsByClassName('copyToNewLink', 'a', newRow); + copy_link = copy_link[0]; + copy_link.href = "javascript:row_level_permission.copyToNew("+id+")"; + + form.action = "../../../auth/row_level_permission/"+hash+"/change/" -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(); - } -} + row_level_permission.add_delete_listener(delete_link); + row_level_permission.add_apply_listener(form); -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; -} + return newRow; + }, +}; -function outputErrors(errs) -{ - var output = genOutput('errors', errs); - dojo.lfx.html.highlight(output, [240, 0, 0], 3000).play(); -} +var row_level_permission = { + init: function() { + row_level_permission.results_div = document.getElementById("rlpResults"); + row_level_permission.edit_table = document.getElementById('current-rlpTable'); + }, + + find_in_select: function(select,val) { + options = select.options; + for(var i=0; i<options.length; i++) { + if(options[i].value==val) { + return i + } + } + return -1; + }, + + add_apply_listener: function(el) { + YAHOO.util.Event.addListener( + el, + 'submit', + function(e) { + YAHOO.util.Event.preventDefault(e); + row_level_permission.applyRLP(this.action, this); + } + ); + }, -function outputMessage(messages) -{ - var output = genOutput('messages', messages); - dojo.lfx.html.highlight(output, [184, 204, 228], 3000).play(); -} + add_delete_listener: function(el) { + YAHOO.util.Event.addListener( + el, + 'click', + function(e) { + YAHOO.util.Event.preventDefault(e); + row_level_permission.deleteRLP(this.href); + } + ); + }, + + deleteRLP: function(url) { + var confirm_ans = confirm("Are you sure?"); + if(confirm_ans) + var cObj = YAHOO.util.Connect.asyncRequest("POST", + url+"?ajax" , + row_level_permission.delete_callback); + return false; + }, + + delete_callback: { + success: function(o) + { + var response_obj = eval('(' + o.responseText + ')'); + // Set up the animation on the results div. + var result_fade_out = null; + if(response_obj.result) { + result_fade_out = row_level_permission.output_success(response_obj.text, document.getElementById("rlpResults")); + var row_fade_out = new YAHOO.util.Anim('editRLP-'+response_obj.id, { + opacity: { from:100, to: 0 } + }, 1, YAHOO.util.Easing.easeOut); + row_fade_out.onComplete.subscribe(function() { + var row = document.getElementById('editRLP-'+response_obj.id); + var table = row_level_permission.edit_table; + table.removeChild(row); + }); + row_fade_out.animate(); + } else { + result_fade_out = row_level_permission.output_errort(response_obj.text, + row_level_permission.results_div); + } + result_fade_out.animate(); + }, + failure: function(o) + { + alert('An error has occurred'); + } + }, + + output_error: function(text, div){ + YAHOO.util.Dom.replaceClass(div, "system-message", "errornote"); + return row_level_permission.output_text(text, div); + }, -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()) + output_success: function(text, div){ + YAHOO.util.Dom.replaceClass(div, "errornote", "system-message"); + return row_level_permission.output_text(text, div); + }, + + output_text: function (text, div) { + var result_fade_out = new YAHOO.util.Anim(div, { + opacity: { to: 0 } + }, 0.25, YAHOO.util.Easing.easeOut); + var success_message = document.createElement('p'); + success_message.innerHTML = text; + YAHOO.util.Dom.setStyle(div, 'display', 'block'); + var result_fade_in = new YAHOO.util.Anim(div, { + opacity: { to: 1 } + }, 0.25, YAHOO.util.Easing.easeIn); + result_fade_out.onComplete.subscribe(function() { + div.innerHTML = ''; + div.appendChild(success_message); + result_fade_in.animate(); + }); + return result_fade_out; + }, + + applyRLP: function(url, form) { + YAHOO.util.Connect.setForm(form); + var cObj = YAHOO.util.Connect.asyncRequest("POST", + url+"?ajax" , + row_level_permission.apply_callback); + return false; + }, + + apply_callback: { + success: function(o) + { + var response_obj = eval('(' + o.responseText + ')'); + // Set up the animation on the results div. + var result_fade_out = null; + if(response_obj.result) { + result_fade_out = row_level_permission.output_success(response_obj.text, document.getElementById("rlpResults")); + var row_highlight_on = new YAHOO.util.ColorAnim('editRLP-'+response_obj.id, { + backgroundColor: { to: 'rgb(255, 255, 204)' } + }, 1); + var row_highlight_off = new YAHOO.util.ColorAnim('editRLP-'+response_obj.id, { + backgroundColor: { to: 'rgb(255, 255, 255)' } + }, 1); + row_highlight_on.onComplete.subscribe(function() { + row_highlight_off.animate(); + }); + row_highlight_on.animate(); + } else { + result_fade_out = row_level_permission.output_errort(response_obj.text, + row_level_permission.results_div); + } + result_fade_out.animate(); + }, + failure: function(o) + { + alert('An error has occurred'); + } + }, + + copyToNew: function (id) { - node.removeChild(node.firstChild); - } -} - - -function init() -{ - for(var i=0; i<document.forms.length; i++) - { - document.forms[i].reset(); - } + var newForm = add_row_level_permission.form; + var form = document.getElementById("editRLPForm-"+id); + newForm.owner.selectedIndex = form.owner.selectedIndex; + newForm.perm.selectedIndex = form.perm.selectedIndex; + newForm.negative.checked = form.negative.checked; + } } -//dojo.addOnLoad(init);
\ No newline at end of file diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index c23d2ce686..942cb1c6e0 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -67,8 +67,7 @@ </form> {% if new_rlp_form %} -<h1>{% trans "Row Level Permissions" %}</h1> -<div> +<div id="row_level_perm_container"> {% include "admin/row_level_permission.html" %} </div> {% endif %} diff --git a/django/contrib/admin/templates/admin/row_level_permission.html b/django/contrib/admin/templates/admin/row_level_permission.html index b73f1e99a2..ae097a7031 100644 --- a/django/contrib/admin/templates/admin/row_level_permission.html +++ b/django/contrib/admin/templates/admin/row_level_permission.html @@ -1,8 +1,38 @@ {% load i18n admin_modify %} -{% include_admin_script "js/ajax/prototype.js" %} -{% include_admin_script "js/ajax/scriptaculous.js" %} +{% include_admin_script "js/lib/YahooUI/yahoo/yahoo-debug.js" %} +{% include_admin_script "js/lib/YahooUI/event/event-debug.js" %} +{% include_admin_script "js/lib/YahooUI/connection/connection-debug.js" %} +{% include_admin_script "js/lib/YahooUI/dom/dom-debug.js" %} +{% include_admin_script "js/lib/YahooUI/animation/animation-debug.js" %} +{% include_admin_script "js/lib/YahooUI/logger/logger-debug.js" %} {% include_admin_script "js/row_level_permission.js" %} -<table id="rlpTable"> +<link rel="stylesheet" type="text/css" href="/media/js/lib/YahooUI/logger/logger.css" /> + + +<script type="text/javascript"> + +function init() { + add_row_level_permission.init(); + row_level_permission.init(); + + forms = document.forms; + for(var i=0; i<forms.length; i++) { + forms[i].reset; + } + + row_level_permission.add_delete_listener(YAHOO.util.Dom.getElementsByClassName( "deleteLink", 'a')); + row_level_permission.add_apply_listener(YAHOO.util.Dom.getElementsByClassName( "editRLPForm", 'form')); +} + +YAHOO.util.Event.addListener(window, 'load', init); +</script> + +<h1>{% trans "Row Level Permissions" %}</h1> +<div id="rlpResults"> +</div> +<h2>{% trans "Add Permissions" %}</h2> +<form id="addRLPForm" method="POST" name="addRLPForm" action="../../../auth/row_level_permission/add/{{ content_type_id }}/{{ object_id }}/"> +<table id="add-rlpTable"> <tr class="header"> <th> {% trans "Owner" %} @@ -17,12 +47,6 @@ {% trans "Options" %} </th> </tr> -<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> -<th colspan=4> -{% trans "Add Permissions" %} -</th> -</tr> <TBODY> <tr> <td> @@ -44,38 +68,88 @@ <input id="addButton" type="submit" value="{% trans 'Add' %}" /> </td> </tr> +</table> </form> -<tr> -<th colspan=4> -{% trans "Current Permissions" %} + +<h2>{% trans "Current Permissions" %}</h2> +<table id="current-rlpTable"> +<tr class="header"> +<th> +{% trans "Owner" %} +</th> +<th> +{% trans "Permission" %} +</th> +<th> +{% trans "Negative" %} +</th> +<th> +{% trans "Options" %} </th> </tr> +<TBODY> {% if rlp_form_list %} {% load row_level_permission %} {% for o in rlp_form_list %} <tr id="editRLP-{{ o.rlp.id }}"> -<form id="editRLPForm-{{ o.rlp.id }}" method="POST" name="editRLPForm-{{ rlp.id }}" action="../../../auth/row_level_permission/{% objref o.rlp %}/change/" onSubmit="applyButtonPressed('{% objref o.rlp %}'); return false;"> -<td> -{{ o.form.owner }} -</td> -<td> -{{ o.form.perm }} -</td> -<td> -{{ o.form.negative }} -</td> -<td> -<input id="applyButton-{{ o.rlp.id }}" type="submit" value="{% trans 'Apply' %}" /> -<input id="cancelButton-{{ o.rlp.id }}" type="reset" value="{% trans 'Reset' %}"/> -<br/> -<a href="../../../auth/row_level_permission/{% objref o.rlp %}/delete/" onClick="deleteRLP('{% objref o.rlp %}'); return false;" class="deleteLink">{% trans 'Delete' %}</a> | -<a href="" onClick="copyToNew({{ o.rlp.id }}); return false;" class="copyToNewLink">{% trans 'Copy to New' %}</a> -</td> +<td colspan="4"> +<form id="editRLPForm-{{ o.rlp.id }}" class="editRLPForm" method="POST" name="editRLPForm-{{ rlp.id }}" action="../../../auth/row_level_permission/{% objref o.rlp %}/change/"> +<table> +<tr> + <td> + {{ o.form.owner }} + </td> + <td> + {{ o.form.perm }} + </td> + <td> + {{ o.form.negative }} + </td> + <td> + <input id="applyButton-{{ o.rlp.id }}" type="submit" value="{% trans 'Apply' %}" /> + <input id="cancelButton-{{ o.rlp.id }}" type="reset" value="{% trans 'Reset' %}"/> + <br/> + <!--<a href="../../../auth/row_level_permission/{% objref o.rlp %}/delete/" class="deleteLink" onclick="row_level_permission.deleteRLP('{% objref o.rlp %}'); return false;">{% trans 'Delete' %}</a> |--> + <a href="../../../auth/row_level_permission/{% objref o.rlp %}/delete/" class="deleteLink">{% trans 'Delete' %}</a> | + <a href="javascript:row_level_permission.copyToNew({{ o.rlp.id }})" class="copyToNewLink">{% trans 'Copy to New' %}</a> + </td> +</tr> +</table> </form> +</td> </tr> {% endfor %} {% else %} <tr><td colspan=4><em>No row level permissions</em></td></tr> {% endif %} </TBODY> +</table> + +<table style="display: none"> +<tr id="empty_editRLP"> +<td colspan="4"> +<form id="empty_editRLPForm" method="POST" class="editRLPForm" name="empty-editRLPForm"> +<table> +<tr> + <td> + {{ empty_rlp_form.owner }} + </td> + <td> + {{ empty_rlp_form.perm }} + </td> + <td> + {{ empty_rlp_form.negative }} + </td> + <td> + <input id="applyButton" type="submit" value="{% trans 'Apply' %}" /> + <input id="cancelButton" type="reset" value="{% trans 'Reset' %}"/> + <br/> + <a class="deleteLink" >{% trans 'Delete' %}</a> | + <a class="copyToNewLink">{% trans 'Copy to New' %}</a> + </td> +</tr> +</table> +</form> +</td> +</tr> </table>
\ No newline at end of file diff --git a/django/contrib/admin/utils.py b/django/contrib/admin/utils.py index e1d408b275..1585e3afb5 100644 --- a/django/contrib/admin/utils.py +++ b/django/contrib/admin/utils.py @@ -103,11 +103,19 @@ if docutils_is_available: #Based off work by Ian Holsman #http://svn.zyons.python-hosting.com/trunk/zilbo/common/utils/misc.py + +import sha +from django.conf import settings +from django.contrib.contenttypes.models import ContentType + def verify_objref_hash( content_type_id, object_id, hash ): - import sha - from django.conf import settings hash_match = sha.new("%s/%s" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest() if hash == hash_match: return True else: return False + +def create_objref(object): + content_type_id = ContentType.objects.get_for_model( object ).id + object_id = object.id + return "%s/%d/%s" % ( content_type_id, object_id, sha.new("%s/%d" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest())
\ No newline at end of file diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py index 6ac7ccb276..58de960d14 100644 --- a/django/contrib/admin/views/main.py +++ b/django/contrib/admin/views/main.py @@ -402,12 +402,13 @@ def change_stage(request, app_label, model_name, object_id): add_rlp_manip = AddRLPManipulator(model_instance, model_ct) edit_rlp_manip = ChangeRLPManipulator(model_ct) new_rlp_form = forms.FormWrapper(add_rlp_manip, rlp_new_data, rlp_errors) + empty_rlp_form = forms.FormWrapper(edit_rlp_manip, rlp_new_data, rlp_errors) rlp_form_list = [] for r in rlp_list: owner_val = str(r.owner_ct)+"-"+str(r.owner_id) data = {'id':r.id, 'owner':owner_val, 'perm':r.permission.id, 'negative':r.negative} rlp_form_list.append({'form':forms.FormWrapper(edit_rlp_manip, data, rlp_errors), 'rlp':r}) - rlp_context = {'new_rlp_form':new_rlp_form, 'rlp_form_list':rlp_form_list,} + rlp_context = {'new_rlp_form':new_rlp_form, 'rlp_form_list':rlp_form_list, 'empty_rlp_form':empty_rlp_form} c.update(rlp_context) return render_change_form(model, manipulator, c, change=True) diff --git a/django/contrib/admin/views/row_level_permissions.py b/django/contrib/admin/views/row_level_permissions.py index 47d441e647..82485e88d8 100644 --- a/django/contrib/admin/views/row_level_permissions.py +++ b/django/contrib/admin/views/row_level_permissions.py @@ -41,7 +41,6 @@ def add_row_level_permission(request, ct_id, obj_id): ct = get_object_or_404(ContentType, pk=ct_id) obj = get_object_or_404(ct.model_class(), pk=obj_id) - if not request.user.has_perm(obj._meta.app_label + '.' + obj._meta.get_change_permission()): raise PermissionDenied @@ -51,6 +50,7 @@ def add_row_level_permission(request, ct_id, obj_id): manip = AddRLPManipulator(obj, ct) new_data = request.POST.copy() + manip.do_html2python(new_data) rlp_list = [] @@ -71,7 +71,8 @@ def add_row_level_permission(request, ct_id, obj_id): resp_list = [] for rlp in rlp_list: - resp_list.append({"id":rlp.id, "permission":rlp.permission.id}) + hash = utils.create_objref(rlp) + resp_list.append({"id":rlp.id, "permission":rlp.permission.id, "hash":hash}) msg["results"]=resp_list return HttpResponse(simplejson.dumps(msg), 'text/javascript') |
