]> git.parisson.com Git - telemeta.git/commitdiff
begin to couple the web view with new CREM models ; junk some leftovers
authorolivier <>
Mon, 25 Jan 2010 19:08:13 +0000 (19:08 +0000)
committerolivier <>
Mon, 25 Jan 2010 19:08:13 +0000 (19:08 +0000)
19 files changed:
telemeta/admin.py [deleted file]
telemeta/models.py [deleted file]
telemeta/models/crem.py
telemeta/models/cremquery.py
telemeta/templates/telemeta/inc/dublincore.html [new file with mode: 0644]
telemeta/templates/telemeta_default/collection.m3u
telemeta/templates/telemeta_default/collection_detail.html
telemeta/templates/telemeta_default/collection_detail_dc.html
telemeta/templates/telemeta_default/collection_xspf.xml
telemeta/templates/telemeta_default/inc/collection_list.html
telemeta/templates/telemeta_default/inc/dublincore.html [new file with mode: 0644]
telemeta/templates/telemeta_default/inc/mediaitem_list.html
telemeta/templates/telemeta_default/mediaitem_detail.html
telemeta/templates/telemeta_default/mediaitem_detail_dc.html
telemeta/templates/telemeta_default/mediaitem_xspf.xml
telemeta/templatetags/telemeta_utils.py
telemeta/tests/model_tests.py
telemeta/urls.py
telemeta/web/base.py

diff --git a/telemeta/admin.py b/telemeta/admin.py
deleted file mode 100644 (file)
index ae8784a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-from django.contrib import admin
-from telemeta.models import MediaCollection, MediaItem, MediaPart, MediaCore 
-from django import forms
-
-class MediaCoreAdminForm(forms.ModelForm):
-    def clean(self):
-        data = forms.ModelForm.clean(self)
-        id = None
-        if data.has_key("id"):
-            id = data["id"] = data["id"].strip()
-        if not id:
-            raise forms.ValidationError(u"id field is required")
-        if not MediaCore.is_well_formed_id(id):
-            raise forms.ValidationError(u"'%s' is not a well-formed id" % id)
-        return data
-
-class MediaCollectionAdminForm(MediaCoreAdminForm):
-    class Meta:
-        model = MediaCollection
-  
-class MediaItemAdminForm(MediaCoreAdminForm):
-    class Meta:
-        model = MediaItem
-  
-class MediaCollectionAdmin(admin.ModelAdmin):
-    form = MediaCollectionAdminForm
-
-class MediaItemAdmin(admin.ModelAdmin):
-    form = MediaItemAdminForm
-
-admin.site.register(MediaCollection, MediaCollectionAdmin)
-admin.site.register(MediaItem, MediaItemAdmin)
-admin.site.register(MediaPart)
diff --git a/telemeta/models.py b/telemeta/models.py
deleted file mode 100644 (file)
index e69de29..0000000
index 0db0975de8fa9d2efdf0a51a77693331cc3d02bd..156bea5ce019247f6eafc3261368291059a36715 100755 (executable)
@@ -131,6 +131,10 @@ class MediaCollection(MediaResource):
     element_type = 'collection'
     PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('metadata', 'full'))
 
+    published_code_regex   = 'CNRSMH_E_[0-9]{4}(?:_[0-9]{3}){2}'
+    unpublished_code_regex = 'CNRSMH_I_[0-9]{4}_[0-9]{3}'
+    code_regex             = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex)
+
     reference             = models.CharField(unique=True, max_length=250,
                                              null=True)
     physical_format       = WeakForeignKey('PhysicalFormat', related_name="collections", null=True)
@@ -215,9 +219,9 @@ class MediaCollection(MediaResource):
     def is_valid_code(self, code):
         "Check if the collection code is well formed"
         if self.is_published:
-            regex = '^CNRSMH_E_[0-9]{4}(_[0-9]{3}){2}$'
+            regex = '^' + self.published_code_regex + '$'
         else:
-            regex = '^CNRSMH_I_[0-9]{4}_[0-9]{3}$'
+            regex = '^' + self.unpublished_code_regex + '$'
            
         if re.match(regex, code):
             return True
@@ -239,6 +243,10 @@ class MediaItem(MediaResource):
     element_type = 'item'
     PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full'))
 
+    published_code_regex    = MediaCollection.published_code_regex + '(?:_[0-9]{2}){1,2}'
+    unpublished_code_regex  = MediaCollection.unpublished_code_regex + '_[0-9]{2,3}(?:_[0-9]{2}){0,2}'
+    code_regex              = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex)
+
     collection            = models.ForeignKey('MediaCollection', related_name="items")
     track                 = models.CharField(max_length=250, default="")
     old_code              = models.CharField(unique=True, max_length=250, null=True)
@@ -281,12 +289,15 @@ class MediaItem(MediaResource):
 
     def is_valid_code(self, code):
         "Check if the item code is well formed"
+        if not re.match('^' + self.collection.code, self.code):
+            return false
+
         if self.collection.is_published:
-            regex = '^' + self.collection.code + '(_[0-9]{2}){1,2}$'
+            regex = '^' + self.published_code_regex + '$'
         else:
-            regex = '^' + self.collection.code + '_[0-9]{2,3}(_[0-9]{2}){0,2}$'
+            regex = '^' + self.unpublished_code_regex + '$'
 
-        if re.match(regex, self.code):
+        if re.match(regex, code):
             return True
 
         return False
index 8c3477bf42c224e7e7a5e885596d7cafadc7ea11..1c72195ffbbb1733f8d7845de69d165b9b477125 100644 (file)
@@ -36,6 +36,7 @@
 from django.db.models import Manager, Q
 from telemeta.models.core import EnhancedQuerySet, EnhancedManager
 import re
