correct serialization
authorymh <ymh.work@gmail.com>
Thu, 10 Jun 2010 11:17:09 +0200
changeset 10 84e31387a741
parent 9 67f071c743f5
child 11 3903840d6720
correct serialization
.hgignore
sbin/virtualenv/create_python_env.py
sbin/virtualenv/res/src/simplejson-2.1.1.tar.gz
web/eulalie/templates/eulalie/workspace.html
web/ldt/ldt_utils/admin.py
web/ldt/ldt_utils/contentindexer.py
web/ldt/ldt_utils/fileimport.py
web/ldt/ldt_utils/models.py
web/ldt/ldt_utils/projectserializer.py
web/ldt/ldt_utils/templates/admin/ldt_utils/content/upload_form.html
web/ldt/ldt_utils/templates/ldt/ldt_utils/copy_ldt.html
web/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html
web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html
web/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html
web/ldt/ldt_utils/urls.py
web/ldt/ldt_utils/utils.py
web/ldt/ldt_utils/views.py
web/ldt/templates/admin/index.html
web/ldt/user/templates/ldt/user/space.html
--- a/.hgignore	Thu Jun 10 04:16:26 2010 +0200
+++ b/.hgignore	Thu Jun 10 11:17:09 2010 +0200
@@ -5,4 +5,5 @@
 ^web/\.htaccess$
 ^web/eulalie/\.htaccess$
 ^web/eulalie/config\.py$
+^web/static/media/
 
--- a/sbin/virtualenv/create_python_env.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/sbin/virtualenv/create_python_env.py	Thu Jun 10 11:17:09 2010 +0200
@@ -46,7 +46,6 @@
 EXTRA_TEXT += "    'PYLUCENE' : { 'setup': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'url': 'http://apache.crihan.fr/dist/lucene/pylucene/pylucene-3.0.1-1-src.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"pylucene-3.0.1-1-src.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'PIL' : { 'setup': 'pil', 'url': 'http://effbot.org/downloads/Imaging-1.1.7.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"Imaging-1.1.7.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'PYXML' : { 'setup': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'url': 'http://sourceforge.net/projects/pyxml/files/pyxml/0.8.4/PyXML-0.8.4.tar.gz/download', 'local': '"+ os.path.abspath(os.path.join(src_base,"PyXML-0.8.4.tar.gz"))+"', 'patch': '"+os.path.join(patch_path,"pyxml.patch")+"'},\n"
-EXTRA_TEXT += "    'JSON' : { 'setup': 'simplejson', 'url': 'http://pypi.python.org/packages/source/s/simplejson/simplejson-2.1.1.tar.gz', 'local': '"+ os.path.abspath(os.path.join(src_base,"simplejson-2.1.1.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'DJANGO' : { 'setup': 'django', 'url': 'http://www.djangoproject.com/download/1.2.1/tarball/', 'local': '"+ os.path.abspath(os.path.join(src_base,"Django-1.2.1.tar.gz"))+"'},\n"
 EXTRA_TEXT += "    'DJANGO-EXTENSIONS' : { 'setup': 'django-extensions', 'url':'http://django-command-extensions.googlecode.com/files/django-extensions-0.4.1.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-extensions-0.4.1.tar.gz"))+"' },\n"
 EXTRA_TEXT += "    'DJANGO-REGISTRATION' : { 'setup': 'django-registration', 'url':'http://bitbucket.org/ubernostrum/django-registration/get/tip.tar.gz', 'local':'"+ os.path.abspath(os.path.join(src_base,"django-registration.tar.gz"))+"' },\n"
@@ -233,9 +232,6 @@
             ('DJANGO-REGISTRATION', 'easy_install', '-Z')
             ]
         
-        if sys.version_info < (2,6):
-            NORMAL_INSTALL.append(('JSON','pip', None))
-        
             
         for key, method, option_str in NORMAL_INSTALL:
             if key not in ignore_packages:
Binary file sbin/virtualenv/res/src/simplejson-2.1.1.tar.gz has changed
--- a/web/eulalie/templates/eulalie/workspace.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/eulalie/templates/eulalie/workspace.html	Thu Jun 10 11:17:09 2010 +0200
@@ -57,6 +57,7 @@
         <td>{{ content.title }}</td>
         <td><a href="{% url ldt.ldt_utils.views.index content.iri_id %}" class="ldt_link">{% trans "open ldt" %}</a></td>
         <td><a href="{% url ldt.ldt_utils.views.create_project content.iri_id %}" class="ldt_link_create">{% trans "create project" %}</a></td>
+        <td><a href="{% url ldt.ldt_utils.views.project_json_externalid content.external_id %}" class="ldt_link">{% trans "link json by externalid" %}</a></td>
     </tr>
 {% endfor %}
 </table>
@@ -70,6 +71,7 @@
         <td>{{ project.title }}</td>
         <td><a href="{% url ldt.ldt_utils.views.indexProject project.ldt_id %}" class="ldt_link">{% trans "open ldt" %}</a></td>
         <td><a href="{% url ldt.ldt_utils.views.copy_project project.ldt_id %}" class="ldt_link_create">{% trans "copy project" %}</a></td>
