From: yomguy Date: Mon, 30 Jan 2012 16:18:48 +0000 (+0100) Subject: fix resource dc view X-Git-Tag: 1.3.9~40 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=5c42a4465e66aa841dd1be20aacd81834daf4133;p=telemeta.git fix resource dc view --- diff --git a/telemeta/models/dublincore.py b/telemeta/models/dublincore.py index 3df15be6..67ebde8a 100644 --- a/telemeta/models/dublincore.py +++ b/telemeta/models/dublincore.py @@ -33,7 +33,7 @@ # Author: Olivier Guilyardi 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 @@ -48,9 +48,9 @@ class Resource(object): 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 """ @@ -76,7 +76,7 @@ class Resource(object): else: try: iter(e) - except TypeError: + except TypeError: raise Exception("add() only accepts elements or sequences of elements") self.add(*e) @@ -88,8 +88,8 @@ class Resource(object): 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" @@ -130,8 +130,8 @@ class Date(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': @@ -145,13 +145,18 @@ def media_identifier(media): 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()) @@ -189,27 +194,27 @@ def express_item(item): 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 = '' @@ -239,14 +244,36 @@ def express_item(item): ) 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: @@ -255,7 +282,7 @@ def lookup_resource(media_id): 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) @@ -274,6 +301,6 @@ def lookup_resource(media_id): return None else: raise MalformedMediaIdentifier("No such type in media identifier: " + type) - + class MalformedMediaIdentifier(Exception): pass diff --git a/telemeta/models/media.py b/telemeta/models/media.py index aea9cbb1..bae4bfb6 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -496,7 +496,7 @@ class Playlist(ModelCore): class PlaylistResource(ModelCore): "Playlist components" - RESOURCE_TYPE_CHOICES = (('item', 'item'), ('collection', 'collection'), ('marker', 'marker')) + RESOURCE_TYPE_CHOICES = (('item', 'item'), ('collection', 'collection'), ('marker', 'marker'), ('fonds', 'fonds'), ('corpus', 'corpus')) element_type = 'playlist_resource' public_id = CharField(_('public_id'), required=True) playlist = ForeignKey('Playlist', related_name="resources", verbose_name=_('playlist')) diff --git a/telemeta/templates/telemeta/inc/dublincore.html b/telemeta/templates/telemeta/inc/dublincore.html index 9d2a151f..51900b1f 100644 --- a/telemeta/templates/telemeta/inc/dublincore.html +++ b/telemeta/templates/telemeta/inc/dublincore.html @@ -7,12 +7,16 @@ {% for element in resource.elements %}
{{ element.name }}{{ element.refinement|default:" " }}
- {% if element.related|is_item or element.related|is_collection %} + {% if element.related|is_item or element.related|is_collection or element.related|is_resource %} {% if element.related|is_item %} {{ element.value }} - {% else %} + {% endif %} + {% if element.related|is_collection %} {{ element.value }} {% endif %} + {% if element.related|is_resource %} + {{ element.value }} + {% endif %} {% else %} {{ element.value }} {% endif %} diff --git a/telemeta/templates/telemeta/resource_detail.html b/telemeta/templates/telemeta/resource_detail.html index b36604d6..7eba6382 100644 --- a/telemeta/templates/telemeta/resource_detail.html +++ b/telemeta/templates/telemeta/resource_detail.html @@ -22,7 +22,7 @@ {% trans "Copy" %} {% endif %} {% if user.is_authenticated %} - {% trans "Add to playlist" %} + {% trans "Add to playlist" %} {% endif %} Dublin Core diff --git a/telemeta/templates/telemeta/resource_detail_dc.html b/telemeta/templates/telemeta/resource_detail_dc.html new file mode 100644 index 00000000..f2063f22 --- /dev/null +++ b/telemeta/templates/telemeta/resource_detail_dc.html @@ -0,0 +1,20 @@ +{% extends "telemeta/resource_detail.html" %} +{% load telemeta_utils %} +{% load i18n %} + +{% if item %} +{% block title_buttons %} + {% trans "Normal View" %} +{% endblock %} + +{% block infos %} +{% with resource|to_dublincore as resource %} +{% include "telemeta/inc/dublincore.html" %} +{% endwith %} +{% endblock %} +{% else %} +

{% trans "No such resource" %}

+{% endif %} + +{% block related %} +{% endblock related %} diff --git a/telemeta/templatetags/telemeta_utils.py b/telemeta/templatetags/telemeta_utils.py index 88879c79..9092a9b7 100644 --- a/telemeta/templatetags/telemeta_utils.py +++ b/telemeta/templatetags/telemeta_utils.py @@ -118,12 +118,26 @@ def is_item(resource): def is_collection(resource): return isinstance(resource, models.MediaCollection) +@register.filter +def is_corpus(resource): + return isinstance(resource, models.MediaCorpus) + +@register.filter +def is_fonds(resource): + return isinstance(resource, models.MediaFonds) + +@register.filter +def is_resource(resource): + return is_fonds(resource) or is_corpus(resource) + @register.filter def to_dublincore(resource): if isinstance(resource, models.MediaItem): return dc.express_item(resource) - else: + elif isinstance(resource, models.MediaCollection): return dc.express_collection(resource) + else: + return dc.express_generic_resource(resource) class DescriptionListFieldNode(template.Node): def __init__(self, model, attr, join_with = None, show_empty = False): diff --git a/telemeta/urls.py b/telemeta/urls.py index 460e2bde..66544359 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -188,6 +188,12 @@ urlpatterns = patterns('', url(r'^archives/(?P[A-Za-z0-9._-]+)/(?P[A-Za-z0-9._-]+)/delete/$', resource_view.delete, name="telemeta-resource-delete"), url(r'^archives/(?P[A-Za-z0-9._-]+)/(?P[A-Za-z0-9._-]+)/related/(?P[A-Za-z0-9._-]+)$', resource_view.related_stream, name="telemeta-resource-related"), url(r'^archives/(?P[A-Za-z0-9._-]+)/(?P[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[A-Za-z0-9._-]+)/(?P[A-Za-z0-9._-]+)/dc/$', resource_view.detail, + {'template': 'telemeta/resource_detail_dc.html'}, + name="telemeta-resource-dublincore"), + url(r'^archives/(?P[A-Za-z0-9._-]+)/(?P[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"), diff --git a/telemeta/views/base.py b/telemeta/views/base.py index f0135261..cbf87132 100644 --- a/telemeta/views/base.py +++ b/telemeta/views/base.py @@ -187,10 +187,9 @@ def check_related_media(medias): if not media.mime_type: media.set_mime_type() media.save() - if not media.title and media.url: + if not media.title and media.url and not 'https' in media.url: import lxml.etree parser = lxml.etree.HTMLParser() - parser = lxml.etree.HTMLParser() tree = lxml.etree.parse(media.url, parser) title = tree.find(".//title").text media.title = title.replace('\n', '').strip() @@ -1190,7 +1189,7 @@ class MarkerView(object): return marker.id class PlaylistView(object): - """Provide Collections web UI methods""" + """Provide Playlist web UI methods""" @jsonrpc_method('telemeta.add_playlist') def add_playlist(request, playlist):