web/ldt/ldt_utils/utils.py
changeset 9 22ab430e9b64
parent 1 3a30d255c235
equal deleted inserted replaced
8:5bb249eefdd1 9:22ab430e9b64
     2 from ldt.ldt_utils import STORE
     2 from ldt.ldt_utils import STORE
     3 from ldt.ldt_utils import ANALYZER
     3 from ldt.ldt_utils import ANALYZER
     4 import uuid
     4 import uuid
     5 import django.core.urlresolvers
     5 import django.core.urlresolvers
     6 from django.conf import settings
     6 from django.conf import settings
     7 from ldt.ldt_utils.models import *
       
     8 import urllib
     7 import urllib
     9 import datetime
     8 import datetime
    10 import lxml.etree
     9 import lxml.etree
    11 import base64
       
    12 
    10 
    13 __BOOLEAN_DICT = {
    11 __BOOLEAN_DICT = {
    14     'false':False,
    12     'false':False,
    15     'true':True,
    13     'true':True,
    16     '0':False,
    14     '0':False,
    25     if bool is True or bool is False:
    23     if bool is True or bool is False:
    26         return bool
    24         return bool
    27     key = str(bool).lower()
    25     key = str(bool).lower()
    28     return __BOOLEAN_DICT.get(key, False)
    26     return __BOOLEAN_DICT.get(key, False)
    29 
    27 
    30 
       
    31 def generate_uuid():
    28 def generate_uuid():
    32     return unicode(uuid.uuid1())
    29     return unicode(uuid.uuid1())
    33 
    30 
    34 
    31 class LdtSearch(object):
    35 def normalize_tags(list):
    32 
    36     nlist=[]
    33     def query(self, field, query):
    37     for tag in list:
    34         indexSearcher = lucene.IndexSearcher(STORE)
    38         tag = tag.lower()
    35         queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30))
    39         nlist.append(tag)
    36         queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
    40     taglist = dict().fromkeys(nlist).keys()    
    37         queryObj = queryParser.parse(query)
    41     
    38         hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER)
    42     return taglist
    39     
    43 
    40         res = []
    44 
    41         for hit in hits.scoreDocs:
    45 def create_empty_annotation():
    42             doc = indexSearcher.doc(hit.doc)
       
    43             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")})
       
    44         indexSearcher.close()
       
    45         return res
       
    46 
       
    47     def queryAll(self, query):        
       
    48         return self.query("all", query)
       
    49 
       
    50 class LdtUtils(object):
       
    51     
       
    52     def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None):
       
    53 
       
    54         iri = lxml.etree.Element(u'iri')
       
    55         doc = lxml.etree.ElementTree(iri)
       
    56     
       
    57         project = lxml.etree.SubElement(iri, u'project')
       
    58         project.set(u"id",unicode(str(uuid.uuid1())))
       
    59         project.set(u"title",unicode(title))
       
    60         project.set(u"user",author)
       
    61         project.set(u"abstract",u"")
       
    62     
       
    63         medias = lxml.etree.SubElement(iri, u"medias")
       
    64         for content in contentList:
       
    65             videopath = unicode(settings.STREAM_URL)
       
    66             if content.videopath :
       
    67                 videopath = unicode(content.videopath)
       
    68             media = lxml.etree.SubElement(medias, "media")
       
    69             media.set(u"id",content.iri_id)
       
    70             media.set(u"src",content.iri_url(web_url))
       
    71             media.set(u"video",videopath)
       
    72             media.set(u"pict",u"")
       
    73             media.set(u"extra",u"")
       
    74     
       
    75             if contributions is None:
       
    76                 contributions = []
       
    77             annotations_nodes = {}
       
    78             for contrib in contributions:
       
    79                 ldtdoc = lxml.etree.fromstring(contrib.ldtproject.ldt.encode("utf-8"))
       
    80                 res = ldtdoc.xpath("/iri/annotations/content")
       
    81     
       
    82                 for content in res:
       
    83                     contentid = content.get("id")
       
    84                     if annotations_nodes.has_key(contentid):
       
    85                         contentnode = annotations_nodes[contentid]
       
    86                     else:
       
    87                         contentnode = {"id":contentid, "ensembles":[]}
       
    88                         annotations_nodes[contentid]=contentnode
       
    89                     for ens in content.childNodes:
       
    90                         if ens.tag.endswith("ensemble"):
       
    91                             contentnode["ensembles"].append(ens.tag)
       
    92     
       
    93     
       
    94             if len(annotations_nodes) > 0:
       
    95                 annotations = lxml.etree.SubElement(iri, "annotations")
       
    96                 for content in contentList:
       
    97                     if content.content_base.iri_id in annotations_nodes:
       
    98                         contentnode = annotations_nodes[content.content_base.iri_id]
       
    99                         if contentnode is not None:
       
   100                             if len(contentnode["ensembles"])>0:
       
   101                                 content = lxml.etree.SubElement(annotation, "content")
       
   102                                 content.set("id",contentnode["id"])
       
   103                                 content.text = u""
       
   104                             else:
       
   105                                 content = lxml.etree.SubElement(annotation, "content")
       
   106                                 content.set("id",contentnode["id"])
       
   107     
       
   108             else:
       
   109                 annotations = lxml.etree.SubElement(iri, "annotations")
       
   110     
       
   111     
       
   112         displays = lxml.etree.SubElement(iri, "displays")
       
   113         if len(contentList) > 0:
       
   114             display = lxml.etree.SubElement(displays, "display")
       
   115             display.set(u"id",u"0")
       
   116             display.set(u"title",u"generated")
       
   117             display.set(u"idsel",contentList[0].iri_id)
       
   118             display.set(u"tc",u"0")
       
   119             for content in contentList:
       
   120                 contentd = lxml.etree.SubElement(display,"content")
       
   121                 contentd.set(u"id",content.iri_id)
       
   122                 filepath = urllib.urlopen(content.iri_url())
       
   123             
       
   124                 udoc = lxml.etree.parse(filepath)
       
   125                 res = udoc.xpath("/iri/body/ensembles/ensemble/decoupage")
       
   126                 for decoupagenode in res:
       
   127                     decoupage_id = decoupagenode.get(u"id")
       
   128                     ensemble_id = decoupagenode.getparent().get(u"id")
       
   129                     decoupage_id = decoupagenode.get(u"id")
       
   130                     ensemble_id = decoupagenode.getparent().get(u"id")
       
   131                     decoupage = lxml.etree.SubElement(contentd,"decoupage")
       
   132                     decoupage.set(u"id",decoupage_id)
       
   133                     decoupage.set(u"idens",ensemble_id)
       
   134             if startSegment is not None:
       
   135                 activeSegment = lxml.etree.SubElement(display,"activeSegment")
       
   136                 idas = lxml.etree.SubElement(activeSegment,"id")
       
   137                 idas.set(u"idctt",startSegment["idcontent"])
       
   138                 idas.set(u"idens" ,startSegment["idgroup"])
       
   139                 idas.set(u"idcut",startSegment["idcutting"])
       
   140                 idas.set(u"idseg",startSegment["idsegment"])
       
   141     
       
   142         edits = lxml.etree.SubElement(iri, "edits")
       
   143         
       
   144         doc.write(file, pretty_print=True)
       
   145 
       
   146 
       
   147     def generateInit(self, url, method, search=None):
       
   148                 
       
   149         iri = lxml.etree.Element('iri')
       
   150         impl = lxml.etree.ElementTree(iri)
       
   151  
       
   152         elementFiles = lxml.etree.SubElement(iri,'files')    
       
   153         elementInit = lxml.etree.SubElement(elementFiles, 'init')
       
   154         elementfile = lxml.etree.SubElement(elementInit, 'file')
       
   155             
       
   156         elementfile.set('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url))
       
   157         elementfile.set('display', '1')
       
   158         if(search):
       
   159             elementfile.set("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url))   
       
   160 
       
   161     
       
   162         # /*chemin video : tant que le serveur de media n'est pas up, */
       
   163         elementfile.set('video', settings.STREAM_URL)
       
   164         elementfile.set('pict', "")
       
   165         elementfile.set('extra', "")    
       
   166 
       
   167         elementRecent = lxml.etree.SubElement(elementFiles, 'recent')
       
   168         elementLibrary = lxml.etree.SubElement(elementFiles, 'library')
       
   169     
       
   170         username = ''
       
   171         id = ''
       
   172 
       
   173         elementUser = lxml.etree.SubElement(iri, 'user')
       
   174         elementUser.set('name', username)
       
   175         elementUser.set('id', id)
       
   176         
       
   177         return iri 
       
   178 
       
   179 
       
   180 
       
   181 def create_ldt(project, user):
       
   182     """create xml"""
       
   183 
       
   184     
       
   185     contentList = project.contents.all()
       
   186     
       
   187     # create a dom
    46     iri = lxml.etree.Element('iri')
   188     iri = lxml.etree.Element('iri')
    47     doc = lxml.etree.ElementTree(iri)
   189     doc = lxml.etree.ElementTree(iri)
    48     
   190     
    49     textannotation = lxml.etree.SubElement(iri, 'text-annotation')
   191     #node project
    50     id = lxml.etree.SubElement(textannotation,'id')
   192     elementProject = lxml.etree.SubElement(iri, 'project')
    51     uri = lxml.etree.SubElement(textannotation,'uri')
   193     
    52     tags = lxml.etree.SubElement(textannotation,'tags')
   194     elementProject.set('abstract', "")
    53     
   195     elementProject.set('title', project.title)
    54     content = lxml.etree.SubElement(textannotation,'content')
   196     elementProject.set('user', user.username)
    55     color = lxml.etree.SubElement(content,'color')
   197     elementProject.set('id', project.ldt_id)
    56     description = lxml.etree.SubElement(content,'description')
   198 
    57     title = lxml.etree.SubElement(content,'title')
   199     #node medias
    58     text = lxml.etree.SubElement(content,'text')
   200     elementMedias = lxml.etree.SubElement(iri, 'medias')
    59     
   201     
    60     meta = lxml.etree.SubElement(textannotation,'meta')
   202     idsel = None      
    61     contributor = lxml.etree.SubElement(meta, "contributor")
   203     for content in contentList:
    62     creator = lxml.etree.SubElement(meta, "creator")
   204         if not idsel:
    63     creationdate = lxml.etree.SubElement(meta, "created")
   205             idsel = content.iri_id
    64     updatedate = lxml.etree.SubElement(meta, "modified")
   206         elementMedia = lxml.etree.SubElement(elementMedias, 'media')
    65 
   207         elementMedia.set('id', content.iri_id)
    66     return doc
   208         elementMedia.set('src', content.iri_url())
    67 
   209 
       
   210         if content.videopath and content.videopath !="":
       
   211             elementMedia.set('video', content.videopath)
       
   212         else:
       
   213             elementMedia.set('video', settings.STREAM_URL)
       
   214         elementMedia.set('pict', "")
       
   215         elementMedia.set('extra', "")
       
   216 
       
   217     if not idsel:
       
   218         idsel = ""
       
   219 
       
   220     #node annotations
       
   221     elementAnnotations = lxml.etree.SubElement(iri, 'annotations')
       
   222     
       
   223     #node displays
       
   224     elementDisplays = lxml.etree.SubElement(iri, 'displays')
       
   225     elementDisplay = lxml.etree.SubElement(elementDisplays, 'display')
       
   226     elementDisplay.set('id', '0')
       
   227     elementDisplay.set('title', 'Init view')
       
   228     elementDisplay.set('idsel', idsel)
       
   229     elementDisplay.set('tc', '0')
       
   230     elementDisplay.set('zoom', '0')
       
   231     elementDisplay.set('scroll', '0')
       
   232     elementDisplay.set('infoBAB', '')
       
   233 
       
   234     
       
   235     #node content
       
   236     for content in contentList:
       
   237         elementContent = lxml.etree.SubElement(elementDisplay, 'content')
       
   238         elementContent.set('id', content.iri_id)
       
   239 
       
   240         if not 'http' in content.iriurl:
       
   241         #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri"
       
   242             url = content.iri_url()
       
   243         else:
       
   244             url =content.iriurl
       
   245         file = urllib.urlopen(url)
       
   246         doc = lxml.etree.parse(file)
       
   247         res = doc.xpath("/iri/body/ensembles/ensemble/decoupage")        
       
   248 
       
   249         #node decoupage
       
   250         for decoupagenode in res:
       
   251             decoupage_id = decoupagenode.get(u"id")
       
   252             parent= decoupagenode.getparent()
       
   253             ensemble_id = parent.get(u"id")
       
   254             elementDecoupage = lxml.etree.SubElement(elementContent, 'decoupage')
       
   255             elementDecoupage.set('idens', ensemble_id)
       
   256             elementDecoupage.set('id', decoupage_id)
       
   257     
       
   258     #node edits
       
   259     elementEdits = lxml.etree.SubElement(iri, 'edits')
       
   260     
       
   261     #write dom in Project.ldt 
       
   262     project.ldt = lxml.etree.tostring(iri, pretty_print=True)
       
   263     
       
   264     #save Project
       
   265     project.save()
       
   266     return project        
       
   267 
       
   268 
       
   269 def copy_ldt(project, new_project, user):
       
   270     new_project.ldt_id = str(uuid.uuid1())
       
   271     new_project.created_by=user.username
       
   272     new_project.changed_by=user.username
       
   273     new_project.state = 1
       
   274     
       
   275     contentList=project.contents.all()
       
   276     
       
   277     """create xml"""
       
   278     
       
   279     ldt = lxml.etree.fromstring(project.ldt.encode("utf-8"))
       
   280     res = ldt.xpath("/iri/project")
       
   281     for elementProject in res:
       
   282         elementProject.set('abstract', "")
       
   283         elementProject.set('title', new_project.title)
       
   284         elementProject.set('user', user.username)
       
   285         elementProject.set('id', new_project.ldt_id)
       
   286         
       
   287     new_project.ldt = lxml.etree.tostring(ldt, pretty_print=True)
       
   288 
       
   289     #save Project
       
   290     new_project.save()
       
   291     return new_project
       
   292 
       
   293 def create_empty_iri(file, content, username):
       
   294     
       
   295     iri = lxml.etree.Element('iri')
       
   296     doc = lxml.etree.ElementTree(iri)
       
   297 
       
   298     head = lxml.etree.SubElement(iri, 'head')
       
   299     meta1 = lxml.etree.SubElement(head, 'meta')
       
   300     meta1.set(u'name', u'id')
       
   301     meta1.set(u'content', unicode(content.iri_id))
       
   302     meta2 = lxml.etree.SubElement(head, 'meta')
       
   303     meta2.set(u'name',u'title')
       
   304     meta2.set(u'content', unicode(content.title))
       
   305     meta3 = lxml.etree.SubElement(head, 'meta')
       
   306     meta3.set(u'name',u'abstract')
       
   307     meta3.set(u'content', unicode(content.description))
       
   308     meta4 = lxml.etree.SubElement(head, 'meta')
       
   309     meta4.set(u'name',u'author')
       
   310     meta4.set(u'content', unicode(username))
       
   311     meta5 = lxml.etree.SubElement(head, 'meta')
       
   312     meta5.set(u'name',u'contributor')
       
   313     meta5.set(u'content', unicode(username))
       
   314     meta6 = lxml.etree.SubElement(head, 'meta')
       
   315     meta6.set(u'name',u'date')
       
   316     meta6.set(u'content', unicode(datetime.date.today().isoformat()))
       
   317     meta7 = lxml.etree.SubElement(head, 'meta')
       
   318     meta7.set(u'name',u'copyright')
       
   319     meta7.set(u'content', u'IRI')
       
   320     meta8 = lxml.etree.SubElement(head, 'meta')
       
   321     meta8.set(u'name', u'type')
       
   322     meta8.set(u'content', u'video')
       
   323 
       
   324     body = lxml.etree.SubElement(iri, 'body')
       
   325     ensembles = lxml.etree.SubElement(body, 'ensembles')
       
   326     links = lxml.etree.SubElement(body, 'links')
       
   327 
       
   328     medias = lxml.etree.SubElement(body, 'medias')
       
   329 
       
   330     media1 = lxml.etree.SubElement(medias, 'media')
       
   331     media1.set(u'id',u'video')
       
   332     video = lxml.etree.SubElement(media1, 'video')
       
   333     video.set(u'src',unicode(content.stream_src))
       
   334     video.set(u'id',unicode(content.iri_id))
       
   335     video.set(u'dur',unicode(content.duration))
       
   336     video.set(u'begin',u'0')
       
   337 
       
   338     media2 = lxml.etree.SubElement(medias, 'media')
       
   339     media2.set(u'id',u'tool')
       
   340     tool = lxml.etree.SubElement(media2, 'tool')
       
   341 
       
   342     display = lxml.etree.SubElement(body, 'display')
       
   343 
       
   344     doc.write(file, pretty_print=True)
       
   345 
       
   346 
       
   347 def update_iri(filepath, content, username):
       
   348     
       
   349     # open xml
       
   350     doc = lxml.etree.parse(filepath)
       
   351     
       
   352     res = doc.xpath("/iri/head/meta")
       
   353     # update meta
       
   354     
       
   355     for meta_node in res:
       
   356         meta_name = meta_node.get("name")
       
   357         content_attr = None
       
   358         if meta_name == u'id':
       
   359             content_attr = unicode(content.iri_id)
       
   360         elif meta_name == u'title':
       
   361             content_attr = unicode(content.title)
       
   362         elif meta_name == u'abstract':
       
   363             content_attr = unicode(content.description)
       
   364         elif meta_name == u'contributor':
       
   365             content_attr = unicode(username)
       
   366         elif meta_name == u"date":
       
   367             content_attr = unicode(datetime.date.today().isoformat())
       
   368         if content_attr is not None:
       
   369             meta_node.set(u"content", content_attr)
       
   370 
       
   371     res = doc.xpath("/iri/body/medias/media[@id='video']/video")
       
   372     
       
   373     if len(res) > 0:
       
   374         video_node = res[0]
       
   375         video_node.set(u'src', unicode(content.stream_src))
       
   376         video_node.set(u'dur', unicode(content.duration))
       
   377         video_node.set(u'id', unicode(content.iri_id))
       
   378     # update video
       
   379     
       
   380     f = open(filepath, "w")
       
   381     try:
       
   382         doc.write(f, encoding="UTF-8", pretty_print=True, xml_declaration=True)
       
   383     finally:
       
   384         f.close()