web/ldt/ldt_utils/utils.py
changeset 5 ae8593287883
child 7 881514514df1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/ldt_utils/utils.py	Tue Jun 08 15:44:35 2010 +0200
@@ -0,0 +1,267 @@
+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 os
+import os.path
+
+class LdtSearch(object):
+
+    def query(self, field, query):
+        indexSearcher = lucene.IndexSearcher(STORE)
+        queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30))
+        queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
+        queryObj = queryParser.parse(query)
+        hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER)
+	
+        res = []
+        for hit in hits.scoreDocs:
+            doc = indexSearcher.doc(hit.doc)
+            res.append({"iri_id":doc.get("iri_id"),"ensemble_id":doc.get("ensemble_id"),"decoupage_id":doc.get("decoupage_id"), "element_id":doc.get("element_id")})
+        indexSearcher.close()
+        return res
+
+    def queryAll(self, query):		
+        return self.query("all", query)
+
+class LdtUtils(object):
+    
+    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")
+
+        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)
+            for content in res:
+                contentid = content.getAttribute("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 len(annotations_nodes) > 0:
+            writer.startElement(u"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")
+                        else:
+                            writer.simpleElement(u"content", attributes={"id":contentnode["id"]})
+            writer.endElement(u"annotations")
+        else:
+            writer.simpleElement(u"annotations")
+
+
+        writer.startElement(u"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"})
+            for content in contentList:
+                writer.startElement(u"content", attributes={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)
+                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")
+            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")
+
+            writer.endElement(u"display")
+        writer.endElement(u"displays")
+        writer.simpleElement(u"edits")
+        writer.endElement(u"iri")
+
+    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')
+            
+        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))
+    
+    
+        # /*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);
+    
+        username = ''
+        id = ''
+        elementUser = doc.createElement('user')
+        elementUser.setAttribute('name', username)
+        elementUser.setAttribute('id', id)
+        doc.documentElement.appendChild(elementUser)
+        
+        return doc
+
+def create_ldt(project, user):
+    
+    contentList=project.contents.all()
+    
+    """create xml"""
+    
+    # create a dom
+    impl = xml.dom.getDOMImplementation()
+    dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
+    #node project
+    elementProject = dom.createElement('project')
+    dom.documentElement.appendChild(elementProject)
+    
+    
+    elementProject.setAttribute('abstract', "")
+    elementProject.setAttribute('title', project.title)
+    elementProject.setAttribute('user', user.username)
+    elementProject.setAttribute('id', project.ldt_id)
+    #node medias
+    elementMedias = dom.createElement('medias')
+    dom.documentElement.appendChild(elementMedias)
+    
+    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())
+        if content.videopath and content.videopath !="":
+            elementMedia.setAttribute('video', content.videopath)
+        else:
+            elementMedia.setAttribute('video', settings.STREAM_URL)
+        elementMedia.setAttribute('pict', "")
+        elementMedia.setAttribute('extra', "")
+        elementMedias.appendChild(elementMedia)
+    if not idsel:
+        idsel = ""
+
+    #node annotations
+    elementAnnotations = dom.createElement('annotations')
+    dom.documentElement.appendChild(elementAnnotations)
+    #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', '')
+    #node content
+    for content in contentList:
+        elementContent = dom.createElement('content')
+        elementContent.setAttribute('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
+        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)   
+    
+    elementDisplays.appendChild(elementDisplay)
+    dom.documentElement.appendChild(elementDisplays)
+    
+    elementEdits = dom.createElement('edits')
+    dom.documentElement.appendChild(elementEdits)
+    # write dom in Project.ldt 
+    project.ldt = dom.documentElement.toprettyxml()
+    #save Project
+    project.save()
+    return project        
+
+
+def copy_ldt(project, new_project, user):
+    new_project.ldt_id = str(uuid.uuid1())
+    new_project.created_by=user.username
+    new_project.changed_by=user.username
+    new_project.state = 1
+    
+    contentList=project.contents.all()
+    
+    """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)
+    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)
+        
+    new_project.ldt = dom.documentElement.toprettyxml()
+    #save Project
+    new_project.save()
+    return new_project