Contents can be shared with groups
authorverrierj
Thu, 08 Dec 2011 11:49:18 +0100
changeset 271 99347d5275b6
parent 270 60b4820c4fdc
child 272 2e3ce6779cd0
Contents can be shared with groups
src/ldt/ldt/ldt_utils/forms.py
src/ldt/ldt/ldt_utils/models.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html
src/ldt/ldt/ldt_utils/urls.py
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/security/forms.py
--- a/src/ldt/ldt/ldt_utils/forms.py	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/forms.py	Thu Dec 08 11:49:18 2011 +0100
@@ -1,7 +1,6 @@
 from django import forms
 from django.utils.translation import ugettext_lazy as _
-from django.contrib.auth.models import User, Group
-from django.forms.widgets import MultipleHiddenInput
+from django.contrib.auth.models import Group
 from ldt.forms import widgets as ldt_widgets
 from ldt.security.forms import ShareForm
 from models import Project, Content, Media
@@ -97,10 +96,8 @@
             'all' : ('admin/css/forms.css', 'admin/css/base.css', 'admin/css/widgets.css')
                }
         
-class GroupAddForm(forms.ModelForm):
+class GroupAddForm(ShareForm):
     name = forms.CharField(required=True)
-    members_list = forms.ModelMultipleChoiceField(User.objects.all(), required=False, widget=MultipleHiddenInput())
-    admin_list = forms.ModelMultipleChoiceField(User.objects.all(), required=False, widget=MultipleHiddenInput())
     
     class Meta:
         model = Group
--- a/src/ldt/ldt/ldt_utils/models.py	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/models.py	Thu Dec 08 11:49:18 2011 +0100
@@ -310,17 +310,19 @@
     def is_public(): #@NoSelf
         
         def fget(self):
-            everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
-            if 'view_content' in get_perms(everyone, self):
-                return True
+            if self.pk:
+                everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+                if 'view_content' in get_perms(everyone, self):
+                    return True
             return False
         
         def fset(self, value):
-            everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
-            if value:
-                assign('view_content', everyone, self)                
-            else:
-                remove_perm('view_content', everyone, self)
+            if self.pk:
+                everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+                if value:
+                    assign('view_content', everyone, self)                
+                else:
+                    remove_perm('view_content', everyone, self)
         
         return locals()
     
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_group.html	Thu Dec 08 11:49:18 2011 +0100
@@ -25,7 +25,7 @@
 	    margin: 5px;
 	  }
 	  
-	  #userslistcontainer,  #memberslistcontainer, #selectors {
+	  #userslistcontainer, #selectors {
 	  	float: left;
 	  }
 	  
@@ -36,9 +36,10 @@
 	  #selecteduserslistfooter, #userslistfooter {
 	  	text-align: center;
 	  }
-	  
-	  #selectors {	  
+	  	  
+	  #moveleftright {
 	  	margin-top: 125px;
+	  	margin-left: 10px;	  	
 	  }
 	  	   
 	</style>
@@ -95,7 +96,8 @@
 			<a href="#" id="selectall" title="{% trans "select all users" %}">{% trans "select all" %}</a>
 		</div>
 	</div>
-	<div id="selectors">
+	
+	<div id="moveleftright" class="span-1">
 		<a href="#" id="selectelems"><img src="{{LDT_MEDIA_PREFIX}}img/to-right.gif" title="{% trans "select users" %}"></a><br />
 		<a href="#" id="removeelems"><img src="{{LDT_MEDIA_PREFIX}}img/to-left.gif" title="{% trans "remove users" %}"></a>
 	</div>
@@ -106,7 +108,7 @@
 		</div>				
 		<select multiple="multiple" id="selecteduserslist" >
 			{% for user in member_list %}
-				<option value="{{ user.id }}" {% if user.change %}style="color: #2181B1;"{% endif %}>{{ user.username }}</option>
+				<option value="{{ user.id }}-{{user.type}}" {% if user.change %}style="color: #2181B1;"{% endif %}>{{ user.name }}</option>
 			{% endfor %}
 		</select>
 		<div id="selecteduserslistfooter" >
@@ -118,13 +120,13 @@
 	
 	<div id="adminselection">
 	{% for user in admin_list %}
-		<input name="admin_list" type="hidden" value="{{ user.id }}" />
+		<input name="write_list" type="hidden" value="{{ user.id }}-{{user.type}}" />
 	{% endfor %}
 	</div>
 	
 	<div id="memberselection">
 	{% for user in member_list %}
-		<input name="members_list" type="hidden" value="{{ user.id }}" />
+		<input name="read_list" type="hidden" value="{{ user.id }}-{{user.type}}" />
 	{% endfor %}
 	</div>
 	
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Thu Dec 08 11:49:18 2011 +0100
@@ -82,8 +82,7 @@
 	<label for="description" class="projectdesc">{% trans "Description :" %}</label>
 	{{form.description}}
 	</div>	
