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