Fix bug in project copy from group tab
authorverrierj
Thu, 15 Dec 2011 14:38:23 +0100
changeset 285 1cc364d7b298
parent 284 e34db010e45c
child 286 8b8df8361924
Fix bug in project copy from group tab
src/ldt/ldt/ldt_utils/forms.py
src/ldt/ldt/ldt_utils/models.py
src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html
src/ldt/ldt/ldt_utils/views.py
src/ldt/ldt/security/cache.py
src/ldt/ldt/security/utils.py
--- a/src/ldt/ldt/ldt_utils/forms.py	Wed Dec 14 12:22:34 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/forms.py	Thu Dec 15 14:38:23 2011 +0100
@@ -20,11 +20,6 @@
         model = Project
         exclude = ("ldt_id", "ldt", "created_by", "changed_by", "creation_date", "modification_date", "state", "owner")   
 
-class PermissionForm(forms.Form):
-    share = forms.BooleanField(required=False, widget=forms.CheckboxInput(attrs={'class':'checkbox_group'}))
-    perms = forms.CharField(required=False, widget=forms.HiddenInput(attrs={'class':'perm_field'})) 
-    group = forms.IntegerField(required=False, widget=forms.HiddenInput())
-
 class ReindexForm(forms.Form):
     contents = forms.ModelMultipleChoiceField(Content.objects.all())
     index_projects = forms.BooleanField(required=False, initial=False)
@@ -44,7 +39,7 @@
 
 class CopyProjectForm (forms.Form):
     title = forms.CharField()
-    group = forms.IntegerField()    
+    group = forms.IntegerField(required=False)    
 
 class ContentForm(ShareForm):
     iriurl = forms.CharField(max_length=1024, widget=forms.HiddenInput, required=False)
--- a/src/ldt/ldt/ldt_utils/models.py	Wed Dec 14 12:22:34 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/models.py	Thu Dec 15 14:38:23 2011 +0100
@@ -441,7 +441,7 @@
             return False        
         
     def save(self):
-        if self.ldt:
+        if self.pk and self.ldt:
             doc = lxml.etree.fromstring(self.ldt)
             new_contents = []
             contents = doc.xpath("/iri/medias/media")
--- a/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html	Wed Dec 14 12:22:34 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/templates/ldt/ldt_utils/partial/groupslist.html	Thu Dec 15 14:38:23 2011 +0100
@@ -22,12 +22,14 @@
 		
 		</tr>
 	{% endfor %}
+	{% if not user.is_superuser %}
 	<tr class="imageline {% cycle color_cycle %} update_group_projects" id="-1">  
 			<td class="cellimg"></td>
 			<td>{% trans "Projects shared with me only" %}</td>
 			
 			<td class="align_right"><img src="{{LDT_MEDIA_PREFIX}}/img/control_play.png" class="next_icon"/></td>	
 	</tr>
+	{% endif %}
 	
 	</tbody>
 </table>
\ No newline at end of file
--- a/src/ldt/ldt/ldt_utils/views.py	Wed Dec 14 12:22:34 2011 +0100
+++ b/src/ldt/ldt/ldt_utils/views.py	Thu Dec 15 14:38:23 2011 +0100
@@ -139,9 +139,10 @@
 
 
 @login_required
-def projects_filter(request, filter, is_owner=False, status=0, id_group=None):
+def projects_filter(request, filter, is_owner=False, status=0, id_group=0):
     is_owner = boolean_convert(is_owner)
     status = int(status)
+    id_group = int(id_group)
     query = Q()
 
     if is_owner:
@@ -161,14 +162,16 @@
         query &= Q(title__icontains=filter)
     
     is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
-    show_username = False
+    show_username = True
     
-    if id_group > 0:
+    if id_group > 0:    # Search inside a group
         grp = Group.objects.get(id=id_group)
         project_list = get_objects_for_group(grp, 'ldt_utils.view_project').filter(query)
-        show_username = True
+    elif id_group == -1:# Search inside projects shared with a specific user
+        project_list = get_objects_for_user(request.user, 'ldt_utils.view_project', use_groups=False).exclude(owner=request.user)
     else:
         project_list = Project.safe_objects.filter(query)
+        show_username = False
     
     project_list = add_change_attr(request.user, project_list)
     
@@ -260,7 +263,6 @@
             results = get_results_with_context(field, search)     
             complete_results = []
             proj_list = Project.safe_objects.all()
-            
             results.sort(key=lambda k: k['iri_id'])
             for iri_id, item in groupby(results, itemgetter('iri_id')):                
                 try: 
@@ -268,23 +270,23 @@
                 except Content.DoesNotExist:
                     continue
                 segments = list(item)
-                i = 0
+                to_delete = []
                 for s in segments:
                     if not s['project_id']:
                         s['project_id'] = '_'
                     else:
                         project = proj_list.filter(ldt_id=s['project_id'])