+        <td><a href="{% url ldt.ldt_utils.views.project_json_id project.ldt_id %}" class="ldt_link">{% trans "link json by id" %}</a></td>
     </tr>
 {% endfor %}
 </table>
--- a/web/ldt/ldt_utils/admin.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/admin.py	Thu Jun 10 11:17:09 2010 +0200
@@ -78,3 +78,4 @@
 
 
 admin.site.register(Content, ContentAdmin)
+admin.site.register(Author)
--- a/web/ldt/ldt_utils/contentindexer.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/contentindexer.py	Thu Jun 10 11:17:09 2010 +0200
@@ -65,18 +65,18 @@
             res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble", context=con)
 
             for ensemble in res:
-                ensembleId = ensemble.getAttributeNS("id",None)
+                ensembleId = ensemble.getAttributeNS(None,u"id")
                 
                 for decoupageNode in ensemble.childNodes:
-                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttributeNS("id",None) in self.decoupage_blacklist:
+                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttributeNS(None,u"id") in self.decoupage_blacklist:
                         continue
                     
-                    decoupId = decoupageNode.getAttributeNS("id",None)
+                    decoupId = decoupageNode.getAttributeNS(None,u"id")
                     res = xml.xpath.Evaluate("elements/element", decoupageNode)
                     for elementNode in res:
                         doc = lucene.Document()
-                        elementId = elementNode.getAttributeNS("id",None)
-                        tags = elementNode.getAttributeNS("tags",None)
+                        elementId = elementNode.getAttributeNS(None,u"id")
+                        tags = elementNode.getAttributeNS(None,u"tags")
                         
                         if tags is not None:                            
                             tags.replace(",", ";")
@@ -170,21 +170,21 @@
             res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
 
             for content in res:
-                contentId = content.getAttributeNS("id",None)
+                contentId = content.getAttributeNS(None,u"id")
                 
                 ensembleId = "ens_perso"
                 
                 for decoupageNode in content.childNodes:
                     # pocketfilms.utils.log.debug("Indexing content decoupage : "+ repr(decoupageNode.nodeType) + " in " + repr(self.decoupage_blacklist))
-                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttributeNS("id",None) in self.decoupage_blacklist:
+                    if decoupageNode.nodeType != xml.dom.Node.ELEMENT_NODE or decoupageNode.tagName != "decoupage"  or decoupageNode.getAttributeNS(None,"id") in self.decoupage_blacklist:
                         continue
                     
-                    decoupId = decoupageNode.getAttributeNS("id",None)
+                    decoupId = decoupageNode.getAttributeNS(None,u"id")
                     res = xml.xpath.Evaluate("elements/element", decoupageNode)
                     for elementNode in res:
                         doc = lucene.Document()
-                        elementId = elementNode.getAttributeNS("id",None)
-                        tags = elementNode.getAttributeNS("tags",None)
+                        elementId = elementNode.getAttributeNS(None,u"id")
+                        tags = elementNode.getAttributeNS(None,u"tags")
                         
                         if tags is not None:                            
                             tags.replace(",", ";")
--- a/web/ldt/ldt_utils/fileimport.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/fileimport.py	Thu Jun 10 11:17:09 2010 +0200
@@ -73,7 +73,7 @@
 
         for node in ensemblesnode.childNodes:
             if node.nodeType == xml.dom.Node.ELEMENT_NODE and node.tagName == "ensemble":
-                id = node.getAttributeNS("id",None)
+                id = node.getAttributeNS(None,u"id")
                 if id not in ensembleids:
                     ensembleids.append(id)
 
@@ -108,7 +108,7 @@
             src_video = res[0].getAttribute('src')
             self.videourl = os.path.basename(src_video)
             res[0].setAttributeNS(None,'src', self.videourl)
-        self.duration = res[0].getAttributeNS(None, 'dur')
+        self.duration = res[0].getAttributeNS(None, u'dur')
             
         f = open(path, "w")
         try:
@@ -130,7 +130,7 @@
         #    url = self.src
         #else:
         #    url = self.id + u"/" + os.path.basename(self.src)
-        content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = {'iriurl': self.src, 'title':self.title, 'description':self.desc, 'videopath': self.videopath})
+        content, self.created = Content.objects.get_or_create(iri_id=self.id, defaults = {'src':self.videourl, 'iriurl': self.src, 'title':self.title, 'description':self.desc, 'videopath': self.videopath})
         if not self.created:
             content.iriurl = self.src
             content.title = self.title
@@ -266,7 +266,7 @@
         #get author from file ldt
         result = xml.xpath.Evaluate("/iri/project", context=con)
         for pnode in result:
-            author = pnode.getAttributeNS("user",None)
+            author = pnode.getAttributeNS(None,u"user")
             if author:
                 self.author = unicode(author)
                 break 
--- a/web/ldt/ldt_utils/models.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/models.py	Thu Jun 10 11:17:09 2010 +0200
@@ -6,6 +6,7 @@
 import os
 import os.path
 import uuid
