Add permission form to content
authorverrierj
Tue, 29 Nov 2011 12:08:11 +0100
changeset 260 3d9cb9b6ff8d
parent 259 ffca461dbce5
child 261 14b59dcd2731
Add permission form to content
src/ldt/ldt/ldt_utils/forms.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/security/utils.py
src/ldt/ldt/static/ldt/css/ldtform.css
src/ldt/ldt/templates/ldt/ldt_raw_base.html
--- a/src/ldt/ldt/ldt_utils/forms.py	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/forms.py	Tue Nov 29 12:08:11 2011 +0100
@@ -49,6 +49,7 @@
     iriurl = forms.CharField(max_length=1024, widget=forms.HiddenInput, required=False)
     content_creation_date = forms.SplitDateTimeField(widget=ldt_widgets.LdtSplitDateTime, required=False, label=_("content.content_creation_date"))
     media_input_type = forms.ChoiceField(required=False, label=_("content.media_input_type"), choices=(("upload", _("file_upload")), ("url", _("url")), ("link", _("existing_media")), ("create", _("create_media")), ("none", _("none_media"))))
+    groups = forms.ModelMultipleChoiceField(Group.objects.all(), required=False)
     
     def clean_iri_id(self):
         data = self.cleaned_data.get('iri_id')
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_content.html	Tue Nov 29 12:08:11 2011 +0100
@@ -20,9 +20,11 @@
 {% block css_import %}
 	{{ block.super }}
 	{{ content_form.media.css }}
-	<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/ldt.css" />
+	<!-- <link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/ldt.css" />--> 
 	<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/ldtform.css" />
+	<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/workspace.css" />
 	<link rel="stylesheet" href="{{LDT_MEDIA_PREFIX}}css/jq-css/themes/base/jquery-ui.css" />
+    
 {% endblock %}
 
 
@@ -112,7 +114,10 @@
 			<div id="media_field_create" class="media_fields">{{ media_form.src.errors }}{{ media_form.src.label_tag }}{{ media_form.src }}</div>
 		</div>
 	</div>
+		 
+	{% include "ldt/ldt_utils/partial/permissions.html" %}
 	</div>
+		
 	<div id="submitcontent" class="span-18 last">
 		<div id="submitcontent-loader" class="span-10">
 			<div id="submitcontent-loader-img" class="submitcontent-loader-content span-10 last"><img alt="loader" src="{{LDT_MEDIA_PREFIX}}img/ajax-loader-220x19.gif"/></div>
@@ -125,6 +130,7 @@
 			<button type="submit" value="write" name="submit_button" id="submit_button_write">{% trans "write" %}</button>
 		</div>
 	</div>
+	
 	</form>
 	</div>
 {% endblock %}
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Tue Nov 29 12:08:11 2011 +0100
@@ -21,25 +21,6 @@
 {% block js_declaration %}
 	{{ block.super }}
 	<script type="text/javascript">
