--- /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