+++ /dev/null
-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)
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)
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
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)
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
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"
""
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):
return result
+
class MediaItemQuerySet(CoreQuerySet):
"Base class for all media item query sets"
--- /dev/null
+{% extends "telemeta_default/inc/dublincore.html" %}
+
#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 %}
<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
</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
{% 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:" " }}</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 %}
{% 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 %}
<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 %}
{% 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 %}
--- /dev/null
+{% 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:" " }}</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>
{% 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>
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
{% 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
<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
-->\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
<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
{% 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
{% 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:" " }}</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
<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 %}
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()
return "&".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)
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)
+
+
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'
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"),
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"),
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"""
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:
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(),
'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
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))
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:
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()
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)