summaryrefslogtreecommitdiff
path: root/archaeological_finds/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-12-03 23:25:12 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-12-03 23:29:00 +0100
commitc02bcd0e6c47c2cb3ce8b9b8927e408020e3a122 (patch)
tree758a052f8fd78bc2071bd4d6abb19a2c623876da /archaeological_finds/models.py
parent0203ccf42cb3e8c79ea90a68f35818e4426b4d65 (diff)
downloadIshtar-c02bcd0e6c47c2cb3ce8b9b8927e408020e3a122.tar.bz2
Ishtar-c02bcd0e6c47c2cb3ce8b9b8927e408020e3a122.zip
Adapt fields/forms/wizard for treatments
Diffstat (limited to 'archaeological_finds/models.py')
-rw-r--r--archaeological_finds/models.py95
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):