web/ldt/ldt_utils/projectserializer.py
changeset 49 55f91a1f9df8
parent 26 5442e8569ff0
child 85 3b70d84e661a
--- a/web/ldt/ldt_utils/projectserializer.py	Mon Sep 13 10:33:05 2010 +0200
+++ b/web/ldt/ldt_utils/projectserializer.py	Mon Sep 13 12:56:17 2010 +0200
@@ -1,6 +1,4 @@
-import xml.dom
-import Ft.Xml.Domlette
-import xml.xpath
+import lxml.etree
 import uuid
 from datetime import datetime
 from ldt.ldt_utils.models import Content, Project
@@ -25,10 +23,10 @@
     
     def __parse_ensemble(self, ensemble_node, content):
         
-        ensemble_id = ensemble_node.getAttributeNS(None,u"id")
-        ensemble_author = ensemble_node.getAttributeNS(None,u"author")
-        ensemble_title = ensemble_node.getAttributeNS(None,u"title")
-        ensemble_description = ensemble_node.getAttributeNS(None,u"abstract")
+        ensemble_id = ensemble_node.attrib[u"id"]
+        ensemble_author = ensemble_node.attrib[u"author"]
+        ensemble_title = ensemble_node.attrib[u"title"]
+        ensemble_description = ensemble_node.attrib[u"abstract"]
         ensemble_created = datetime.utcnow().isoformat()
         ensemble_modified = ensemble_created 
         
@@ -49,16 +47,16 @@
         }
         
         
-        for decoupage_node in ensemble_node.childNodes:
-            if decoupage_node.nodeType != xml.dom.Node.ELEMENT_NODE or decoupage_node.tagName != "decoupage" :
+        for decoupage_node in ensemble_node:
+            if decoupage_node.tag != "decoupage" :
                 continue
             
-            decoupage_id = decoupage_node.getAttributeNS(None, u"id")
-            decoupage_creator = decoupage_node.getAttributeNS(None,u"author")
+            decoupage_id = decoupage_node.attrib[ u"id"]
+            decoupage_creator = decoupage_node.attrib[u"author"]
             if not decoupage_creator:
                 decoupage_creator = "IRI"
             decoupage_contributor = decoupage_creator
-            date_str = decoupage_node.getAttributeNS(None,u"date")
+            date_str = decoupage_node.get(u"date")
             decoupage_created = None
             if date_str :
                 for date_format in DATE_FORMATS:
@@ -72,12 +70,12 @@
             decoupage_modified = decoupage_created
             
             decoupage_title = ""
-            for txtRes in xml.xpath.Evaluate("title/text()", decoupage_node): 
-                    decoupage_title += txtRes.data
+            for txtRes in decoupage_node.xpath("title/text()", smart_strings=False): 
+                    decoupage_title += txtRes
 
             decoupage_description = ""
-            for txtRes in xml.xpath.Evaluate("abstract/text()", decoupage_node): 
-                    decoupage_description += txtRes.data
+            for txtRes in decoupage_node.xpath("abstract/text()", smart_strings=False): 
+                    decoupage_description += txtRes
             
 
             
@@ -95,53 +93,48 @@
             
             self.annotation_types.append(new_annotation_types)            
                         
-            res = xml.xpath.Evaluate("elements/element", decoupage_node)
+            res = decoupage_node.xpath("elements/element")
             for element_node in res:
                 
-                element_id = element_node.getAttributeNS(None,u"id")
-                element_begin = element_node.getAttributeNS(None,u"begin")
-                element_duration = element_node.getAttributeNS(None,u"dur")
+                element_id = element_node.attrib[u"id"]
+                element_begin = element_node.attrib[u"begin"]
+                element_duration = element_node.attrib[u"dur"]
                 element_media = content.iri_id
-                element_color = element_node.getAttributeNS(None,u"color")
+                element_color = element_node.attrib[u"color"]
                 
                 element_title = ""
-                for txtRes in xml.xpath.Evaluate("title/text()", element_node): 
-                    element_title += txtRes.data 
+                for txtRes in element_node.xpath("title/text()", smart_strings=False): 
+                    element_title += txtRes
         
                 element_description = ""
-                for txtRes in xml.xpath.Evaluate("abstract/text()", element_node): 
-                    element_description += txtRes.data 
+                for txtRes in element_node.xpath("abstract/text()", smart_strings=False): 
+                    element_description += txtRes
                 
                 element_audio_src = ""
                 element_audio_href = ""
-                res = xml.xpath.Evaluate("audio", element_node)
+                res = element_node.xpath("audio")
                 if len(res) > 0:
