diff options
Diffstat (limited to 'archaeological_finds/models.py')
-rw-r--r-- | archaeological_finds/models.py | 95 |
1 files changed, 67 insertions, 28 deletions
diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index 2957c656d..01c904cc8 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -30,7 +30,7 @@ from ishtar_common.utils import cached_label_changed from ishtar_common.models import GeneralType, ImageModel, BaseHistorizedItem, \ ShortMenuItem, LightHistorizedItem, HistoricalRecords, OwnPerms, Source, \ - Person, Basket, get_external_id, post_save_cache + Organization, Person, Basket, get_external_id, post_save_cache from archaeological_operations.models import AdministrativeAct from archaeological_context_records.models import ContextRecord, Dating @@ -792,16 +792,16 @@ post_save.connect(post_save_cache, sender=TreatmentType) post_delete.connect(post_save_cache, sender=TreatmentType) -class Treatment(BaseHistorizedItem, OwnPerms): +class Treatment(BaseHistorizedItem, ImageModel, OwnPerms): SHOW_URL = 'show-treatment' - external_id = models.CharField(_(u"External ID"), blank=True, null=True, - max_length=120) - container = models.ForeignKey(Container, verbose_name=_(u"Container"), - blank=True, null=True) - description = models.TextField(_(u"Description"), blank=True, null=True) - comment = models.TextField(_(u"Comment"), blank=True, null=True) - treatment_type = models.ForeignKey(TreatmentType, - verbose_name=_(u"Treatment type")) + label = models.CharField(_(u"Label"), blank=True, null=True, + max_length=200) + other_reference = models.CharField(_(u"Other ref."), blank=True, null=True, + max_length=200) + year = models.IntegerField(_(u"Year"), default=2016) + index = models.IntegerField(_(u"Index"), default=1) + treatment_types = models.ManyToManyField( + TreatmentType, verbose_name=_(u"Treatment type")) location = models.ForeignKey( Warehouse, verbose_name=_(u"Location"), blank=True, null=True, help_text=_( @@ -810,12 +810,23 @@ class Treatment(BaseHistorizedItem, OwnPerms): other_location = models.CharField(_(u"Location (not referenced)"), max_length=200, blank=True, null=True) person = models.ForeignKey( - Person, verbose_name=_(u"Doer"), blank=True, null=True, + Person, verbose_name=_(u"Responsible"), blank=True, null=True, + on_delete=models.SET_NULL, related_name='treatments') + organization = models.ForeignKey( + Organization, verbose_name=_(u"Organization"), blank=True, null=True, on_delete=models.SET_NULL, related_name='treatments') + external_id = models.CharField(_(u"External ID"), blank=True, null=True, + max_length=200) + comment = models.TextField(_(u"Comment"), blank=True, null=True) + description = models.TextField(_(u"Description"), blank=True, null=True) + goal = models.TextField(_(u"Goal"), blank=True, null=True) start_date = models.DateField(_(u"Start date"), blank=True, null=True) end_date = models.DateField(_(u"End date"), blank=True, null=True) + container = models.ForeignKey(Container, verbose_name=_(u"Container"), + blank=True, null=True) + target_is_basket = models.BooleanField(_("Target a basket"), default=False) history = HistoricalRecords() - TABLE_COLS = ('treatment_type__label', 'person', 'start_date', + TABLE_COLS = ('treatment_type', 'person', 'start_date', 'downstream_cached_label', 'upstream_cached_label') EXTRA_REQUEST_KEYS = { "downstream_cached_label": "downstream__cached_label", @@ -829,6 +840,7 @@ class Treatment(BaseHistorizedItem, OwnPerms): class Meta: verbose_name = _(u"Treatment") verbose_name_plural = _(u"Treatments") + unique_together = ('year', 'index') permissions = ( ("view_treatment", ugettext(u"Can view all Treatments")), ("view_own_treatment", ugettext(u"Can view own Treatment")), @@ -843,6 +855,22 @@ class Treatment(BaseHistorizedItem, OwnPerms): lbl += u" %s %s" % (_(u"by"), unicode(self.person)) return lbl + def treatment_type(self): + """ + Treatment types label + :return: string + """ + return u" ; ".join([unicode(t) for t in self.treatment_types.all()]) + + def pre_save(self): + # is not new + if self.pk is not None: + return + self.index = 1 + q = Treatment.objects.filter(year=self.year) + if q.count(): + self.index = q.all().aggregate(Max('index'))['index__max'] + 1 + def save(self, *args, **kwargs): items, user, extra_args_for_new = [], None, [] if "items" in kwargs: @@ -852,23 +880,34 @@ class Treatment(BaseHistorizedItem, OwnPerms): if "extra_args_for_new" in kwargs: extra_args_for_new = kwargs.pop('extra_args_for_new') is_new = self.pk is None + self.pre_save() super(Treatment, self).save(*args, **kwargs) - if not is_new or not items: - return - if hasattr(items, "items"): - items = items.items.all() - for item in items: - new = item.duplicate(user) - item.downstream_treatment = self - item.save() - new.upstream_treatment = self - for k in extra_args_for_new: - setattr(new, k, extra_args_for_new[k]) - new.save() - # update baskets - for basket in FindBasket.objects.filter(items__pk=item.pk).all(): - basket.items.remove(item) - basket.items.add(new) + updated = [] + if is_new: + if hasattr(items, "items"): + items = items.items.all() + for item in items: + new = item.duplicate(user) + item.downstream_treatment = self + item.save() + new.upstream_treatment = self + for k in extra_args_for_new: + setattr(new, k, extra_args_for_new[k]) + new.save() + updated.append(new.pk) + # update baskets + for basket in \ + FindBasket.objects.filter(items__pk=item.pk).all(): + basket.items.remove(item) + basket.items.add(new) + # manage containers + for find in Find.objects.filter(upstream_treatment=self).all(): + if find.container != self.container: + find.container = self.container + if find.pk in updated: + # don't record twice history + find.skip_history_when_saving = True + find.save() class AbsFindTreatments(models.Model): |