web/ldt/ldt_utils/utils.py
changeset 80 1e7732f40eee
parent 71 fc1210bbb854
child 85 3b70d84e661a
--- a/web/ldt/ldt_utils/utils.py	Thu Sep 23 18:39:40 2010 +0200
+++ b/web/ldt/ldt_utils/utils.py	Tue Sep 28 18:24:14 2010 +0200
@@ -1,17 +1,11 @@
 import lucene
 from ldt.ldt_utils import STORE
 from ldt.ldt_utils import ANALYZER
-from Ft.Xml import MarkupWriter
 import uuid
 import django.core.urlresolvers
 from django.conf import settings
 import urllib
-import xml.dom
-import xml.dom.minidom
-import xml.dom.ext
-import xml.xpath
 import datetime
-import Ft
 import lxml.etree
 
 __BOOLEAN_DICT = {
@@ -57,206 +51,217 @@
     
     def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None):
 
-        writer = MarkupWriter(file, indent = u"yes")
-        writer.startDocument()
-        writer.startElement(u"iri")
-        writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""})
-        writer.startElement(u"medias")
-        for content in contentList:
-            videopath = unicode(settings.STREAM_URL)
-            if content.videopath :
-                videopath = unicode(content.videopath)
-            writer.simpleElement(u"media", attributes={u"id":content.iri_id,u"src":content.iri_url(web_url),u"video":videopath,u"pict":u"",u"extra":u""})
-        writer.endElement(u"medias")
+	iri = lxml.etree.Element(u'iri')
+	doc = lxml.etree.ElementTree(iri)
+
+	project = lxml.etree.SubElement(iri, u'project')
+	project.set(u"id",unicode(str(uuid.uuid1())))
+        project.set(u"title",unicode(title))
+	project.set(u"user",author)
+	project.set(u"abstract",u"")
+
+	medias = lxml.etree.SubElement(iri, u"medias")
+	for content in contentList:
+	    videopath = unicode(settings.STREAM_URL)
+	    if content.videopath :
+		videopath = unicode(content.videopath)
+	    media = lxml.etree.SubElement(medias, "media")
+	    media.set(u"id",content.iri_id)
+	    media.set(u"src",content.iri_url(web_url))
+	    media.set(u"video",videopath)
+            media.set(u"pict",u"")
+            media.set(u"extra",u"")
 
         if contributions is None:
             contributions = []
         annotations_nodes = {}
         for contrib in contributions:
-            doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8"))
-            con = xml.xpath.Context.Context(doc, 1, 1, None)
-            res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
+	    ldtdoc = lxml.etree.fromstring(contrib.ldtproject.ldt.encode("utf-8"))
+	    res = ldtdoc.xpath("/iri/annotations/content")
+
             for content in res:
-                contentid = content.getAttribute("id")
+		contentid = content.get("id")
                 if annotations_nodes.has_key(contentid):
                     contentnode = annotations_nodes[contentid]
                 else:
                     contentnode = {"id":contentid, "ensembles":[]}
                     annotations_nodes[contentid]=contentnode
                 for ens in content.childNodes:
-                    if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"):
-                        contentnode["ensembles"].append(ens.toprettyxml())
+		    if ens.tag.endswith("ensemble"):
+			contentnode["ensembles"].append(ens.tag)
+
 
         if len(annotations_nodes) > 0:
-            writer.startElement(u"annotations")
+	    annotations = lxml.etree.SubElement(iri, "annotations")
             for content in contentList:
                 if content.content_base.iri_id in annotations_nodes:
                     contentnode = annotations_nodes[content.content_base.iri_id]
                     if contentnode is not None:
                         if len(contentnode["ensembles"])>0:
-                            writer.startElement(u"content", attributes={"id":contentnode["id"]})
-                            writer.text(u"")
-                            for ens in contentnode["ensembles"]:
-                                writer.xmlFragment(ens.encode("utf-8"))
-                            writer.endElement(u"content")
+			    content = lxml.etree.SubElement(annotation, "content")
+			    content.set("id",contentnode["id"])
+                            content.text = u""
                         else:
