From 59ecfdd6b5afca76e60a1efed3c3f480bb15f901 Mon Sep 17 00:00:00 2001
From: olivier <>
Date: Mon, 29 Sep 2008 17:19:30 +0000
Subject: [PATCH] fix compatibility with django 1.0
---
telemeta/admin.py | 33 ++++
telemeta/analysis/core.py | 4 +-
telemeta/dublincore.py | 2 +-
telemeta/models/__init__.py | 2 +-
telemeta/models/enum.py | 8 +-
telemeta/models/media.py | 189 +++++++++++----------
telemeta/templates/inc/mediaitem_list.html | 2 +-
telemeta/templates/search_criteria.html | 26 +--
telemeta/templatetags/telemeta_utils.py | 5 +-
telemeta/urls.py | 2 +-
telemeta/visualization/octave_core.py | 2 +-
telemeta/visualization/snack_core.py | 2 +-
telemeta/visualization/spectrogram3.py | 2 +-
telemeta/visualization/spectrogram4.py | 2 +-
telemeta/visualization/waveform.py | 2 +-
telemeta/visualization/waveform3.py | 2 +-
telemeta/visualization/waveform4.py | 2 +-
telemeta/web/base.py | 2 +-
18 files changed, 156 insertions(+), 133 deletions(-)
create mode 100644 telemeta/admin.py
diff --git a/telemeta/admin.py b/telemeta/admin.py
new file mode 100644
index 00000000..ae8784ab
--- /dev/null
+++ b/telemeta/admin.py
@@ -0,0 +1,33 @@
+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/analysis/core.py b/telemeta/analysis/core.py
index fe76ed01..2347bb3e 100644
--- a/telemeta/analysis/core.py
+++ b/telemeta/analysis/core.py
@@ -36,7 +36,7 @@ class AudioProcessor(Component):
self.clip = lambda val, low, high: min(high, max(low, val))
def pre_process(self, media_item):
- wav_file = settings.MEDIA_ROOT + '/' + media_item.file
+ wav_file = media_item.file.path
self.audio_file = audiolab.sndfile(wav_file, 'read')
self.frames = self.audio_file.get_nframes()
self.samplerate = self.audio_file.get_samplerate()
@@ -194,4 +194,4 @@ class AudioProcessor(Component):
return (max_value, min_value)
-
\ No newline at end of file
+
diff --git a/telemeta/dublincore.py b/telemeta/dublincore.py
index f9d0489d..e3062d34 100644
--- a/telemeta/dublincore.py
+++ b/telemeta/dublincore.py
@@ -27,7 +27,7 @@ class Resource(object):
result = {}
for element in self.elements:
if not result.has_key(element.name):
- result[element.name] = str(element.value)
+ result[element.name] = unicode(element.value)
return result
class Element(object):
diff --git a/telemeta/models/__init__.py b/telemeta/models/__init__.py
index e1e04a56..768c640e 100644
--- a/telemeta/models/__init__.py
+++ b/telemeta/models/__init__.py
@@ -7,6 +7,6 @@
#
# Author: Olivier Guilyardi
-from telemeta.models.media import MediaCollection, MediaItem, MediaPart
+from telemeta.models.media import MediaCollection, MediaItem, MediaPart, MediaCore
from telemeta.models.enum import PhysicalFormat, PublishingStatus
diff --git a/telemeta/models/enum.py b/telemeta/models/enum.py
index 94b3b5d1..aa4c9f65 100644
--- a/telemeta/models/enum.py
+++ b/telemeta/models/enum.py
@@ -12,9 +12,9 @@ from django.db.models import Model, CharField
class PhysicalFormat(Model):
"Physical support of media items"
- value = CharField(maxlength=250)
+ value = CharField(max_length=250)
is_enumeration = True
- def __str__(self):
+ def __unicode__(self):
return self.value
class Meta:
app_label = 'telemeta'
@@ -23,9 +23,9 @@ class PhysicalFormat(Model):
class PublishingStatus(Model):
"Publishing status of media items"
- value = CharField(maxlength=250)
+ value = CharField(max_length=250)
is_enumeration = True
- def __str__(self):
+ def __unicode__(self):
return self.value
class Meta:
app_label = 'telemeta'
diff --git a/telemeta/models/media.py b/telemeta/models/media.py
index 1aed1d36..3c41a27d 100644
--- a/telemeta/models/media.py
+++ b/telemeta/models/media.py
@@ -10,9 +10,9 @@
from django.db.models import Model, CharField, FileField, \
TextField, DecimalField, ForeignKey, DateField
from django.core.exceptions import ObjectDoesNotExist
-from django.core import validators
from django.conf import settings
from xml.dom.minidom import getDOMImplementation
+import re
import telemeta
from telemeta.core import *
@@ -21,7 +21,8 @@ from telemeta.models.query import MediaItemManager, MediaItemQuerySet, \
MediaCollectionManager, MediaCollectionQuerySet
# Regular (sub) expression for matching/validating media objects IDs
-media_id_regex = r'[0-9A-Za-z._-]+'
+# FIXME: need to use this in MediaCore.save()
+media_id_regex = r'[0-9A-Za-z._-]+'
class MediaModel(Component):
"Represent the whole model as a component"
@@ -64,49 +65,57 @@ class MediaCore(object):
element.appendChild(doc.createTextNode(value))
top.appendChild(element)
return doc
+
+ def is_well_formed_id(cls, value):
+ regex = re.compile(r"^" + media_id_regex + r"$")
+ if regex.match(value):
+ return True
+ else:
+ return False
+ is_well_formed_id = classmethod(is_well_formed_id)
+
class MediaCollection(Model, MediaCore):
"Group related media items"
id_regex = media_id_regex
- id_validator = validators.MatchesRegularExpression('^' + id_regex + '$')
-
- publisher_reference = CharField(maxlength=250, blank=True)
- physical_format = CharField(maxlength=250, blank=True)
- id = CharField(maxlength=250, primary_key=True,
- verbose_name='identifier', validator_list=[id_validator])
- title = CharField(maxlength=250)
- native_title = CharField(maxlength=250, blank=True)
- physical_items_num = CharField(maxlength=250, blank=True)
- publishing_status = CharField(maxlength=250, blank=True)
- is_original = CharField(maxlength=250, blank=True)
- is_full_copy = CharField(maxlength=250, blank=True)
+
+ publisher_reference = CharField(max_length=250, blank=True)
+ physical_format = CharField(max_length=250, blank=True)
+ id = CharField(max_length=250, primary_key=True,
+ verbose_name='identifier')
+ title = CharField(max_length=250)
+ native_title = CharField(max_length=250, blank=True)
+ physical_items_num = CharField(max_length=250, blank=True)
+ publishing_status = CharField(max_length=250, blank=True)
+ is_original = CharField(max_length=250, blank=True)
+ is_full_copy = CharField(max_length=250, blank=True)
copied_from = ForeignKey('self', null=True, blank=True)
- creator = CharField(maxlength=250)
- booklet_writer = CharField(maxlength=250, blank=True)
+ creator = CharField(max_length=250)
+ booklet_writer = CharField(max_length=250, blank=True)
booklet_description = TextField(blank=True)
- collector = CharField(maxlength=250, blank=True)
- publisher = CharField(maxlength=250, blank=True)
- date_published = CharField(maxlength=250, blank=True)
- publisher_collection= CharField(maxlength=250, blank=True)
- publisher_serial_id = CharField(maxlength=250, blank=True)
+ collector = CharField(max_length=250, blank=True)
+ publisher = CharField(max_length=250, blank=True)
+ date_published = CharField(max_length=250, blank=True)
+ publisher_collection= CharField(max_length=250, blank=True)
+ publisher_serial_id = CharField(max_length=250, blank=True)
ref_biblio = TextField(blank=True)
- acquisition_mode = CharField(maxlength=250, blank=True)
+ acquisition_mode = CharField(max_length=250, blank=True)
comment = TextField(blank=True)
- record_author = CharField(maxlength=250, blank=True)
- record_writer = CharField(maxlength=250, blank=True)
- rights = CharField(maxlength=250, blank=True)
- annee_enr = CharField(maxlength=250, blank=True)
- terrain_ou_autre = CharField(maxlength=250, blank=True)
- duree_approx = CharField(maxlength=250, blank=True)
- tri_dibm = CharField(maxlength=250, blank=True)
- travail = CharField(maxlength=250, blank=True)
+ record_author = CharField(max_length=250, blank=True)
+ record_writer = CharField(max_length=250, blank=True)
+ rights = CharField(max_length=250, blank=True)
+ annee_enr = CharField(max_length=250, blank=True)
+ terrain_ou_autre = CharField(max_length=250, blank=True)
+ duree_approx = CharField(max_length=250, blank=True)
+ tri_dibm = CharField(max_length=250, blank=True)
+ travail = CharField(max_length=250, blank=True)
compil_face_plage = TextField(blank=True)
- deposant_cnrs = CharField(maxlength=250, blank=True)
- fiches = CharField(maxlength=250, blank=True)
- a_informer = CharField(maxlength=250, blank=True)
- numerisation = CharField(maxlength=250, blank=True)
- champ36 = CharField(maxlength=250, blank=True)
+ deposant_cnrs = CharField(max_length=250, blank=True)
+ fiches = CharField(max_length=250, blank=True)
+ a_informer = CharField(max_length=250, blank=True)
+ numerisation = CharField(max_length=250, blank=True)
+ champ36 = CharField(max_length=250, blank=True)
objects = MediaCollectionManager()
@@ -171,55 +180,56 @@ class MediaCollection(Model, MediaCore):
groups.append(item.ethnie_grsocial)
return groups
- def __str__(self):
+ def __unicode__(self):
#return self.title
return self.id
+ def save(self, force_insert=False, force_update=False):
+ if not MediaCore.is_well_formed_id(self.id):
+ raise MediaInvalidIdError()
+ return super(MediaCollection, self).save(force_insert, force_update)
+
class Meta:
app_label = 'telemeta'
ordering = ['title']
db_table = 'telemeta_collection'
- class Admin:
- pass
-
class MediaItem(Model, MediaCore):
"Describe an item with metadata"
id_regex = media_id_regex
- id_validator = validators.MatchesRegularExpression('^' + id_regex + '$')
- ref = CharField(maxlength=250, blank=True)
- format = CharField(maxlength=250, blank=True)
+ ref = CharField(max_length=250, blank=True)
+ format = CharField(max_length=250, blank=True)
collection = ForeignKey(MediaCollection, related_name="items")
- face_plage = CharField(maxlength=250, blank=True)
- id = CharField(maxlength=250, primary_key=True,
- verbose_name='identifier', validator_list=[id_validator])
- duree = CharField(maxlength=250, blank=True)
- dates_enregistr = CharField(maxlength=250, blank=True)
- etat = CharField(maxlength=250, blank=True)
- region_village = CharField(maxlength=250, blank=True)
- ethnie_grsocial = CharField(maxlength=250, blank=True)
- titre_support = CharField(maxlength=250, blank=True)
- _title = CharField(maxlength=250, db_column='title', blank=True)
- transcrip_trad = CharField(maxlength=250, blank=True)
- auteur = CharField(maxlength=250, blank=True)
- form_genr_style = CharField(maxlength=250, blank=True)
- struct_modale = CharField(maxlength=250, blank=True)
- struct_rythm = CharField(maxlength=250, blank=True)
+ face_plage = CharField(max_length=250, blank=True)
+ id = CharField(max_length=250, primary_key=True,
+ verbose_name='identifier')
+ duree = CharField(max_length=250, blank=True)
+ dates_enregistr = CharField(max_length=250, blank=True)
+ etat = CharField(max_length=250, blank=True)
+ region_village = CharField(max_length=250, blank=True)
+ ethnie_grsocial = CharField(max_length=250, blank=True)
+ titre_support = CharField(max_length=250, blank=True)
+ _title = CharField(max_length=250, db_column='title', blank=True)
+ transcrip_trad = CharField(max_length=250, blank=True)
+ auteur = CharField(max_length=250, blank=True)
+ form_genr_style = CharField(max_length=250, blank=True)
+ struct_modale = CharField(max_length=250, blank=True)
+ struct_rythm = CharField(max_length=250, blank=True)
comm_fonctusage = TextField(blank=True)
- documentation = TextField(maxlength=250, blank=True)
- remarques = TextField(maxlength=250, blank=True)
- moda_execut = CharField(maxlength=250, blank=True)
- copie_de = CharField(maxlength=250, blank=True)
- enregistre_par = CharField(maxlength=250, blank=True)
- aire_geo_cult = CharField(maxlength=250, blank=True)
- annee_enreg = CharField(maxlength=250, blank=True)
- formstyl_generi = CharField(maxlength=250, blank=True)
- choixcollecteur = CharField(maxlength=250, blank=True)
- repere_bande = CharField(maxlength=250, blank=True)
- nroband_nropiec = CharField(maxlength=250, blank=True)
- continent = CharField(maxlength=250, blank=True)
+ documentation = TextField(max_length=250, blank=True)
+ remarques = TextField(max_length=250, blank=True)
+ moda_execut = CharField(max_length=250, blank=True)
+ copie_de = CharField(max_length=250, blank=True)
+ enregistre_par = CharField(max_length=250, blank=True)
+ aire_geo_cult = CharField(max_length=250, blank=True)
+ annee_enreg = CharField(max_length=250, blank=True)
+ formstyl_generi = CharField(max_length=250, blank=True)
+ choixcollecteur = CharField(max_length=250, blank=True)
+ repere_bande = CharField(max_length=250, blank=True)
+ nroband_nropiec = CharField(max_length=250, blank=True)
+ continent = CharField(max_length=250, blank=True)
file = FileField(upload_to='items/%Y/%m/%d', blank=True)
objects = MediaItemManager()
@@ -268,12 +278,14 @@ class MediaItem(Model, MediaCore):
return duration
- def __str__(self):
+ def __unicode__(self):
return self.title
- class Admin:
- pass
-
+ def save(self, force_insert=False, force_update=False):
+ if not MediaCore.is_well_formed_id(self.id):
+ raise MediaInvalidIdError()
+ return super(MediaItem, self).save(force_insert, force_update)
+
class Meta:
app_label = 'telemeta'
ordering = ['_title']
@@ -283,19 +295,19 @@ class MediaItem(Model, MediaCore):
class MediaPart(Model, MediaCore):
"Describe the part of a media item"
- contributor = CharField(maxlength=250, blank=True)
- coverage = CharField(maxlength=250, blank=True)
- creator = CharField(maxlength=250, blank=True)
+ contributor = CharField(max_length=250, blank=True)
+ coverage = CharField(max_length=250, blank=True)
+ creator = CharField(max_length=250, blank=True)
date = DateField()
- description = CharField(maxlength=250, blank=True)
- format = CharField(maxlength=250, blank=True)
- identifier = CharField(maxlength=250, blank=True)
- language = CharField(maxlength=250, blank=True)
- publisher = CharField(maxlength=250, blank=True)
- rights = CharField(maxlength=250, blank=True)
- source = CharField(maxlength=250, blank=True)
- subject = CharField(maxlength=250, blank=True)
- title = CharField(maxlength=250, blank=True)
+ description = CharField(max_length=250, blank=True)
+ format = CharField(max_length=250, blank=True)
+ identifier = CharField(max_length=250, blank=True)
+ language = CharField(max_length=250, blank=True)
+ publisher = CharField(max_length=250, blank=True)
+ rights = CharField(max_length=250, blank=True)
+ source = CharField(max_length=250, blank=True)
+ subject = CharField(max_length=250, blank=True)
+ title = CharField(max_length=250, blank=True)
media_item = ForeignKey(MediaItem)
#media_item.dublin_core = 'relation'
parent = ForeignKey('self', null=True, related_name='children')
@@ -304,7 +316,7 @@ class MediaPart(Model, MediaCore):
end = DecimalField(max_digits=11, decimal_places=3)
#comment = TextField(blank=True)
- def __str__(self):
+ def __unicode__(self):
return self.title
class Meta:
@@ -312,6 +324,5 @@ class MediaPart(Model, MediaCore):
ordering = ['title']
db_table = 'telemeta_part'
- class Admin:
- pass
-
+class MediaInvalidIdError(Exception):
+ pass
diff --git a/telemeta/templates/inc/mediaitem_list.html b/telemeta/templates/inc/mediaitem_list.html
index b231f2ca..9ef69716 100644
--- a/telemeta/templates/inc/mediaitem_list.html
+++ b/telemeta/templates/inc/mediaitem_list.html
@@ -9,7 +9,7 @@
{% endif %}
diff --git a/telemeta/templates/search_criteria.html b/telemeta/templates/search_criteria.html
index bfd32e05..584feb5e 100644
--- a/telemeta/templates/search_criteria.html
+++ b/telemeta/templates/search_criteria.html
@@ -2,7 +2,7 @@
{% load telemeta_utils %}
{% block extra_javascript %}
-
+
{% endblock %}
{% block content %}
@@ -71,26 +71,4 @@
-
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/telemeta/templatetags/telemeta_utils.py b/telemeta/templatetags/telemeta_utils.py
index b9d63daf..39c5be2a 100644
--- a/telemeta/templatetags/telemeta_utils.py
+++ b/telemeta/templatetags/telemeta_utils.py
@@ -1,4 +1,5 @@
from django import template
+from django.utils.http import urlquote
register = template.Library()
@@ -62,8 +63,8 @@ def build_query_string(vars):
args = []
for k, v in vars.iteritems():
if not isinstance(v, basestring):
- v = str(v)
- args.append(urllib.quote(k) + '=' + urllib.quote(v))
+ v = unicode(v)
+ args.append(urlquote(k) + '=' + urlquote(v))
return "&".join(args)
return ''
diff --git a/telemeta/urls.py b/telemeta/urls.py
index 2de399e1..b3ed6ec2 100644
--- a/telemeta/urls.py
+++ b/telemeta/urls.py
@@ -43,7 +43,7 @@ urlpatterns = patterns('',
url(r'^items/(?P' + i_ex + ')/dc/xml/$', web_view.item_detail,
{'format': 'dublin_core_xml'},
name="telemeta-item-dublincore-xml"),
- url(r'^items/download/(?P' + i_ex + ').(?P'
+ url(r'^items/download/(?P' + i_ex + ')\.(?P'
+ export_extensions + ')$',
web_view.item_export,
name="telemeta-item-export"),
diff --git a/telemeta/visualization/octave_core.py b/telemeta/visualization/octave_core.py
index 8b262b82..9109d43d 100644
--- a/telemeta/visualization/octave_core.py
+++ b/telemeta/visualization/octave_core.py
@@ -32,7 +32,7 @@ class OctaveCoreVisualizer(Component):
self.mFile = mFile
def get_wav_path(self, media_item):
- self.wavFile_path = settings.MEDIA_ROOT + '/' + media_item.file
+ self.wavFile_path = media_item.file.path
def octave_to_png_stream(self, media_item):
self.buffer_size = 0xFFFF
diff --git a/telemeta/visualization/snack_core.py b/telemeta/visualization/snack_core.py
index 888ab998..1232d880 100644
--- a/telemeta/visualization/snack_core.py
+++ b/telemeta/visualization/snack_core.py
@@ -22,7 +22,7 @@ class SnackCoreVisualizer(Component):
def get_snack_sound(self, media_item):
self.snd = tkSnack.Sound()
- self.snd.read(settings.MEDIA_ROOT + '/' + media_item.file)
+ self.snd.read(media_item.file.path)
return self.snd
def canvas_to_png_stream(self, canvas):
diff --git a/telemeta/visualization/spectrogram3.py b/telemeta/visualization/spectrogram3.py
index 455cf998..4317e0cc 100644
--- a/telemeta/visualization/spectrogram3.py
+++ b/telemeta/visualization/spectrogram3.py
@@ -27,7 +27,7 @@ class SpectrogramVisualizer3(Component):
def render(self, media_item, options=None):
"""Generator that streams the spectrogram as a PNG image with a python method"""
- wav_file = settings.MEDIA_ROOT + '/' + media_item.file
+ wav_file = media_item.file.path
pngFile_w = NamedTemporaryFile(suffix='.png')
pngFile_s = NamedTemporaryFile(suffix='.png')
image_width = 305
diff --git a/telemeta/visualization/spectrogram4.py b/telemeta/visualization/spectrogram4.py
index f92cd338..fcbe7ac8 100644
--- a/telemeta/visualization/spectrogram4.py
+++ b/telemeta/visualization/spectrogram4.py
@@ -27,7 +27,7 @@ class SpectrogramVisualizer3(Component):
def render(self, media_item, options=None):
"""Generator that streams the spectrogram as a PNG image with a python method"""
- wav_file = settings.MEDIA_ROOT + '/' + media_item.file
+ wav_file = media_item.file.path
pngFile_w = NamedTemporaryFile(suffix='.png')
pngFile_s = NamedTemporaryFile(suffix='.png')
image_width = 1800
diff --git a/telemeta/visualization/waveform.py b/telemeta/visualization/waveform.py
index fc89c718..6959cc40 100644
--- a/telemeta/visualization/waveform.py
+++ b/telemeta/visualization/waveform.py
@@ -33,7 +33,7 @@ class WaveFormVisualizer(Component):
pngFile = NamedTemporaryFile(suffix='.png')
wav2png = os.path.dirname(__file__) + '/wav2png/wav2png'
- args = "-i " + settings.MEDIA_ROOT + '/' + media_item.file + " "
+ args = "-i " + media_item.file.path + " "
args += "-o " + pngFile.name + " "
args += "-b ffffff "
args += "-l 000088 "
diff --git a/telemeta/visualization/waveform3.py b/telemeta/visualization/waveform3.py
index 3fbb7e09..85b5133f 100644
--- a/telemeta/visualization/waveform3.py
+++ b/telemeta/visualization/waveform3.py
@@ -27,7 +27,7 @@ class WaveFormVisualizer(Component):
def render(self, media_item, options=None):
"""Generator that streams the waveform as a PNG image with a python method"""
- wav_file = settings.MEDIA_ROOT + '/' + media_item.file
+ wav_file = media_item.file.path
pngFile_w = NamedTemporaryFile(suffix='.png')
pngFile_s = NamedTemporaryFile(suffix='.png')
image_width = 305
diff --git a/telemeta/visualization/waveform4.py b/telemeta/visualization/waveform4.py
index 07ff6dea..45865048 100644
--- a/telemeta/visualization/waveform4.py
+++ b/telemeta/visualization/waveform4.py
@@ -27,7 +27,7 @@ class WaveFormVisualizer(Component):
def render(self, media_item, options=None):
"""Generator that streams the waveform as a PNG image with a python method"""
- wav_file = settings.MEDIA_ROOT + '/' + media_item.file
+ wav_file = media_item.file.path
pngFile_w = NamedTemporaryFile(suffix='.png')
pngFile_s = NamedTemporaryFile(suffix='.png')
image_width = 1800
diff --git a/telemeta/web/base.py b/telemeta/web/base.py
index ec84704e..d303f588 100644
--- a/telemeta/web/base.py
+++ b/telemeta/web/base.py
@@ -114,7 +114,7 @@ class WebView(Component):
item = MediaItem.objects.get(pk=item_id)
- infile = settings.MEDIA_ROOT + "/" + item.file
+ infile = item.file.path
metadata = item.to_dublincore().flatten()
stream = exporter.process(item.id, infile, metadata)
--
2.39.5