Merge with b5c0d6a45f28f34586bc1187c360c332fde2a4a5
authorverrierj
Mon, 16 Jan 2012 15:39:17 +0100
changeset 394 47735d0bedb5
parent 393 fa07a599883c (diff)
parent 391 b5c0d6a45f28 (current diff)
child 398 db8697ff4594
Merge with b5c0d6a45f28f34586bc1187c360c332fde2a4a5
src/ldt/ldt/ldt_utils/utils.py
--- a/src/ldt/ldt/ldt_utils/admin.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/admin.py	Mon Jan 16 15:39:17 2012 +0100
@@ -5,13 +5,17 @@
 from ldt.ldt_utils.contentindexer import ContentIndexer, ProjectIndexer
 from ldt.ldt_utils.fileimport import FileImport, FileImportError
 from ldt.ldt_utils.forms import LdtImportForm, ReindexForm, StatAnnotationForm
-from ldt.ldt_utils.models import Content, Project, Media, Author
-#from ldt.ldt_utils.stat import compute_stats_for 
+from ldt.ldt_utils.models import Content, Project, Media, Author, AnnotationStat
 import ldt.indexation
 from guardian.admin import GuardedModelAdmin
 
+
+class StatInlineAdmin(admin.TabularInline):
+    model = AnnotationStat
+    extra = 1
+
 class ProjectAdmin(GuardedModelAdmin):
-    pass
+    inlines = [StatInlineAdmin, ]
 
 class AuthorAdmin(GuardedModelAdmin):
     pass
--- a/src/ldt/ldt/ldt_utils/models.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/models.py	Mon Jan 16 15:39:17 2012 +0100
@@ -6,7 +6,7 @@
 from ldt.core.models import Document
 from guardian.shortcuts import assign, remove_perm, get_perms
 import ldt.indexation
-from ldt.security import get_current_user_or_admin
+from ldt.security import get_current_user_or_admin, set_current_user
 from ldt.security.models import SafeModel
 from ldt.security.manager import SafeManager
 from sorl.thumbnail import ImageField
@@ -225,11 +225,7 @@
         if create_front_project: 
             # We need a primary key for self in create_project, so
             # save() has to be called first
-            user = get_current_user_or_admin()
-            self.front_project = Project.create_project(user,'front_%s' % self.iri_id, [self], cuttings=['chapitrage', 'contribution'] )
-            self.front_project.publish(allow_write=True)
-            assign('ldt_utils.change_content', user, self)
-            self.save()
+            self.create_front_project()
             
     def __unicode__(self):
         return str(self.id) + ": " + self.iri_id
@@ -358,6 +354,22 @@
         return locals()
     
     is_public = property(**is_public())
+    
+    def create_front_project(self):
+        request_user = get_current_user_or_admin()
+            
+        if request_user.is_superuser:
+            admin = request_user
+        else:
+            admin = User.objects.filter(is_superuser=True)[0]
+            
+        set_current_user(admin)
+        self.front_project = Project.create_project(admin, 'front project : %s' % self.title, [self], cuttings=['chapitrage', 'contribution'] )
+        self.front_project.publish(allow_write=True)
+        set_current_user(request_user)
+            
+        assign('ldt_utils.change_content', request_user, self)
+        self.save()
 
 
     
--- a/src/ldt/ldt/ldt_utils/stat.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/stat.py	Mon Jan 16 15:39:17 2012 +0100
@@ -84,21 +84,23 @@
         
 def delete_stat_project(sender, instance, **kwargs):
     
-    contents = instance.contents.all()
+    contents = list(instance.contents.all())
     contributions = AnnotationStat.objects.filter(project=instance)
     
     for c in contributions:
-        content = contents.get(id=c.content.id)
-        
-        if c.nb_annotation:        
-            content.nb_annotation -= c.nb_annotation
-        
-        if c.stat:
-            content_stat = get_buckets_from_string(content.stat_annotation)
-            proj_stat = get_buckets_from_string(c.stat)
-            content.stat_annotation = get_string_from_buckets([pair[0] - pair[1] for pair in zip(content_stat, proj_stat)])
-        
-        content.save()        
+        result = [x for x in contents if x.id == c.content.id ]
+        if result:
+            content = result[0]
+            
+            if c.nb_annotation:        
+                content.nb_annotation -= c.nb_annotation
+            
+            if c.stat:
+                content_stat = get_buckets_from_string(content.stat_annotation)
+                proj_stat = get_buckets_from_string(c.stat)
+                content.stat_annotation = get_string_from_buckets([pair[0] - pair[1] for pair in zip(content_stat, proj_stat)])
+            
+            content.save()        
 
 pre_delete.connect(delete_stat_project, sender=Project)    
         
--- a/src/ldt/ldt/ldt_utils/utils.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/utils.py	Mon Jan 16 15:39:17 2012 +0100
@@ -364,14 +364,15 @@
         content_node = lxml.etree.SubElement(annotations, 'content')
         content_node.set('id', content.iri_id)
         ensemble = lxml.etree.SubElement(content_node, 'ensemble')
-        ensemble.set('id', generate_uuid())
+        ensemble.set('id', "g_%s" % generate_uuid())
         ensemble.set('author', 'undefined')
         ensemble.set('abstract', '')
+        ensemble.set('idProject', project.ldt_id)
         
         for cutting in cuttings:
             cutting_node = lxml.etree.SubElement(ensemble, 'decoupage')
             cutting_node.set('author', 'perso')