-	function check_uncheck_all(name) {
-		var check_all = '{% trans "check all" %}';
-		var uncheck_all = '{% trans "uncheck all" %}';
-		var id_name = "#global_checkbox_" + name;
-		
-		$(id_name).attr('title', uncheck_all);
-		
-		$(id_name).change(function () {
-			var checkbox_names = ".checkbox_" + name;
-			if ($(id_name).is(":checked")) {
-				$(checkbox_names).prop('checked', true);
-				$(id_name).attr('title', uncheck_all );
-			} else {
-				$(checkbox_names).prop('checked', false);
-				$(id_name).attr('title', check_all);
-			}
-			$(checkbox_names).trigger("change");
-		});		
-	}
 	
 	function activate_initial_permissions() {		
 		$("#grouplist tr").each(function (e) {
@@ -80,8 +61,8 @@
         theme_advanced_buttons3 : "",
         theme_advanced_toolbar_location : "top",
         theme_advanced_toolbar_align : "left",
-        width: "430",
-        plugins : "autoresize"        
+        width: "630",
+        height: "150"       
 	});
 
 
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/groups.html	Tue Nov 29 12:08:11 2011 +0100
@@ -28,7 +28,7 @@
 	input_list_init = [
 		{'input_selector':"#searchprojectsinput", 'container_selector':"#projectslistcontainer", 'url':project_filter_url}
 	];
-	
+		
 	searchFieldInit(input_list_init);
 	
 	init_events(document);
@@ -39,7 +39,7 @@
 		
     $(".update_group_projects").live("click", function(){
         //alert("group id = " + $(this).attr('id') + ", url = " + get_group_projects_url);
-        id_group = $(this).attr('id');
+        var id_group = $(this).attr('id');
         // Remove icons from all the lines
         $(".next_icon, td .grouplink").hide();
         // Display icons from the good line
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html	Tue Nov 29 12:08:11 2011 +0100
@@ -64,9 +64,9 @@
                     {{ management_form }}
                 
                     <tr class="projectscontentsheader last" id="contentslistheader">
-                        <td class="cellcheckbox">
+                        <td class="cellcheckbox">                        
                         {% if groups|length > 1 %}
-                        	<input class="selectallgroups" id="global_checkbox_group" type="checkbox" checked="true"/>
+                        	<input class="selectallgroups" id="global_checkbox_group" type="checkbox" />
                         {% endif %}                            
                         </td>				
                         <td class="projectcontentsheadertitle">{% trans "nom" %}</td>
@@ -86,8 +86,8 @@
 				       	{{ form.perms }}
 				       	{{ form.group }}
 				    </tr>
-				    {% endfor %} 
-				                
+				    {% endfor %}
+				    				                
                     </tbody>
                 </table>		
             </div>		
--- a/src/ldt/ldt/ldt_utils/views.py	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/views.py	Tue Nov 29 12:08:11 2011 +0100
@@ -23,7 +23,7 @@
 from guardian.shortcuts import assign, remove_perm, get_perms, get_objects_for_group
 from ldt.ldt_utils.models import Content
 from ldt.ldt_utils.utils import boolean_convert, LdtUtils, LdtSearch
-from ldt.security.utils import assign_project_to_groups, set_forbidden_stream, add_change_attr
+from ldt.security.utils import assign_object_to_groups, set_forbidden_stream, add_change_attr
 from lxml.html import fragment_fromstring
 from models import Media, Project
 from projectserializer import ProjectSerializer
@@ -446,7 +446,7 @@
             p = Project.create_project(title=form.cleaned_data['title'], user=user, contents=form.cleaned_data['contents'],
                                        description=form.cleaned_data['description'])
             
-            assign_project_to_groups(p, group_form.cleaned_data)
+            assign_object_to_groups(p, group_form.cleaned_data)
             form_status = "saved"
             contents = []
     else:
@@ -833,7 +833,7 @@
                 return HttpResponseRedirect(reverse('index_project_full', args=[project.ldt_id]))
             else:
                 return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
-            assign_project_to_groups(project, group_form.cleaned_data)
+            assign_object_to_groups(project, group_form.cleaned_data)
     else:
         form = AddProjectForm()
         perm_list = [] 
@@ -891,7 +891,7 @@
                     project.ldt = lxml.etree.tostring(ldt, pretty_print=True)
                     project.save()                    
                     
-                assign_project_to_groups(project, group_form.cleaned_data)
+                assign_object_to_groups(project, group_form.cleaned_data)
     else:
         form = AddProjectForm({'title':unicode(project.title), 'description':unicode(project.get_description())})
         
@@ -978,15 +978,19 @@
             content_instance_val[k] = value
             media_instance_val[k] = value
         
+        
+        permission_formset = formset_factory(PermissionForm, extra=0)        
         content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
         media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
+        group_form = permission_formset(request.POST)
         
         media_valid = media_form.is_valid()
         content_valid = content_form.is_valid()
+        group_valid = group_form.is_valid()
         
         logging.debug("write_content_base : valid form: for instance : " + repr(instance_media) + " -> media " + str(media_valid) + " content : for instance : " + repr(instance_content) + " : " + str(content_valid)) #@UndefinedVariable
         
-        if media_valid and content_valid :
+        if media_valid and content_valid and group_valid:
             
             # see if media must be created
             cleaned_data = {}
@@ -1109,11 +1113,13 @@
                 content_defaults.update(content_form.cleaned_data)
                 content_defaults['media_obj'] = media
                 del content_defaults["media_input_type"]
+                del content_defaults['groups']
                 content, created = Content.safe_objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
-                if created:
-                    assign('change_content', request.user, content)
-                    assign('view_content', request.user, content)                
-                else:
+                
+                assign('change_content', request.user, content)
+                assign('view_content', request.user, content)
+                assign_object_to_groups(content, group_form.cleaned_data)                
+                if not created:
                     for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
                         setattr(content, attribute, content_defaults[attribute])
                 content.save()
@@ -1138,7 +1144,9 @@
 def write_content(request, iri_id=None):
     
     submit_action = request.REQUEST.get("submit_button", False) 
-
+    groups = request.user.groups.exclude(name=settings.PUBLIC_GROUP_NAME)
+    permission_formset = formset_factory(PermissionForm, extra=0)
+    
     if submit_action == "prepare_delete": 
         errors, titles = prepare_delete_content(request, iri_id)
         if errors and len(errors) > 0:
@@ -1153,8 +1161,27 @@
         form_status = "deleted"
         content_form = ContentForm()
         media_form = MediaForm()
+        management_form = group_form = None
     else:
         content_form, media_form, form_status = write_content_base(request, iri_id)
+        
+        perm_list = []
+        content = Content.safe_objects.get(iri_id=iri_id) if iri_id else None
+        
+        for group in groups:
+            group_perms = get_perms(group, content) if content else []
+            share = False
+            perm = None
+            if 'view_content' in group_perms:
+                share = True
+                perm = 'read'
+            if 'change_content' in group_perms:
+                perm = 'write'
+                
+            perm_list.append({'share': share, 'perms': perm, 'group': group.id })
+        permission = permission_formset(initial=perm_list)    
+        management_form = permission.management_form
+        group_form = zip(permission, groups)
 
     if iri_id:
         create_content_action = reverse('ldt.ldt_utils.views.write_content', kwargs={'iri_id':iri_id})
@@ -1164,7 +1191,8 @@
     session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
     cookie_name = settings.SESSION_COOKIE_NAME
     
-    return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'media_form': media_form, 'form_status': form_status, 'create_content_action': create_content_action, 'iri_id': iri_id, 'session_key':session_key, 'cookie_name':cookie_name}, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/create_content.html', {'content_form': content_form, 'media_form': media_form, 'form_status': form_status, 'create_content_action': create_content_action,
+                                                                    'management_form': management_form, 'group_form': group_form, 'iri_id': iri_id, 'session_key':session_key, 'cookie_name':cookie_name}, context_instance=RequestContext(request))
 
 @login_required
 def prepare_delete_content(request, iri_id=None): 