-   
-   
+     
    	<div id="contentright" class="span-9 last">
 	<label>{% trans "List of contents" %}</label>
 
@@ -115,8 +114,7 @@
 		</div>
 	</div>		
 	
-	
-    {% include "ldt/ldt_utils/partial/permissions.html" %}
+	{% include "ldt/ldt_utils/partial/permissions.html" %}
               
     <div id="submitcontent" class="span-18 last">
                    
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/permissions.html	Thu Dec 08 11:49:18 2011 +0100
@@ -1,34 +1,4 @@
 {% load i18n %}
-
-<style type="text/css">
-	#elemslistcontainer, #selectors {
-		float: left;
-	}
-	
-    #sharelist, #selectedlist {
-    	width: 250px;
-    	height: 200px;
-  	}
-  
-  	#selectedlistfooter, #elemslistfooter {
-	  	text-align: center;
-  	}
-  	
-  	#selectedlistcontainer {
-  		padding-top: 35px;
-  	}
-  	  
-  	#selectors {	  
-	  	margin-top: 125px;	  	
-    	padding-left: 45px;
-    	padding-right: 45px;
-  	}	  	  
-  	
-  	#elemslistheader input {
-  		background-color: white;
-  		width: 100px;
-  	}
-</style>	
 	
 <script type="text/javascript">
 	
@@ -69,8 +39,8 @@
 		</select>
 		<div id="selectedlistfooter" class="span-6" >
 			<a href="#" id="removeall" title="{% trans "select all users" %}">{% trans "remove all" %}</a>
-			| <a href="#" id="chooseaux" title="{% trans "Decide whether a user user can change this group" %}">{% trans "is admin" %}</a>
-			| <a href="#" id="removeaux">{% trans "is not admin" %}</a>
+			| <a href="#" id="chooseaux" title="{% trans "Decide whether a user user can change this group" %}">{% trans "can change" %}</a>
+			| <a href="#" id="removeaux">{% trans "can not change" %}</a>
 		</div>	
 	</div>
 	
