]> git.parisson.com Git - telemeta.git/commitdiff
split dublin core collection routines and move generic methods to ModelCore
authorolivier <>
Fri, 22 Jan 2010 19:28:35 +0000 (19:28 +0000)
committerolivier <>
Fri, 22 Jan 2010 19:28:35 +0000 (19:28 +0000)
telemeta/models/crem.py
telemeta/models/dublincore.py

index eafac6d161727a0e2557694117c9f84418a23111..056adbce7ac6ce20afad93e1d07d1cfb3e8a0b7b 100755 (executable)
@@ -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':
index 3e76fe29b43f36388f57358c06cb67d43b7b80c7..f99b5b403558ce47cb4b03ceb57a21a205969f94 100644 (file)
@@ -32,6 +32,8 @@
 #
 # Author: Olivier Guilyardi <olivier@samalyse.com>
 
+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