-                        if not project:
-                            segments.pop(i)
-                    i += 1
+                        if len(project) == 0:
+                            to_delete.append(s)
+                            
+                for e in to_delete:
+                    segments.remove(e)
+                    
                 if not segments:
                     continue 
                 
                 score = sum([seg['score'] for seg in segments])
-                if content.description == None:
-                    desc = ''
-                else:
-                    desc = content.description        
+                desc = content.description if content.description else ''
                 complete_results.append({'list' : segments, 'score' : score, 'content_title' : content.title, 'content_id' : content.iri_id, 'content_description' : desc })
             
             complete_results.sort(key=lambda k: k['score'])
@@ -907,15 +909,16 @@
                                                                 'create_project_action':reverse("ldt.ldt_utils.views.update_project", args=[ldt_id])}, context_instance=RequestContext(request))
 
 @login_required
-def copy_project(request, ldt_id, group_id=None): 
+def copy_project(request, ldt_id, group_id=0): 
     
     project = get_object_or_404(Project.safe_objects, ldt_id=ldt_id)
     if request.method == "POST" :
         form = CopyProjectForm(request.POST)
+        
         if form.is_valid():
             user = request.user
             group_id = form.cleaned_data['group']
-            group = Group.objects.get(id=group_id) if group_id else None
+            group = Group.objects.get(id=group_id) if group_id and group_id > 0 else None
             project = project.copy_project(title=form.cleaned_data['title'], user=user, group=group)
             is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
             if is_gecko:
@@ -923,7 +926,7 @@
             else:
                 return HttpResponseRedirect(reverse('index_project', args=[project.ldt_id]))
     else:
-        form = CopyProjectForm
+        form = CopyProjectForm()
     # Modal window is not used with firefox, so we ask to submit the form in _parent in firefox case.
     target_parent = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
     return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project, 'group_id':group_id, 'target_parent':target_parent}, context_instance=RequestContext(request))
@@ -1096,7 +1099,7 @@
                 media.mimetype_field = mimetype
                 cached_assign('view_media', request.user, media)
                 cached_assign('change_media', request.user, media)
-                media.save()                 
+                media.save()
             
             if form_status != "error": 
                 content_defaults = {}
@@ -1107,7 +1110,8 @@
                     del content_defaults[key]
                      
                 content, created = Content.safe_objects.get_or_create(iri_id=content_form.cleaned_data['iri_id'], defaults=content_defaults) #@UndefinedVariable
-                
+                if not created:
+                    content.save() # Check if user is allowed to change object before assigning permissions.
                 cached_assign('change_content', request.user, content)
                 cached_assign('view_content', request.user, content)
                 everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
@@ -1266,12 +1270,13 @@
     # Get group, user and project_list
     grp_id = request.POST["id_group"]
     if grp_id == "-1":
-        project_list = get_objects_for_user(request.user, 'ldt_utils.view_project', use_groups=False)
+        project_list = get_objects_for_user(request.user, 'ldt_utils.view_project', use_groups=False).exclude(owner=request.user)
     else:
         grp = Group.objects.get(id=grp_id)
         everyone = Group.objects.get(name=settings.PUBLIC_GROUP_NAME)
         project_list = get_objects_for_group(grp, 'ldt_utils.view_project') | get_objects_for_group(everyone, 'ldt_utils.view_project').filter(owner__in=[grp])
-        #project_list = add_change_attr(request.user, project_list)
+    
+    project_list = add_change_attr(request.user, project_list)
     
     is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
 
--- a/src/ldt/ldt/security/cache.py	Wed Dec 14 12:22:34 2011 +0100
+++ b/src/ldt/ldt/security/cache.py	Thu Dec 15 14:38:23 2011 +0100
@@ -13,7 +13,7 @@
         return checker
     
     checker = ObjectPermissionChecker(user)
-    cache.set(key_name, checker, 30)
+    cache.set(key_name, checker)
     return checker
 
 
--- a/src/ldt/ldt/security/utils.py	Wed Dec 14 12:22:34 2011 +0100
+++ b/src/ldt/ldt/security/utils.py	Thu Dec 15 14:38:23 2011 +0100
@@ -149,7 +149,7 @@
     if hasattr(object, 'is_public') and object.is_public:
         return [None, None]
     
-    users = get_users_with_perms(object, attach_perms=True)
+    users = get_users_with_perms(object, attach_perms=True, with_group_users=False)
     groups = get_groups_with_perms(object, attach_perms=True)
     object_name = object.__class__.__name__.lower()
     
@@ -179,7 +179,7 @@
     groups_list, admin_groups = create_dict(groups, object_name, True)
     
     return [users_list + groups_list, admin_users + admin_groups]
-
+ 
 def get_userlist_group(group, user):
     members = group.user_set.all()
     admin = get_users_with_perms(group)