From: olivier <> Date: Wed, 20 Jan 2010 13:05:04 +0000 (+0000) Subject: enforce valid code upon media object saving ; rename save_by_user() to save_with_revi... X-Git-Tag: 1.1~595 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=cd1737e80e13dc648a7cf87aa427bddc0132e1a0;p=telemeta.git enforce valid code upon media object saving ; rename save_by_user() to save_with_revision() ; do not disable save() --- diff --git a/telemeta/models/crem.py b/telemeta/models/crem.py index 12a4579e..cb38cddb 100755 --- a/telemeta/models/crem.py +++ b/telemeta/models/crem.py @@ -34,9 +34,11 @@ # David LIPSZYC from django.db import models +from django.core.exceptions import ObjectDoesNotExist import cremquery as query from xml.dom.minidom import getDOMImplementation from telemeta.util.unaccent import unaccent_icmp +import re class ModelCore(models.Model): @@ -108,22 +110,10 @@ class MediaCore(ModelCore): top.appendChild(element) return doc - def is_well_formed_id(cls, value): - "Check if the media id is well formed" - 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) - - def save(self, force_insert=False, force_update=False, using=None): - raise MissingUserError("save() method disabled, use save_by_user()") - - def save_by_user(self, user, force_insert=False, force_update=False, using=None): + def save_with_revision(self, user, force_insert=False, force_update=False, using=None): "Save a media object and add a revision" - super(MediaCore, self).save(force_insert, force_update, using) - Revision(element_type=self.element_type, element_id=self.id, user=user).touch() + self.save(force_insert, force_update, using) + Revision.touch(self, user) def get_revision(self): return Revision.objects.filter(element_type=self.element_type, element_id=self.id).order_by('-time')[0] @@ -230,6 +220,25 @@ class MediaCollection(MediaCore): return groups + 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}_[0-9]{3}$' + else: + regex = '^CNRSMH_I_[0-9]{4}_[0-9]{3}$' + + if re.match(regex, code): + return True + + return False + + def save(self, force_insert=False, force_update=False, using=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) + super(MediaCollection, self).save(force_insert, force_update, using) + class Meta(MetaCore): db_table = 'media_collections' @@ -276,6 +285,22 @@ class MediaItem(MediaCore): class Meta(MetaCore): db_table = 'media_items' + def is_valid_code(self, code): + "Check if the item code is well formed" + regex = '^' + self.collection.code + '_[0-9]{2}(_[0-9]{2})?$' + if re.match(regex, self.code): + return True + + return False + + def save(self, force_insert=False, force_update=False, using=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 item code for collection %s" + % (self.code, self.collection.code)) + super(MediaItem, self).save(force_insert, force_update, using) + def __unicode__(self): if self.code: return self.code @@ -550,14 +575,21 @@ class Revision(ModelCore): time = models.DateTimeField(auto_now_add=True) user = models.ForeignKey('User', db_column='username', related_name="revisions") - def touch(self): + @classmethod + def touch(cls, element, user): "Create or update a revision" - q = Revision.objects.filter(element_type=self.element_type, element_id=self.element_id) - if q.count(): - self.change_type = 'update' - else: - self.change_type = 'create' - self.save() + revision = cls(element_type=element.element_type, element_id=element.pk, + user=user, change_type='create') + if element.pk: + try: + element.__class__.objects.get(pk=element.pk) + except ObjectDoesNotExist: + pass + else: + revision.change_type = 'update' + + revision.save() + return revision class Meta(MetaCore): db_table = 'revisions' @@ -589,3 +621,6 @@ class RequiredFieldError(Exception): self.model = model self.field = field super(Exception, self).__init__('%s.%s is required' % (model._meta.object_name, field.name)) + +class MediaInvalidCodeError(Exception): + pass diff --git a/telemeta/tests/model_tests.py b/telemeta/tests/model_tests.py index ae68a520..59a21628 100644 --- a/telemeta/tests/model_tests.py +++ b/telemeta/tests/model_tests.py @@ -66,66 +66,66 @@ class CollectionItemTestCase(unittest.TestCase): self.d = EthnicGroup.objects.create(name="d") MediaCollection.objects.all().delete() - self.persepolis = MediaCollection(id=1, code="100", reference="A1", title="persepolis", - creator="Abraham LINCOLN", collector="Friedrich HEINZ", year_published=2009, + self.persepolis = MediaCollection(id=1, code="CNRSMH_E_1970_001_002", reference="A1", title="persepolis", + creator="Abraham LINCOLN", collector="Friedrich HEINZ", year_published=2009, is_published=True, recorded_from_year=1970, recorded_to_year=1980) - self.persepolis.save_by_user(self.david) + self.persepolis.save_with_revision(self.david) - self.volonte = MediaCollection(id=2, reference="A2", code="200", title="Volonté de puissance", + self.volonte = MediaCollection(id=2, reference="A2", code="CNRSMH_I_1960_001", title="Volonté de puissance", creator="Friedrich NIETZSCHE", collector="Jean AMORA", year_published=1999, recorded_from_year=1960, recorded_to_year=2000) - self.volonte.save_by_user(self.olivier) + self.volonte.save_with_revision(self.olivier) - self.nicolas = MediaCollection(id=3, reference="A3", code="300", title="petit nicolas", - creator="Georgette McKenic", collector="Paul MAILLE", year_published=1999, + self.nicolas = MediaCollection(id=3, reference="A3", code="CNRSMH_E_1967_123_456", title="petit nicolas", + creator="Georgette McKenic", collector="Paul MAILLE", year_published=1999, is_published=True, recorded_from_year=1967, recorded_to_year=1968) - self.nicolas.save_by_user(self.olivier) + self.nicolas.save_with_revision(self.olivier) MediaItem.objects.all().delete() - self.item_1 = MediaItem(id=1, collection=self.persepolis, code="1010", + self.item_1 = MediaItem(id=1, collection=self.persepolis, code="CNRSMH_E_1970_001_002_44", recorded_from_date="1971-01-12", recorded_to_date="1971-02-24", location=self.paris, ethnic_group=self.a, title="item 1", author="Mickael SHEPHERD", collector="Charles PREMIER", comment="comment 1") - self.item_1.save_by_user(self.david) + self.item_1.save_with_revision(self.david) - self.item_2 = MediaItem(id=2, collection=self.volonte, code="2020", + self.item_2 = MediaItem(id=2, collection=self.volonte, code="CNRSMH_I_1960_001_12_78", recorded_from_date="1981-01-12", recorded_to_date="1991-02-24", location=self.france, ethnic_group=self.a, title="item 2", author="Rick ROLL", comment="comment 2") - self.item_2.save_by_user(self.david) + self.item_2.save_with_revision(self.david) - self.item_3 = MediaItem(id=3, collection=self.nicolas, code="3030", + self.item_3 = MediaItem(id=3, collection=self.nicolas, code="CNRSMH_E_1967_123_456_01_99", recorded_from_date="1968-01-12", recorded_to_date="1968-02-24", location=self.belgique, ethnic_group=self.b, title="item 3", author="John SMITH", collector="Paul CARLOS", comment="comment 3", ) - self.item_3.save_by_user(self.olivier) + self.item_3.save_with_revision(self.olivier) - self.item_4 = MediaItem(id=4, collection=self.persepolis, code="4040", + self.item_4 = MediaItem(id=4, collection=self.persepolis, code="CNRSMH_E_1970_001_002_22_33", recorded_from_date="1972-01-12", recorded_to_date="1972-02-24", location=self.europe, ethnic_group=self.a, title="item 4", alt_title="I4", author="Keanu REAVES", collector="Christina BARCELONA", comment="comment 4") - self.item_4.save_by_user(self.olivier) + self.item_4.save_with_revision(self.olivier) - self.item_5 = MediaItem(id=5, collection=self.volonte,code="5050", + self.item_5 = MediaItem(id=5, collection=self.volonte,code="CNRSMH_I_1960_001_85", approx_duration="00:05:00", recorded_from_date="1978-01-12", recorded_to_date="1978-02-24", location=self.belgique, ethnic_group=self.a, title="item 5", alt_title="I5", author="Simon PAUL", collector="Javier BARDEM", comment="comment 5") - self.item_5.save_by_user(self.olivier) + self.item_5.save_with_revision(self.olivier) - self.item_6 = MediaItem(id=6, collection=self.persepolis, code="6060", + self.item_6 = MediaItem(id=6, collection=self.persepolis, code="CNRSMH_E_1970_001_002_90", recorded_from_date="1968-01-12", recorded_to_date="1968-02-11", location=self.france, ethnic_group=self.b, title="item 6", author="Paul ANDERSON", collector="Jim CARLSON", comment="comment 10000") - self.item_6.save_by_user(self.david) + self.item_6.save_with_revision(self.david) self.collections = MediaCollection.objects.all() self.items = MediaItem.objects.all() @@ -223,8 +223,8 @@ class CollectionItemTestCase(unittest.TestCase): def testWordSearchCore(self): "Test word_search property of CoreQuerySet class" self.assertEquals(self.collections.word_search("title", "volonté")[0], self.volonte) - self.assertEquals(self.collections.word_search("code", "100")[0], self.persepolis) - self.assertEquals(self.items.word_search("code", "1010")[0], self.item_1) + self.assertEquals(self.collections.word_search("code", "CNRSMH_E_1970_001_002")[0], self.persepolis) + self.assertEquals(self.items.word_search("code", "CNRSMH_E_1970_001_002_44")[0], self.item_1) result = self.items.word_search("comment", "comment").order_by("title") self.assertEquals(result[0], self.item_1) self.assertEquals(result[1], self.item_2) @@ -253,7 +253,7 @@ class CollectionItemTestCase(unittest.TestCase): "Test that a proper failure occur when a collection code isn't provided" c = MediaCollection() try: - c.save_by_user(self.olivier) + c.save_with_revision(self.olivier) except RequiredFieldError, e: self.assertEquals(e.field.name, 'code') else: