diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-01 15:50:52 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 09:57:24 +0200 |
commit | 572b9047260322ed19cc9f674657b8be8d62c052 (patch) | |
tree | 0ed9392291c50980c7dbff14c9a05edc601076de /ishtar_common/models.py | |
parent | 66a376e081e335cf94ecf6fd41e5fe13a5445c57 (diff) | |
download | Ishtar-572b9047260322ed19cc9f674657b8be8d62c052.tar.bz2 Ishtar-572b9047260322ed19cc9f674657b8be8d62c052.zip |
Adapt forms, wizards, views, urls for new management of documents (refs #4107)
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 106 |
1 files changed, 58 insertions, 48 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index ef4ae63e2..995a2c136 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -51,7 +51,7 @@ from django.db.utils import DatabaseError from django.template.defaultfilters import slugify from django.utils.functional import lazy from django.utils.safestring import SafeUnicode, mark_safe -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _, ugettext from secretary import Renderer as SecretaryRenderer from simple_history.models import HistoricalRecords as BaseHistoricalRecords from unidecode import unidecode @@ -1244,7 +1244,14 @@ class FixAssociated(object): setattr(item, subkey, new_value) -class BaseHistorizedItem(FullSearch, Imported, JsonData, FixAssociated): +class DocumentItem(object): + @property + def images(self): + return self.documents.filter(image__isnull=False).exclude(image="") + + +class BaseHistorizedItem(FullSearch, Imported, JsonData, FixAssociated, + DocumentItem): """ Historized item with external ID management. All historized items are searcheable and have a data json field @@ -3079,7 +3086,18 @@ post_save.connect(post_save_cache, sender=LicenseType) post_delete.connect(post_save_cache, sender=LicenseType) -class BaseSource(OwnPerms, ImageModel, FullSearch): +class Document(OwnPerms, ImageModel, FullSearch): + # order is important: put the image in the first match found + # other will be symbolic links + RELATED_MODELS = [ + 'treatment_files', 'treatments', 'finds', 'context_records', + 'operations', 'sites', 'warehouses', + ] + + LINK_SPLIT = u"<||>" + + + title = models.TextField(_(u"Title"), blank=True, default='') index = models.IntegerField(verbose_name=_(u"Index"), blank=True, null=True) @@ -3125,21 +3143,51 @@ class BaseSource(OwnPerms, ImageModel, FullSearch): BASE_SEARCH_VECTORS = ['title', 'source_type__label', 'external_id', 'reference', 'description', 'comment', 'additional_information'] - PARENT_SEARCH_VECTORS = ['authors'] + PARENT_SEARCH_VECTORS = ['authors', ] class Meta: - abstract = True + verbose_name = _(u"Document") + verbose_name_plural = _(u"Documents") + ordering = ('title',) + permissions = ( + ("view_document", + ugettext(u"Can view all Documents")), + ("view_own_document", + ugettext(u"Can view own Document")), + ("add_own_document", + ugettext(u"Can add own Document")), + ("change_own_document", + ugettext(u"Can change own Document")), + ("delete_own_document", + ugettext(u"Can delete own Document")), + ) def __unicode__(self): return self.title + """ + @property + def code(self): + if not self.index: + return u"{}-".format(self.operation.code_patriarche or '') + return u"{}-{:04d}".format(self.operation.code_patriarche or '', + self.index) + """ + + @classmethod + def get_query_owns(cls, ishtaruser): + Operation = cls.operations.rel.related_model + ArchaeologicalSite = cls.sites.rel.related_model + q = cls._construct_query_own( + 'operations__', Operation._get_query_owns_dicts(ishtaruser) + ) | cls._construct_query_own( + 'sites__', ArchaeologicalSite._get_query_owns_dicts(ishtaruser) + ) + return q + def get_associated_operation(self): raise NotImplementedError() - def _get_base_image_path(self): - base = self.owner._get_base_image_path() - return u"{}/sources".format(base) - @property def associated_filename(self): values = [unicode(getattr(self, attr)) @@ -3147,25 +3195,6 @@ class BaseSource(OwnPerms, ImageModel, FullSearch): if getattr(self, attr)] return slugify(u"-".join(values)) - -class Document(BaseSource): - pass - - -class IshtarImage(BaseSource): - # order is important: put the image in the first match found - # other will be symbolic links - RELATED_MODELS = [ - 'treatmentimage_set', 'findimage_set', 'contextrecordimage_set', - 'operationimage_set', 'siteimage_set', 'warehouseimage_set', - ] - LINK_SPLIT = u"<||>" - - class Meta: - verbose_name = _(u"Image") - verbose_name_plural = _(u"Images") - ordering = ('title',) - def _get_base_image_paths(self): for related_model in self.RELATED_MODELS: q = getattr(self, related_model).all() @@ -3269,8 +3298,7 @@ class IshtarImage(BaseSource): def save(self, *args, **kwargs): no_path_change = 'no_path_change' in kwargs \ and kwargs.pop('no_path_change') - - super(IshtarImage, self).save(*args, **kwargs) + super(Document, self).save(*args, **kwargs) if self.image and not no_path_change and \ not getattr(self, '_no_path_change', False): @@ -3281,24 +3309,6 @@ class IshtarImage(BaseSource): self.save(no_path_change=True) -class ThroughImage(models.Model): - image = models.ForeignKey( - IshtarImage, on_delete=models.CASCADE) - is_main = models.BooleanField(_(u"Main image"), default=False) - - class Meta: - ordering = ('-is_main', 'image__name') - abstract = True - - def save(self, force_insert=False, force_update=False, using=None, - update_fields=None): - super(ThroughImage, self).save( - force_insert=force_insert, force_update=force_update, using=using, - update_fields=update_fields) - # force relocation of image file and creation of symlinks - self.image.save() - - class Arrondissement(models.Model): name = models.CharField(u"Nom", max_length=30) department = models.ForeignKey(Department, verbose_name=u"Département") |