+import xml
 
 class Author(models.Model):
 
@@ -20,14 +21,15 @@
 
 class Content(models.Model):
     iri_id = models.CharField(max_length=1024, unique=True)
-    iriurl = models.URLField()
-    videopath = models.URLField(null=True, blank=True)
+    iriurl = models.CharField(max_length=1024)
+    src = models.CharField(max_length=1024)
+    videopath = models.CharField(max_length=1024, null=True, blank=True)
     creation_date = models.DateTimeField(auto_now_add=True)
     update_date = models.DateTimeField(auto_now=True)
     title = models.CharField(max_length=1024, null=True, blank=True)
     description = models.TextField(null=True, blank=True)
     external_id = models.CharField(max_length=1024, null=True, blank=True)
-    authors = models.ManyToManyField(Author)
+    authors = models.ManyToManyField(Author, blank=True)
     duration = models.IntegerField(null=True, blank=True)
 
     def get_duration(self):
@@ -36,7 +38,7 @@
             doc = Ft.Xml.Domlette.ConvertDocument(doc)        
             con = xml.xpath.Context.Context(doc, 1, 1, None)
             res = xml.xpath.Evaluate("/iri/body/medias/media[@id='video']/video", context=con)
-            self.duration = int(res[0].getAttributeNS(None, 'dur'))
+            self.duration = int(res[0].getAttributeNS(None, u'dur'))
             self.save()
         return self.duration
     
@@ -68,10 +70,10 @@
             return unicode(web_url) + unicode(settings.MEDIA_URL)+u"media/ldt/"+unicode(self.iriurl)
     
     def iri_file_path(self):
-        return os.path.join(os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.iri_id), os.path.basename(self.iri.path))
+        return os.path.join(os.path.join(os.path.join(os.path.join(settings.MEDIA_ROOT, "media"), "ldt"), self.iri_id), os.path.basename(self.iriurl))
 
     def iri_url_template(self):
-        return "${web_url}${media_url}media/ldt/" + unicode(self.iri_id) + "/" + os.path.basename(self.iri.path)
+        return "${web_url}${media_url}media/ldt/" + unicode(self.iri_id) + "/" + os.path.basename(self.iriurl)
         
         
 class Project(Document):  
@@ -104,7 +106,7 @@
         con = xml.xpath.Context.Context(doc, 1, 1, None)
         res = xml.xpath.Evaluate("/iri/project", context=con)
         if len(res) > 0:
-            return res[0].getAttributeNS(None, 'abstract')
+            return res[0].getAttributeNS(None, u'abstract')
         else:
             return None
         
--- a/web/ldt/ldt_utils/projectserializer.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/projectserializer.py	Thu Jun 10 11:17:09 2010 +0200
@@ -2,6 +2,9 @@
 import Ft.Xml.Domlette
 import xml.xpath
 from datetime import datetime