-                            writer.simpleElement(u"content", attributes={"id":contentnode["id"]})
-            writer.endElement(u"annotations")
+			    content = lxml.etree.SubElement(annotation, "content")
+			    content.set("id",contentnode["id"])
+
         else:
-            writer.simpleElement(u"annotations")
+	    annotations = lxml.etree.SubElement(iri, "annotations")
 
 
-        writer.startElement(u"displays")
+	displays = lxml.etree.SubElement(iri, "displays")
         if len(contentList) > 0:
-            writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].iri_id,u"tc":u"0"})
+	    display = lxml.etree.SubElement(displays, "display")
+	    display.set(u"id",u"0")
+	    display.set(u"title",u"generated")
+	    display.set(u"idsel",contentList[0].iri_id)
+	    display.set(u"tc",u"0")
             for content in contentList:
-                writer.startElement(u"content", attributes={u"id":content.iri_id})
+		contentd = lxml.etree.SubElement(display,"content")
+		contentd.set(u"id",content.iri_id)
                 filepath = urllib.urlopen(content.iri_url())
-                doc = xml.dom.minidom.parse(filepath)
-                con = xml.xpath.Context.Context(doc, 1, 1, None)
-                res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
+		
+		udoc = lxml.etree.parse(filepath)
+		res = udoc.xpath("/iri/body/ensembles/ensemble/decoupage")
                 for decoupagenode in res:
                     decoupage_id = decoupagenode.getAttribute(u"id")
                     ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
-                    writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id})
-                writer.endElement(u"content")
+		    decoupage_id = decoupagenode.get(u"id")
+		    ensemble_id = decoupagenode.getparent().get(u"id")
+		    decoupage = lxml.etree.SubElement(content,"decoupage")
+		    decoupage.set(u"id",decoupage_id)
+		    decoupage.set(u"idens",ensemble_id)
             if startSegment is not None:
-                writer.startElement(u"activeSegment")
-                writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]})
-                writer.endElement(u"activeSegment")
+		activeSegment = lxml.etree.SubElement(display,"activeSegment")
+		idas = lxml.etree.SubElement(activeSegment,"id")
+		idas.set(u"idctt",startSegment["idcontent"])
+                idas.set(u"idens" ,startSegment["idgroup"])
+                idas.set(u"idcut",startSegment["idcutting"])
+                idas.set(u"idseg",startSegment["idsegment"])
 
-            writer.endElement(u"display")
-        writer.endElement(u"displays")
-        writer.simpleElement(u"edits")
-        writer.endElement(u"iri")
+	edits = lxml.etree.SubElement(iri, "edits")
+	
+	doc.write(file, pretty_print=True)
+
 
     def generateInit(self, url, method, search=None):
         
-        import xml.dom
-        import xml.dom.ext
-    
-        impl = xml.dom.getDOMImplementation()
-        doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
-    
-        elementFiles = doc.createElement('files')
-        doc.documentElement.appendChild(elementFiles)
-    
-        elementInit = doc.createElement('init')
-        elementFiles.appendChild(elementInit)
-    
-        elementfile = doc.createElement('file')
+	iri = lxml.etree.Element('iri')
+	impl = lxml.etree.ElementTree(iri)
+ 
+	elementFiles = lxml.etree.SubElement(iri,'files')    
+	elementInit = lxml.etree.SubElement(elementFiles, 'init')
+	elementfile = lxml.etree.SubElement(elementInit, 'file')
             
