diff -r 66f6aff5c382 -r c9460033138f web/ldt/ldt_utils/projectserializer.py --- 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'])