diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 174 |
1 files changed, 120 insertions, 54 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index d7e63856b..2a12edc02 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -42,7 +42,7 @@ from django.core.urlresolvers import reverse, NoReverseMatch from django.db.utils import DatabaseError from django.db.models import Q, Max, Count from django.db.models.base import ModelBase -from django.db.models.signals import post_save, pre_delete +from django.db.models.signals import post_save, pre_delete, post_delete from django.utils.translation import ugettext_lazy as _, ugettext, \ pgettext_lazy @@ -188,7 +188,7 @@ def valid_ids(cls): cls.objects.get(pk=v) except ObjectDoesNotExist: raise ValidationError( - _(u"An item selected is not a valid item.")) + _(u"A selected item is not a valid item.")) return func @@ -199,7 +199,7 @@ def is_unique(cls, field): try: assert cls.objects.filter(**query).count() == 0 except AssertionError: - raise ValidationError(_(u"This item already exist.")) + raise ValidationError(_(u"This item already exists.")) return func @@ -249,7 +249,24 @@ class OwnPerms: return cls.objects.filter(query).order_by(*cls._meta.ordering) -class GeneralType(models.Model): +class Cached(object): + slug_field = 'txt_idx' + + @classmethod + def get_cache(cls, slug): + cache_key, value = get_cache(cls, slug) + if value: + return value + try: + k = {cls.slug_field: slug} + obj = cls.objects.get(**k) + cache.set(cache_key, obj, settings.CACHE_TIMEOUT) + return obj + except cls.DoesNotExist: + return None + + +class GeneralType(models.Model, Cached): """ Abstract class for "types" """ @@ -457,18 +474,6 @@ class GeneralType(models.Model): for item in cls.objects.all(): item.generate_key() - @classmethod - def get_cache(cls, slug): - cache_key, value = get_cache(cls, slug) - if value: - return value - try: - obj = cls.objects.get(txt_idx=slug) - cache.set(cache_key, obj, settings.CACHE_TIMEOUT) - return obj - except cls.DoesNotExist: - return None - class ItemKey(models.Model): key = models.CharField(_(u"Key"), max_length=100) @@ -477,7 +482,7 @@ class ItemKey(models.Model): content_object = generic.GenericForeignKey('content_type', 'object_id') importer = models.ForeignKey( 'Import', null=True, blank=True, - help_text=_(u"Key specific to an import")) + help_text=_(u"Specific key to an import")) def __unicode__(self): return self.key @@ -765,7 +770,79 @@ class LightHistorizedItem(BaseHistorizedItem): return True -class GlobalVar(models.Model): +class IshtarSiteProfile(models.Model, Cached): + slug_field = 'slug' + label = models.TextField(_(u"Name")) + slug = models.SlugField(_(u"Slug"), unique=True) + description = models.TextField(_(u"Description"), null=True, blank=True) + files = models.BooleanField(_(u"Files module"), default=False) + context_record = models.BooleanField(_(u"Context records module"), + default=False) + find = models.BooleanField(_(u"Finds module"), default=False, + help_text=_(u"Need context records module")) + warehouse = models.BooleanField( + _(u"Warehouses module"), default=False, + help_text=_(u"Need finds module")) + active = models.BooleanField(_(u"Current active"), default=False) + + class Meta: + verbose_name = _(u"Ishtar site profile") + verbose_name_plural = _(u"Ishtar site profiles") + ordering = ['label'] + + def __unicode__(self): + return unicode(self.label) + + def save(self, *args, **kwargs): + raw = False + if 'raw' in kwargs: + raw = kwargs.pop('raw') + super(IshtarSiteProfile, self).save(*args, **kwargs) + obj = self + if raw: + return obj + q = self.__class__.objects.filter(active=True).exclude(slug=self.slug) + if obj.active and q.count(): + for profile in q.all(): + profile.active = False + profile.save(raw=True) + changed = False + if not obj.active and not q.count(): + obj.active = True + changed = True + if obj.warehouse and not obj.find: + obj.find = True + changed = True + if obj.find and not obj.context_record: + obj.context_record = True + changed = True + if changed: + obj = obj.save(raw=True) + return obj + + +def get_current_profile(force=False): + cache_key, value = get_cache(IshtarSiteProfile, ['is-current-profile']) + if value and not force: + return value + q = IshtarSiteProfile.objects.filter(active=True) + if not q.count(): + obj = IshtarSiteProfile.objects.create( + label="Default profile", slug='default', active=True) + else: + obj = q.all()[0] + cache.set(cache_key, obj, settings.CACHE_TIMEOUT) + return obj + + +def cached_site_changed(sender, **kwargs): + get_current_profile(force=True) + +post_save.connect(cached_site_changed, sender=IshtarSiteProfile) +post_delete.connect(cached_site_changed, sender=IshtarSiteProfile) + + +class GlobalVar(models.Model, Cached): slug = models.SlugField(_(u"Variable name"), unique=True) description = models.TextField(_(u"Description of the variable"), null=True, blank=True) @@ -779,18 +856,6 @@ class GlobalVar(models.Model): def __unicode__(self): return unicode(self.slug) - @classmethod - def get_cache(cls, slug): - cache_key, value = get_cache(cls, slug) - if value: - return value - try: - obj = cls.objects.get(slug=slug) - cache.set(cache_key, obj.value, settings.CACHE_TIMEOUT) - return obj.value - except cls.DoesNotExist: - return None - def cached_globalvar_changed(sender, **kwargs): if not kwargs['instance']: @@ -1174,29 +1239,29 @@ class OrganizationType(GeneralType): verbose_name_plural = _(u"Organization types") ordering = ('label',) -MODELS = [ - ('archaeological_operations.models.Operation', _(u"Operation")), - ('archaeological_operations.models.ArchaeologicalSite', - _(u"Archaeological site")), - ('archaeological_operations.models.Parcel', _(u"Parcels")), - ('archaeological_operations.models.OperationSource', - _(u"Operation source")), -] - IMPORTER_CLASSES = {} -if 'archaeological_files' in settings.INSTALLED_APPS: - MODELS = [('archaeological_files.models.File', _(u"Archaeological files"))]\ - + MODELS - IMPORTER_CLASSES.update({ - 'sra-pdl-files': - 'archaeological_files.data_importer.FileImporterSraPdL'}) -if 'archaeological_context_records' in settings.INSTALLED_APPS: +IMPORTER_CLASSES.update({ + 'sra-pdl-files': + 'archaeological_files.data_importer.FileImporterSraPdL'}) + + +def get_importer_models(): + MODELS = [ + ('archaeological_operations.models.Operation', _(u"Operation")), + ('archaeological_operations.models.ArchaeologicalSite', + _(u"Archaeological site")), + ('archaeological_operations.models.Parcel', _(u"Parcels")), + ('archaeological_operations.models.OperationSource', + _(u"Operation source")), + ] + MODELS = [('archaeological_files.models.File', + _(u"Archaeological files"))] + MODELS MODELS = [('archaeological_context_records.models.ContextRecord', _(u"Context records")), ] + MODELS -if 'archaeological_finds' in settings.INSTALLED_APPS: MODELS = [('archaeological_finds.models.BaseFind', _(u"Finds")), ] + MODELS + return MODELS def get_model_fields(model): @@ -1234,7 +1299,8 @@ class ImporterType(models.Model): users = models.ManyToManyField('IshtarUser', verbose_name=_(u"Users"), blank=True, null=True) associated_models = models.CharField(_(u"Associated model"), - max_length=200, choices=MODELS) + max_length=200, + choices=get_importer_models()) is_template = models.BooleanField(_(u"Is template"), default=False) unicity_keys = models.CharField(_(u"Unicity keys (separator \";\")"), blank=True, null=True, max_length=500) @@ -1429,7 +1495,7 @@ class ImporterDuplicateField(models.Model): column = models.ForeignKey(ImporterColumn, related_name='duplicate_fields') field_name = models.CharField(_(u"Field name"), blank=True, null=True, max_length=200) - force_new = models.BooleanField(_(u"Force creation of new item"), + force_new = models.BooleanField(_(u"Force creation of new items"), default=False) concat = models.BooleanField(_(u"Concatenate with existing"), default=False) @@ -1463,7 +1529,7 @@ class ImportTarget(models.Model): target = models.CharField(u"Target", max_length=500) regexp_filter = models.ForeignKey("Regexp", blank=True, null=True) formater_type = models.ForeignKey("FormaterType") - force_new = models.BooleanField(_(u"Force creation of new item"), + force_new = models.BooleanField(_(u"Force creation of new items"), default=False) concat = models.BooleanField(_(u"Concatenate with existing"), default=False) @@ -1729,7 +1795,7 @@ class Import(models.Model): null=True) end_date = models.DateTimeField(_(u"End date"), blank=True, null=True, editable=False) - seconds_remaining = models.IntegerField(_(u"Seconds remaining"), + seconds_remaining = models.IntegerField(_(u"Remaining seconds"), blank=True, null=True, editable=False) @@ -1895,7 +1961,7 @@ class Organization(Address, Merge, OwnPerms, ValueGetter): verbose_name = _(u"Organization") verbose_name_plural = _(u"Organizations") permissions = ( - ("view_organization", ugettext(u"Can view all Organization")), + ("view_organization", ugettext(u"Can view all Organizations")), ("view_own_organization", ugettext(u"Can view own Organization")), ("add_own_organization", ugettext(u"Can add own Organization")), ("change_own_organization", @@ -1950,7 +2016,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter): TYPE = ( ('Mr', _(u'Mr')), ('Ms', _(u'Miss')), - ('Mr and Miss', _(u'Mr and Miss')), + ('Mr and Miss', _(u'Mr and Mrs')), ('Md', _(u'Mrs')), ('Dr', _(u'Doctor')), ) @@ -1973,7 +2039,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter): verbose_name = _(u"Person") verbose_name_plural = _(u"Persons") permissions = ( - ("view_person", ugettext(u"Can view all Person")), + ("view_person", ugettext(u"Can view all Persons")), ("view_own_person", ugettext(u"Can view own Person")), ("add_own_person", ugettext(u"Can add own Person")), ("change_own_person", ugettext(u"Can change own Person")), |