-        elementfile.setAttribute('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url))
-        elementfile.setAttribute('display', '1')
-        if(search):
-            elementfile.setAttribute("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url))
-    
+	elementfile.set('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url))
+	elementfile.set('display', '1')
+	if(search):
+	    elementfile.set("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url))   
+
     
         # /*chemin video : tant que le serveur de media n'est pas up, */
-        elementfile.setAttribute('video', settings.STREAM_URL)
-        elementfile.setAttribute('pict', "")
-        elementfile.setAttribute('extra', "")
-    
-        elementInit.appendChild(elementfile);
-    
-        elementRecent = doc.createElement('recent');
-        elementFiles.appendChild(elementRecent);
-    
-    
-        elementLibrary = doc.createElement('library');
-        elementFiles.appendChild(elementLibrary);
+	elementfile.set('video', settings.STREAM_URL)
+	elementfile.set('pict', "")
+	elementfile.set('extra', "")    
+
+    	elementRecent = lxml.etree.SubElement(elementFiles, 'recent')
+	elementLibrary = lxml.etree.SubElement(elementFiles, 'library')
     
         username = ''
         id = ''
-        elementUser = doc.createElement('user')
-        elementUser.setAttribute('name', username)
-        elementUser.setAttribute('id', id)
-        doc.documentElement.appendChild(elementUser)
+
+	elementUser = lxml.etree.SubElement(iri, 'user')
+	elementUser.set('name', username)
+	elementUser.set('id', id)
         
-        return doc
+        return iri 
+
+
 
 def create_ldt(project, user):
     
-    contentList=project.contents.all()
+    contentList = project.contents.all()
     
     """create xml"""
     
     # create a dom
-    impl = xml.dom.getDOMImplementation()
-    dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
+    iri = lxml.etree.Element('iri')
+    doc = lxml.etree.ElementTree(iri)
+    
     #node project
-    elementProject = dom.createElement('project')
-    dom.documentElement.appendChild(elementProject)
-    
+    elementProject = lxml.etree.SubElement(iri, 'project')
     
-    elementProject.setAttribute('abstract', "")
-    elementProject.setAttribute('title', project.title)
-    elementProject.setAttribute('user', user.username)
-    elementProject.setAttribute('id', project.ldt_id)
+    elementProject.set('abstract', "")
+    elementProject.set('title', project.title)
+    elementProject.set('user', user.username)
+    elementProject.set('id', project.ldt_id)
+
     #node medias
-    elementMedias = dom.createElement('medias')
-    dom.documentElement.appendChild(elementMedias)
+    elementMedias = lxml.etree.SubElement(iri, 'medias')
     
     idsel = None      
     for content in contentList:
         if not idsel:
             idsel = content.iri_id
-        elementMedia = dom.createElement('media')            
-        elementMedia.setAttribute('id', content.iri_id)
-        elementMedia.setAttribute('src', content.iri_url())
+	elementMedia = lxml.etree.SubElement(elementMedias, 'media')
+	elementMedia.set('id', content.iri_id)
+	elementMedia.set('src', content.iri_url())
+
         if content.videopath and content.videopath !="":
-            elementMedia.setAttribute('video', content.videopath)
+	    elementMedia.set('video', content.videopath)
         else:
-            elementMedia.setAttribute('video', settings.STREAM_URL)
-        elementMedia.setAttribute('pict', "")
-        elementMedia.setAttribute('extra', "")
-        elementMedias.appendChild(elementMedia)
+	    elementMedia.set('video', settings.STREAM_URL)
+	elementMedia.set('pict', "")
+	elementMedia.set('extra', "")
+
     if not idsel:
         idsel = ""
 
     #node annotations
-    elementAnnotations = dom.createElement('annotations')
-    dom.documentElement.appendChild(elementAnnotations)
+    elementAnnotations = lxml.etree.SubElement(iri, 'annotations')
+    
     #node displays
-    elementDisplays = dom.createElement('displays')
-    elementDisplay = dom.createElement('display')
-    elementDisplay.setAttribute('id', '0')
-    elementDisplay.setAttribute('title', 'Init view')
-    elementDisplay.setAttribute('idsel', idsel)
-    elementDisplay.setAttribute('tc', '0')
-    elementDisplay.setAttribute('zoom', '0')
-    elementDisplay.setAttribute('scroll', '0')
-    elementDisplay.setAttribute('infoBAB', '')
+    elementDisplays = lxml.etree.SubElement(iri, 'displays')
+    elementDisplay = lxml.etree.SubElement(elementDisplays, 'display')
+    elementDisplay.set('id', '0')
+    elementDisplay.set('title', 'Init view')
+    elementDisplay.set('idsel', idsel)
+    elementDisplay.set('tc', '0')
+    elementDisplay.set('zoom', '0')
+    elementDisplay.set('scroll', '0')
+    elementDisplay.set('infoBAB', '')
+
+    
     #node content
     for content in contentList:
-        elementContent = dom.createElement('content')
-        elementContent.setAttribute('id', content.iri_id)
+	elementContent = lxml.etree.SubElement(elementDisplay, 'content')
+	elementContent.set('id', content.iri_id)
+
         if not 'http' in content.iriurl:
         #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri"
             url = content.iri_url()
         else:
             url =content.iriurl
         file = urllib.urlopen(url)
-        doc = xml.dom.minidom.parse(file)
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
-        res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
-        #node decoupage
+	doc = lxml.etree.parse(file)
+	res = doc.xpath("/iri/body/ensembles/ensemble/decoupage")        
+
+
+	#node decoupage
         for decoupagenode in res:
-            decoupage_id = decoupagenode.getAttribute(u"id")
-            ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
-            elementDecoupage = dom.createElement('decoupage')
-            elementDecoupage.setAttribute('idens', ensemble_id)
-            elementDecoupage.setAttribute('id', decoupage_id)
-            elementContent.appendChild(elementDecoupage)     
-        elementDisplay.appendChild(elementContent)   
+	    decoupage_id = decoupagenode.attrib(u"id")
+	    parent= decoupagenode.getparent()
+	    ensemble_id = parent.attrib(u"id")
+	    elementDecoupage = etree.SubElement(elementContent, 'decoupage')
+	    elementDecoupage.set('idens', ensemble_id)
+	    elementDecoupage.set('id', decoupage_id)
     
-    elementDisplays.appendChild(elementDisplay)
-    dom.documentElement.appendChild(elementDisplays)
+    #node edits
+    elementEdits = lxml.etree.SubElement(iri, 'edits')
     
-    elementEdits = dom.createElement('edits')
-    dom.documentElement.appendChild(elementEdits)
-    # write dom in Project.ldt 
-    project.ldt = dom.documentElement.toprettyxml()
+    #write dom in Project.ldt 
+    project.ldt = lxml.etree.tostring(iri, pretty_print=True)
+    
     #save Project
     project.save()
     return project        
@@ -272,67 +277,74 @@
     
     """create xml"""
     
-    # create a dom
-    dom = xml.dom.minidom.parseString(project.ldt.encode("utf-8"))
-    con = xml.xpath.Context.Context(dom, 1, 1, None)
-    res = xml.xpath.Evaluate("iri/project", context=con)
+    ldt = lxml.etree.fromstring(project.ldt.encode("utf-8"))
+    res = ldt.xpath("/iri/project")
     for elementProject in res:
-        elementProject.setAttribute('abstract', "")
-        elementProject.setAttribute('title', new_project.title)
-        elementProject.setAttribute('user', user.username)
-        elementProject.setAttribute('id', new_project.ldt_id)
+	elementProject.set('abstract', "")
+	elementProject.set('title', new_project.title)
+	elementProject.set('user', user.username)
+	elementProject.set('id', new_project.ldt_id)
         
-    new_project.ldt = dom.documentElement.toprettyxml()
+    new_project.ldt = lxml.etree.tostring(ldt, pretty_print=True)
+
     #save Project
     new_project.save()
     return new_project
 
 def create_empty_iri(file, content, username):
     
-    writer = MarkupWriter(file, indent = u"yes")
-    writer.startDocument()
-    writer.startElement(u"iri")
-    
-    writer.startElement(u"head")
-    
-    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'abstract', 'content':unicode(content.description)})
-    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")
+    iri = lxml.etree.Element('iri')
+    doc = lxml.etree.ElementTree(iri)
 
-    writer.startElement(u"body")
-    
-    writer.startElement(u"ensembles")
-    writer.endElement(u"ensembles")
-    
-    writer.simpleElement(u'links')
-    writer.startElement(u"medias")
-
-    writer.startElement(u"media", attributes={u'id':u'video'})
-    writer.simpleElement(u'video', attributes={u'src':unicode(content.stream_src),u'id':unicode(content.iri_id),u'dur':unicode(content.duration),u'begin':u'0'})
-    writer.endElement(u"media")
+    head = lxml.etree.SubElement(iri, 'head')
+    meta1 = lxml.etree.SubElement(head, 'meta')
+    meta1.set(u'name', u'id')
+    meta1.set(u'content', unicode(content.iri_id))
+    meta2 = lxml.etree.SubElement(head, 'meta')
+    meta2.set(u'name',u'title')
+    meta2.set(u'content', unicode(content.title))
+    meta3 = lxml.etree.SubElement(head, 'meta')
+    meta3.set(u'name',u'abstract')
+    meta3.set(u'content', unicode(content.description))
+    meta4 = lxml.etree.SubElement(head, 'meta')
+    meta4.set(u'name',u'author')
+    meta4.set(u'content', unicode(username))
+    meta5 = lxml.etree.SubElement(head, 'meta')
+    meta5.set(u'name',u'contributor')
+    meta5.set(u'content', unicode(username))
+    meta6 = lxml.etree.SubElement(head, 'meta')
+    meta6.set(u'name',u'date')
+    meta6.set(u'content', unicode(datetime.date.today().isoformat()))
+    meta7 = lxml.etree.SubElement(head, 'meta')
+    meta7.set(u'name',u'copyright')
+    meta7.set(u'content', u'IRI')
+    meta8 = lxml.etree.SubElement(head, 'meta')
+    meta8.set(u'name', u'type')
+    meta8.set(u'content', u'video')
 
-    writer.startElement(u"media", attributes={u'id':u'tool'})
-    writer.simpleElement(u'tool')
-    writer.endElement(u"media")
+    body = lxml.etree.SubElement(iri, 'body')
+    ensembles = lxml.etree.SubElement(body, 'ensembles')
+    links = lxml.etree.SubElement(body, 'links')
+
+    medias = lxml.etree.SubElement(body, 'medias')
 
-    writer.endElement(u"medias")
-    
-    #writer.startElement(u'display', attributes={u'id':unicode(uuid.uuid1()), u'title':u"default", u"idsel":unicode(content.iri_id), u"tc":u"0", u"zoom":u"0", u"scroll":u"0", u"infoBAB":u""})
-    writer.simpleElement(u'display')
-    
-    writer.endElement(u"body")
+    media1 = lxml.etree.SubElement(medias, 'media')
+    media1.set(u'id',u'video')
+    video = lxml.etree.SubElement(media1, 'video')
+    video.set(u'src',unicode(content.stream_src))
+    video.set(u'id',unicode(content.iri_id))
+    video.set(u'dur',unicode(content.duration))
+    video.set(u'begin',u'0')
 
-    
-    writer.endElement(u"iri")
-    writer.endDocument()
-    
+    media2 = lxml.etree.SubElement(medias, 'media')
+    media2.set(u'id',u'tool')
+    tool = lxml.etree.SubElement(media2, 'tool')
+
+    display = lxml.etree.SubElement(body, 'display')
+
+    doc.write(file, pretty_print=True)
+
+
 def update_iri(filepath, content, username):
     
     # open xml