From 61fb2db56b5c90a1e1082b6ad4e453dbf97ef1d4 Mon Sep 17 00:00:00 2001 From: yomguy Date: Wed, 2 Feb 2011 15:13:41 +0100 Subject: [PATCH] add MediaItem formset for edit, fix aprrox_duration bug when save --- telemeta/models/core.py | 3 +- telemeta/models/media.py | 5 +- telemeta/models/query.py | 6 +- .../telemeta/mediaitem_detail_edit.html | 1 + .../telemeta_default/mediaitem_detail.html | 5 +- .../mediaitem_detail_edit.html | 144 ++++++++++++++++++ telemeta/urls.py | 3 + telemeta/web/base.py | 80 +++++++++- 8 files changed, 242 insertions(+), 5 deletions(-) create mode 100644 telemeta/templates/telemeta/mediaitem_detail_edit.html create mode 100644 telemeta/templates/telemeta_default/mediaitem_detail_edit.html diff --git a/telemeta/models/core.py b/telemeta/models/core.py index a5ed16a1..7c568004 100644 --- a/telemeta/models/core.py +++ b/telemeta/models/core.py @@ -165,7 +165,8 @@ class DurationField(models.Field): # information), but this can be a side-effect of interacting with a # database backend (e.g. Oracle), so we'll be accommodating. return self.to_python(value.time()) - + else: + value = str(value) try: return Duration.fromstr(value) except ValueError: diff --git a/telemeta/models/media.py b/telemeta/models/media.py index c2747ee0..5019b940 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -41,6 +41,7 @@ import re from telemeta.models.location import LocationRelation, Location from telemeta.models.system import Revision from telemeta.models import query +from django.forms import ModelForm class MediaResource(ModelCore): "Base class of all media objects" @@ -202,7 +203,7 @@ class MediaCollection(MediaResource): class Meta(MetaCore): db_table = 'media_collections' - + class MediaItem(MediaResource): "Describe an item" element_type = 'item' @@ -374,3 +375,5 @@ class MediaItemMarker(ModelCore): def __unicode__(self): return self.time + ' : ' + self.description + '(' + self.author + ')' + + diff --git a/telemeta/models/query.py b/telemeta/models/query.py index f99300ca..7e190693 100644 --- a/telemeta/models/query.py +++ b/telemeta/models/query.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- + # -*- coding: utf-8 -*- # Copyright (C) 2007-2010 Samalyse SARL # # This software is a computer program whose purpose is to backup, analyse, @@ -57,6 +57,10 @@ class MediaItemQuerySet(CoreQuerySet): return self.extra( where = ["collection_id NOT IN (SELECT id FROM media_collections)"]); + def by_public_id(self, public_id): + "Find items by public_id" + return self.filter(public_id=public_id) + def by_recording_date(self, from_date, to_date = None): "Find items by recording date" if to_date is None: diff --git a/telemeta/templates/telemeta/mediaitem_detail_edit.html b/telemeta/templates/telemeta/mediaitem_detail_edit.html new file mode 100644 index 00000000..eeeec911 --- /dev/null +++ b/telemeta/templates/telemeta/mediaitem_detail_edit.html @@ -0,0 +1 @@ +{% extends "telemeta_default/mediaitem_detail_edit.html" %} diff --git a/telemeta/templates/telemeta_default/mediaitem_detail.html b/telemeta/templates/telemeta_default/mediaitem_detail.html index 44cc3460..0deefd7d 100644 --- a/telemeta/templates/telemeta_default/mediaitem_detail.html +++ b/telemeta/templates/telemeta_default/mediaitem_detail.html @@ -31,7 +31,10 @@ load_player({{ item.approx_duration.as_seconds }}); {% if item %} {% block submenu %} -
Dublin Core
+
+ + Dublin Core +
{% endblock %} {% block content %} diff --git a/telemeta/templates/telemeta_default/mediaitem_detail_edit.html b/telemeta/templates/telemeta_default/mediaitem_detail_edit.html new file mode 100644 index 00000000..d505c778 --- /dev/null +++ b/telemeta/templates/telemeta_default/mediaitem_detail_edit.html @@ -0,0 +1,144 @@ +{% extends "telemeta/base.html" %} +{% load telemeta_utils %} +{% load i18n %} + +{% block head_title %}{% trans "Item" %}{{item|prepend:': '}} - {{ block.super }}{% endblock %} + +{% block stylesheets %} +{{ block.super }} + + + +{% endblock %} +{% block extra_javascript %} + + + + + + + + +{% endblock %} + +{% if item %} +{% block submenu %} +
+ Dublin Core +
+{% endblock %} + +{% block content %} + +

Item : {{ item }}

