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):
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))
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':
#
# Author: Olivier Guilyardi <olivier@samalyse.com>
+from telemeta.models.core import Duration
+
class Resource(object):
"Represent a Dublin Core resource"
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