+from ldt.ldt_utils.models import Content, Project
+
+DATE_FORMATS = ["%d/%m/%Y","%Y-%m-%d"]
 
 """
 Serialize a project object to a cinelab compatible array
@@ -21,11 +24,11 @@
     
     def __parse_ensemble(self, ensemble_node, content):
         
-        ensemble_id = ensemble_node.getAttributeNS("id",None)
-        ensemble_author = ensemble_node.getAttributeNS("author",None)
-        ensemble_title = ensemble_node.getAttributeNS("title",None)
-        ensemble_description = ensemble_node.getAttributeNS("abstract",None)
-        ensemble_created = datetime.utcnow().iso_format()
+        ensemble_id = ensemble_node.getAttributeNS(None,u"id")
+        ensemble_author = ensemble_node.getAttributeNS(None,u"author")
+        ensemble_title = ensemble_node.getAttributeNS(None,u"title")
+        ensemble_description = ensemble_node.getAttributeNS(None,u"abstract")
+        ensemble_created = datetime.utcnow().isoformat()
         ensemble_modified = ensemble_created 
         
         list_items = []
@@ -50,16 +53,22 @@
             if decoupage_node.nodeType != xml.dom.Node.ELEMENT_NODE or decoupage_node.tagName != "decoupage" :
                 continue
             
-            decoupage_id = decoupage_node.getAttributeNS("id",None)
-            decoupage_creator = decoupage_node.getAttributeNS("author",None)
+            decoupage_id = decoupage_node.getAttributeNS(None, u"id")
+            decoupage_creator = decoupage_node.getAttributeNS(None,u"author")
             if not decoupage_creator:
                 decoupage_creator = "IRI"
             decoupage_contributor = decoupage_creator
-            date_str = decoupage_node.getAttributeNS("date",None)
+            date_str = decoupage_node.getAttributeNS(None,u"date")
+            decoupage_created = None
             if date_str :
-                decoupage_created = datetime.strptime(date_str,"%d/%m/%Y").iso_format()
-            else :
-                decoupage_created = datetime.utcnow().iso_format()
+                for date_format in DATE_FORMATS:
+                    try:
+                        decoupage_created = datetime.strptime(date_str,date_format).isoformat()
+                        break
+                    except Exception:
+                        decoupage_created = None
+            if decoupage_created is None:
+                decoupage_created = datetime.utcnow().isoformat()
             decoupage_modified = decoupage_created
             
             decoupage_title = ""
@@ -89,11 +98,11 @@
             res = xml.xpath.Evaluate("elements/element", decoupage_node)
             for element_node in res:
                 
-                element_id = element_node.getAttributeNS("id",None)
-                element_begin = element_node.getAttributeNS("begin",None)
-                element_duration = element_node.getAttributeNS("dur",None)
+                element_id = element_node.getAttributeNS(None,u"id")
+                element_begin = element_node.getAttributeNS(None,u"begin")
+                element_duration = element_node.getAttributeNS(None,u"dur")
                 element_media = content.iri_id
-                element_color = element_node.getAttributeNS("color",None)
+                element_color = element_node.getAttributeNS(None,u"color")
                 
                 element_title = ""
                 for txtRes in xml.xpath.Evaluate("title/text()", element_node): 
@@ -107,15 +116,19 @@
                 element_audio_href = ""
                 res = xml.xpath.Evaluate("audio", element_node)
                 if len(res) > 0:
-                    element_audio_src = res[0].getAttributeNS(None, "source")
-                    element_audio_href = res[0].value
+                    element_audio_src = res[0].getAttributeNS(None, u"source")
+                    ltext = []
+                    for n in res[0].childNodes:
+                        if n.nodeType in (dom.Node.TEXT_NODE, dom.Node.CDATA_SECTION_NODE):
+                            ltext.append(n.data)
+                    element_audio_href = ''.join(ltext)
                 
                 
                 element_tags = []
                 
-                tags = element_node.getAttributeNS("tags",None)
+                tags = element_node.getAttributeNS(None,u"tags")
                 
-                tags_list = map(lambda s:s.trim(),tags.split(","))
+                tags_list = map(lambda s:s.strip(),tags.split(","))
 
                 #tags                                
                 if tags is None or len(tags) == 0:
@@ -130,7 +143,7 @@
                     for tagnode in restagnode:
                         tags_list.append(tagnode.data)
                 
-                tag_date = datetime.utcnow().iso_format()
+                tag_date = datetime.utcnow().isoformat()
                 for tag_id in tags_list:
                     if tag_id not in self.tags:
                         new_tag = {
@@ -177,20 +190,20 @@
     
     def __parse_ldt(self):
         
-        doc = xml.dom.minidom.parseString(self.project.ldt)
+        doc = xml.dom.minidom.parseString(self.project.ldt.encode("utf-8"))
         self.ldt_doc = Ft.Xml.Domlette.ConvertDocument(doc)
         con = xml.xpath.Context.Context(doc, 1, 1, None)
         
         res = xml.xpath.Evaluate("/iri/medias/media", context=con)
         for mediaNode in res:
-            iri_id = mediaNode.getAttributeNS(None,"id")
+            iri_id = mediaNode.getAttributeNS(None,u"id")
             content = Content.objects.get(iri_id=iri_id)
-            self.__parser_content(content)
+            self.__parse_content(content)
             
         res = xml.xpath.Evaluate("/iri/annotations/content",context=con)               
         
         for content_node in res:
-            content_id = content_node.getAttributeNS(None, "id")
+            content_id = content_node.getAttributeNS(None, u"id")
             content = Content.objects.get(iri_id=content_id)
             for ensemble_node in content_node.childNodes:
                 if ensemble_node.nodeType != xml.dom.Node.ELEMENT_NODE or ensemble_node.tagName != "ensemble" :
@@ -239,9 +252,9 @@
              "id" : content.iri_id,
              "url" : content.videopath.rstrip('/') + "/" + content.src,
              "dc:creator" : author,
-             "dc:created" : content.creation_date.iso_format(),
+             "dc:created" : content.creation_date.isoformat(),
              "dc:contributor" : contributor,
-             "dc:modified" : content.update_date.iso_format(),
+             "dc:modified" : content.update_date.isoformat(),
              "dc:creator.contents" : content_author,
              "dc:created.contents" : content_date,
              "dc:title" : content.title,
@@ -263,7 +276,6 @@
         res = {}
         
         self.__parse_ldt()
-        self.__parse_contents()
         
         project_main_media = ""
         if len(self.medias) > 0:
@@ -271,8 +283,8 @@
         
         res['metas'] = {
              'id': self.project.ldt_id,
-             'dc:created':self.project.creation_date.iso_format(),
-             'dc:modified':self.project.modification_date.iso_format(),
+             'dc:created':self.project.creation_date.isoformat(),
+             'dc:modified':self.project.modification_date.isoformat(),
              'dc:contributor':self.project.changed_by,
              'dc:creator':self.project.created_by,
              'dc:title':self.project.title,
--- a/web/ldt/ldt_utils/templates/admin/ldt_utils/content/upload_form.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/templates/admin/ldt_utils/content/upload_form.html	Thu Jun 10 11:17:09 2010 +0200
@@ -1,4 +1,5 @@
-{% extends "admin/ldt_utils/app_action.html" %} {# import an ldt #}
+{% extends "admin/ldt_utils/app_action.html" %}
+{# import an ldt #}
 {% block content %}
 <p>Vous pouvez importer un fichier ldt ou un zip qui compresse un
 fichier .ldt et plusieurs fichiers .iri.</p>
@@ -10,7 +11,9 @@
 <div>
 <p>{{ message }}</p>
 </div>
-{% endif %} {% if form %}
+{% endif %}
+
+{% if form %}
 
 <form method="post" enctype="multipart/form-data" action="">{% csrf_token %}
 <table>
--- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/copy_ldt.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/copy_ldt.html	Thu Jun 10 11:17:09 2010 +0200
@@ -9,10 +9,11 @@
 <body>
 <div id="add_contribution">
 <div class="title">{% trans "Copy your project" %}</div>
-<form action="" method="POST">{% csrf_token %} <label for="title">{%
-trans "Title" %}:</label> <input class="inputbox required" type="text"
-	name="title" size="80" ; value="" id="title" /> <input class="button"
-	id="ldt_submit" type="submit" value="{% trans 'Copy' %}" /></form>
+
+<form action="" method="POST">{% csrf_token %}
+	<label for="title">{%trans "Title" %}:</label>
+	<input class="inputbox required" type="text" name="title" size="80"  value="" id="title" />
+	<input class="button" id="ldt_submit" type="submit" value="{% trans 'Copy' %}" /></form>
 </div>
 </body>
 </html>
--- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/create_ldt.html	Thu Jun 10 11:17:09 2010 +0200
@@ -4,15 +4,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
-<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
+	<link rel="stylesheet" href="{{BASE_URL}}static/ldt/css/ldt.css" />
 </head>
 <body>
 <div id="add_contribution">
 <div class="title">{% trans "Create your project" %}</div>
-<form action="{{create_project_action}}" method="POST">{% csrf_token %} <label for="title">{% trans "Title" %}:</label> <input
-	class="inputbox required" type="text" name="title" size="80" ; value=""
-	id="title" />
-
+<form action="{{create_project_action}}" method="POST">
+{% csrf_token %} 
+<label for="title">{% trans "Title" %}:</label>
+<input class="inputbox required" type="text" name="title" size="80" ; value="" id="title" />
 <div class="title">{% trans "List of contents" %}</div>
 <ul class='contentlist'>
 	{% for content in contents %}
@@ -20,9 +20,8 @@
 		checked="true" />{{content.iri_id}}</li>
 	{% endfor %}
 </ul>
-
-<input class="button" id="ldt_submit" type="submit"
-	value="{% trans 'Create' %}" /></form>
+<input class="button" id="ldt_submit" type="submit" value="{% trans 'Create' %}" />
+</form>
 </div>
 </body>
 </html>
--- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/ldt_list.html	Thu Jun 10 11:17:09 2010 +0200
@@ -1,5 +1,7 @@
-{% extends "ldt/user/user_base.html" %} {# list of projects ldt #} {%
-load i18n %} {% block js_import %}{{ block.super }}
+{% extends "ldt/user/user_base.html" %}
+{# list of projects ldt #}
+{%load i18n %}
+{% block js_import %}{{ block.super }}
 <script type="text/javascript"
 	src="{{ BASE_URL }}static/js/jquery.DOMwindow.js"></script>
 <script type="text/javascript">           
@@ -38,19 +40,25 @@
             	});       
         });        	        
 </script>
-{% endblock %} {% block css_import %} {{ block.super }}
-<link rel="stylesheet" type="text/css"
-	href="{{ BASE_URL }}static/ldt/css/ldt.css" />
-{% endblock %} {% block breadcrumb %}
+{% endblock %}
+
+{% block css_import %}
+{{ block.super }}
+	<link rel="stylesheet" type="text/css"
+		href="{{ BASE_URL }}static/ldt/css/ldt.css" />
+{% endblock %}
+
+{% block breadcrumb %}
 <li></li>
-<li><a href="{% url ldt.userpanel.views.space %}">{% trans
-"Space" %}</a></li>
+<li><a href="{% url ldt.userpanel.views.space %}">{% trans "Space" %}</a></li>
 <li>{% trans "Ldt Project" %}</li>
-{% endblock %} {% block content_title %}{% trans "Ldt Project" %}{%
-endblock %} {% block iricontent %}
+{% endblock %}
+
+{% block content_title %}{% trans "Ldt Project" %}{%endblock %}
+
+{% block iricontent %}
 <div id='ldtlist'><a
-	href="{% url ldt.ldt.views.create_ldt_view %}" class="create_ldt_link">{%
-trans 'Create new project'%}</a>
+	href="{% url ldt.ldt_utils.views.create_ldt_view %}" class="create_ldt_link">{% trans 'Create new project'%}</a>
 <table>
 	<caption>{% trans "Project" %}</caption>
 	<thead>
@@ -62,13 +70,13 @@
 	<tbody>
 		{% for ldt in ldtProjects %}
 		<tr>
-			<th><a href="{% url ldt.ldt.views.indexProject ldt.ldt_id %}"
+			<th><a href="{% url ldt.ldt_utils.views.indexProject ldt.ldt_id %}"
 				class="ldt_link">{{ ldt.title }}</a></th>
 			{% ifequal ldt.state 2%}
-			<td><a href="{% url ldt.ldt.views.unpublish ldt.ldt_id%}"><img
+			<td><a href="{% url ldt.ldt_utils.views.unpublish ldt.ldt_id%}"><img
 				alt="True" src="{{BASE_URL}}static/admin/img/admin/icon-yes.gif" /></td>
 			{% else %}
-			<td><a href="{% url ldt.ldt.views.publish ldt.ldt_id %}"><img
+			<td><a href="{% url ldt.ldt_utils.views.publish ldt.ldt_id %}"><img
 				alt="False" src="{{BASE_URL}}static/admin/img/admin/icon-no.gif" /></td>
 			{% endifequal %}
 		</tr>
--- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/search_form.html	Thu Jun 10 11:17:09 2010 +0200
@@ -1,7 +1,7 @@
 {% extends "base.html" %} {% block content %}
 
 <form method="post"
-	action="{{WEB_URL}}{% url ldt.ldt.views.searchIndex %}"
+	action="{{WEB_URL}}{% url ldt.ldt_utils.views.searchIndex %}"
 	accept-charset="utf-8">
 
 <table>
--- a/web/ldt/ldt_utils/urls.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/urls.py	Thu Jun 10 11:17:09 2010 +0200
@@ -13,7 +13,7 @@
     url(r'^searchLdt/(?P<field>.*)/(?P<query>.*)$', 'views.searchLdt'),
     url(r'^searchSeg/(?P<field>.*)/(?P<query>.*)$', 'views.searchSegments'),
     url(r'^index/(?P<url>.*)$', 'views.index'),
-    url(r'^init/(?P<method>.*)/(?P<url>.*)$', 'views.init'),
+    url(r'^init/(?P<method>.*)/(?P<url>.*)$', 'views.init', name='ldt_init'),
     url(r'^ldt/(?P<url>.*)$', 'views.ldt'),
     url(r'^search/loading/$', 'views.loading'),
     url(r'^create/(?P<iri_id>.*)$', 'views.create_project'),
@@ -26,7 +26,7 @@
     urlpatterns += patterns('ldt.ldt_utils',
         url(r'^space/ldt/$', 'views.list_ldt'),
         url(r'^space/ldt/indexproject/(?P<id>.*)$', 'views.indexProject'),
-        url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.+)$', 'views.init'),
+        url(r'^space/ldt/init/(?P<method>.*)/(?P<url>.+)$', 'views.init', name='space_ldt_init'),
         url(r'^space/ldt/project/(?P<id>.*)$', 'views.ldtProject'),
         url(r'^space/ldt/create/$', 'views.create_ldt_view'),
         url(r'^space/ldt/created_done/$', 'views.created_ldt'),
--- a/web/ldt/ldt_utils/utils.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/utils.py	Thu Jun 10 11:17:09 2010 +0200
@@ -275,13 +275,13 @@
     
     writer.startElement(u"head")
     
-    writer.simpleElement(u'meta', attributes={'name':'id', 'content':content.iri_id})
-    writer.simpleElement(u'meta', attributes={'name':'title', 'content':content.title})
-    writer.simpleElement(u'meta', attributes={'name':'author', 'content':username})
-    writer.simpleElement(u'meta', attributes={'name':'contributor', 'content':username})
-    writer.simpleElement(u'meta', attributes={'name':'date', 'content':datetime.date.utcnow().isoformat()})
-    writer.simpleElement(u'meta', attributes={'name':'copyright', 'content':'IRI'})
-    writer.simpleElement(u'meta', attributes={'name':'type', 'content':'video'})    
+    writer.simpleElement(u'meta', attributes={u'name':u'id', 'content':unicode(content.iri_id)})
+    writer.simpleElement(u'meta', attributes={u'name':u'title', 'content':unicode(content.title)})
+    writer.simpleElement(u'meta', attributes={u'name':u'author', 'content':unicode(username)})
+    writer.simpleElement(u'meta', attributes={u'name':u'contributor', 'content':unicode(username)})
+    writer.simpleElement(u'meta', attributes={u'name':u'date', 'content':unicode(datetime.date.today().isoformat())})
+    writer.simpleElement(u'meta', attributes={u'name':u'copyright', 'content':u'IRI'})
+    writer.simpleElement(u'meta', attributes={u'name':u'type', 'content':u'video'})    
     
     writer.endElement(u"head")
 
@@ -291,22 +291,22 @@
     ensemble_id = unicode(uuid.uuid1())
     writer.startElement(u"ensemble", 
                         attributes = {
-                            'label':'undefined',
-                            'date':datetime.date.utcnow().isoformat(),
-                            'title':'autogenerated',
-                            'abstract':'auto generated',
-                            'id':ensemble_id,
-                            'author':username
+                            u'label':u'undefined',
+                            u'date':unicode(datetime.date.today().isoformat()),
+                            u'title':u'autogenerated',
+                            u'abstract':u'auto generated',
+                            u'id':ensemble_id,
+                            u'author':unicode(username)
                             })
     decoupage_id = unicode(uuid.uuid1())
     writer.startElement(u"decoupage", 
                         attributes = {
-                            'height' : '10',
-                            'dur':content.duration,
-                            'type':'regular',
-                            'date':datetime.date.utcnow().isoformat(),
-                            'id':decoupage_id,
-                            'author':username
+                            u'height' : u'10',
+                            u'dur':unicode(content.duration),
+                            u'type':u'regular',
+                            u'date':unicode(datetime.date.today().isoformat()),
+                            u'id':decoupage_id,
+                            u'author':unicode(username)
                             })
     
     writer.startElement(u"title")
@@ -320,22 +320,22 @@
     writer.endElement(u"ensemble")
     writer.endElement(u"ensembles")
     
-    writer.simpleElement('links')
+    writer.simpleElement(u'links')
     writer.startElement(u"medias")
 
-    writer.startElement(u"media", attributes={'id':'video'})
-    writer.simpleElement(u'video', attributes={'src':content.videopath,'id':uuid.uuid1(),'dur':content.duration,'begin':0})
+    writer.startElement(u"media", attributes={u'id':u'video'})
+    writer.simpleElement(u'video', attributes={u'src':unicode(content.src),u'id':unicode(uuid.uuid1()),u'dur':unicode(content.duration),u'begin':u'0'})
     writer.endElement(u"media")
 
-    writer.startElement(u"media", attributes={'id':'tool'})
-    writer.simpleElement('tool')
+    writer.startElement(u"media", attributes={u'id':u'tool'})
+    writer.simpleElement(u'tool')
     writer.endElement(u"media")
 
     writer.endElement(u"medias")
     
-    writer.startElement('display')
-    writer.simpleElement('decoupage', attributes={'position':'1', 'id':decoupage_id, 'idensemble':ensemble_id})
-    writer.endElement('display')
+    writer.startElement(u'display')
+    writer.simpleElement(u'decoupage', attributes={u'position':u'1', u'id':decoupage_id, u'idensemble':ensemble_id})
+    writer.endElement(u'display')
     
     writer.endElement(u"body")
 
--- a/web/ldt/ldt_utils/views.py	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/ldt_utils/views.py	Thu Jun 10 11:17:09 2010 +0200
@@ -1,10 +1,12 @@
 import django.core.urlresolvers
 from django.http import HttpResponse, HttpResponseRedirect
-from django.shortcuts import render_to_response, get_object_or_404
+from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
 from django.template import RequestContext
 from django.core.urlresolvers import reverse
 from django.contrib.auth.decorators import login_required
 from django.conf import settings
+from django.core import serializers
+from django.utils import simplejson
 from fileimport import *
 from forms import LdtImportForm, LdtAddForm, SearchForm, AddProjectForm, CopyProjectForm
 from ldt.core.models import Owner
@@ -26,7 +28,7 @@
     
 def searchForm(request):
     form = SearchForm()
-    return render_to_response('ldt/ldt_utils/search_form.html',{'form': form} , context_instance=RequestContext(request))    
+    return render_to_response('ldt/ldt_utils_utils/search_form.html',{'form': form} , context_instance=RequestContext(request))    
 
 def searchIndex(request):
     
@@ -40,7 +42,7 @@
         language_code = request.LANGUAGE_CODE[:2]
     
         url = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.searchInit", args=[field, queryStr])
-        return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
+        return render_to_response('ldt/ldt_utils/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': url}, context_instance=RequestContext(request))
     else:
         resp = HttpResponse()
         resp.write("<html><head></head><body>Error : No result</body></html>");
@@ -132,7 +134,7 @@
     'contents': contents,
     'ldtProjects': ldtProjects.reverse(),
     }
-    return render_to_response('ldt/ldt/ldt_list.html', context, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/ldt_list.html', context, context_instance=RequestContext(request))
 
 def create_ldt_view(request):
     if request.method == "POST" :
@@ -144,14 +146,14 @@
     else:
         form = LdtAddForm()
         contents = Content.objects.all()    
-        return render_to_response('ldt/ldt/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request))
+        return render_to_response('ldt/ldt_utils/create_ldt.html', {'contents': contents, 'form': form,'create_project_action':reverse(create_ldt_view)}, context_instance=RequestContext(request))
      
 def created_ldt(request):
-    return render_to_response('ldt/ldt/done.html', context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/done.html', context_instance=RequestContext(request))
     
 def indexProject(request, id):
 
-    urlStr = settings.WEB_URL + reverse("ldt.ldt_utils.views.init", args=['ldtProject', id])
+    urlStr = settings.WEB_URL + reverse("space_ldt_init", args=['ldtProject', id])
     posturl= settings.WEB_URL + reverse("ldt.ldt_utils.views.save_ldtProject")
     language_code = request.LANGUAGE_CODE[:2]
     
@@ -161,7 +163,7 @@
     else:
         readonly = 'false'
     
-    return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'posturl': posturl, 'id': id, 'readonly': readonly}, context_instance=RequestContext(request))
     
 def init(request, method, url):
     ldtgen = LdtUtils()
@@ -186,15 +188,16 @@
 
 def project_json_id(request, id):
     
-    project = Project.objects.get(ldt_id=id)
+    project = get_object_or_404(Project,ldt_id=id)
 
     return project_json(request, project)
 
+
 def project_json_externalid(request, id):
+        
+    res_proj = get_list_or_404(Project.objects.order_by('-modification_date'),contents__external_id = id)
     
-    project = Project.objects.get(external_id=id)
-
-    return project_json(request, project)
+    return project_json(request, res_proj[0])
 
 
 
@@ -207,8 +210,7 @@
     ps = ProjectSerializer(project)
     project_dict = ps.serialize_to_cinelab()
     
-    json_serializer = serializers.get_serializer("json")()
-    json_serializer.serialize(project_array, ensure_ascii=False, stream=resp)
+    simplejson.dump(project_dict, resp, ensure_ascii=False, indent=2)
 
     return resp
 
@@ -242,7 +244,7 @@
         ldtproject.save()
     else:
         ldt = ''
-    return render_to_response('ldt/ldt/save_done.html', {'ldt': ldt, 'id':id, 'title':title, 'contents': new_contents}, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/save_done.html', {'ldt': ldt, 'id':id, 'title':title, 'contents': new_contents}, context_instance=RequestContext(request))
     
 @login_required    
 def publish(request, id):
@@ -261,10 +263,10 @@
 
 def index(request, url):
     
-    urlStr = settings.WEB_URL + django.core.urlresolvers.reverse("ldt.ldt_utils.views.init", args=['ldt',url])
+    urlStr = settings.WEB_URL + reverse("ldt_init", args=['ldt',url])
     language_code = request.LANGUAGE_CODE[:2]
     
-    return render_to_response('ldt/ldt/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL+settings.BASE_URL}, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/init_ldt.html', {'MEDIA_URL': settings.MEDIA_URL, 'colorurl': settings.MEDIA_URL+'swf/ldt/pkg/color.xml', 'i18nurl': settings.MEDIA_URL+'swf/ldt/pkg/i18n', 'language': language_code, 'baseurl': settings.MEDIA_URL+'swf/ldt/', 'url': urlStr, 'weburl':settings.WEB_URL+settings.BASE_URL}, context_instance=RequestContext(request))
 
 
 def ldt(request, url, startSegment = None):
@@ -284,7 +286,7 @@
 
 
 def loading(request):
-     return render_to_response('ldt/ldt/loading.html', context_instance=RequestContext(request))
+     return render_to_response('ldt/ldt_utils/loading.html', context_instance=RequestContext(request))
 
 
 @login_required
@@ -300,7 +302,7 @@
             return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id]))
     else:
         form = AddProjectForm()
-    return render_to_response('ldt/ldt/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt_utils.views.create_project",args=[iri_id])}, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/create_ldt.html', {'form':form, 'contents':contents, 'iri_id':iri_id, 'create_project_action':reverse("ldt.ldt_utils.views.create_project",args=[iri_id])}, context_instance=RequestContext(request))
 
 @login_required
 def copy_project(request, ldt_id):
@@ -314,5 +316,5 @@
             return HttpResponseRedirect(reverse('ldt.ldt_utils.views.indexProject', args=[project.ldt_id]))
     else:
         form = CopyProjectForm
-    return render_to_response('ldt/ldt/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
+    return render_to_response('ldt/ldt_utils/copy_ldt.html', {'form':form, 'project':project}, context_instance=RequestContext(request))
 
--- a/web/ldt/templates/admin/index.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/templates/admin/index.html	Thu Jun 10 11:17:09 2010 +0200
@@ -46,14 +46,14 @@
         	<caption>Import</caption>
         	<tr>
         	<th>        	
-        	<a href="{% url ldt.ldt.views.importFile %}">Import an ldt</a>
+        	<a href="{% url ldt.ldt_utils.views.importFile %}">Import an ldt</a>
         	</th>
         	<td>&nbsp;
         	</td>
             </tr>
         	<tr>
             <th>            
-            <a href="{% url ldt.ldt.views.reindex %}">Reindex</a>
+            <a href="{% url ldt.ldt_utils.views.reindex %}">Reindex</a>
             </th>
             <td>&nbsp;
             </td>         
--- a/web/ldt/user/templates/ldt/user/space.html	Thu Jun 10 04:16:26 2010 +0200
+++ b/web/ldt/user/templates/ldt/user/space.html	Thu Jun 10 11:17:09 2010 +0200
@@ -13,7 +13,7 @@
     <li><a href="{% url admin:page %}">{% trans "Page" %}</a></li>
 {% endif %}
 {% if ldt %}
-    <li><a href="{% url ldt.ldt.views.list_ldt %}">{% trans "Projets Lignes de temps" %}</a></li>
+    <li><a href="{% url ldt.ldt_utils.views.list_ldt %}">{% trans "Projets Lignes de temps" %}</a></li>
 {% endif %}
 </ul>      
 {% endblock %}