]> git.parisson.com Git - telemeta.git/commitdiff
enforce valid code upon media object saving ; rename save_by_user() to save_with_revi...
authorolivier <>
Wed, 20 Jan 2010 13:05:04 +0000 (13:05 +0000)
committerolivier <>
Wed, 20 Jan 2010 13:05:04 +0000 (13:05 +0000)
telemeta/models/crem.py
telemeta/tests/model_tests.py

index 12a4579e7cfac98763e464cae02ae58a6001cbe7..cb38cddba33083ae1f56c859800c1d7364f9ae96 100755 (executable)
 #          David LIPSZYC <davidlipszyc@gmail.com>
 
 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
index ae68a520f77398887a0482b4d22ccfb00530cbc7..59a216281c4b94bea35024d1e9e9d9b80e6de018 100644 (file)
@@ -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: