From 331301d64d0af04186bfe67dc6b92a6cff011d7a Mon Sep 17 00:00:00 2001 From: olivier <> Date: Fri, 22 Jan 2010 19:28:35 +0000 Subject: [PATCH] split dublin core collection routines and move generic methods to ModelCore --- telemeta/models/crem.py | 50 +++++++++++++------------- telemeta/models/dublincore.py | 67 ++++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 26 deletions(-) diff --git a/telemeta/models/crem.py b/telemeta/models/crem.py index eafac6d1..056adbce 100755 --- a/telemeta/models/crem.py +++ b/telemeta/models/crem.py @@ -60,25 +60,13 @@ class ModelCore(models.Model): raise RequiredFieldError(self, field) super(ModelCore, self).save(force_insert, force_update, using) - class Meta: - abstract = True - -class MediaResource(ModelCore): - "Base class of all media objects" - - def to_dict(self): - "Return model fields as a dict of name/value pairs" - fields_dict = {} - for field in self._meta.fields: - fields_dict[field.name] = getattr(self, field.name) - return fields_dict + def save_with_revision(self, user, force_insert=False, force_update=False, using=None): + "Save a media object and add a revision" + self.save(force_insert, force_update, using) + Revision.touch(self, user) - def to_list(self): - "Return model fields as a list" - fields_list = [] - for field in self._meta.fields: - fields_list.append({'name': field.name, 'value': getattr(self, field.name)}) - return fields_list + def get_revision(self): + return Revision.objects.filter(element_type=self.element_type, element_id=self.id).order_by('-time')[0] @classmethod def get_dom_name(cls): @@ -101,7 +89,7 @@ class MediaResource(ModelCore): root = self.get_dom_name() doc = impl.createDocument(None, root, None) top = doc.documentElement - top.setAttribute("id", str(self.id)) + top.setAttribute("id", str(self.pk)) fields = self.to_dict() for name, value in fields.iteritems(): element = doc.createElement(self.get_dom_field_name(name)) @@ -112,13 +100,25 @@ class MediaResource(ModelCore): top.appendChild(element) return doc - def save_with_revision(self, user, force_insert=False, force_update=False, using=None): - "Save a media object and add a revision" - self.save(force_insert, force_update, using) - Revision.touch(self, user) + def to_dict(self): + "Return model fields as a dict of name/value pairs" + fields_dict = {} + for field in self._meta.fields: + fields_dict[field.name] = getattr(self, field.name) + return fields_dict - def get_revision(self): - return Revision.objects.filter(element_type=self.element_type, element_id=self.id).order_by('-time')[0] + def to_list(self): + "Return model fields as a list" + fields_list = [] + for field in self._meta.fields: + fields_list.append({'name': field.name, 'value': getattr(self, field.name)}) + return fields_list + + class Meta: + abstract = True + +class MediaResource(ModelCore): + "Base class of all media objects" def dc_access_rights(self): if self.public_access == 'full': diff --git a/telemeta/models/dublincore.py b/telemeta/models/dublincore.py index 3e76fe29..f99b5b40 100644 --- a/telemeta/models/dublincore.py +++ b/telemeta/models/dublincore.py @@ -32,6 +32,8 @@ # # Author: Olivier Guilyardi +from telemeta.models.core import Duration + class Resource(object): "Represent a Dublin Core resource" @@ -107,5 +109,68 @@ class Date(Element): if end and start != end: value = 'start=' + value + '; end=' + unicode(end) + ';' super(Date, self).__init__('date', value, refinement) - + +def media_access_rights(media): + if media.public_access == 'full': + return 'public' + if media.public_access == 'metadata': + return 'restricted' + return 'private' + +def media_identifier(media): + if media.code: + return media.element_type + ':' + media.code + elif media.old_code: + return media.element_type + ':' + media.old_code + return None + +def express_collection(collection): + "Express a collection as a Dublin Core resource" + + if collection.collector: + creator = (Element('creator', collection.collector), + Element('contributor', collection.creator)) + else: + creator = Element('creator', collection.creator) + + resource = Resource( + Element('identifier', media_identifier(collection)), + Element('type', 'Collection'), + Element('title', collection.title), + Element('title', collection.alt_title), + creator, + Element('contributor', collection.metadata_author), + Element('subject', 'Ethnologie'), + Element('subject', 'Ethnomusicologie'), + Element('publisher', collection.publisher), + Element('publisher', u'CNRS - Musée de l\'homme'), + Date(collection.recorded_from_year, collection.recorded_to_year, 'created'), + Date(collection.year_published, refinement='issued'), + Element('rightsHolder', collection.creator), + Element('rightsHolder', collection.collector), + Element('rightsHolder', collection.publisher), + ) + + duration = Duration() + parts = [] + for item in collection.items.all(): + duration += item.duration() + + id = media_identifier(item) + if id: + parts.append(Element('relation', id, 'hasPart')) + + if duration < collection.approx_duration: + duration = collection.approx_duration + + resource.add( + Element('rights', collection.legal_rights, 'license'), + Element('rights', media_access_rights(collection), 'accessRights'), + Element('format', duration, 'extent'), + Element('format', collection.physical_format, 'medium'), + #FIXME: audio mime types are missing, + parts + ) + + return resource -- 2.39.5