From: yomguy Date: Wed, 4 May 2011 12:25:47 +0000 (+0200) Subject: fix item and collection code validation with ValidationError X-Git-Tag: 1.1~248 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=cd8f344b53618f3b43f9a0db2cb43ab616f3bf70;p=telemeta.git fix item and collection code validation with ValidationError --- diff --git a/telemeta/__init__.py b/telemeta/__init__.py index 12c89576..d83fcaca 100644 --- a/telemeta/__init__.py +++ b/telemeta/__init__.py @@ -12,7 +12,7 @@ U{http://telemeta.org} """ __docformat__ = 'epytext en' -__version__ = '0.7.2' +__version__ = '0.8' __url__ = 'http://telemeta.org' __copyright__ = '(C) 2007-2011 Parisson' __license__ = 'CeCILL-2' diff --git a/telemeta/htdocs/css/telemeta.css b/telemeta/htdocs/css/telemeta.css index 8562ae99..9d91a018 100644 --- a/telemeta/htdocs/css/telemeta.css +++ b/telemeta/htdocs/css/telemeta.css @@ -792,6 +792,12 @@ table td.error { font-weight: bold; } +.infos li.error{ + color: red; + font-weight: bold; + font-size: 110%; +} + .gmap { border: solid 1px #888; margin-top: 0.8em; diff --git a/telemeta/models/__init__.py b/telemeta/models/__init__.py index 5dd06929..72aa524c 100644 --- a/telemeta/models/__init__.py +++ b/telemeta/models/__init__.py @@ -38,3 +38,4 @@ from telemeta.models.instrument import * from telemeta.models.enum import * from telemeta.models.system import * + diff --git a/telemeta/models/media.py b/telemeta/models/media.py index f59e5a1b..07dd5a15 100644 --- a/telemeta/models/media.py +++ b/telemeta/models/media.py @@ -35,15 +35,17 @@ from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ +from django.core.exceptions import ValidationError from telemeta.models.core import * from telemeta.models.enum import ContextKeyword from telemeta.util.unaccent import unaccent_icmp import re from telemeta.models.location import LocationRelation, Location from telemeta.models.system import Revision -from telemeta.models import query +from telemeta.models.query import * from django.forms import ModelForm + class MediaResource(ModelCore): "Base class of all media objects" @@ -66,16 +68,24 @@ class MediaResource(ModelCore): class Meta: abstract = True + +collection_published_code_regex = '[A-Za-z0-9._-]*' +collection_unpublished_code_regex = '[A-Za-z0-9._-]*' +collection_code_regex = '(?:%s|%s)' % (collection_published_code_regex, + collection_unpublished_code_regex) + class MediaCollection(MediaResource): "Describe a collection of items" element_type = 'collection' PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full')) - published_code_regex = '[A-Za-z0-9._-]*' - unpublished_code_regex = '[A-Za-z0-9._-]*' - code_regex = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex) + def is_valid_collection_code(value): + "Check if the collection code is well formed" + regex = '^' + collection_code_regex + '$' + if not re.match(regex, value): + raise ValidationError(u'%s is not a valid collection code' % value) - code = CharField(_('code'), unique=True, required=True) + code = CharField(_('code'), unique=True, required=True, validators=[is_valid_collection_code]) old_code = CharField(_('old code'), unique=True, null=True) reference = CharField(_('reference'), unique=True, null=True) title = CharField(_('title'), required=True) @@ -125,7 +135,7 @@ class MediaCollection(MediaResource): public_access = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES, max_length=16, default="metadata") - objects = query.MediaCollectionManager() + objects = MediaCollectionManager() def __unicode__(self): if self.title: @@ -179,29 +189,13 @@ class MediaCollection(MediaResource): duration = Duration() for item in self.items.all(): duration += item.computed_duration() - return duration + computed_duration.verbose_name = _('computed duration') - - def is_valid_code(self, code): - "Check if the collection code is well formed" - if self.is_published: - regex = '^' + self.published_code_regex + '$' - else: - regex = '^' + self.unpublished_code_regex + '$' - - if re.match(regex, code): - return True - - return False - - def save(self, force_insert=False, force_update=False, user=None): - if not self.code: - raise RequiredFieldError(self, self._meta.get_field('code')) - if not self.is_valid_code(self.code): - raise MediaInvalidCodeError("%s is not a valid code for this collection" % self.code) + + def save(self, force_insert=False, force_update=False, user=None, code=None): super(MediaCollection, self).save(force_insert, force_update) - + class Meta(MetaCore): db_table = 'media_collections' @@ -209,15 +203,16 @@ class MediaCollectionForm(ModelForm): class Meta: model = MediaCollection + +item_published_code_regex = '[A-Za-z0-9._-]*' +item_unpublished_code_regex = '[A-Za-z0-9._-]*' +item_code_regex = '(?:%s|%s)' % (item_published_code_regex, item_unpublished_code_regex) + class MediaItem(MediaResource): "Describe an item" element_type = 'item' PUBLIC_ACCESS_CHOICES = (('none', 'none'), ('metadata', 'metadata'), ('full', 'full')) - published_code_regex = '[A-Za-z0-9._-]*' - unpublished_code_regex = '[A-Za-z0-9._-]*' - code_regex = '(?:%s|%s)' % (published_code_regex, unpublished_code_regex) - collection = ForeignKey('MediaCollection', related_name="items", verbose_name=_('collection')) title = CharField(_('title')) @@ -250,7 +245,7 @@ class MediaItem(MediaResource): file = FileField(_('file'), upload_to='items/%Y/%m/%d', db_column="filename") public_access = CharField(_('public access'), choices=PUBLIC_ACCESS_CHOICES, max_length=16, default="metadata") - objects = query.MediaItemManager() + objects = MediaItemManager() def keywords(self): return ContextKeyword.objects.filter(item_relations__item = self) @@ -269,21 +264,20 @@ class MediaItem(MediaResource): "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.published_code_regex + '$' + regex = '^' + item_published_code_regex + '$' else: - regex = '^' + self.unpublished_code_regex + '$' - + regex = '^' + item_unpublished_code_regex + '$' if re.match(regex, code): return True - return False - def save(self, force_insert=False, force_update=False): + def clean(self): if self.code and not self.is_valid_code(self.code): - raise MediaInvalidCodeError("%s is not a valid item code for collection %s" + raise ValidationError("%s is not a valid item code for collection %s" % (self.code, self.collection.code)) + + def save(self, force_insert=False, force_update=False): super(MediaItem, self).save(force_insert, force_update) def computed_duration(self): @@ -373,9 +367,7 @@ class PlaylistResource(ModelCore): class Meta(MetaCore): db_table = 'playlist_resources' - -class MediaInvalidCodeError(Exception): - pass + class MediaItemMarker(MediaResource): "2D marker object : text value vs. time" diff --git a/telemeta/templates/telemeta_default/base.html b/telemeta/templates/telemeta_default/base.html index c3b918bc..12a28249 100644 --- a/telemeta/templates/telemeta_default/base.html +++ b/telemeta/templates/telemeta_default/base.html @@ -24,7 +24,7 @@ {% block extra_javascript %}{% endblock %} -{% if user.is_authenticated and perms.telemeta.change_mediaitem %} +{% if user.is_authenticated %} {% else %} diff --git a/telemeta/templates/telemeta_default/collection_add.html b/telemeta/templates/telemeta_default/collection_add.html index 800d748d..d83fcb84 100644 --- a/telemeta/templates/telemeta_default/collection_add.html +++ b/telemeta/templates/telemeta_default/collection_add.html @@ -11,6 +11,7 @@ {% block infos %}
{% csrf_token %} +
    {% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
{% for field in form %} {% if not field.html_name == "copied_from_item" %} diff --git a/telemeta/templates/telemeta_default/collection_edit.html b/telemeta/templates/telemeta_default/collection_edit.html index 18ec62db..7c585d3d 100644 --- a/telemeta/templates/telemeta_default/collection_edit.html +++ b/telemeta/templates/telemeta_default/collection_edit.html @@ -10,8 +10,9 @@ {% endblock %} {% block infos %} -
- {% csrf_token %} +
+ {% csrf_token %} +
    {% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
{% for field in form %} {% if not field.html_name == "copied_from_item" %} @@ -27,6 +28,6 @@ {% trans "Save" %} - - + + {% endblock infos%} diff --git a/telemeta/templates/telemeta_default/mediaitem_add.html b/telemeta/templates/telemeta_default/mediaitem_add.html index e2bdec6c..632ed544 100644 --- a/telemeta/templates/telemeta_default/mediaitem_add.html +++ b/telemeta/templates/telemeta_default/mediaitem_add.html @@ -20,6 +20,7 @@ {% block infos %}
{% csrf_token %} +
    {% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
{% for field in form %} {% if not field.html_name == "copied_from_item" %} diff --git a/telemeta/templates/telemeta_default/mediaitem_copy.html b/telemeta/templates/telemeta_default/mediaitem_copy.html index b503d3b1..23767a05 100644 --- a/telemeta/templates/telemeta_default/mediaitem_copy.html +++ b/telemeta/templates/telemeta_default/mediaitem_copy.html @@ -20,6 +20,7 @@ {% block infos %}
{% csrf_token %} +
    {% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
{% for field in form %} {% if not field.html_name == "copied_from_item" %} diff --git a/telemeta/templates/telemeta_default/mediaitem_edit.html b/telemeta/templates/telemeta_default/mediaitem_edit.html index 7aabeed3..542e4fc3 100644 --- a/telemeta/templates/telemeta_default/mediaitem_edit.html +++ b/telemeta/templates/telemeta_default/mediaitem_edit.html @@ -12,6 +12,7 @@ {% block infos %}
{% csrf_token %} +
    {% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
{% for field in form %} {% if not field.html_name == "copied_from_item" %} diff --git a/telemeta/web/base.py b/telemeta/web/base.py index d7100fc9..18f39a7f 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -366,7 +366,7 @@ class WebView(object): else: form = MediaItemForm(instance=item) - return render(request, template, {'item': item, "form": form}) + return render(request, template, {'item': item, 'form': form}) @method_decorator(permission_required('telemeta.add_mediaitem')) def item_copy(self, request, public_id, template='telemeta/mediaitem_copy.html'):