-                    element_audio_src = res[0].getAttributeNS(None, u"source")
-                    ltext = []
-                    for n in res[0].childNodes:
-                        if n.nodeType in (dom.Node.TEXT_NODE, dom.Node.CDATA_SECTION_NODE):
-                            ltext.append(n.data)
-                    element_audio_href = ''.join(ltext)
-                
+                    element_audio_src = res[0].get(u"source",u"")
+                    element_audio_href =  res[0].text                
                 
                 element_tags = []
                 
-                tags = element_node.getAttributeNS(None,u"tags")
+                tags = element_node.get(u"tags",u"")
                 
                 tags_list = map(lambda s:s.strip(),tags.split(","))
 
                 #tags                                
                 if tags is None or len(tags) == 0:
                     tags_list = []
-                    restagnode = xml.xpath.Evaluate("tag/text()", element_node)
+                    restagnode = element_node.xpath("tag/text()", smart_strings=False)
                     for tagnode in restagnode:
-                        tags_list.append(tagnode.data)
+                        tags_list.append(tagnode)
                         
                 if tags_list is None or len(tags_list) == 0:
                     tags_list = []
-                    restagnode = xml.xpath.Evaluate("tags/tag/text()", element_node)
+                    restagnode = element_node.xpath("tags/tag/text()", smart_strings=False)
                     for tagnode in restagnode:
-                        tags_list.append(tagnode.data)
+                        tags_list.append(tagnode)
                 
                 tag_date = datetime.utcnow().isoformat()
                 for tag_title in tags_list:
@@ -198,36 +191,28 @@
 
     def __parse_ldt(self):
         
-        doc = xml.dom.minidom.parseString(self.project.ldt.encode("utf-8"))
-        self.ldt_doc = Ft.Xml.Domlette.ConvertDocument(doc)
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        self.ldt_doc = lxml.etree.fromstring(self.project.ldt.encode("utf-8"))
         
-        res = xml.xpath.Evaluate("/iri/medias/media", context=con)
+        res = self.ldt_doc.xpath("/iri/medias/media")
         for mediaNode in res:
-            iri_id = mediaNode.getAttributeNS(None,u"id")
+            iri_id = mediaNode.attrib[u"id"]
             content = Content.objects.get(iri_id=iri_id)
             self.__parse_content(content)
             
-        res = xml.xpath.Evaluate("/iri/annotations/content",context=con)               
+        res = self.ldt_doc.xpath("/iri/annotations/content")               
         
         for content_node in res:
-            content_id = content_node.getAttributeNS(None, u"id")
+            content_id = content_node.attrib[u"id"]
             content = Content.objects.get(iri_id=content_id)
-            for ensemble_node in content_node.childNodes:
-                if ensemble_node.nodeType != xml.dom.Node.ELEMENT_NODE or ensemble_node.tagName != "ensemble" :
+            for ensemble_node in content_node:
+                if ensemble_node.tag != "ensemble" :
                     continue
-                self.__parse_ensemble(ensemble_node, content)
-            
-        #res = xml.xpath.Evaluate("/iri/displays/display",context=con)
-        
-        #for display_node in res:
-            
+                self.__parse_ensemble(ensemble_node, content)            
     
     
     def __parse_content(self, content):
         
-        doc = Ft.Xml.Domlette.ConvertDocument(xml.dom.minidom.parse(content.iri_file_path()))
-        con = xml.xpath.Context.Context(doc, 1, 1, None)
+        doc = lxml.etree.parse(content.iri_file_path())
         
         authors = content.authors.all()
         
@@ -243,16 +228,16 @@
         
         content_author = ""
         
-        res = xml.xpath.Evaluate("/iri/head/meta[@name='author']/@content", context=con)
+        res = doc.xpath("/iri/head/meta[@name='author']/@content")
         if len(res) > 0:
-            content_author = res[0].value
+            content_author = res[0]
         
         
         content_date = ""
         
-        res = xml.xpath.Evaluate("/iri/head/meta[@name='date']/@content", context=con)
+        res = doc.xpath("/iri/head/meta[@name='date']/@content")
         if len(res) > 0:
-            content_date = res[0].value
+            content_date = res[0]
 
         
         new_media = {
@@ -281,7 +266,7 @@
         self.medias.append(new_media)
         
         
-        res = xml.xpath.Evaluate("/iri/body/ensembles/ensemble",context=con)
+        res = doc.xpath("/iri/body/ensembles/ensemble")
         
         for ensemble_node in res:
             self.__parse_ensemble(ensemble_node, content)