diff -r 85b071fb75b2 -r eb9188f2ee4f web/ldt/ldt_utils/utils.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/ldt/ldt_utils/utils.py Fri Oct 22 18:14:30 2010 +0200 @@ -0,0 +1,384 @@ +import lucene +from ldt.ldt_utils import STORE +from ldt.ldt_utils import ANALYZER +import uuid +import django.core.urlresolvers +from django.conf import settings +import urllib +import datetime +import lxml.etree + +__BOOLEAN_DICT = { + 'false':False, + 'true':True, + '0':False, + '1':True, + 't': True, + 'f':False +} + +def boolean_convert(bool): + if bool is None: + return False + if bool is True or bool is False: + return bool + key = str(bool).lower() + return __BOOLEAN_DICT.get(key, False) + +def generate_uuid(): + return unicode(uuid.uuid1()) + +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): + + 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: + ldtdoc = lxml.etree.fromstring(contrib.ldtproject.ldt.encode("utf-8")) + res = ldtdoc.xpath("/iri/annotations/content") + + for content in res: + 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.tag.endswith("ensemble"): + contentnode["ensembles"].append(ens.tag) + + + if len(annotations_nodes) > 0: + 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: + content = lxml.etree.SubElement(annotation, "content") + content.set("id",contentnode["id"]) + content.text = u"" + else: + content = lxml.etree.SubElement(annotation, "content") + content.set("id",contentnode["id"]) + + else: + annotations = lxml.etree.SubElement(iri, "annotations") + + + displays = lxml.etree.SubElement(iri, "displays") + if len(contentList) > 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: + contentd = lxml.etree.SubElement(display,"content") + contentd.set(u"id",content.iri_id) + filepath = urllib.urlopen(content.iri_url()) + + udoc = lxml.etree.parse(filepath) + res = udoc.xpath("/iri/body/ensembles/ensemble/decoupage") + for decoupagenode in res: + decoupage_id = decoupagenode.get(u"id") + ensemble_id = decoupagenode.getparent().get(u"id") + decoupage_id = decoupagenode.get(u"id") + ensemble_id = decoupagenode.getparent().get(u"id") + decoupage = lxml.etree.SubElement(contentd,"decoupage") + decoupage.set(u"id",decoupage_id) + decoupage.set(u"idens",ensemble_id) + if startSegment is not None: + 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"]) + + edits = lxml.etree.SubElement(iri, "edits") + + doc.write(file, pretty_print=True) + + + def generateInit(self, url, method, search=None): + + 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.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.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 = lxml.etree.SubElement(iri, 'user') + elementUser.set('name', username) + elementUser.set('id', id) + + return iri + + + +def create_ldt(project, user): + """create xml""" + + + contentList = project.contents.all() + + # create a dom + iri = lxml.etree.Element('iri') + doc = lxml.etree.ElementTree(iri) + + #node project + elementProject = lxml.etree.SubElement(iri, 'project') + + elementProject.set('abstract', "") + elementProject.set('title', project.title) + elementProject.set('user', user.username) + elementProject.set('id', project.ldt_id) + + #node medias + elementMedias = lxml.etree.SubElement(iri, 'medias') + + idsel = None + for content in contentList: + if not idsel: + idsel = content.iri_id + 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.set('video', content.videopath) + else: + elementMedia.set('video', settings.STREAM_URL) + elementMedia.set('pict', "") + elementMedia.set('extra', "") + + if not idsel: + idsel = "" + + #node annotations + elementAnnotations = lxml.etree.SubElement(iri, 'annotations') + + #node displays + 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 = 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 = lxml.etree.parse(file) + res = doc.xpath("/iri/body/ensembles/ensemble/decoupage") + + #node decoupage + for decoupagenode in res: + decoupage_id = decoupagenode.get(u"id") + parent= decoupagenode.getparent() + ensemble_id = parent.get(u"id") + elementDecoupage = lxml.etree.SubElement(elementContent, 'decoupage') + elementDecoupage.set('idens', ensemble_id) + elementDecoupage.set('id', decoupage_id) + + #node edits + elementEdits = lxml.etree.SubElement(iri, 'edits') + + #write dom in Project.ldt + project.ldt = lxml.etree.tostring(iri, pretty_print=True) + + #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""" + + ldt = lxml.etree.fromstring(project.ldt.encode("utf-8")) + res = ldt.xpath("/iri/project") + for elementProject in res: + elementProject.set('abstract', "") + elementProject.set('title', new_project.title) + elementProject.set('user', user.username) + elementProject.set('id', new_project.ldt_id) + + 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): + + iri = lxml.etree.Element('iri') + doc = lxml.etree.ElementTree(iri) + + 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') + + body = lxml.etree.SubElement(iri, 'body') + ensembles = lxml.etree.SubElement(body, 'ensembles') + links = lxml.etree.SubElement(body, 'links') + + medias = lxml.etree.SubElement(body, 'medias') + + 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') + + 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 + doc = lxml.etree.parse(filepath) + + res = doc.xpath("/iri/head/meta") + # update meta + + for meta_node in res: + meta_name = meta_node.get("name") + content_attr = None + if meta_name == u'id': + content_attr = unicode(content.iri_id) + elif meta_name == u'title': + content_attr = unicode(content.title) + elif meta_name == u'abstract': + content_attr = unicode(content.description) + elif meta_name == u'contributor': + content_attr = unicode(username) + elif meta_name == u"date": + content_attr = unicode(datetime.date.today().isoformat()) + if content_attr is not None: + meta_node.set(u"content", content_attr) + + res = doc.xpath("/iri/body/medias/media[@id='video']/video") + + if len(res) > 0: + video_node = res[0] + video_node.set(u'src', unicode(content.stream_src)) + video_node.set(u'dur', unicode(content.duration)) + video_node.set(u'id', unicode(content.iri_id)) + # update video + + f = open(filepath, "w") + try: + doc.write(f, encoding="UTF-8", pretty_print=True, xml_declaration=True) + finally: + f.close()