--- a/src/ldt/ldt/ldt_utils/urls.py	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/urls.py	Thu Dec 08 11:49:18 2011 +0100
@@ -32,7 +32,7 @@
     url(r'^filterprojects/_(?P<filter>[\w\%\_\-\+]*?)/(?P<is_owner>true|false)/(?P<status>\d)/(?P<id_group>.*)$', "views.projects_filter",),
     url(r'^filtercontents/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.contents_filter",),
     url(r'^filtergroups/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.groups_filter",),
-    url(r'filtershare/_(?P<filter>[\w\%\_\-\+]*?)/$', "views.share_filter"),
+    url(r'filtershare/_(?P<filter>[\w\%\_\-\+]*?)/(?P<use_groups>true|false)$', "views.share_filter"),
     (r'^embedpopup/?$', "views.popup_embed"),
     url(r'^segment/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.index_segment'),
     url(r'^segmentInit/(?P<project_id>.*)/(?P<content_id>.*)/(?P<ensemble_id>.*)/(?P<cutting_id>.*)/(?P<segment_id>.*)/$', 'views.init_segment'),
--- a/src/ldt/ldt/ldt_utils/views.py	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/views.py	Thu Dec 08 11:49:18 2011 +0100
@@ -166,14 +166,14 @@
         grp = Group.objects.get(id=id_group)
         project_list = get_objects_for_group(grp, 'ldt_utils.view_project').filter(query)
         show_username = True
-    else :
+    else:
         project_list = Project.safe_objects.filter(query) #@UndefinedVariable
     
     project_list = add_change_attr(request.user, project_list)
     # Template depends on the projects's status
-    if status == 2 :
+    if status == 2:
         url_templ = "ldt/ldt_utils/partial/publishedprojectslist.html"
-    else :
+    else:
         url_templ = "ldt/ldt_utils/partial/projectslist.html"
         
     return render_to_response(url_templ,
@@ -181,23 +181,24 @@
                                'is_gecko': is_gecko, 'group_id':id_group},
                               context_instance=RequestContext(request))
 
-def share_filter(request, filter):
-    
+def share_filter(request, filter, use_groups=False):
+    use_groups = boolean_convert(use_groups)
     if not filter or len(filter) == 0:
         raise AttributeError("filter should be a string")
     
-    filter = filter[1:]
-    
+    filter = filter[1:]    
     users = User.objects.filter(username__icontains=filter)[0:20]
-    groups = Group.objects.filter(name__icontains=filter).exclude(name=settings.PUBLIC_GROUP_NAME)[0:20]
     
     resp = []
     for u in users:
         resp.append({'name':u.username, 'id':u.id, 'type': 'user'})
+        
+    if use_groups:
+        groups = Group.objects.filter(name__icontains=filter).exclude(name=settings.PUBLIC_GROUP_NAME)[0:20]
+
+        for g in groups:
+            resp.append({'name': g.name, 'id': g.id, 'type': 'group'})
     
-    for g in groups:
-        resp.append({'name': g.name, 'id': g.id, 'type': 'group'})
-   
     resp = sorted(resp, key=lambda elem: elem['name'].lower())
     
     return render_to_response("ldt/ldt_utils/partial/sharewith.html", {'elem_list' : resp}, context_instance=RequestContext(request))
@@ -970,13 +971,16 @@
                 del(dict[key])
         
         add_prefix(content_instance_val, "content")
-        add_prefix(media_instance_val, "media")        
+        add_prefix(media_instance_val, "media")     
         
         for k in request.POST.keys():
             value = request.POST.get(k)
             content_instance_val[k] = value
             media_instance_val[k] = value
-        
+            
+        content_instance_val['read_list'] = request.POST.getlist('read_list')
+        content_instance_val['write_list'] = request.POST.getlist('write_list')
+            
         content_form = ContentForm(content_instance_val, prefix="content", instance=instance_content)
         media_form = MediaForm(media_instance_val, request.FILES, prefix="media", instance=instance_media)
                 
@@ -1078,6 +1082,7 @@
                         if source_file:
                             source_file.close()
                 
+                
                 if form_status != "error":
                     #try:
                     del cleaned_data["media_file"]
@@ -1099,27 +1104,30 @@
                 mimetype = cleaned_data.get('mimetype_field', None)
                 if not mimetype:
                     mimetype = mimetypes.guess_type(media.src)
-                media.mimetype_field = mimetype   
-                media.save()                
+                media.mimetype_field = mimetype
                 assign('view_media', request.user, media)
-                assign('change_media', request.user, media) 
+                assign('change_media', request.user, media)
+                media.save()                 
             
-            if form_status != "error":     
+            if form_status != "error": 
                 content_defaults = {}
                 content_defaults.update(content_form.cleaned_data)
                 content_defaults['media_obj'] = media
-                del content_defaults["media_input_type"]
-                del content_defaults['groups']
+                
+                for key in ["media_input_type", "groups", "is_public", "read_list", "write_list" ]:
+                    del content_defaults[key]
+                     
                 content, created = Content.safe_objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
                 
                 assign('change_content', request.user, content)
                 assign('view_content', request.user, content)
                 everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
+                        
                 if content_form.cleaned_data['is_public']:
                     assign('view_content', everyone, content)
                 else:
                     remove_perm('view_content', everyone, content)
-                    assign_perm_to_obj(content, content_form.cleaned_data["read_list"], content_form.cleaned_data["write_list"], request.user)
+                    assign_perm_to_obj(content, content_form.cleaned_data['read_list'], content_form.cleaned_data['write_list'], request.user)
                 if not created:
                     for attribute in ('iriurl', 'title', 'description', 'duration', 'content_creation_date', 'tags', 'media_obj'):
                         setattr(content, attribute, content_defaults[attribute])
@@ -1147,7 +1155,7 @@
 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)
-    
+    elem_list = [{'name': u.username, 'id': u.id, 'type': 'user'} for u in User.objects.all()[0:20]]
     
     if submit_action == "prepare_delete": 
         errors, titles = prepare_delete_content(request, iri_id)
@@ -1177,7 +1185,7 @@
     content_form.fields["media_obj"].queryset = Media.safe_objects.all()
     
     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))
+                                                                    'elem_list': elem_list, '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): 
@@ -1289,23 +1297,24 @@
         
         if form.is_valid():          
             name = form.cleaned_data['name']
-            members_list = form.cleaned_data['members_list']
-            admin_list = form.cleaned_data['admin_list']            
+            members_list = form.cleaned_data['read_list']
+            admin_list = form.cleaned_data['write_list']            
             
             group = Group.objects.create(name=name)
             group.save()
             assign('change_group', request.user, group)
             
-            for user in members_list:
-                user.groups.add(group)
-                if user in admin_list:
-                    assign('change_group', user, group)
+            for elem in members_list:
+                if hasattr(elem, 'username'):
+                    elem.groups.add(group)
+                    if elem in admin_list:
+                        assign('change_group', elem, group)
+                        
             request.user.groups.add(group)             
             form_status = 'saved' 
             
     else:
