]> git.parisson.com Git - telemeta.git/commitdiff
fix resource dc view
authoryomguy <yomguy@parisson.com>
Mon, 30 Jan 2012 16:18:48 +0000 (17:18 +0100)
committeryomguy <yomguy@parisson.com>
Mon, 30 Jan 2012 16:18:48 +0000 (17:18 +0100)
telemeta/models/dublincore.py
telemeta/models/media.py
telemeta/templates/telemeta/inc/dublincore.html
telemeta/templates/telemeta/resource_detail.html
telemeta/templates/telemeta/resource_detail_dc.html [new file with mode: 0644]
telemeta/templatetags/telemeta_utils.py
telemeta/urls.py
telemeta/views/base.py

index 3df15be61cfc1cd48f274d3b3261b22f966d5367..67ebde8ae626395e3271a9d989166d47ea00bbea 100644 (file)
@@ -33,7 +33,7 @@
 # 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
 
@@ -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
index aea9cbb193d4473e2e21d3fb4f1e0fb824939c44..bae4bfb612cf62f75c338d148dc4c358473c4f66 100644 (file)
@@ -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'))
index 9d2a151f9e806c33fb9a161bb08e52454357364c..51900b1f846dd8b3bdb5855829cb1faf873133eb 100644 (file)
@@ -7,12 +7,16 @@
         {% for element in resource.elements %}
         <dt><span>{{ element.name }}</span>{{ element.refinement|default:"&nbsp;" }}</dt>
         <dd>
-        {% 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 %}
             <a href="{% url telemeta-item-dublincore element.related.public_id %}">{{ element.value }}</a>
-            {% else %}
+            {% endif %}
+            {% if element.related|is_collection %}
             <a href="{% url telemeta-collection-dublincore element.related.public_id %}">{{ element.value }}</a>
             {% endif %}
+            {% if element.related|is_resource %}
+            <a href="{{element.value}}">{{ element.value }}</a>
+            {% endif %}
         {% else %}
             {{ element.value }}
         {% endif %}
index b36604d62287fd8ca8c8e51dbb7bfb921e526c0b..7eba63820f27a4f58c401091b0482b402f10c53d 100644 (file)
@@ -22,7 +22,7 @@
       <a href="{% url telemeta-resource-copy type resource.public_id %}" class="component_icon button icon_copy">{% trans "Copy" %}</a>
      {% endif %}
     {% if user.is_authenticated %}
-    <a href=# id ="_add_to_playlist" class="component_icon button icon_add_to_playlist">{% trans "Add to playlist" %}</a>
+    <a href="#" id ="_add_to_playlist" class="component_icon button icon_add_to_playlist">{% trans "Add to playlist" %}</a>
     {% endif %}
     <a href="{% url telemeta-resource-dublincore type resource.public_id %}" class="component_icon button icon_dublin_core">Dublin Core</a>
    </div>
diff --git a/telemeta/templates/telemeta/resource_detail_dc.html b/telemeta/templates/telemeta/resource_detail_dc.html
new file mode 100644 (file)
index 0000000..f2063f2
--- /dev/null
@@ -0,0 +1,20 @@
+{% extends "telemeta/resource_detail.html" %}
+{% load telemeta_utils %}
+{% load i18n %}
+
+{% if item %}
+{% block title_buttons %}
+ <a class="component_icon button icon_previous" href="{% url telemeta-resource-detail type resource.public_id %}">{% trans "Normal View" %}</a>
+{% endblock %}
+
+{% block infos %}
+{% with resource|to_dublincore as resource %}
+{% include "telemeta/inc/dublincore.html" %}
+{% endwith %}
+{% endblock %}
+{% else %}
+    <p>{% trans "No such resource" %}</p>
+{% endif %}
+
+{% block related %}
+{% endblock related %}
index 88879c794e07914339106396771b9852af8ef127..9092a9b7c0498597ca56afdc883daa930a72d181 100644 (file)
@@ -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):
index 460e2bde7372a9b503b19771364ed33f3b938263..6654435909933c4227b99748f6eeeb8db4793914 100644 (file)
@@ -188,6 +188,12 @@ urlpatterns = patterns('',
     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"),
index f0135261856b0d9a0b9b20d5423bac30250e62b2..cbf87132d6f1c3b6bc8ee4339c7daee62be86d34 100644 (file)
@@ -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):