+
+ +{% if item.file %} +
+ Minimize +
+
+
+
+ Maximize +
+
+
+
+
+ + +
+
+
+
+
+ +
+
+ + + +
+ +
+ + + + + + + {% for analyser in analysers %} + + + + + + {% endfor %} +
PropertyValueUnit
+ {{ analyser.name }} + + {{ analyser.value }} + + {{ analyser.unit }} +
+
+ +
+ + {% if audio_export_enabled %} +
+

{% trans "Download:" %} + {% for format in export_formats %} + {{ format.name }} + {% endfor %}

+
+ {% endif %} + +
+{% endif %} + +
+
{% csrf_token %} + {{ formset }} + +
+
+ +
+ +{% endblock %} +{% else %} +

No such item

+{% endif %} diff --git a/telemeta/urls.py b/telemeta/urls.py index a5253645..9e6b3a01 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -84,6 +84,9 @@ urlpatterns = patterns('', web_view.item_playlist, dict(template="telemeta/mediaitem_xspf.xml", mimetype="application/xspf+xml"), name="telemeta-item-xspf"), + url(r'^items/(?P[A-Za-z0-9._-]+)/edit/$', + web_view.item_detail_edit, + name="telemeta-item-detail-edit"), # collections url(r'^collections/$', 'django.views.generic.list_detail.object_list', diff --git a/telemeta/web/base.py b/telemeta/web/base.py index 2407adac..dac02486 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -50,6 +50,7 @@ from django.conf import settings from django.contrib import auth from django.contrib.auth.decorators import login_required from django.core.context_processors import csrf +from django.forms.models import modelformset_factory from telemeta.models import MediaItem, Location, MediaCollection, EthnicGroup from telemeta.models import dublincore, Enumeration, MediaItemMarker @@ -174,13 +175,88 @@ class WebView(object): self.cache.write_analyzer_xml(analyzers, analyze_file) - return render(request, template, {'item': item, 'export_formats': formats, 'visualizers': graphers, 'visualizer_id': grapher_id,'analysers': analyzers, #FIXME analysers 'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True) }) + def item_detail_edit(self, request, public_id, template='telemeta/mediaitem_detail_edit.html'): + """Show the details of a given item""" + item = MediaItem.objects.get(public_id=public_id) + + formats = [] + for encoder in self.encoders: + formats.append({'name': encoder.format(), 'extension': encoder.file_extension()}) + + graphers = [] + for grapher in self.graphers: + graphers.append({'name':grapher.name(), 'id': grapher.id()}) + if request.REQUEST.has_key('grapher_id'): + grapher_id = request.REQUEST['grapher_id'] + else: + grapher_id = 'waveform' + + analyze_file = public_id + '.xml' + + if self.cache.exists(analyze_file): + analyzers = self.cache.read_analyzer_xml(analyze_file) + if not item.approx_duration: + for analyzer in analyzers: + if analyzer['id'] == 'duration': + value = analyzer['value'] + time = value.split(':') + time[2] = time[2].split('.')[0] + time = ':'.join(time) + item.approx_duration = str(time) + item.save() + else: + analyzers = [] + analyzers_sub = [] + if item.file: + decoder = timeside.decoder.FileDecoder(item.file.path) + pipe = decoder + + for analyzer in self.analyzers: + subpipe = analyzer() + analyzers_sub.append(subpipe) + pipe = pipe | subpipe + + pipe.run() + + mime_type = decoder.format() + analyzers.append({'name': 'Mime type', 'id': 'mime_type', 'unit': '', 'value': mime_type}) + + for analyzer in analyzers_sub: + value = analyzer.result() + if analyzer.id() == 'duration': + approx_value = int(round(value)) + item.approx_duration = approx_value + item.save() + value = datetime.timedelta(0,value) + + analyzers.append({'name':analyzer.name(), + 'id':analyzer.id(), + 'unit':analyzer.unit(), + 'value':str(value)}) + + self.cache.write_analyzer_xml(analyzers, analyze_file) + + MediaItemFormSet = modelformset_factory(MediaItem) + if request.method == 'POST': + formset = MediaItemFormSet(request.POST, request.FILES, queryset=MediaItem.objects.filter(code=public_id)) + if formset.is_valid(): + formset.save() + # do something. + else: + formset = MediaItemFormSet(queryset=MediaItem.objects.filter(code=public_id)) + + return render(request, template, + {'item': item, 'export_formats': formats, + 'visualizers': graphers, 'visualizer_id': grapher_id,'analysers': analyzers, #FIXME analysers + 'audio_export_enabled': getattr(settings, 'TELEMETA_DOWNLOAD_ENABLED', True), "formset": formset, + }) + def item_analyze(self): pass @@ -565,3 +641,5 @@ class WebView(object): dict['author'] = marker.author list.append(dict) return list + + -- 2.39.5