diff -r 674a65969a14 -r 1e7732f40eee web/ldt/ldt_utils/utils.py --- 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