--- a/src/ldt/ldt/security/utils.py	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/security/utils.py	Tue Nov 29 12:08:11 2011 +0100
@@ -101,14 +101,15 @@
     return obj_list
         
 
-def assign_project_to_groups(project, permissions):
+def assign_object_to_groups(object, permissions):
+    name = object.__class__.__name__.lower()
     for elem in permissions:
         group = Group.objects.get(id=elem['group'])
         if elem['share']:
-            assign('view_project', group, project)
+            assign('view_%s' % name, group, object)
             if elem['perms'] == 'write':
-                assign('change_project', group, project)
+                assign('change_%s' % name, group, object)
         else:
-            remove_perm('view_project', group, project)
-            remove_perm('change_project', group, project) 
+            remove_perm('view_%s' % name, group, object)
+            remove_perm('change_%s' % name, group, object) 
             
\ No newline at end of file
--- a/src/ldt/ldt/static/ldt/css/ldtform.css	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/static/ldt/css/ldtform.css	Tue Nov 29 12:08:11 2011 +0100
@@ -8,7 +8,6 @@
 	padding: 10px;	
 }
 
-
 #add_content input, #add_content textarea, #add_content select,
 #add_contribution input, #add_contribution textarea, #add_contribution select
 {
@@ -20,6 +19,9 @@
 	width: auto;
 }
 
+#add_content input[type="checkbox"] {
+	width: 15px;
+}
 
 #add_content textarea {
 	height : 125px;
@@ -29,13 +31,17 @@
 	list-style: none;
 }
 
+#add_content td, #add_content th {
+	vertical-align: baseline;
+	border: none;
+}
 
 label {
 	display: block;
 	margin-top: 0.5em;
 }
 
-#add_content .vDateField,#add_content .vTimeField {
+#add_content .vDateField, #add_content .vTimeField {
 	width: 90px;
 	float: left;
 }
@@ -65,12 +71,10 @@
 	display: none;
 }
 
-
 #submitcontent-loader-msg {
 	padding-left: 6px;
 }
 
-
 #submitcontent-buttons input[type="submit"], #submitcontent-buttons button, #submitcontent-buttons-login input[type="submit"], #submitcontent-buttons-login button {
 	background-color: #656565;
 	color: white;
--- a/src/ldt/ldt/templates/ldt/ldt_raw_base.html	Mon Nov 28 15:48:28 2011 +0100
+++ b/src/ldt/ldt/templates/ldt/ldt_raw_base.html	Tue Nov 29 12:08:11 2011 +0100
@@ -13,6 +13,27 @@
     <title>{% block title %}{% trans "page_title" %}{% endblock %}</title>
     {% block js_import %}
     <script type="text/javascript" src="{{LDT_MEDIA_PREFIX}}js/jquery.min.js"></script>
+    <script type="text/javascript">
+    function check_uncheck_all(name) {
+    	var check_all = '{% trans "check all" %}';
+    	var uncheck_all = '{% trans "uncheck all" %}';
+    	var id_name = "#global_checkbox_" + name;
+    	
+    	$(id_name).attr('title', uncheck_all);
+    	
+    	$(id_name).change(function () {
+    		var checkbox_names = ".checkbox_" + name;
+    		if ($(id_name).is(":checked")) {
+    			$(checkbox_names).prop('checked', true);
+    			$(id_name).attr('title', uncheck_all );
+    		} else {
+    			$(checkbox_names).prop('checked', false);
+    			$(id_name).attr('title', check_all);
+    		}
+    		$(checkbox_names).trigger("change");
+    	});		
+    }
+    </script>
     {% endblock %}
     
     {% block css_declaration %}