# Author: Olivier Guilyardi <olivier@samalyse.com>
from telemeta.models.core import Duration
-from telemeta.models.media import MediaItem, MediaCollection, MediaItemAnalysis
+from telemeta.models.media import *
from django.contrib.sites.models import Site
from django.conf import settings
def flatten(self):
"""Convert the resource to a dictionary with element names as keys.
- Warnings:
+ Warnings:
- refinements are lost during this conversion,
- - if there are several occurences of the same element, only the first is
+ - if there are several occurences of the same element, only the first is
used, others are lost.
- all values are converted to strings
"""
else:
try:
iter(e)
- except TypeError:
+ except TypeError:
raise Exception("add() only accepts elements or sequences of elements")
self.add(*e)
if e.refinement:
key += u'.' + unicode(e.refinement)
dump += u'%s:\t%s\n' % (key, unicode(e.value))
- return dump
-
+ return dump
+
class Element(object):
"Represent a Dublin Core element"
value = unicode(value) + '-01-01T00:00:00Z'
elif value:
value = value.strftime('%Y-%m-%dT%H:%M:%SZ')
-
- super(Date, self).__init__('date', value, refinement)
+
+ super(Date, self).__init__('date', value, refinement)
def media_access_rights(media):
if media.public_access == 'full':
domain = sites[0].domain
return 'http://' + domain + '/' + media.element_type + 's/' + unicode(media.id)
+def media_generic_identifier(media):
+ sites = Site.objects.all()
+ domain = sites[0].domain
+ return 'http://' + domain + '/' + media.element_type + '/' + unicode(media.id)
+
def express_collection(collection):
"Express a collection as a Dublin Core resource"
if collection.collector:
- creator = (Element('creator', collection.collector),
+ creator = (Element('creator', collection.collector),
Element('contributor', collection.creator))
- else:
+ else:
creator = Element('creator', collection.creator)
duration = max(collection.approx_duration, collection.computed_duration())
if item.collector:
creator = (Element('creator', item.collector),
Element('contributor', item.collection.creator))
- elif item.collection.collector:
+ elif item.collection.collector:
creator = (Element('creator', item.collection.collector),
Element('contributor', item.collection.creator))
else:
creator = Element('creator', item.collection.creator)
-
+
if item.recorded_from_date:
date = Date(item.recorded_from_date, item.recorded_to_date, refinement='created')
else:
date = Date(item.collection.recorded_from_year, item.collection.recorded_to_year, refinement='created'),
-
+
if item.title:
title = item.title
else:
title = item.collection.title
if item.track:
title += u' - ' + item.track
-
+
try:
analysis = MediaItemAnalysis.objects.get(item=item, analyzer_id='mime_type')
- mime_type = analysis.value
+ mime_type = analysis.value
except:
mime_type = ''
)
return resource
-
+
+def express_generic_resource(resource):
+ "Express a media item as a Dublin Core resource"
+
+ parts = []
+ for child in resource.children.all():
+ id = media_generic_identifier(child)
+ if id:
+ parts.append(Element('relation', id, 'hasPart', child))
+
+ r = Resource(
+ Element('identifier', media_generic_identifier(resource), related=resource),
+ Element('identifier', resource.public_id, related=resource),
+ Element('type', resource.element_type),
+ Element('title', resource.title),
+ Element('description', resource.description),
+ Element('publisher', settings.TELEMETA_ORGANIZATION),
+ parts
+ )
+
+ return r
+
+
def express_resource(res):
if isinstance(res, MediaItem):
return express_item(res)
elif isinstance(res, MediaCollection):
return express_collection(res)
- raise Exception("Invalid resource type")
+ raise Exception("Invalid resource type")
def lookup_resource(media_id):
try:
code = id[-1]
except ValueError:
raise MalformedMediaIdentifier("Media identifier must be in type:code format")
-
+
if (type == 'collection') or (type == 'collections'):
try:
return MediaCollection.objects.get(code=code)
return None
else:
raise MalformedMediaIdentifier("No such type in media identifier: " + type)
-
+
class MalformedMediaIdentifier(Exception):
pass
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/delete/$', resource_view.delete, name="telemeta-resource-delete"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/related/(?P<media_id>[A-Za-z0-9._-]+)$', resource_view.related_stream, name="telemeta-resource-related"),
url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/related_edit/$', resource_view.related_edit, dict(template='telemeta/resource_related_edit.html'), name="telemeta-resource-related_edit"),
+ url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/dc/$', resource_view.detail,
+ {'template': 'telemeta/resource_detail_dc.html'},
+ name="telemeta-resource-dublincore"),
+ url(r'^archives/(?P<type>[A-Za-z0-9._-]+)/(?P<public_id>[A-Za-z0-9._-]+)/dc/xml/$', resource_view.detail,
+ {'format': 'dublin_core_xml'},
+ name="telemeta-resource-dublincore-xml"),
# search
url(r'^search/$', general_view.search, name="telemeta-search"),