web/ldt/ldt_utils/utils.py
changeset 0 cc4a51750724
child 5 d42bb045f7d1
equal deleted inserted replaced
-1:000000000000 0:cc4a51750724
       
     1 import lucene
       
     2 from ldt.ldt_utils import STORE
       
     3 from ldt.ldt_utils import ANALYZER
       
     4 from Ft.Xml import MarkupWriter
       
     5 import uuid
       
     6 import django.core.urlresolvers
       
     7 from django.conf import settings
       
     8 import urllib
       
     9 import xml.dom
       
    10 import xml.dom.minidom
       
    11 import xml.dom.ext
       
    12 import xml.xpath
       
    13 import os
       
    14 import os.path
       
    15 import datetime
       
    16 
       
    17 class LdtSearch(object):
       
    18 
       
    19     def query(self, field, query):
       
    20         indexSearcher = lucene.IndexSearcher(STORE)
       
    21         queryParser = lucene.QueryParser(lucene.Version.LUCENE_30, field, lucene.FrenchAnalyzer(lucene.Version.LUCENE_30))
       
    22         queryParser.setDefaultOperator(lucene.QueryParser.Operator.AND)
       
    23         queryObj = queryParser.parse(query)
       
    24         hits = indexSearcher.search(queryObj, settings.LDT_MAX_SEARCH_NUMBER)
       
    25 	
       
    26         res = []
       
    27         for hit in hits.scoreDocs:
       
    28             doc = indexSearcher.doc(hit.doc)
       
    29             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")})
       
    30         indexSearcher.close()
       
    31         return res
       
    32 
       
    33     def queryAll(self, query):		
       
    34         return self.query("all", query)
       
    35 
       
    36 class LdtUtils(object):
       
    37     
       
    38     def generateLdt(self, contentList, file, title = u"", author=u"IRI Web", web_url=u"", media_url="", startSegment = None, contributions=None):
       
    39 
       
    40         writer = MarkupWriter(file, indent = u"yes")
       
    41         writer.startDocument()
       
    42         writer.startElement(u"iri")
       
    43         writer.simpleElement(u"project", attributes={u"id":unicode(str(uuid.uuid1())), u"title":unicode(title) , u"user":author, u"abstract":u""})
       
    44         writer.startElement(u"medias")
       
    45         for content in contentList:
       
    46             videopath = unicode(settings.STREAM_URL)
       
    47             if content.videopath :
       
    48                 videopath = unicode(content.videopath)
       
    49             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""})
       
    50         writer.endElement(u"medias")
       
    51 
       
    52         if contributions is None:
       
    53             contributions = []
       
    54         annotations_nodes = {}
       
    55         for contrib in contributions:
       
    56             doc = xml.dom.minidom.parseString(contrib.ldtproject.ldt.encode("utf-8"))
       
    57             con = xml.xpath.Context.Context(doc, 1, 1, None)
       
    58             res = xml.xpath.Evaluate("/iri/annotations/content", context=con)
       
    59             for content in res:
       
    60                 contentid = content.getAttribute("id")
       
    61                 if annotations_nodes.has_key(contentid):
       
    62                     contentnode = annotations_nodes[contentid]
       
    63                 else:
       
    64                     contentnode = {"id":contentid, "ensembles":[]}
       
    65                     annotations_nodes[contentid]=contentnode
       
    66                 for ens in content.childNodes:
       
    67                     if ens.nodeType == xml.dom.Node.ELEMENT_NODE and ens.tagName.endswith("ensemble"):
       
    68                         contentnode["ensembles"].append(ens.toprettyxml())
       
    69 
       
    70         if len(annotations_nodes) > 0:
       
    71             writer.startElement(u"annotations")
       
    72             for content in contentList:
       
    73                 if content.content_base.iri_id in annotations_nodes:
       
    74                     contentnode = annotations_nodes[content.content_base.iri_id]
       
    75                     if contentnode is not None:
       
    76                         if len(contentnode["ensembles"])>0:
       
    77                             writer.startElement(u"content", attributes={"id":contentnode["id"]})
       
    78                             writer.text(u"")
       
    79                             for ens in contentnode["ensembles"]:
       
    80                                 writer.xmlFragment(ens.encode("utf-8"))
       
    81                             writer.endElement(u"content")
       
    82                         else:
       
    83                             writer.simpleElement(u"content", attributes={"id":contentnode["id"]})
       
    84             writer.endElement(u"annotations")
       
    85         else:
       
    86             writer.simpleElement(u"annotations")
       
    87 
       
    88 
       
    89         writer.startElement(u"displays")
       
    90         if len(contentList) > 0:
       
    91             writer.startElement(u"display", attributes={u"id":u"0",u"title":u"generated",u"idsel":contentList[0].iri_id,u"tc":u"0"})
       
    92             for content in contentList:
       
    93                 writer.startElement(u"content", attributes={u"id":content.iri_id})
       
    94                 filepath = urllib.urlopen(content.iri_url())
       
    95                 doc = xml.dom.minidom.parse(filepath)
       
    96                 con = xml.xpath.Context.Context(doc, 1, 1, None)
       
    97                 res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
       
    98                 for decoupagenode in res:
       
    99                     decoupage_id = decoupagenode.getAttribute(u"id")
       
   100                     ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
       
   101                     writer.simpleElement(u"decoupage", attributes={u"id":decoupage_id,u"idens":ensemble_id})
       
   102                 writer.endElement(u"content")
       
   103             if startSegment is not None:
       
   104                 writer.startElement(u"activeSegment")
       
   105                 writer.simpleElement(u"id",attributes={u"idctt" : startSegment["idcontent"],u"idens" : startSegment["idgroup"], u"idcut" : startSegment["idcutting"], u"idseg" : startSegment["idsegment"]})
       
   106                 writer.endElement(u"activeSegment")
       
   107 
       
   108             writer.endElement(u"display")
       
   109         writer.endElement(u"displays")
       
   110         writer.simpleElement(u"edits")
       
   111         writer.endElement(u"iri")
       
   112 
       
   113     def generateInit(self, url, method, search=None):
       
   114         
       
   115         import xml.dom
       
   116         import xml.dom.ext
       
   117     
       
   118         impl = xml.dom.getDOMImplementation()
       
   119         doc = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
       
   120     
       
   121         elementFiles = doc.createElement('files')
       
   122         doc.documentElement.appendChild(elementFiles)
       
   123     
       
   124         elementInit = doc.createElement('init')
       
   125         elementFiles.appendChild(elementInit)
       
   126     
       
   127         elementfile = doc.createElement('file')
       
   128             
       
   129         elementfile.setAttribute('src',settings.WEB_URL + django.core.urlresolvers.reverse(method, args=url))
       
   130         elementfile.setAttribute('display', '1')
       
   131         if(search):
       
   132             elementfile.setAttribute("segsel",settings.WEB_URL + django.core.urlresolvers.reverse(search, args=url))
       
   133     
       
   134     
       
   135         # /*chemin video : tant que le serveur de media n'est pas up, */
       
   136         elementfile.setAttribute('video', settings.STREAM_URL)
       
   137         elementfile.setAttribute('pict', "")
       
   138         elementfile.setAttribute('extra', "")
       
   139     
       
   140         elementInit.appendChild(elementfile);
       
   141     
       
   142         elementRecent = doc.createElement('recent');
       
   143         elementFiles.appendChild(elementRecent);
       
   144     
       
   145     
       
   146         elementLibrary = doc.createElement('library');
       
   147         elementFiles.appendChild(elementLibrary);
       
   148     
       
   149         username = ''
       
   150         id = ''
       
   151         elementUser = doc.createElement('user')
       
   152         elementUser.setAttribute('name', username)
       
   153         elementUser.setAttribute('id', id)
       
   154         doc.documentElement.appendChild(elementUser)
       
   155         
       
   156         return doc
       
   157 
       
   158 def create_ldt(project, user):
       
   159     
       
   160     contentList=project.contents.all()
       
   161     
       
   162     """create xml"""
       
   163     
       
   164     # create a dom
       
   165     impl = xml.dom.getDOMImplementation()
       
   166     dom = impl.createDocument(xml.dom.EMPTY_NAMESPACE, 'iri', None)
       
   167     #node project
       
   168     elementProject = dom.createElement('project')
       
   169     dom.documentElement.appendChild(elementProject)
       
   170     
       
   171     
       
   172     elementProject.setAttribute('abstract', "")
       
   173     elementProject.setAttribute('title', project.title)
       
   174     elementProject.setAttribute('user', user.username)
       
   175     elementProject.setAttribute('id', project.ldt_id)
       
   176     #node medias
       
   177     elementMedias = dom.createElement('medias')
       
   178     dom.documentElement.appendChild(elementMedias)
       
   179     
       
   180     idsel = None      
       
   181     for content in contentList:
       
   182         if not idsel:
       
   183             idsel = content.iri_id
       
   184         elementMedia = dom.createElement('media')            
       
   185         elementMedia.setAttribute('id', content.iri_id)
       
   186         elementMedia.setAttribute('src', content.iri_url())
       
   187         if content.videopath and content.videopath !="":
       
   188             elementMedia.setAttribute('video', content.videopath)
       
   189         else:
       
   190             elementMedia.setAttribute('video', settings.STREAM_URL)
       
   191         elementMedia.setAttribute('pict', "")
       
   192         elementMedia.setAttribute('extra', "")
       
   193         elementMedias.appendChild(elementMedia)
       
   194     if not idsel:
       
   195         idsel = ""
       
   196 
       
   197     #node annotations
       
   198     elementAnnotations = dom.createElement('annotations')
       
   199     dom.documentElement.appendChild(elementAnnotations)
       
   200     #node displays
       
   201     elementDisplays = dom.createElement('displays')
       
   202     elementDisplay = dom.createElement('display')
       
   203     elementDisplay.setAttribute('id', '0')
       
   204     elementDisplay.setAttribute('title', 'Init view')
       
   205     elementDisplay.setAttribute('idsel', idsel)
       
   206     elementDisplay.setAttribute('tc', '0')
       
   207     elementDisplay.setAttribute('zoom', '0')
       
   208     elementDisplay.setAttribute('scroll', '0')
       
   209     elementDisplay.setAttribute('infoBAB', '')
       
   210     #node content
       
   211     for content in contentList:
       
   212         elementContent = dom.createElement('content')
       
   213         elementContent.setAttribute('id', content.iri_id)
       
   214         if not 'http' in content.iriurl:
       
   215         #eg: "iiiielizabethrosse/ENMI08-III_elizabethrosse.iri"
       
   216             url = content.iri_url()
       
   217         else:
       
   218             url =content.iriurl
       
   219         file = urllib.urlopen(url)
       
   220         doc = xml.dom.minidom.parse(file)
       
   221         con = xml.xpath.Context.Context(doc, 1, 1, None)
       
   222         res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble/decoupage", context=con)
       
   223         #node decoupage
       
   224         for decoupagenode in res:
       
   225             decoupage_id = decoupagenode.getAttribute(u"id")
       
   226             ensemble_id = decoupagenode.parentNode.getAttribute(u"id")
       
   227             elementDecoupage = dom.createElement('decoupage')
       
   228             elementDecoupage.setAttribute('idens', ensemble_id)
       
   229             elementDecoupage.setAttribute('id', decoupage_id)
       
   230             elementContent.appendChild(elementDecoupage)     
       
   231         elementDisplay.appendChild(elementContent)   
       
   232     
       
   233     elementDisplays.appendChild(elementDisplay)
       
   234     dom.documentElement.appendChild(elementDisplays)
       
   235     
       
   236     elementEdits = dom.createElement('edits')
       
   237     dom.documentElement.appendChild(elementEdits)
       
   238     # write dom in Project.ldt 
       
   239     project.ldt = dom.documentElement.toprettyxml()
       
   240     #save Project
       
   241     project.save()
       
   242     return project        
       
   243 
       
   244 
       
   245 def copy_ldt(project, new_project, user):
       
   246     new_project.ldt_id = str(uuid.uuid1())
       
   247     new_project.created_by=user.username
       
   248     new_project.changed_by=user.username
       
   249     new_project.state = 1
       
   250     
       
   251     contentList=project.contents.all()
       
   252     
       
   253     """create xml"""
       
   254     
       
   255     # create a dom
       
   256     dom = xml.dom.minidom.parseString(project.ldt.encode("utf-8"))
       
   257     con = xml.xpath.Context.Context(dom, 1, 1, None)
       
   258     res = xml.xpath.Evaluate("iri/project", context=con)
       
   259     for elementProject in res:
       
   260         elementProject.setAttribute('abstract', "")
       
   261         elementProject.setAttribute('title', new_project.title)
       
   262         elementProject.setAttribute('user', user.username)
       
   263         elementProject.setAttribute('id', new_project.ldt_id)
       
   264         
       
   265     new_project.ldt = dom.documentElement.toprettyxml()
       
   266     #save Project
       
   267     new_project.save()
       
   268     return new_project
       
   269 
       
   270 def create_empty_iri(file, content, username):
       
   271     
       
   272     writer = MarkupWriter(file, indent = u"yes")
       
   273     writer.startDocument()
       
   274     writer.startElement(u"iri")
       
   275     
       
   276     writer.startElement(u"head")
       
   277     
       
   278     writer.simpleElement(u'meta', attributes={u'name':u'id', 'content':unicode(content.iri_id)})
       
   279     writer.simpleElement(u'meta', attributes={u'name':u'title', 'content':unicode(content.title)})
       
   280     writer.simpleElement(u'meta', attributes={u'name':u'author', 'content':unicode(username)})
       
   281     writer.simpleElement(u'meta', attributes={u'name':u'contributor', 'content':unicode(username)})
       
   282     writer.simpleElement(u'meta', attributes={u'name':u'date', 'content':unicode(datetime.date.today().isoformat())})
       
   283     writer.simpleElement(u'meta', attributes={u'name':u'copyright', 'content':u'IRI'})
       
   284     writer.simpleElement(u'meta', attributes={u'name':u'type', 'content':u'video'})    
       
   285     
       
   286     writer.endElement(u"head")
       
   287 
       
   288     writer.startElement(u"body")
       
   289     
       
   290     writer.startElement(u"ensembles")
       
   291     writer.endElement(u"ensembles")
       
   292     
       
   293     writer.simpleElement(u'links')
       
   294     writer.startElement(u"medias")
       
   295 
       
   296     writer.startElement(u"media", attributes={u'id':u'video'})
       
   297     writer.simpleElement(u'video', attributes={u'src':unicode(content.src),u'id':unicode(uuid.uuid1()),u'dur':unicode(content.duration),u'begin':u'0'})
       
   298     writer.endElement(u"media")
       
   299 
       
   300     writer.startElement(u"media", attributes={u'id':u'tool'})
       
   301     writer.simpleElement(u'tool')
       
   302     writer.endElement(u"media")
       
   303 
       
   304     writer.endElement(u"medias")
       
   305     
       
   306     #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""})
       
   307     writer.simpleElement(u'display')
       
   308     
       
   309     writer.endElement(u"body")
       
   310 
       
   311     
       
   312     writer.endElement(u"iri")
       
   313     writer.endDocument()
       
   314