--- a/web/ldt/ldt_utils/projectserializer.py Mon Oct 18 01:44:12 2010 +0200
+++ b/web/ldt/ldt_utils/projectserializer.py Tue Oct 19 15:14:42 2010 +0200
@@ -1,8 +1,9 @@
-import lxml.etree
-import uuid
from datetime import datetime
from django.utils.datastructures import SortedDict
from ldt.ldt_utils.models import Content, Project
+import logging
+import lxml.etree
+import uuid
DATE_FORMATS = ["%d/%m/%Y","%Y-%m-%d"]
@@ -15,23 +16,50 @@
self.project = project
self.parsed = False
self.ldt_doc = None
- self.medias = []
- self.medias_by_id = {}
self.medias_dict = SortedDict()
- self.annotations = []
- self.annotations_by_annotation_type = {}
self.annotations_dict = SortedDict()
self.tags = {}
- self.tags_by_id = {}
- self.annotation_types = []
- self.annotation_types_by_id = {}
+ self.tags_dict = SortedDict()
self.annotation_types_dict = SortedDict()
- self.views = []
- self.lists = []
- self.lists_by_id = {}
+ self.views_dict = SortedDict()
self.lists_dict = SortedDict()
self.serialize_contents = from_contents
self.from_display = from_display
+ self.display_contents_list = []
+ self.display_cuttings_list = []
+ self.display_ensemble_list = []
+
+
+ def __parse_views(self, display_node_list):
+ for display_node in display_node_list:
+ display_id = display_node.get(u"id", None)
+ if not display_id:
+ continue
+ content_list = []
+ cuttings_list = []
+ new_display = {
+ "id": display_id,
+ "contents": content_list,
+ "annotation_types": cuttings_list,
+ }
+
+ for content_node in display_node.xpath("content"):
+ content_id = content_node.get("id")
+ if content_id not in content_list:
+ content_list.append(content_id)
+ if content_id not in self.display_contents_list:
+ self.display_contents_list.append(content_id)
+ for cutting_node in content_node.xpath("decoupage"):
+ cutting_id = cutting_node.get("id")
+ if cutting_id not in cuttings_list:
+ cuttings_list.append(cutting_id)
+ if cutting_id not in self.display_cuttings_list:
+ self.display_cuttings_list.append(cutting_id)
+ ensemble_id = cutting_node.get("idens")
+ if ensemble_id not in self.display_ensemble_list:
+ self.display_ensemble_list.append(ensemble_id)
+ self.views_dict[display_id] = new_display
+
def __parse_ensemble(self, ensemble_node, content):
@@ -65,6 +93,8 @@
continue
decoupage_id = decoupage_node.attrib[ u"id"]
+ if self.from_display and decoupage_id not in self.display_cuttings_list:
+ continue
decoupage_creator = decoupage_node.attrib[u"author"]
if not decoupage_creator:
decoupage_creator = "IRI"
@@ -89,7 +119,6 @@
decoupage_description = ""
for txtRes in decoupage_node.xpath("abstract/text()", smart_strings=False):
decoupage_description += txtRes
-
list_items.append({"id-ref":decoupage_id})
@@ -104,11 +133,7 @@
"dc:description":decoupage_description
}
- self.annotation_types.append(new_annotation_types)
- self.annotation_types_by_id[decoupage_id] = new_annotation_types
- annotations_list = []
-
- self.annotations_by_annotation_type[decoupage_id] = annotations_list
+ self.annotation_types_dict[decoupage_id] = new_annotation_types
res = decoupage_node.xpath("elements/element")
for element_node in res:
@@ -168,7 +193,7 @@
}
}
self.tags[tag_title] = new_tag
- self.tags_by_id[tag_id] = new_tag
+ self.tags_dict[tag_id] = new_tag
element_tags.append({"id-ref":tag_id})
if not element_tags:
@@ -200,73 +225,47 @@
}
}
- self.annotations.append(new_annotation)
- annotations_list.append(new_annotation)
+ self.annotations_dict[element_id] = new_annotation
if not list_items:
new_list["items"] = None
- self.lists.append(new_list)
- self.lists_by_id[ensemble_id] = new_list
+ self.lists_dict[ensemble_id] = new_list
def __parse_ldt(self):
self.ldt_doc = lxml.etree.fromstring(self.project.ldt.encode("utf-8"))
+ if self.from_display:
+ xpath_str = "/iri/displays/display[position()=1]"
+ if isinstance(self.from_display, basestring):
+ xpath_str = "/iri/displays/display[@id='%s']" % self.from_display
+
+ logging.debug("xpath_str " + xpath_str)
+ self.__parse_views(self.ldt_doc.xpath(xpath_str))
+ logging.debug("xpath_str " + repr(self.views_dict))
+
res = self.ldt_doc.xpath("/iri/medias/media")
for mediaNode in res:
iri_id = mediaNode.attrib[u"id"]
+ if self.from_display and iri_id not in self.display_contents_list:
+ continue
content = Content.objects.get(iri_id=iri_id)
self.__parse_content(content)
res = self.ldt_doc.xpath("/iri/annotations/content")
for content_node in res:
content_id = content_node.attrib[u"id"]
+ if self.from_display and content_id not in self.display_contents_list:
+ continue
content = Content.objects.get(iri_id=content_id)
for ensemble_node in content_node:
if ensemble_node.tag != "ensemble" :
continue
+ ensemble_id = ensemble_node.get("id")
+ if self.from_display and ensemble_id not in self.display_ensemble_list:
+ continue
self.__parse_ensemble(ensemble_node, content)
-
- if self.from_display :
- annotations = []
- annotation_types = []
- ensembles = []
- medias = []
- tags = []
- xpath_str = "/iri/displays/display[position()=1]/content"
- if isinstance(self.from_display, basestring):
- xpath_str = "/iri/displays/display[id='%s']/content" % self.from_display
-
- for content_node in self.ldt_doc.xpath(xpath_str):
- content_id = content_node.get("id")
- if content_id not in medias:
- medias.append(content_id)
- for node in content_node.xpath("decoupage"):
- annotation_type_id = node.get('id')
- ensemble_id = node.get('idens')
- if annotation_type_id in self.annotations_by_annotation_type:
- annot_list = self.annotations_by_annotation_type[annotation_type_id]
- annotations.extend(annot_list)
- for annot in annot_list:
- if annot['tags']:
- for tag in annot['tags']:
- tag_id = tag['id-ref']
- if tag_id not in tags:
- tags.append(tag_id)
- if annotation_type_id not in annotation_types:
- annotation_types.append(annotation_type_id)
- if ensemble_id not in ensembles:
- ensembles.append(ensemble_id)
-
- self.annotations = annotations
- self.annotation_types = map(lambda id: self.annotation_types_by_id[id], annotation_types)
- self.lists = map(lambda id: self.lists_by_id[id], ensembles)
- self.medias = map(lambda id: self.medias_by_id[id], medias)
- self.tags = {}
- for tag_id in tags:
- tag_inst = self.tags_by_id[tag_id]
- self.tags[tag_inst['meta']['dc:title']] = tag_inst
self.parsed = True
@@ -323,8 +322,6 @@
}
}
- self.medias.append(new_media)
- self.medias_by_id[content.iri_id] = new_media
self.medias_dict[content.iri_id] = new_media
if self.serialize_contents:
@@ -339,10 +336,11 @@
if not self.parsed:
self.__parse_ldt()
+
project_main_media = ""
- if len(self.medias) > 0:
- project_main_media = self.medias[0]["id"]
+ if len(self.medias_dict) > 0:
+ project_main_media = self.medias_dict.value_for_index(0)["id"]
res['meta'] = {
'id': self.project.ldt_id,
@@ -354,34 +352,16 @@
'dc:description':self.project.get_description(self.ldt_doc), # get from doc, parse ldt
'main_media': {"id-ref":project_main_media}
}
-
- if not self.medias:
- self.medias = None
-
- if not self.annotation_types:
- self.annotation_types = None
+
+
+ res['medias'] = self.medias_dict.values() if len(self.medias_dict) > 0 else None
+ res['annotation-types'] = self.annotation_types_dict.values() if len(self.annotation_types_dict) > 0 else None
+ res['annotations'] = self.annotations_dict.values() if len(self.annotations_dict) > 0 else None
+ res['lists'] = self.lists_dict.values() if len(self.lists_dict) > 0 else None
+ res['tags'] = self.tags.values() if len(self.tags) > 0 else None
+ res['views'] = self.views_dict.values() if len(self.views_dict) > 0 else None
- if len(self.tags) == 0:
- tags = None
- else:
- tags = self.tags.values()
-
- if not self.lists:
- self.lists = None
-
- if not self.views:
- self.views = None
-
- if not self.annotations:
- self.annotations = None
-
- res['medias'] = self.medias
- res['annotation-types'] = self.annotation_types
- res['annotations'] = self.annotations
- res['lists'] = self.lists
- res['tags'] = tags
- res['views'] = self.views # ignored for the moment
-
+
return res
def getAnnotations(self, first_cutting=True):
@@ -393,14 +373,14 @@
current_cutting = None
uri = None
- for annot in self.annotations:
+ for annot in self.annotations_dict.values():
if first_cutting and current_cutting and current_cuttings != annot['meta']['id-ref'] :
break
current_cuttings = annot['meta']['id-ref']
content_id = annot['media']
content = Content.objects.get(iri_id=content_id)
if annot['tags']:
- tags_list = map(lambda tag_entry: self.tags_by_id[tag_entry['id-ref']]['meta']['dc:title'],annot['tags'])
+ tags_list = map(lambda tag_entry: self.tags_dict[tag_entry['id-ref']]['meta']['dc:title'],annot['tags'])
else:
tags_list = []
begin = int(annot['begin'])
--- a/web/ldt/ldt_utils/views.py Mon Oct 18 01:44:12 2010 +0200
+++ b/web/ldt/ldt_utils/views.py Tue Oct 19 15:14:42 2010 +0200
@@ -293,7 +293,7 @@
resp['Pragma']='no-cache'
ps = ProjectSerializer(project, from_contents=False, from_display=True)
- annotations = project.getAnnotations(first_cutting=True)
+ annotations = ps.getAnnotations(first_cutting=True)
rdf_ns = u"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
dc_ns = u"http://purl.org/dc/elements/1.1/"