Django

Code

Changeset 3540

Show
Ignore:
Timestamp:
08/08/06 20:22:35 (2 years ago)
Author:
clong
Message:

[per-object-permissions] AJAX interface is now working most of the time. A fair amount of work has to be done still and some tidying up of the interface. Uses YUI toolkit. Currently comes w/ the full toolkit, once debugged and working will keep only the needed js files.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/per-object-permissions/django/contrib/admin/media/js/row_level_permission.js

    r3486 r3540  
    1 /** 
    2  * @author clong 
    3  */ 
    4       //dojo.require("dojo.io.*"); 
    5       //dojo.require("dojo.event.*"); 
    6       //dojo.require("dojo.lfx.*"); 
    7       //dojo.require("dojo.widget.*"); 
    8       //dojo.require("dojo.json"); 
    9  
    10 function addButtonPressed(obj_ct, obj_id) 
    11 
    12     return; 
    13   dojo.io.bind({ 
    14                  url: "/rlp/add/"+obj_ct+"/"+obj_id+"/ajax/",  
    15                  handler: addCallback, 
    16                  formNode: dojo.byId('addRLPForm') 
    17               }); 
     1var add_row_level_permission = { 
     2        init: function() { 
     3           // Grab the elements we’ll need.                                                                                                                                       
     4           add_row_level_permission.form = document.getElementById("addRLPForm"); 
     5           add_row_level_permission.results_div = document.getElementById("rlpResults"); 
     6 
     7           // This is so we can fade it in later.                                                                                                                                 
     8           YAHOO.util.Dom.setStyle(add_row_level_permission.results_div, "opacity", 0); 
     9         
     10           // Hijack the form.                                                                                                                                                    
     11           YAHOO.util.Event.addListener(add_row_level_permission.form, "submit", add_row_level_permission.submit_func); 
     12        }, 
     13         
     14        submit_func: function(e) { 
     15           YAHOO.util.Event.preventDefault(e); 
     16         
     17                //TODO: Remove any error messages here 
     18         
     19           YAHOO.util.Connect.setForm(add_row_level_permission.form); 
     20         
     21           //Temporarily disable the form.                                                                                                                                        
     22           for(var i=0; i<add_row_level_permission.form.elements.length; i++) { 
     23              add_row_level_permission.form.elements[i].disabled = true; 
     24           } 
     25           var cObj = YAHOO.util.Connect.asyncRequest("POST",  
     26                                                                                add_row_level_permission.form.action+"?ajax" ,  
     27                                                                                add_row_level_permission.ajax_callback); 
     28        }, 
     29         
     30        ajax_callback: { 
     31      success: function(o) { 
     32                var response_obj = eval('(' + o.responseText + ')'); 
     33                // Set up the animation on the results div. 
     34                var result_fade_out = null; 
     35                if(response_obj.result) { 
     36                        result_fade_out = row_level_permission.output_success(response_obj.text, add_row_level_permission.results_div); 
     37                        var results=response_obj.results 
     38                        var new_rows = []; 
     39                        var table = row_level_permission.edit_table; 
     40                        for(var i=0; i<results.length; i++) { 
     41                                row = add_row_level_permission.add_rlp_row(results[i].id, results[i].permission, results[i].hash); 
     42                                var row_fade_in = new YAHOO.util.Anim(row, { 
     43                                                                 opacity: { from: 0, to: 100 }  
     44                                                                 }, 1, YAHOO.util.Easing.easeOut); 
     45                                row_fade_in.onStart.subscribe(function() { 
     46                                table.appendChild(row); 
     47                                }); 
     48                                row_fade_in.animate(); 
     49                        } 
     50                } else { 
     51                        result_fade_out = row_level_permission.output_error(response_obj.text,  
     52                                                                                                                add_row_level_permission.results_div); 
     53                } 
     54                for(var i=0; i<add_row_level_permission.form.elements.length; i++) 
     55                        add_row_level_permission.form.elements[i].disabled = false; 
     56                result_fade_out.animate(); 
     57         }, 
     58       
     59      failure: function(o) { 
     60                        alert('An error has occurred'); 
     61                for(var i=0; i<add_row_level_permission.form.elements.length; i++) 
     62                        add_row_level_permission.form.elements[i].disabled = false;              
     63      } 
     64   }, 
     65    
     66   add_rlp_row: function(id, permission, hash) { 
     67                var emptyRow = document.getElementById('empty_editRLP'); 
     68                var newRow = emptyRow.cloneNode(true); 
     69                var form = YAHOO.util.Dom.getElementsByClassName('editRLPForm', 'form', newRow); 
     70                form=form[0];  
     71                form.owner.options.selectedIndex = add_row_level_permission.form.owner.selectedIndex; 
     72                form.perm.options.selectedIndex = row_level_permission.find_in_select(form.perm, permission); 
     73                form.negative.checked =add_row_level_permission.form.negative.checked; 
     74                form.id = "editRLPForm-"+id; 
     75                newRow.id = "editRLP-"+id; 
     76                 
     77                var delete_link = YAHOO.util.Dom.getElementsByClassName('deleteLink', 'a', form); 
     78                delete_link = delete_link[0]; 
     79                delete_link.href = "../../../auth/row_level_permission/"+hash+"/delete/"; 
     80                 
     81                var copy_link = YAHOO.util.Dom.getElementsByClassName('copyToNewLink', 'a', newRow); 
     82                copy_link = copy_link[0]; 
     83                copy_link.href = "javascript:row_level_permission.copyToNew("+id+")"; 
     84                 
     85                form.action = "../../../auth/row_level_permission/"+hash+"/change/"              
     86 
     87                row_level_permission.add_delete_listener(delete_link); 
     88                row_level_permission.add_apply_listener(form); 
     89 
     90                return newRow;  
     91   }, 
     92}; 
     93 
     94var row_level_permission = { 
     95        init: function() { 
     96                row_level_permission.results_div = document.getElementById("rlpResults"); 
     97                row_level_permission.edit_table = document.getElementById('current-rlpTable'); 
     98        }, 
     99         
     100        find_in_select: function(select,val) { 
     101                options = select.options; 
     102                for(var i=0; i<options.length; i++) { 
     103                        if(options[i].value==val) { 
     104                                return i 
     105                        } 
     106                } 
     107                return -1; 
     108        }, 
     109         
     110        add_apply_listener: function(el) { 
     111                YAHOO.util.Event.addListener( 
     112          el, 
     113          'submit', 
     114          function(e) { 
     115                        YAHOO.util.Event.preventDefault(e); 
     116                        row_level_permission.applyRLP(this.action, this); 
     117                  } 
     118        );       
     119        }, 
     120 
     121        add_delete_listener: function(el) { 
     122            YAHOO.util.Event.addListener( 
     123                  el, 
     124                  'click', 
     125                  function(e) { 
     126                                YAHOO.util.Event.preventDefault(e); 
     127                                row_level_permission.deleteRLP(this.href); 
     128                          } 
     129            ); 
     130        }, 
     131         
     132        deleteRLP: function(url) { 
     133                var confirm_ans = confirm("Are you sure?"); 
     134            if(confirm_ans) 
     135                        var cObj = YAHOO.util.Connect.asyncRequest("POST",  
     136                                                                                url+"?ajax" ,  
     137                                                                                row_level_permission.delete_callback); 
     138                return false;  
     139        }, 
     140         
     141        delete_callback: { 
     142                success: function(o) 
     143                { 
     144                        var response_obj = eval('(' + o.responseText + ')'); 
     145                        // Set up the animation on the results div. 
     146                        var result_fade_out = null; 
     147                        if(response_obj.result) { 
     148                                result_fade_out = row_level_permission.output_success(response_obj.text, document.getElementById("rlpResults")); 
     149                                var row_fade_out = new YAHOO.util.Anim('editRLP-'+response_obj.id, { 
     150                                                                 opacity: { from:100, to: 0 }  
     151                                                                 }, 1, YAHOO.util.Easing.easeOut); 
     152                                row_fade_out.onComplete.subscribe(function() { 
     153                                        var row = document.getElementById('editRLP-'+response_obj.id); 
     154                                        var table = row_level_permission.edit_table; 
     155                                table.removeChild(row); 
     156                                }); 
     157                                row_fade_out.animate(); 
     158                        } else { 
     159                                result_fade_out = row_level_permission.output_errort(response_obj.text,  
     160                                                                                                                row_level_permission.results_div); 
     161                        } 
     162                        result_fade_out.animate(); 
     163                }, 
     164                failure: function(o) 
     165                { 
     166                        alert('An error has occurred'); 
     167                } 
     168        }, 
     169         
     170        output_error: function(text, div){ 
     171                YAHOO.util.Dom.replaceClass(div, "system-message", "errornote"); 
     172                return row_level_permission.output_text(text, div); 
     173        }, 
     174 
     175        output_success: function(text, div){ 
     176                YAHOO.util.Dom.replaceClass(div, "errornote", "system-message"); 
     177                return row_level_permission.output_text(text, div); 
     178        }, 
     179         
     180        output_text: function (text, div) { 
     181                 var result_fade_out = new YAHOO.util.Anim(div, { 
     182                                              opacity: { to: 0 } 
     183                                           }, 0.25, YAHOO.util.Easing.easeOut); 
     184                        var success_message = document.createElement('p'); 
     185                        success_message.innerHTML = text; 
     186                        YAHOO.util.Dom.setStyle(div, 'display', 'block'); 
     187                        var result_fade_in = new YAHOO.util.Anim(div, { 
     188                                        opacity: { to: 1 } 
     189                                     }, 0.25, YAHOO.util.Easing.easeIn); 
     190                        result_fade_out.onComplete.subscribe(function() { 
     191                                    div.innerHTML = ''; 
     192                                    div.appendChild(success_message); 
     193                                    result_fade_in.animate(); 
     194                                 });     
     195                        return result_fade_out;                             
     196        }, 
     197         
     198        applyRLP: function(url, form) { 
     199                YAHOO.util.Connect.setForm(form); 
     200                var cObj = YAHOO.util.Connect.asyncRequest("POST",  
     201                                                                                url+"?ajax" ,  
     202                                                                                row_level_permission.apply_callback); 
     203                return false;  
     204        }, 
     205         
     206        apply_callback: { 
     207                success: function(o) 
     208                { 
     209                        var response_obj = eval('(' + o.responseText + ')'); 
     210                        // Set up the animation on the results div. 
     211                        var result_fade_out = null; 
     212                        if(response_obj.result) { 
     213                                result_fade_out = row_level_permission.output_success(response_obj.text, document.getElementById("rlpResults")); 
     214                                var row_highlight_on = new YAHOO.util.ColorAnim('editRLP-'+response_obj.id, { 
     215                                                                 backgroundColor: { to: 'rgb(255, 255, 204)' }  
     216                                                                 }, 1); 
     217                                var row_highlight_off = new YAHOO.util.ColorAnim('editRLP-'+response_obj.id, { 
     218                                                                 backgroundColor: { to: 'rgb(255, 255, 255)' }  
     219                                                                 }, 1); 
     220                                row_highlight_on.onComplete.subscribe(function() { 
     221                                        row_highlight_off.animate(); 
     222                                        }); 
     223                                row_highlight_on.animate();  
     224                        } else { 
     225                                result_fade_out = row_level_permission.output_errort(response_obj.text,  
     226                                                                                                                row_level_permission.results_div); 
     227                        } 
     228                        result_fade_out.animate(); 
     229                }, 
     230                failure: function(o) 
     231                { 
     232                        alert('An error has occurred'); 
     233                } 
     234        },       
     235         
     236        copyToNew: function (id) 
     237        { 
     238            var newForm = add_row_level_permission.form; 
     239            var form = document.getElementById("editRLPForm-"+id); 
     240            newForm.owner.selectedIndex = form.owner.selectedIndex; 
     241            newForm.perm.selectedIndex = form.perm.selectedIndex; 
     242            newForm.negative.checked = form.negative.checked; 
     243        }        
    18244} 
    19245 
    20 function addCallback(type, data, evt) 
    21 { 
    22     if (type == 'error') 
    23         alert('Error when retrieving data from the server!'); 
    24     else 
    25     { 
    26         dictData = dojo.json.evalJson(data); 
    27         if(dictData.result == false) 
    28         { 
    29             //outputError(dictData.text); 
    30             return; 
    31         } 
    32         alert("Success!"); 
    33         //outputMsg(dictData.text); 
    34         //dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [184, 204, 228], 1000).play(); 
    35     } 
    36 } 
    37  
    38 function applyButtonPressed(id) 
    39 { 
    40 return; 
    41     strArray = id.split("/"); 
    42   dojo.io.bind({ 
    43                  url: "/rlp/change/"+id+'/ajax/',  
    44                  handler: editCallback, 
    45                  formNode: dojo.byId('editRLPForm-'+strArray[1]) 
    46               }); 
    47 } 
    48  
    49 function editCallback(type, data, evt) 
    50 { 
    51     if (type == 'error') 
    52         alert('Error when retrieving data from the server!'); 
    53     else 
    54     { 
    55         dictData = dojo.json.evalJson(data); 
    56         if(dictData.result == false) 
    57         { 
    58             outputError(dictData.text); 
    59             dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [255, 0, 0], 1000).play(); 
    60             alert("Error"); 
    61             return; 
    62         } 
    63         outputMessage(dictData.text); 
    64         dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [184, 204, 228], 1000).play(); 
    65     } 
    66 } 
    67  
    68 function deleteRLP(id) 
    69 { 
    70 return; 
    71     var confirm_ans = confirm("Are you sure?"); 
    72     if(confirm_ans)  
    73     { 
    74         dojo.io.bind({ 
    75                    url: '/rlp/delete/'+id+'/ajax', 
    76                    handler: deleteCallback, 
    77                     mimetype: 'text/json' 
    78                 }); 
    79     } 
    80 } 
    81  
    82 function deleteCallback(type, data, evt) 
    83 { 
    84     if (type == 'error') 
    85         alert('Error when retrieving data from the server!'); 
    86     else 
    87     { 
    88         dictData = dojo.json.evalJson(data); 
    89         if(dictData.result == false) 
    90         { 
    91             //outputError(dictData.text); 
    92             dojo.lfx.html.highlight(dojo.byId("editRLP-"+dictData.id), [255, 0, 0], 1000).play(); 
    93             return; 
    94         } 
    95         outputMessage(dictData.text); 
    96         var row = dojo.byId('editRLP-'+dictData.id);     
    97         var fadeOut = dojo.lfx.fadeOut(row, 1000, null, function(n) { 
    98                     var table = dojo.byId('rlpTable'); 
    99                     table.deleteRow(row.rowIndex);     
    100                     }); 
    101         dojo.lfx.html.highlight(row, [255, 0, 0], 500).play(1500); 
    102         fadeOut.play(); 
    103     } 
    104 } 
    105  
    106 function copyToNew(id) 
    107 { 
    108     var newForm = document.addRLPForm; 
    109     var form = dojo.byId("editRLPForm-"+id); 
    110     newForm.owner.selectedIndex = form.owner.selectedIndex; 
    111     newForm.perm.selectedIndex = form.perm.selectedIndex; 
    112     newForm.negative.checked = form.negative.checked; 
    113 } 
    114  
    115 function outputErrors(errs) 
    116 { 
    117     var output = genOutput('errors', errs); 
    118     dojo.lfx.html.highlight(output, [240, 0, 0], 3000).play(); 
    119 } 
    120  
    121 function outputMessage(messages) 
    122 { 
    123     var output = genOutput('messages', messages); 
    124     dojo.lfx.html.highlight(output, [184, 204, 228], 3000).play(); 
    125 } 
    126  
    127 function genOutput(id, str) 
    128 { 
    129     var list = document.createElement("ul"); 
    130     list.id = id; 
    131     var txt = document.createTextNode(str); 
    132     var ele = document.createElement("li"); 
    133     ele.appendChild(txt); 
    134     list.appendChild(ele); 
    135     var output = dojo.byId('output'); 
    136     removeChildrenFromNode(output); 
    137     output.appendChild(list); 
    138     return output; 
    139 } 
    140  
    141  
    142 function removeChildrenFromNode(node) 
    143 { 
    144    
    145         while (node.hasChildNodes()) 
    146         { 
    147           node.removeChild(node.firstChild); 
    148         } 
    149 } 
    150  
    151  
    152 function init() 
    153 { 
    154     for(var i=0; i<document.forms.length; i++) 
    155     { 
    156         document.forms[i].reset(); 
    157     } 
    158 } 
    159  
    160 //dojo.addOnLoad(init); 
  • django/branches/per-object-permissions/django/contrib/admin/templates/admin/change_form.html

    r3518 r3540  
    6868 
    6969{% if new_rlp_form  %} 
    70 <h1>{% trans "Row Level Permissions" %}</h1> 
    71 <div> 
     70<div id="row_level_perm_container"> 
    7271{% include "admin/row_level_permission.html" %} 
    7372</div> 
  • django/branches/per-object-permissions/django/contrib/admin/templates/admin/row_level_permission.html

    r3518 r3540  
    11{% load i18n admin_modify %} 
    2 {% include_admin_script "js/ajax/prototype.js" %} 
    3 {% include_admin_script "js/ajax/scriptaculous.js" %} 
     2{% include_admin_script "js/lib/YahooUI/yahoo/yahoo-debug.js" %} 
     3{% include_admin_script "js/lib/YahooUI/event/event-debug.js" %} 
     4{% include_admin_script "js/lib/YahooUI/connection/connection-debug.js" %} 
     5{% include_admin_script "js/lib/YahooUI/dom/dom-debug.js" %} 
     6{% include_admin_script "js/lib/YahooUI/animation/animation-debug.js" %} 
     7{% include_admin_script "js/lib/YahooUI/logger/logger-debug.js" %} 
    48{% include_admin_script "js/row_level_permission.js" %} 
    5 <table id="rlpTable"> 
     9<link rel="stylesheet" type="text/css" href="/media/js/lib/YahooUI/logger/logger.css" /> 
     10 
     11 
     12<script type="text/javascript"> 
     13 
     14function init() { 
     15        add_row_level_permission.init(); 
     16        row_level_permission.init(); 
     17         
     18        forms = document.forms; 
     19        for(var i=0; i<forms.length; i++) { 
     20                forms[i].reset; 
     21        } 
     22         
     23        row_level_permission.add_delete_listener(YAHOO.util.Dom.getElementsByClassName( "deleteLink", 'a')); 
     24        row_level_permission.add_apply_listener(YAHOO.util.Dom.getElementsByClassName( "editRLPForm", 'form'));  
     25
     26         
     27YAHOO.util.Event.addListener(window, 'load', init); 
     28</script> 
     29 
     30<h1>{% trans "Row Level Permissions" %}</h1> 
     31<div id="rlpResults"> 
     32</div> 
     33<h2>{% trans "Add Permissions" %}</h2> 
     34<form id="addRLPForm" method="POST" name="addRLPForm" action="../../../auth/row_level_permission/add/{{ content_type_id }}/{{ object_id }}/"> 
     35<table id="add-rlpTable"> 
    636<tr class="header"> 
    737<th> 
     
    1646<th> 
    1747{% trans "Options" %} 
    18 </th> 
    19 </tr> 
    20 <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;"> 
    21 <tr> 
    22 <th colspan=4> 
    23 {% trans "Add Permissions" %} 
    2448</th> 
    2549</tr> 
     
    4569</td> 
    4670</tr> 
     71</table> 
    4772</form> 
    48 <tr> 
    49 <th colspan=4> 
    50 {% trans "Current Permissions" %} 
     73 
     74<h2>{% trans "Current Permissions" %}</h2> 
     75<table id="current-rlpTable"> 
     76<tr class="header"> 
     77<th> 
     78{% trans "Owner" %} 
     79</th> 
     80<th> 
     81{% trans "Permission" %} 
     82</th> 
     83<th> 
     84{% trans "Negative" %} 
     85</th> 
     86<th> 
     87{% trans "Options" %} 
    5188</th> 
    5289</tr> 
     90<TBODY> 
    5391{% if rlp_form_list %} 
    5492{% load row_level_permission %} 
    5593{% for o in rlp_form_list %} 
    5694<tr id="editRLP-{{ o.rlp.id }}"> 
    57 <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;"> 
    58 <td> 
    59 {{ o.form.owner }} 
     95<td colspan="4"> 
     96<form id="editRLPForm-{{ o.rlp.id }}" class="editRLPForm" method="POST" name="editRLPForm-{{ rlp.id }}"  action="../../../auth/row_level_permission/{% objref o.rlp %}/change/"> 
     97<table> 
     98<tr> 
     99        <td> 
     100                {{ o.form.owner }} 
     101        </td> 
     102        <td> 
     103                {{ o.form.perm }} 
     104        </td> 
     105        <td> 
     106                {{ o.form.negative }} 
     107        </td> 
     108        <td> 
     109                <input id="applyButton-{{ o.rlp.id }}" type="submit" value="{% trans 'Apply' %}" /> 
     110                <input id="cancelButton-{{ o.rlp.id }}" type="reset" value="{% trans 'Reset' %}"/> 
     111                <br/> 
     112                <!--<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> |--> 
     113                <a href="../../../auth/row_level_permission/{% objref o.rlp %}/delete/" class="deleteLink">{% trans 'Delete' %}</a> |  
     114                <a href="javascript:row_level_permission.copyToNew({{ o.rlp.id }})" class="copyToNewLink">{% trans 'Copy to New' %}</a> 
     115        </td>    
     116</tr> 
     117</table> 
     118</form> 
    60119</td> 
    61 <td> 
    62 {{ o.form.perm }} 
    63 </td> 
    64 <td> 
    65 {{ o.form.negative }} 
    66 </td> 
    67 <td> 
    68 <input id="applyButton-{{ o.rlp.id }}" type="submit" value="{% trans 'Apply' %}" /> 
    69 <input id="cancelButton-{{ o.rlp.id }}" type="reset" value="{% trans 'Reset' %}"/> 
    70 <br/> 
    71 <a href="../../../auth/row_level_permission/{% objref o.rlp %}/delete/" onClick="deleteRLP('{% objref o.rlp %}'); return false;" class="deleteLink">{% trans 'Delete' %}</a> |  
    72 <a href="" onClick="copyToNew({{ o.rlp.id }}); return false;" class="copyToNewLink">{% trans 'Copy to New' %}</a> 
    73 </td> 
    74 </form> 
    75120</tr> 
    76121{% endfor %} 
     
    80125</TBODY> 
    81126</table> 
     127 
     128<table style="display: none"> 
     129<tr id="empty_editRLP"> 
     130<td colspan="4"> 
     131<form id="empty_editRLPForm" method="POST" class="editRLPForm" name="empty-editRLPForm"> 
     132<table> 
     133<tr> 
     134        <td> 
     135                {{ empty_rlp_form.owner }} 
     136        </td> 
     137        <td> 
     138                {{ empty_rlp_form.perm }} 
     139        </td> 
     140        <td> 
     141                {{ empty_rlp_form.negative }} 
     142        </td> 
     143        <td> 
     144                <input id="applyButton" type="submit" value="{% trans 'Apply' %}" /> 
     145                <input id="cancelButton" type="reset" value="{% trans 'Reset' %}"/> 
     146                <br/> 
     147                <a class="deleteLink" >{% trans 'Delete' %}</a> |  
     148                <a class="copyToNewLink">{% trans 'Copy to New' %}</a> 
     149        </td>    
     150</tr> 
     151</table> 
     152</form> 
     153</td> 
     154</tr> 
     155</table> 
  • django/branches/per-object-permissions/django/contrib/admin/utils.py

    r3486 r3540  
    104104#Based off work by Ian Holsman 
    105105#http://svn.zyons.python-hosting.com/trunk/zilbo/common/utils/misc.py 
     106 
     107import sha 
     108from django.conf import settings  
     109from django.contrib.contenttypes.models import ContentType 
     110 
    106111def verify_objref_hash( content_type_id, object_id, hash ): 
    107     import sha 
    108     from django.conf import settings  
    109112    hash_match = sha.new("%s/%s" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest() 
    110113    if hash == hash_match: 
     
    112115    else: 
    113116        return False 
     117 
     118def create_objref(object): 
     119    content_type_id = ContentType.objects.get_for_model( object ).id 
     120    object_id = object.id 
     121    return "%s/%d/%s" % ( content_type_id, object_id, sha.new("%s/%d" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest()) 
  • django/branches/per-object-permissions/django/contrib/admin/views/main.py

    r3487 r3540  
    403403        edit_rlp_manip = ChangeRLPManipulator(model_ct) 
    404404        new_rlp_form = forms.FormWrapper(add_rlp_manip, rlp_new_data, rlp_errors) 
     405        empty_rlp_form = forms.FormWrapper(edit_rlp_manip, rlp_new_data, rlp_errors) 
    405406        rlp_form_list = [] 
    406407        for r in rlp_list: 
     
    408409            data = {'id':r.id, 'owner':owner_val, 'perm':r.permission.id, 'negative':r.negative} 
    409410            rlp_form_list.append({'form':forms.FormWrapper(edit_rlp_manip, data, rlp_errors), 'rlp':r}) 
    410         rlp_context = {'new_rlp_form':new_rlp_form, 'rlp_form_list':rlp_form_list,
     411        rlp_context = {'new_rlp_form':new_rlp_form, 'rlp_form_list':rlp_form_list, 'empty_rlp_form':empty_rlp_form
    411412        c.update(rlp_context) 
    412413     
  • django/branches/per-object-permissions/django/contrib/admin/views/row_level_permissions.py

    r3534 r3540  
    4242    ct = get_object_or_404(ContentType, pk=ct_id) 
    4343    obj = get_object_or_404(ct.model_class(), pk=obj_id) 
    44  
    4544    if not request.user.has_perm(obj._meta.app_label + '.' + obj._meta.get_change_permission()): 
    4645        raise PermissionDenied   
     
    5251     
    5352    new_data = request.POST.copy() 
     53     
    5454    manip.do_html2python(new_data) 
    5555     
     
    7272    resp_list = [] 
    7373    for rlp in rlp_list: 
    74         resp_list.append({"id":rlp.id, "permission":rlp.permission.id}) 
     74        hash = utils.create_objref(rlp) 
     75        resp_list.append({"id":rlp.id, "permission":rlp.permission.id, "hash":hash}) 
    7576    msg["results"]=resp_list 
    7677    return HttpResponse(simplejson.dumps(msg), 'text/javascript')