+from django.core.exceptions import ObjectDoesNotExist
 
 class CoreQuerySet(EnhancedQuerySet):
     "Base class for all query sets"
@@ -74,6 +75,21 @@ class CoreManager(EnhancedManager):
         ""
         return self.get_query_set().none(*args, **kwargs)
 
+    def get(self, **kwargs):
+        if kwargs.has_key('code_or_id'):
+            try:
+                args = kwargs.copy()
+                args['code'] = kwargs['code_or_id']
+                args.pop('code_or_id')
+                return super(CoreManager, self).get(**args)
+            except ObjectDoesNotExist:
+                args = kwargs.copy()
+                args['id'] = kwargs['code_or_id']
+                args.pop('code_or_id')
+                return super(CoreManager, self).get(**args)
+
+        return super(CoreManager, self).get(**kwargs)
+                
 class MediaCollectionQuerySet(CoreQuerySet):
 
     def quick_search(self, pattern):
@@ -202,6 +218,7 @@ class MediaCollectionManager(CoreManager):
         
         return result
 
+
 class MediaItemQuerySet(CoreQuerySet):
     "Base class for all media item query sets"
     
diff --git a/telemeta/templates/telemeta/inc/dublincore.html b/telemeta/templates/telemeta/inc/dublincore.html
new file mode 100644 (file)
index 0000000..2c6134b
--- /dev/null
@@ -0,0 +1,2 @@
+{% extends "telemeta_default/inc/dublincore.html" %}
+
index 7bb028e5c5e64ba9d7ff112e63aae48605358a47..259dc4babccd51987af53bfa08dd590d8dfd4ae8 100644 (file)
@@ -1,3 +1,3 @@
 #EXTM3U{% load telemeta_utils %}{% for item in collection.items.all %}
 #EXTINF:{{ item.get_duration }},{{ item.title }}
-http://{{ host }}{% url telemeta-item-export item.id|urlencode,"mp3" %}{% endfor %}
+http://{{ host }}{% url telemeta-item-export item|code_or_id,"mp3" %}{% endfor %}
index b7313314b84d846ae31629ec3e524d0bfbd61239..62399beffce1c0cd0254276a16228a4189f1290d 100644 (file)
@@ -7,28 +7,28 @@
 <script src="{% url telemeta-js "swfobject.js" %}" type="text/javascript"></script>\r
 {% endblock %}\r
 \r
-{% if object %}\r
+{% if collection %}\r
 \r
 {% block submenu %}\r
-    <h3>Collection: {{ object.title }}</h3>\r
-    <div><a href="{% url telemeta-collection-dublincore object.id|urlencode %}">Dublin Core</a></div>\r
+    <h3>Collection: {{ collection.title }}</h3>\r
+    <div><a href="{% url telemeta-collection-dublincore collection.code %}">Dublin Core</a></div>\r
 {% endblock %}\r
 \r
 {% block content %}\r
-    <div class="{% if object.has_mediafile %}with-rightcol{% endif %}">\r
-        {% if object.has_mediafile %}\r
+    <div class="{% if collection.has_mediafile %}with-rightcol{% endif %}">\r
+        {% if collection.has_mediafile %}\r
         <div id="rightcol">\r
             <div id="collection_player">\r
               <p><b>Listen to this collection</b>\r