-        form = GroupAddForm()
-        form.fields['members_list'].queryset = user_list       
+        form = GroupAddForm()      
     
     return render_to_response("ldt/ldt_utils/create_group.html", {'form' : form, 'form_status' : form_status, 'elem_list' : user_list}, context_instance=RequestContext(request))
 
@@ -1315,19 +1324,16 @@
         return HttpResponseServerError('<h1>User can not update a group.</h1>')
     
     group = get_object_or_404(Group, id=group_id)
-    member_list = group.user_set.exclude(id=request.user.id)
-    query = Q(id=settings.ANONYMOUS_USER_ID) | Q(id=request.user.id) | Q(is_superuser=True)
-    user_list = User.objects.exclude(query)[0:20]
-    admin_list = []
-    form_status = ''    
-    
+      
     if not request.user.has_perm('change_group', group):
         form_status = 'saved'
         return render_to_response("ldt/ldt_utils/create_group.html", {'form_status' : form_status}, context_instance=RequestContext(request))
 
-    for u in member_list:
-        if u.has_perm('change_group', group):
-            u.change = True
+    member_list = group.user_set.exclude(id=request.user.id)
+    query = Q(id=settings.ANONYMOUS_USER_ID) | Q(id=request.user.id) | Q(is_superuser=True)
+    user_list = User.objects.exclude(query)[0:20]
+    user_list = [{'name': x.username, 'id': x.id, 'type': 'user'} for x in user_list]
+    form_status = ''     
             
     if request.method == "POST":
         form = GroupAddForm(request.POST, instance=group)
@@ -1340,17 +1346,19 @@
         else:            
             if form.is_valid():
                 name = form.cleaned_data['name']
-                new_member_list = form.cleaned_data['members_list']
-                admin_list = form.cleaned_data['admin_list']
+                new_member_list = form.cleaned_data['read_list']
+                admin_list = form.cleaned_data['write_list']
                 group.name = name
-                        
-                for user in new_member_list:                       
+
+                for user in new_member_list:
+                    if not hasattr(user, 'username'):
+                        raise AttributeError('new_member_list should only contain users')                      
                     group.user_set.add(user)
                     if user in admin_list:
                         assign('change_group', user, group)
                     else:
                         remove_perm('change_group', user, group)
-                    
+                        
                 for user in member_list:
                     if user not in new_member_list:
                         group.user_set.remove(user)
@@ -1360,11 +1368,12 @@
                 form_status = 'saved'       
                     
     else:
-        form = GroupAddForm(initial={'name':unicode(group.name), 'members_list':member_list})    
-    
+        form = GroupAddForm(initial={'name':unicode(group.name)})    
+
+    member_list = [{'name': x.username, 'id': x.id, 'type': 'user'} for x in member_list]
     return render_to_response("ldt/ldt_utils/create_group.html", {'group_id' : group_id, 'form' : form, 'form_status' : form_status,
-                                                                  'user_list' : user_list, 'member_list': member_list,
-                                                                  'admin_list' : admin_list}, context_instance=RequestContext(request))
+                                                                  'elem_list' : user_list, 'member_list': member_list,
+                                                                  }, context_instance=RequestContext(request))
 
 @login_required
 def leave_group(request, group_id, redirect=True):
--- a/src/ldt/ldt/security/forms.py	Wed Dec 07 14:53:01 2011 +0100
+++ b/src/ldt/ldt/security/forms.py	Thu Dec 08 11:49:18 2011 +0100
@@ -2,7 +2,6 @@
 from django.contrib.auth.models import User, Group
 from django.forms.widgets import MultipleHiddenInput
 
-
 class LazyMultipleChoiceField(forms.MultipleChoiceField):
     
     # Should do some checking here
@@ -14,8 +13,16 @@
     write_list = LazyMultipleChoiceField(required=False, widget=MultipleHiddenInput()) 
 
     def clean(self):
-        read_list = self.data.getlist("read_list")
-        write_list = self.data.getlist("write_list")
+        super(ShareForm, self).clean()
+        
+        try: 
+            read_list = self.data.getlist("read_list")
+            write_list = self.data.getlist("write_list")
+        except AttributeError:
+            # This will be raised for content creation. As data is preprocessed, self.data
+            # is a dict and not a querydict, so getlist won't work
+            read_list = self.data.get('read_list', [])
+            write_list = self.data.get('write_list', [])
         
         elems = read_list + write_list
         users = [e.split('-')[0] for e in elems if e.split('-')[1] == 'user' ]
@@ -34,7 +41,7 @@
                     new_list.append(groups.get(id=id))
             return new_list
          
-        new_read_list = create_real_lists(read_list, users, groups)
+        new_read_list = create_real_lists(read_list, users, groups)        
         new_write_list = create_real_lists(write_list, users, groups)
 
         self.cleaned_data["read_list"] = new_read_list