-            cutting_node.set('id', generate_uuid())
+            cutting_node.set('id', "c_%s" % generate_uuid())
             title = lxml.etree.SubElement(cutting_node, 'title')
             title.text = cutting
             lxml.etree.SubElement(cutting_node, 'abstract')
--- a/src/ldt/ldt/ldt_utils/views/json.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/json.py	Mon Jan 16 15:39:17 2012 +0100
@@ -35,7 +35,7 @@
 
 def project_json(request, project, serialize_contents=True, first_cutting=None):
     
-# TODO : the following lines have been uncommented for tests only
+# TODO : the following lines have been commented for tests only
 # they should not be commented for production
 #    if not ldt_auth.check_access(request.user, project):
 #        return HttpResponseForbidden(_("You can not access this project"))
--- a/src/ldt/ldt/ldt_utils/views/project.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/project.py	Mon Jan 16 15:39:17 2012 +0100
@@ -110,6 +110,10 @@
                 errors.append(_("the project %(title)s is published. please unpublish before deleting.") % {'title':project.title})
                 message = _("can not delete the project. Please correct the following error")
                 title = _('title error deleting project')
+            elif project.content_set.count() != 0:
+                errors.append(_("the project %(title)s is the front project of %(content)s. please delete this content first.") % {'title':project.title, 'content':project.content_set.all()[0]})
+                message = _("can not delete the project. Please correct the following error")
+                title = _('title error deleting project')
             else:
                 message = _("please confirm deleting project %(title)s") % {'title':project.title}
                 title = _("confirm deletion")
@@ -198,9 +202,7 @@
         if len(filter) > 0 and filter[0] == '_':
             filter = filter[1:]
         query &= Q(title__icontains=filter)
-        
-    query &= ~Q(title__startswith='front')
-    
+           
     is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
     show_username = True
     
--- a/src/ldt/ldt/ldt_utils/views/workspace.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/ldt_utils/views/workspace.py	Mon Jan 16 15:39:17 2012 +0100
@@ -32,7 +32,7 @@
     content_list = add_change_attr(request.user, Content.safe_objects.all()) #@UndefinedVariable
     
     # get list of projects owned by the current user
-    project_list = add_change_attr(request.user, Project.safe_objects.filter(owner=request.user).exclude(title__startswith='front')) #@UndefinedVariable
+    project_list = add_change_attr(request.user, Project.safe_objects.filter(owner=request.user)) #@UndefinedVariable
 
     is_gecko = ((request.META['HTTP_USER_AGENT'].lower().find("firefox")) > -1);
     
--- a/src/ldt/ldt/static/ldt/js/projectscontents.js	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/static/ldt/js/projectscontents.js	Mon Jan 16 15:39:17 2012 +0100
@@ -169,7 +169,7 @@
     );
 }
 
-function init_events_contents(base_node, embed_url, content_filter_url) {
+function init_events_contents(base_node, embed_url, content_filter_url, project_filter_url) {
     
     init_events_base(base_node, embed_url);
     
@@ -185,7 +185,11 @@
         closeOnClick:false,
         callbacks: {
             afterClose: function(nm) {
-                searchCallback($('#searchprojectsinput'), "#contentslistcontainer", content_filter_url, 0);
+                searchCallback($('#searchcontentsinput'), "#contentslistcontainer", content_filter_url, 0);
+                if (project_filter_url != 'undefined') {
+                	// Used when an admin creates a content, the list of project has to be refreshed for the front project
+                	searchCallback($('#searchprojectsinput'), "#projectslistcontainer", project_filter_url, 0);
+                }
             },
             afterShowCont: function(nm) {
                 nm.store.iframe.load(function() {
@@ -220,7 +224,7 @@
         closeOnClick:false,
         callbacks: {
             afterClose: function(nm) {
-                searchCallback($("#searchcontentsinput"),"#contentslistcontainer",content_filter_url,0);    
+                searchCallback($("#searchcontentsinput"),"#contentslistcontainer",content_filter_url,0);
             },
             afterShowCont: function(nm) {
                 nm.store.iframe.load(function() {                	
@@ -270,6 +274,7 @@
                 // Can't do that because searchprojectfilterurl is not defined in init_events_base params
             	searchCallback($('#searchprojectsinput'), "#projectslistcontainer", searchprojectfilterurl, 0);
             }
+            
         }
     });
     
@@ -413,7 +418,7 @@
 }
 
 function init_events_all(base_node, embed_url, searchcontentfilterurl, searchprojectfilterurl, publishprojecturl, unpublishprojecturl) {
-    init_events_contents(base_node, embed_url, searchcontentfilterurl);
+    init_events_contents(base_node, embed_url, searchcontentfilterurl, searchprojectfilterurl);
     init_events_base_projects(base_node, embed_url, searchprojectfilterurl, publishprojecturl, unpublishprojecturl);
 }
 
--- a/src/ldt/ldt/user/admin.py	Fri Jan 13 18:32:19 2012 +0100
+++ b/src/ldt/ldt/user/admin.py	Mon Jan 16 15:39:17 2012 +0100
@@ -5,10 +5,13 @@
 from django.utils.translation import ugettext as _
 from forms import LdtForm
 from guardian.admin import GuardedModelAdmin
-from models import Ldt, UserProfile
+from models import Ldt, UserProfile, GroupProfile
+
+class GroupProfileInline(admin.StackedInline):
+    model = GroupProfile
 
 class GroupAdmin(GuardedModelAdmin):
-    pass
+    inlines = [GroupProfileInline, ]
 
 class UserProfileInline(admin.StackedInline):
     model = UserProfile