--- a/web/ldt/ldt_utils/utils.py Tue Nov 16 12:20:59 2010 +0100
+++ b/web/ldt/ldt_utils/utils.py Tue Nov 16 14:15:07 2010 +0100
@@ -4,11 +4,9 @@
import uuid
import django.core.urlresolvers
from django.conf import settings
-from ldt.ldt_utils.models import *
import urllib
import datetime
import lxml.etree
-import base64
__BOOLEAN_DICT = {
'false':False,
@@ -27,41 +25,360 @@
key = str(bool).lower()
return __BOOLEAN_DICT.get(key, False)
-
def generate_uuid():
return unicode(uuid.uuid1())
+class LdtSearch(object):
-def normalize_tags(list):
- nlist=[]
- for tag in list:
- tag = tag.lower()
- nlist.append(tag)
- taglist = dict().fromkeys(nlist).keys()
+ 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")
- return taglist
+ 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 create_empty_annotation():
+ 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)
- textannotation = lxml.etree.SubElement(iri, 'text-annotation')
- id = lxml.etree.SubElement(textannotation,'id')
- uri = lxml.etree.SubElement(textannotation,'uri')
- tags = lxml.etree.SubElement(textannotation,'tags')
+ #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"""
- content = lxml.etree.SubElement(textannotation,'content')
- color = lxml.etree.SubElement(content,'color')
- description = lxml.etree.SubElement(content,'description')
- title = lxml.etree.SubElement(content,'title')
- text = lxml.etree.SubElement(content,'text')
+ 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):
- meta = lxml.etree.SubElement(textannotation,'meta')
- contributor = lxml.etree.SubElement(meta, "contributor")
- creator = lxml.etree.SubElement(meta, "creator")
- creationdate = lxml.etree.SubElement(meta, "created")
- updatedate = lxml.etree.SubElement(meta, "modified")
+ 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')
- return doc
+ 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()