-              (<a href="{% url telemeta-collection-m3u object.id|urlencode %}">M3U</a>,\r
-              <a href="{% url telemeta-collection-xspf object.id|urlencode %}">XSPF</a>)</p>\r
+              (<a href="{% url telemeta-collection-m3u collection.code %}">M3U</a>,\r
+              <a href="{% url telemeta-collection-xspf collection.code %}">XSPF</a>)</p>\r
               {% if 0 %} {# Use 1/0 for alternate player #}\r
                 <!-- This is the XSPF Web Music Player, under the BSD license, \r
                   from: http://musicplayer.sourceforge.net/-->\r
                 <object type="application/x-shockwave-flash" width="362" height="200"\r
-                  data="{% url telemeta-swf "xspf_player.swf" %}?playlist_url={% url telemeta-collection-xspf object.id|urlencode %}">\r
+                  data="{% url telemeta-swf "xspf_player.swf" %}?playlist_url={% url telemeta-collection-xspf collection.code %}">\r
                   <param name="movie" \r
-                    value="{% url telemeta-swf "xspf_player.swf" %}?playlist_url={% url telemeta-collection-xspf object.id|urlencode %}" />\r
+                    value="{% url telemeta-swf "xspf_player.swf" %}?playlist_url={% url telemeta-collection-xspf collection.code %}" />\r
                 </object>\r
               {% else %}\r
                 <!-- This is Jeroen Wijering's Flash MP3 Player, \r
@@ -39,7 +39,7 @@
                 </p>\r
                 <script type="text/javascript">\r
                   var so = new SWFObject('{% url telemeta-swf "mp3player.swf" %}','playlist','362','200','7');\r
-                  so.addVariable("file","{% url telemeta-collection-xspf object.id|urlencode %}");\r
+                  so.addVariable("file","{% url telemeta-collection-xspf collection.code %}");\r
                   so.addVariable("displayheight","0");\r
                   so.write('collection_player_c');\r
                 </script> \r
         </div>\r
         {% endif %}\r
         <div class="intro">\r
-            <span>{% if object.items.count %}{{ object.items.count }} {% ifequal object.items.count 1 %}item{% else %}items{% endifequal %}{% else %}No item{% endif %}</span>\r
+            <span>{% if collection.items.count %}{{ collection.items.count }} {% ifequal collection.items.count 1 %}item{% else %}items{% endifequal %}{% else %}No item{% endif %}</span>\r
         </div>\r
         <div class="infos">\r
         {% block general_info %}\r
             <dl class="listing">\r
-                {% if object.creator %}<dt>Auteur / Cédant</dt><dd>{{ object.creator }}</dd>{% endif %}\r
+                {% if collection.creator %}<dt>Auteur / Cédant</dt><dd>{{ collection.creator }}</dd>{% endif %}\r
 \r
-                {% if object.is_published %}\r
-                {% if object.date_published %}<dt>Date</dt><dd>{{ object.date_published }}</dd>{% endif %}\r
+                {% if collection.is_published %}\r
+                {% if collection.date_published %}<dt>Date</dt><dd>{{ collection.date_published }}</dd>{% endif %}\r
                 {% else %}\r
-                {% if object.annee_enr %}<dt>Date</dt><dd>{{ object.annee_enr }}</dd>{% endif %}\r
+                {% if collection.annee_enr %}<dt>Date</dt><dd>{{ collection.annee_enr }}</dd>{% endif %}\r
                 {% endif %}\r
 \r
-                {% if object.title %}<dt>Titre</dt><dd>{{ object.title }}</dd>{% endif %}\r
-                {% if object.native_title %}<dt>Traduction du titre</dt><dd>{{ object.native_title }}</dd>{% endif %}\r
-                {% if object.duree_approx %}<dt>Durée</dt><dd>{{ object.duree_approx }}</dd>{% endif %}\r
+                {% if collection.title %}<dt>Titre</dt><dd>{{ collection.title }}</dd>{% endif %}\r
+                {% if collection.native_title %}<dt>Traduction du titre</dt><dd>{{ collection.native_title }}</dd>{% endif %}\r
+                {% if collection.duree_approx %}<dt>Durée</dt><dd>{{ collection.duree_approx }}</dd>{% endif %}\r
 \r
-                {% if object.is_published %}\r
-                {% if object.publisher %}<dt>Éditeur</dt><dd>{{ object.publisher }}</dd>{% endif %}\r
-                {% if object.publisher_reference %}<dt>Référence</dt><dd>{{ object.publisher_reference }}</dd>{% endif %}\r
+                {% if collection.is_published %}\r
+                {% if collection.publisher %}<dt>Éditeur</dt><dd>{{ collection.publisher }}</dd>{% endif %}\r
+                {% if collection.publisher_reference %}<dt>Référence</dt><dd>{{ collection.publisher_reference }}</dd>{% endif %}\r
                 {% endif %}\r
 \r
             </dl>\r
                 <div>\r
                     <dl class="listing">\r
 \r
-                    {% if object.get_countries %}\r
-                    <dt>État / Nation</dt><dd>{{object.get_countries|join:", "}}</dd>\r
+                    {% if collection.get_countries %}\r
+                    <dt>État / Nation</dt><dd>{{collection.get_countries|join:", "}}</dd>\r
                     {% endif %}\r
 \r
-                    {% if object.get_ethnic_groups %}\r
-                    <dt>Ethnie / Groupe social</dt><dd>{{ object.get_ethnic_groups|join:", " }}</dd>\r
+                    {% if collection.get_ethnic_groups %}\r
+                    <dt>Ethnie / Groupe social</dt><dd>{{ collection.get_ethnic_groups|join:", " }}</dd>\r
                     {% endif %}\r
 \r
-                    {% if object.terrain_ou_autre %}<dt>Contexte de l’enregistrement</dt><dd>{{ object.terrain_ou_autre }}</dd>{% endif %}\r
+                    {% if collection.terrain_ou_autre %}<dt>Contexte de l’enregistrement</dt><dd>{{ collection.terrain_ou_autre }}</dd>{% endif %}\r
 \r
                     </dl>\r
                 </div>\r
             </div>\r
         {% endblock geoethnic_data %}\r
         </div>\r
-        {% if object.is_published %}\r
+        {% if collection.is_published %}\r
         <div class="extraInfos">\r
         {% block publication_data %}\r
             <div class="folded">\r
                 <h4><a href="#">Détails du document édité</a></h4>\r
                 <div>\r
                     <dl class="listing">\r
-                    {% if object.publishing_status %}<dt>Réédition</dt><dd>{{ object.publishing_status }}</dd>{% endif %}\r
-                    {% if object.booklet_writer %}<dt>Auteur Notice</dt><dd>{{ object.booklet_writer }}</dd>{% endif %}\r
-                    {% if object.booklet_description %}<dt>Notice</dt><dd>{{ object.booklet_description }}</dd>{% endif %}\r
+                    {% if collection.publishing_status %}<dt>Réédition</dt><dd>{{ collection.publishing_status }}</dd>{% endif %}\r
+                    {% if collection.booklet_writer %}<dt>Auteur Notice</dt><dd>{{ collection.booklet_writer }}</dd>{% endif %}\r
+                    {% if collection.booklet_description %}<dt>Notice</dt><dd>{{ collection.booklet_description }}</dd>{% endif %}\r
                     </dl>\r
                 </div>\r
             </div>\r
                 <h4><a href="#">Identification du document</a></h4>\r
                 <div>\r
                     <dl class="listing">\r
-                    {% if object.id %}<dt>Cote</dt><dd>{{ object.id }}</dd>{% endif %}\r
-                    {% if object.physical_format %}<dt>Format de l'original</dt><dd>{{ object.physical_format }}</dd>{% endif %}\r
+                    {% if collection.id %}<dt>Cote</dt><dd>{{ collection.id }}</dd>{% endif %}\r
+                    {% if collection.physical_format %}<dt>Format de l'original</dt><dd>{{ collection.physical_format }}</dd>{% endif %}\r
                     </dl>\r
                 </div>\r
             </div>\r
                 <h4><a href="#">Informations documentaires</a></h4>\r
                 <div>\r
                     <dl class="listing">\r
-                    {% if object.a_informer %}<dt>a informer</dt><dd>{{ object.a_informer }}</dd>{% endif %}\r
-                    {% if object.acquisition_mode %}<dt>acquisition mode</dt><dd>{{ object.acquisition_mode }}</dd>{% endif %}\r
-                    {% if object.champ36 %}<dt>champ36</dt><dd>{{ object.champ36 }}</dd>{% endif %}\r
-                    {% if object.collector %}<dt>collector</dt><dd>{{ object.collector }}</dd>{% endif %}\r
-                    {% if object.comment %}<dt>comment</dt><dd>{{ object.comment }}</dd>{% endif %}\r
+                    {% if collection.a_informer %}<dt>a informer</dt><dd>{{ collection.a_informer }}</dd>{% endif %}\r
+                    {% if collection.acquisition_mode %}<dt>acquisition mode</dt><dd>{{ collection.acquisition_mode }}</dd>{% endif %}\r
+                    {% if collection.champ36 %}<dt>champ36</dt><dd>{{ collection.champ36 }}</dd>{% endif %}\r
+                    {% if collection.collector %}<dt>collector</dt><dd>{{ collection.collector }}</dd>{% endif %}\r
+                    {% if collection.comment %}<dt>comment</dt><dd>{{ collection.comment }}</dd>{% endif %}\r
                     <!--\r
                     <dt>compil face plage</dt><dd>{{ object.compil_face_plage }}</dd>\r
                     -->\r
-                    {% if object.deposant_cnrs %}<dt>deposant cnrs</dt><dd>{{ object.deposant_cnrs }}</dd>{% endif %}\r
-                    {% if object.fiches %}<dt>fiches</dt><dd>{{ object.fiches }}</dd>{% endif %}\r
-                    {% if object.is_full_copy %}<dt>is full copy</dt><dd>{{ object.is_full_copy }}</dd>{% endif %}\r
-                    {% if object.is_original %}<dt>is original</dt><dd>{{ object.is_original }}</dd>{% endif %}\r
-                    {% if object.numerisation %}<dt>numerisation</dt><dd>{{ object.numerisation }}</dd>{% endif %}\r
-                    {% if object.physical_items_num %}<dt>physical items num</dt><dd>{{ object.physical_items_num }}</dd>{% endif %}\r
-                    {% if object.publisher_collection %}<dt>publisher collection</dt><dd>{{ object.publisher_collection }}</dd>{% endif %}\r
-                    {% if object.publisher_serial_id %}<dt>publisher serial id</dt><dd>{{ object.publisher_serial_id }}</dd>{% endif %}\r
-                    {% if object.record_author %}<dt>record author</dt><dd>{{ object.record_author }}</dd>{% endif %}\r
-                    {% if object.record_writer %}<dt>record writer</dt><dd>{{ object.record_writer }}</dd>{% endif %}\r
-                    {% if object.ref_biblio %}<dt>ref biblio</dt><dd>{{ object.ref_biblio }}</dd>{% endif %}\r
-                    {% if object.rights %}<dt>rights</dt><dd>{{ object.rights }}</dd>{% endif %}\r
-                    {% if object.travail %}<dt>travail</dt><dd>{{ object.travail }}</dd>{% endif %}\r
-                    {% if object.tri_dibm %}<dt>tri dibm</dt><dd>{{ object.tri_dibm }}</dd>{% endif %}\r
+                    {% if collection.deposant_cnrs %}<dt>deposant cnrs</dt><dd>{{ collection.deposant_cnrs }}</dd>{% endif %}\r
+                    {% if collection.fiches %}<dt>fiches</dt><dd>{{ collection.fiches }}</dd>{% endif %}\r
+                    {% if collection.is_full_copy %}<dt>is full copy</dt><dd>{{ collection.is_full_copy }}</dd>{% endif %}\r
+                    {% if collection.is_original %}<dt>is original</dt><dd>{{ collection.is_original }}</dd>{% endif %}\r
+                    {% if collection.numerisation %}<dt>numerisation</dt><dd>{{ collection.numerisation }}</dd>{% endif %}\r
+                    {% if collection.physical_items_num %}<dt>physical items num</dt><dd>{{ collection.physical_items_num }}</dd>{% endif %}\r
+                    {% if collection.publisher_collection %}<dt>publisher collection</dt><dd>{{ collection.publisher_collection }}</dd>{% endif %}\r
+                    {% if collection.publisher_serial_id %}<dt>publisher serial id</dt><dd>{{ collection.publisher_serial_id }}</dd>{% endif %}\r
+                    {% if collection.record_author %}<dt>record author</dt><dd>{{ collection.record_author }}</dd>{% endif %}\r
+                    {% if collection.record_writer %}<dt>record writer</dt><dd>{{ collection.record_writer }}</dd>{% endif %}\r
+                    {% if collection.ref_biblio %}<dt>ref biblio</dt><dd>{{ collection.ref_biblio }}</dd>{% endif %}\r
+                    {% if collection.rights %}<dt>rights</dt><dd>{{ collection.rights }}</dd>{% endif %}\r
+                    {% if collection.travail %}<dt>travail</dt><dd>{{ collection.travail }}</dd>{% endif %}\r
+                    {% if collection.tri_dibm %}<dt>tri dibm</dt><dd>{{ collection.tri_dibm }}</dd>{% endif %}\r
                     </dl>\r
                 </div>\r
             </div>\r
         {% endblock document_data %}\r
         </div>\r
         <h4>Items</h4>\r
-        {% with object.ordered_items as items %}\r
+        {% with collection.ordered_items as items %}\r
             {% include "telemeta/inc/mediaitem_list.html" %}\r
         {% endwith %}\r
         </div>\r
index 0cf3e394eb35f512c6ab759e3bfc443ce8f41222..bc86c070a434ca6c4a82133792b70745282b8ca0 100644 (file)
@@ -1,26 +1,18 @@
 {% extends "telemeta/base.html" %}
 {% load telemeta_utils %}
 
-{% if object %}
+{% if collection %}
 {% block submenu %}
-    <h3>Collection: {{ object.title }}</h3>
-    <div><a href="{% url telemeta-collection-detail object.id|urlencode %}">Normal View</a></div>
+    <h3>Collection: {{ collection.title }}</h3>
+    <div><a href="{% url telemeta-collection-detail collection.code %}">Normal View</a></div>
 {% endblock %}
 
 {% block content %}
-    <h4 class="dublincore">Dublin Core Expression</h4>
-    <dl class="dublincore">
-        <dt class="caption"><span>Element</span>Refinement</dt><dd class="caption">Value</dd>
-        {% for element in object.to_dublincore.elements %}
-        {% if element.value %}
-        <dt><span>{{ element.name }}</span>{{ element.refinement|default:"&nbsp;" }}</dt><dd>{% ifequal element.field "collection" %}<a href="{% url telemeta-collection-dublincore item.collection.id|urlencode %}">{{ element.value }}</a>{% else %}{{ element.value }}{% endifequal %}</dd>
-        {% endif %}
-        {% endfor %}
-        {% for item in object.ordered_items %}
-        <dt><span>relation</span>hasPart</dt><dd><a href="{% url telemeta-item-dublincore item.id|urlencode %}">{{ item.id }}</a></dd>
-        {% endfor %}
-    </dl>
+{% with collection|to_dublincore as resource %}
+{% include "telemeta/inc/dublincore.html" %}
+{% endwith %}
+
 {% endblock %}
 {% else %}
     <p>No such collection</p>
-{% endif %}
\ No newline at end of file
+{% endif %}
index 2e8066c0dd79a63fb364ec0fce42f616954009a9..f7b72e6f8afd3a3bd07fc62c43187e763a4d6527 100644 (file)
@@ -5,7 +5,7 @@
 {% with collection.to_dublincore.flatten as dc %}
   <creator>{{ dc.creator }}</creator>
   <title>{{ dc.title }}</title>
-  <info>http://{{ host }}{% url telemeta-collection-detail collection.id|urlencode %}</info>
+  <info>http://{{ host }}{% url telemeta-collection-detail collection.code %}</info>
 {% endwith %}
 {% endblock %}
 
@@ -14,9 +14,9 @@
     <track>
       <title>{{ item.title }}</title>
       <meta rel="type">mp3</meta>
-      <location>http://{{ host }}{% url telemeta-item-export item.id|urlencode,"mp3" %}</location>
+      <location>http://{{ host }}{% url telemeta-item-export item|code_or_id,"mp3" %}</location>
       <duration>{{ item.get_duration|mul:1000 }}</duration>
-      <info>http://{{ host }}{% url telemeta-item-detail item.id|urlencode %}</info>
+      <info>http://{{ host }}{% url telemeta-item-detail item|code_or_id %}</info>
     </track>
 {% endfor %}
 {% endblock %}
index 31fbf023ad9c2911183c37090aa61de023751bf1..26254382c99130217ee00fb8f9425432723c8653 100644 (file)
@@ -9,7 +9,7 @@
     {% endif %}
     <ul>
     {% for p in collections %}
-        <li><a href="{% url telemeta-collection-detail p.id|urlencode %}">{{ p.title }}</a>
+        <li><a href="{% url telemeta-collection-detail p.code %}">{{ p.title }}</a>
             </li>
     {% endfor %}
     {% if more_collections %} <li>[...]</li> {% endif %}
diff --git a/telemeta/templates/telemeta_default/inc/dublincore.html b/telemeta/templates/telemeta_default/inc/dublincore.html
new file mode 100644 (file)
index 0000000..0e00134
--- /dev/null
@@ -0,0 +1,21 @@
+{% load telemeta_utils %}
+
+    <h4 class="dublincore">Dublin Core Expression</h4>
+    <dl class="dublincore">
+        <dt class="caption"><span>Element</span>Refinement</dt><dd class="caption">Value</dd>
+        {% 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 %}
+            <a href="{% url telemeta-item-dublincore element.related|code_or_id %}">{{ element.value }}</a>
+            {% else %}
+            <a href="{% url telemeta-collection-dublincore element.related.code %}">{{ element.value }}</a>
+            {% endif %}
+        {% else %}
+            {{ element.value }}
+        {% endif %}
+        </dd>
+        {% endfor %}
+
+    </dl>
index 9ef69716da53b07569d124eb9ae0dafeb3be0a4f..7e66c4b916464072d1c6510084536f3585625ff2 100644 (file)
@@ -9,7 +9,7 @@
     {% endif %}
     <ul>
     {% for p in items %}
-        <li><a href="{% url telemeta-item-detail p.id %}">{{ p.title }}</a></li>
+        <li><a href="{% url telemeta-item-detail p|code_or_id %}">{{ p.title }}</a></li>
     {% endfor %}
     {% if more_items %} <li>[...]</li> {% endif %}
     </ul>
index c874f3030ff78978ee799440af5dfb6283ee7ebe..37069f132a565f19f8fae97bba1b68af7ee2f633 100644 (file)
@@ -20,7 +20,7 @@
 soundManager.url = '{% url telemeta-swf "./" %}';\r
 soundManager.flashVersion = 9;\r
 soundManager.debugMode = false;\r
-set_player_image_url('{% url telemeta-item-visualize item.id|urlencode,visualizer_id,"WIDTH","HEIGHT" %}');\r
+set_player_image_url('{% url telemeta-item-visualize item|code_or_id,visualizer_id,"WIDTH","HEIGHT" %}');\r
 load_player({{ item.get_duration }});\r
 </script>\r
 \r
@@ -30,7 +30,7 @@ load_player({{ item.get_duration }});
 {% if item %}\r
 {% block submenu %}\r
     <h3>Item : {{ item.title }}</h3>\r
-    <div><a href="{% url telemeta-item-dublincore item.id|urlencode %}">Dublin Core</a></div>\r
+    <div><a href="{% url telemeta-item-dublincore item|code_or_id %}">Dublin Core</a></div>\r
 {% endblock %}\r
 \r
 {% block content %}\r
@@ -50,8 +50,8 @@ load_player({{ item.get_duration }});
             <div class="ts-viewer">\r
                 <div class="ts-wave">\r
                     <div class="ts-image-container">\r
-                        <a href="{% url telemeta-item-export item.id|urlencode,"mp3" %}">\r
-                        <img class="ts-image" src="{% url telemeta-item-visualize item.id|urlencode,visualizer_id,360,130 %}" \r
+                        <a href="{% url telemeta-item-export item|code_or_id,"mp3" %}">\r
+                        <img class="ts-image" src="{% url telemeta-item-visualize item|code_or_id,visualizer_id,360,130 %}" \r
                           alt="" /></a>\r
                     </div>\r
                 </div>  \r
@@ -71,7 +71,7 @@ load_player({{ item.get_duration }});
                 -->\r
                 <select id="visualizer_id" name="visualizer_id">\r
                     {% for v in visualizers %}\r
-                    <option value="{% url telemeta-item-visualize item.id|urlencode,v.id,"WIDTH","HEIGHT" %}">\r
+                    <option value="{% url telemeta-item-visualize item|code_or_id,v.id,"WIDTH","HEIGHT" %}">\r
                     {{v.name}}</option>\r
                     {% endfor %}\r
                 </select>\r
@@ -117,7 +117,7 @@ load_player({{ item.get_duration }});
         <div class="exporter">\r
             <p>Download:\r
             {% for format in export_formats %}\r
-            <a href="{% url telemeta-item-export item.id|urlencode,format.extension %}">{{ format.name }}</a>\r
+            <a href="{% url telemeta-item-export item|code_or_id,format.extension %}">{{ format.name }}</a>\r
             {% endfor %}</p>\r
         </div>\r
 \r
@@ -132,7 +132,7 @@ load_player({{ item.get_duration }});
             {% if item.dates_enregistr %}<dt>Date d'enregistrement</dt><dd>{{ item.dates_enregistr }}</dd>{% endif %}\r
             {% if item.title %}<dt>Titre</dt><dd>{{ item.title }}</dd>{% endif %}\r
             {% if item.transcrip_trad %}<dt>Traduction du titre</dt><dd>{{ item.transcrip_trad }}</dd>{% endif %}\r
-            <dt>Collection</dt><dd><a href="{% url telemeta-collection-detail item.collection.id|urlencode %}">{{ item.collection.title }}</a></dd>\r
+            <dt>Collection</dt><dd><a href="{% url telemeta-collection-detail item.collection.code %}">{{ item.collection.title }}</a></dd>\r
             {% if item.duree %}<dt>Durée</dt><dd>{{ item.duree }}</dd>{% endif %}\r
             {% if item.collection.ispublished and item.Ref %}\r
             <dt>Ref</dt><dd>{{ item.Ref }}</dd>\r
index 4f1f330e73176016fe430822ea894119b7da39a9..013d672101a8c9b0826bd98daac971376940507d 100644 (file)
@@ -8,15 +8,9 @@
 {% endblock %}\r
 \r
 {% block content %}\r
-    <h4 class="dublincore">Dublin Core Expression</h4>\r
-    <dl class="dublincore">\r
-        <dt class="caption"><span>Element</span>Refinement</dt><dd class="caption">Value</dd>\r
-        {% for element in item.to_dublincore.elements %}\r
-        {% if element.value %}\r
-        <dt><span>{{ element.name }}</span>{{ element.refinement|default:"&nbsp;" }}</dt><dd>{% ifequal element.field "collection" %}<a href="{% url telemeta-collection-dublincore item.collection.id|urlencode %}">{{ element.value }}</a>{% else %}{{ element.value }}{% endifequal %}</dd>\r
-        {% endif %}\r
-        {% endfor %}\r
-    </dl>\r
+{% with item|to_dublincore as resource %}\r
+{% include "telemeta/inc/dublincore.html" %}\r
+{% endwith %}\r
 {% endblock %}\r
 {% else %}\r
     <p>No such item</p>\r
index ece81d373cd8b091674a7d6980f1f599c4f9efdf..78ed4cc525ad38d271b257d2bd9e0788ab1ea54b 100644 (file)
@@ -5,9 +5,9 @@
     <track>
       <title>{{ item.title }}</title>
       <meta rel="type">mp3</meta>
-      <location>http://{{ host }}{% url telemeta-item-export item.id|urlencode,"mp3" %}</location>
+      <location>http://{{ host }}{% url telemeta-item-export item|code_or_id,"mp3" %}</location>
       <duration>{{ item.get_duration|mul:1000 }}</duration>
-      <info>http://{{ host }}{% url telemeta-item-detail item.id|urlencode %}</info>
+      <info>http://{{ host }}{% url telemeta-item-detail item|code_or_id %}</info>
     </track>
 {% endblock %}
 
index 39c5be2a37b7fad290913469f9a48a751e4e9838..622cec0a9d2a4c436592298ab85f5a6be066556e 100644 (file)
@@ -1,5 +1,8 @@
 from django import template
 from django.utils.http import urlquote
+from telemeta.models import MediaItem, MediaCollection
+from django.core.urlresolvers import reverse
+import telemeta.models.dublincore as dc
 
 register = template.Library()
 
@@ -69,3 +72,24 @@ def build_query_string(vars):
       return "&amp;".join(args)
     return ''
 
+@register.filter
+def code_or_id(resource):
+    if resource.code:
+        return resource.code
+    else:
+        return resource.id
+     
+@register.filter
+def is_item(resource):
+    return isinstance(resource, MediaItem)
+
+@register.filter
+def is_collection(resource):
+    return isinstance(resource, MediaCollection)
+
+@register.filter
+def to_dublincore(resource):
+    if isinstance(resource, MediaItem):
+        return dc.express_item(resource)
+    else:
+        return dc.express_collection(resource)
index db45bae25734cb0af981ca2984d1f70be9294d90..ae5e3b499006bf79326ee99a7d676a16f624bab2 100644 (file)
@@ -322,9 +322,11 @@ class RelatedDeleteTestCase(unittest.TestCase):
         self.assertEquals(q[0].publisher, self.publisher2)
         self.assertEquals(q[0].publisher_collection, None)
 
-    def testOnDeleteCascadeMultiple(self):
+    def testOnDeleteMultiple(self):
         Publisher.objects.all().delete()
         self.assertEquals(Publisher.objects.count(), 0)
         self.assertEquals(PublisherCollection.objects.count(), 0)
         self.assertEquals(MediaCollection.objects.count(), 2)
 
+        
+
index 160163d0a9157de948fff975ceb7e130e67b8b1d..9fded5a40c9a620c57f352aa52015ab724ff85ac 100644 (file)
@@ -52,8 +52,6 @@ all_items = { 'queryset': MediaItem.objects.all(), }
 all_collections = { 'queryset': MediaCollection.objects.all(), }
 
 # ID's regular expressions
-i_ex = MediaItem.id_regex
-c_ex = MediaCollection.id_regex
 export_extensions = "|".join(web_view.list_export_extensions())
 
 htdocs = os.path.dirname(__file__) + '/htdocs'
@@ -65,22 +63,22 @@ urlpatterns = patterns('',
     url(r'^items/$', 'django.views.generic.list_detail.object_list', 
         dict(all_items, paginate_by=20, template_name="telemeta/mediaitem_list.html"),
         name="telemeta-items"),
-    url(r'^items/(?P<item_id>' + i_ex + ')/$', web_view.item_detail, 
+    url(r'^items/(?P<item_key>[A-Z0-9_]+)/$', web_view.item_detail, 
         name="telemeta-item-detail"),
-    url(r'^items/(?P<item_id>' + i_ex + ')/dc/$', web_view.item_detail, 
+    url(r'^items/(?P<item_key>[A-Z0-9_]+)/dc/$', web_view.item_detail, 
         {'template': 'telemeta/mediaitem_detail_dc.html'},
         name="telemeta-item-dublincore"),
-    url(r'^items/(?P<item_id>' + i_ex + ')/dc/xml/$', web_view.item_detail, 
+    url(r'^items/(?P<item_key>[A-Z0-9_]+)/dc/xml/$', web_view.item_detail, 
         {'format': 'dublin_core_xml'},
         name="telemeta-item-dublincore-xml"),
-    url(r'^items/download/(?P<item_id>' + i_ex + ')\.(?P<extension>' 
+    url(r'^items/download/(?P<item_key>[A-Z0-9_]+)\.(?P<extension>' 
             + export_extensions + ')$', 
         web_view.item_export,
         name="telemeta-item-export"),
-    url(r'^items/(?P<item_id>' + i_ex + ')/visualize/(?P<visualizer_id>[0-9a-z_]+)/(?P<width>[0-9A-Z]+)x(?P<height>[0-9A-Z]+)/$', 
+    url(r'^items/(?P<item_key>[A-Z0-9_]+)/visualize/(?P<visualizer_id>[0-9a-z_]+)/(?P<width>[0-9A-Z]+)x(?P<height>[0-9A-Z]+)/$', 
         web_view.item_visualize,
         name="telemeta-item-visualize"),
-    url(r'^items/(?P<item_id>' + i_ex + ')/item_xspf.xml$', 
+    url(r'^items/(?P<item_key>[A-Z0-9_]+)/item_xspf.xml$', 
         web_view.item_playlist, 
         dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"),
         name="telemeta-item-xspf"),
@@ -93,19 +91,15 @@ urlpatterns = patterns('',
     url(r'^collections/?page=(?P<page>[0-9]+)$', 
         'django.views.generic.list_detail.object_list',
         dict(all_collections, paginate_by=20)),
-    url(r'^collections/(?P<object_id>' + c_ex + ')/$', 
-        'django.views.generic.list_detail.object_detail',
-        dict(all_collections, template_name="telemeta/collection_detail.html"),
-        name="telemeta-collection-detail"),
-    url(r'^collections/(?P<object_id>' + c_ex + ')/dc/$', 
-        'django.views.generic.list_detail.object_detail',
-        dict(all_collections, template_name="telemeta/collection_detail_dc.html"),
-        name="telemeta-collection-dublincore"),
-    url(r'^collections/(?P<collection_id>' + c_ex + ')/collection_xspf.xml$', 
+    url(r'^collections/(?P<code>[A-Z0-9_]+)/$', web_view.collection_detail,
+        dict(template="telemeta/collection_detail.html"), name="telemeta-collection-detail"),
+    url(r'^collections/(?P<code>[A-Z0-9_]+)/dc/$', web_view.collection_detail,
+        dict(template="telemeta/collection_detail_dc.html"), name="telemeta-collection-dublincore"),
+    url(r'^collections/(?P<code>[A-Z0-9_]+)/collection_xspf.xml$', 
         web_view.collection_playlist, 
         dict(template="telemeta/collection_xspf.xml", mimetype="application/xspf+xml"),
         name="telemeta-collection-xspf"),
-    url(r'^collections/(?P<collection_id>' + c_ex + ')/collection.m3u$',
+    url(r'^collections/(?P<code>[A-Z0-9_]+)/collection.m3u$',
         web_view.collection_playlist, 
         dict(template="telemeta/collection.m3u", mimetype="audio/mpegurl"),
         name="telemeta-collection-m3u"),
index 805a7074d45b307a74590b7c4215aa5731db86cc..ef7e4fa3071d2ff32ef09fa0ff7f35673b989d28 100644 (file)
@@ -54,6 +54,7 @@ from telemeta.analysis import *
 from telemeta.analysis.vamp import *
 import telemeta.interop.oai as oai
 from telemeta.interop.oaidatasource import TelemetaOAIDataSource
+from django.core.exceptions import ObjectDoesNotExist
 
 class WebView(Component):
     """Provide web UI methods"""
@@ -69,9 +70,14 @@ class WebView(Component):
         context = Context({})
         return HttpResponse(template.render(context))
 
-    def item_detail(self, request, item_id, template='telemeta/mediaitem_detail.html'):
+    def collection_detail(self, request, code, template=''):
+        collection = MediaCollection.objects.get(code=code)
+        return render_to_response(template, {'collection': collection})
+
+
+    def item_detail(self, request, item_key, template='telemeta/mediaitem_detail.html'):
         """Show the details of a given item"""
-        item = MediaItem.objects.get(pk=item_id)
+        item = MediaItem.objects.get(code_or_id=item_key)
         
         formats = []
         for exporter in self.exporters:
@@ -88,7 +94,11 @@ class WebView(Component):
 
         analyzers = []
         for analyzer in self.analyzers:
-            value = analyzer.render(item)
+            if item.file:
+                value = analyzer.render(item)
+            else:
+                value = 'N/A'
+
             analyzers.append({'name':analyzer.get_name(),
                               'id':analyzer.get_id(),
                               'unit':analyzer.get_unit(),
@@ -105,7 +115,7 @@ class WebView(Component):
                     'visualizers': visualizers, 'visualizer_id': visualizer_id,
                     'analysers': analyzers, 'vamp_plugins': vamp_plugin_list})
                     
-    def item_visualize(self, request, item_id, visualizer_id, width, height):
+    def item_visualize(self, request, item_key, visualizer_id, width, height):
         for visualizer in self.visualizers:
             if visualizer.get_id() == visualizer_id:
                 break
@@ -113,7 +123,7 @@ class WebView(Component):
         if visualizer.get_id() != visualizer_id:
             raise Http404
         
-        item = MediaItem.objects.get(pk=item_id)
+        item = MediaItem.objects.get(code_or_id=item_key)
 
         visualizer.set_colors((255,255,255), 'purple')
         stream = visualizer.render(item, width=int(width), height=int(height))
@@ -127,7 +137,7 @@ class WebView(Component):
             list.append(exporter.get_file_extension())
         return list
 
-    def item_export(self, request, item_id, extension):                    
+    def item_export(self, request, item_key, extension):                    
         """Export a given media item in the specified format (OGG, FLAC, ...)"""
         for exporter in self.exporters:
             if exporter.get_file_extension() == extension:
@@ -140,7 +150,7 @@ class WebView(Component):
 
         exporter.set_cache_dir(settings.TELEMETA_EXPORT_CACHE_DIR)
 
-        item = MediaItem.objects.get(pk=item_id)
+        item = MediaItem.objects.get(code_or_id=item_key)
 
         infile = item.file.path
         metadata = item.to_dublincore().flatten()
@@ -306,18 +316,20 @@ class WebView(Component):
 
         return self.edit_enumeration(request, enumeration_id)
   
-    def collection_playlist(self, request, collection_id, template, mimetype):
-        collection = MediaCollection.objects.get(id__exact=collection_id)
-        if not collection:
+    def collection_playlist(self, request, code, template, mimetype):
+        try:
+            collection = MediaCollection.objects.get(code=code)
+        except ObjectDoesNotExist:
             raise Http404
 
         template = loader.get_template(template)
         context = Context({'collection': collection, 'host': request.META['HTTP_HOST']})
         return HttpResponse(template.render(context), mimetype=mimetype)
 
-    def item_playlist(self, request, item_id, template, mimetype):
-        item = MediaItem.objects.get(id__exact=item_id)
-        if not item:
+    def item_playlist(self, request, item_key, template, mimetype):
+        try:
+            item = MediaItem.objects.get(code_or_id=item_key)
+        except ObjectDoesNotExist:
             raise Http404
 
         template = loader.get_template(template)