# 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):
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]
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'
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
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'
self.model = model
self.field = field
super(Exception, self).__init__('%s.%s is required' % (model._meta.object_name, field.name))
+
+class MediaInvalidCodeError(Exception):
+ pass
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()
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)
"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: