summaryrefslogtreecommitdiff
path: root/archaeological_finds/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_finds/models.py')
-rw-r--r--archaeological_finds/models.py281
1 files changed, 281 insertions, 0 deletions
diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py
new file mode 100644
index 000000000..cea9a35f1
--- /dev/null
+++ b/archaeological_finds/models.py
@@ -0,0 +1,281 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2012 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# See the file COPYING for details.
+
+from django.conf import settings
+from django.contrib.gis.db import models
+from django.utils.translation import ugettext_lazy as _, ugettext
+
+from ishtar_common.models import GeneralType, BaseHistorizedItem, \
+ LightHistorizedItem, HistoricalRecords, OwnPerms, Source, Person
+
+from archaeological_operations.models import AdministrativeAct
+from archaeological_context_records.models import ContextRecord, Dating
+WAREHOUSE_AVAILABLE = 'archaeological_warehouse' in settings.INSTALLED_APPS
+if WAREHOUSE_AVAILABLE:
+ from archaeological_warehouse.models import Warehouse, Container
+
+class MaterialType(GeneralType):
+ recommendation = models.TextField(_(u"Recommendation"))
+ parent = models.ForeignKey("MaterialType", blank=True, null=True,
+ verbose_name=_(u"Parent material"))
+
+ class Meta:
+ verbose_name = _(u"Material type")
+ verbose_name_plural = _(u"Material types")
+
+class BaseItem(BaseHistorizedItem, OwnPerms):
+ label = models.CharField(_(u"ID"), max_length=60)
+ description = models.TextField(_(u"Description"))
+ context_record = models.ForeignKey(ContextRecord,
+ related_name='base_items', verbose_name=_(u"Context Record"))
+ is_isolated = models.NullBooleanField(_(u"Is isolated?"), blank=True,
+ null=True)
+ index = models.IntegerField(u"Index", default=0)
+ material_index = models.IntegerField(u"Material index", default=0)
+ history = HistoricalRecords()
+
+ class Meta:
+ verbose_name = _(u"Base item")
+ verbose_name_plural = _(u"Base items")
+ permissions = (
+ ("view_own_baseitem", ugettext(u"Can view own Base item")),
+ ("add_own_baseitem", ugettext(u"Can add own Base item")),
+ ("change_own_baseitem", ugettext(u"Can change own Base item")),
+ ("delete_own_baseitem", ugettext(u"Can delete own Base item")),
+ )
+
+ def __unicode__(self):
+ return self.label
+
+ def get_last_item(self):
+ #TODO: manage virtuals - property(last_item) ?
+ items = self.item.filter().order_by("-order").all()
+ return items and items[0]
+
+ def full_label(self):
+ return self._real_label() or self._temp_label()
+
+ def material_type_label(self):
+ item = self.get_last_item()
+ items = [item and unicode(item.material_type) or '']
+ ope = self.context_record.operation
+ items += [ope.code_patriarche or \
+ (unicode(ope.year) + "-" + unicode(ope.operation_code))]
+ items += [self.context_record.label, unicode(self.material_index)]
+ return JOINT.join(items)
+
+ def _real_label(self):
+ if not self.context_record.parcel.operation.code_patriarche:
+ return
+ item = self.get_last_item()
+ lbl = item.label or self.label
+ return JOINT.join([unicode(it) for it in (
+ self.context_record.parcel.operation.code_patriarche,
+ self.context_record.label,
+ lbl) if it])
+
+ def _temp_label(self):
+ if self.context_record.parcel.operation.code_patriarche:
+ return
+ item = self.get_last_item()
+ lbl = item.label or self.label
+ return JOINT.join([unicode(it) for it in (
+ self.context_record.parcel.year,
+ self.index,
+ self.context_record.label,
+ lbl) if it])
+
+class Item(BaseHistorizedItem, OwnPerms):
+ TABLE_COLS = ['label', 'material_type', 'dating.period',
+ 'base_items.context_record.parcel.town',
+ 'base_items.context_record.parcel.operation.year',
+ 'base_items.context_record.parcel.operation.operation_code',
+ 'base_items.is_isolated']
+ if settings.COUNTRY == 'fr':
+ TABLE_COLS.insert(6,
+ 'base_items.context_record.parcel.operation.code_patriarche')
+ base_items = models.ManyToManyField(BaseItem, verbose_name=_(u"Base item"),
+ related_name='item')
+ order = models.IntegerField(_(u"Order"))
+ label = models.CharField(_(u"ID"), max_length=60)
+ description = models.TextField(_(u"Description"), blank=True, null=True)
+ material_type = models.ForeignKey(MaterialType,
+ verbose_name = _(u"Material type"))
+ volume = models.FloatField(_(u"Volume (l)"), blank=True, null=True)
+ weight = models.FloatField(_(u"Weight (g)"), blank=True, null=True)
+ item_number = models.IntegerField(_("Item number"), blank=True, null=True)
+ upstream_treatment = models.ForeignKey("Treatment", blank=True, null=True,
+ related_name='downstream_treatment', verbose_name=_("Upstream treatment"))
+ downstream_treatment = models.ForeignKey("Treatment", blank=True, null=True,
+ related_name='upstream_treatment', verbose_name=_("Downstream treatment"))
+ dating = models.ForeignKey(Dating, verbose_name=_(u"Dating"))
+ if WAREHOUSE_AVAILABLE:
+ container = models.ForeignKey(Container, verbose_name=_(u"Container"),
+ blank=True, null=True, related_name='items')
+ history = HistoricalRecords()
+
+ @classmethod
+ def get_years(cls):
+ years = set()
+ items = cls.objects.filter(downstream_treatment__isnull=True)
+ for item in items:
+ bi = item.base_items.all()
+ if not bi:
+ continue
+ bi = bi[0]
+ yr = bi.context_record.operation.start_date.year
+ years.add(yr)
+ return list(years)
+
+ @classmethod
+ def get_by_year(cls, year):
+ return cls.objects.filter(downstream_treatment__isnull=True,
+ base_items__context_record__operation__start_date__year=year)
+
+ @classmethod
+ def get_operations(cls):
+ operations = set()
+ items = cls.objects.filter(downstream_treatment__isnull=True)
+ for item in items:
+ bi = item.base_items.all()
+ if not bi:
+ continue
+ bi = bi[0]
+ pk = bi.context_record.operation.pk
+ operations.add(pk)
+ return list(operations)
+
+ @classmethod
+ def get_by_operation(cls, operation_id):
+ return cls.objects.filter(downstream_treatment__isnull=True,
+ base_items__context_record__operation__pk=operation_id)
+
+ @classmethod
+ def get_total_number(cls):
+ return cls.objects.filter(downstream_treatment__isnull=True).count()
+
+ def duplicate(self, user):
+ dct = dict([(attr, getattr(self, attr)) for attr in ('order', 'label',
+ 'description', 'material_type', 'volume', 'weight',
+ 'item_number', 'dating')])
+ dct['order'] += 1
+ dct['history_modifier'] = user
+ new = self.__class__(**dct)
+ new.save()
+ for base_item in self.base_items.all():
+ new.base_items.add(base_item)
+ return new
+
+ class Meta:
+ verbose_name = _(u"Item")
+ verbose_name_plural = _(u"Items")
+ permissions = (
+ ("view_own_item", ugettext(u"Can view own Item")),
+ ("add_own_item", ugettext(u"Can add own Item")),
+ ("change_own_item", ugettext(u"Can change own Item")),
+ ("delete_own_item", ugettext(u"Can delete own Item")),
+ )
+
+ def __unicode__(self):
+ return self.label
+
+ def save(self, *args, **kwargs):
+ if not self.pk:
+ super(Item, self).save(*args, **kwargs)
+ for base_item in self.base_items.all():
+ if not base_item.index:
+ idx = BaseItem.objects.filter(context_record=\
+ base_item.context_record).aggregate(Max('index'))
+ base_item.index = idx and idx['index__max'] + 1 or 1
+ if not base_item.material_index:
+ idx = BaseItem.objects.filter(context_record=\
+ base_item.context_record,
+ item__material_type=self.material_type).aggregate(
+ Max('material_index'))
+ base_item.material_index = idx and \
+ idx['material_index__max'] + 1 or 1
+ base_item.save()
+ super(Item, self).save(*args, **kwargs)
+
+class ItemSource(Source):
+ class Meta:
+ verbose_name = _(u"Item documentation")
+ verbose_name_plural = _(u"Item documentations")
+ item = models.ForeignKey(Item, verbose_name=_(u"Item"),
+ related_name="source")
+
+class TreatmentType(GeneralType):
+ virtual = models.BooleanField(_(u"Virtual"))
+ class Meta:
+ verbose_name = _(u"Treatment type")
+ verbose_name_plural = _(u"Treatment types")
+
+class Treatment(BaseHistorizedItem, OwnPerms):
+ container = models.ForeignKey(Container, verbose_name=_(u"Container"),
+ blank=True, null=True)
+ description = models.TextField(_(u"Description"), blank=True, null=True)
+ treatment_type = models.ForeignKey(TreatmentType,
+ verbose_name=_(u"Treatment type"))
+ if WAREHOUSE_AVAILABLE:
+ location = models.ForeignKey(Warehouse, verbose_name=_(u"Location"),
+ blank=True, null=True)
+ person = models.ForeignKey(Person, verbose_name=_(u"Person"),
+ 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)
+ history = HistoricalRecords()
+
+ class Meta:
+ verbose_name = _(u"Treatment")
+ verbose_name_plural = _(u"Treatments")
+ permissions = (
+ ("view_own_treatment", ugettext(u"Can view own Treatment")),
+ ("add_own_treatment", ugettext(u"Can add own Treatment")),
+ ("change_own_treatment", ugettext(u"Can change own Treatment")),
+ ("delete_own_treatment", ugettext(u"Can delete own Treatment")),
+ )
+
+ def __unicode__(self):
+ lbl = unicode(self.treatment_type)
+ if self.person:
+ lbl += u" %s %s" % (_(u"by"), unicode(self.person))
+ return lbl
+
+class TreatmentSource(Source):
+ class Meta:
+ verbose_name = _(u"Treatment documentation")
+ verbose_name_plural = _(u"Treament documentations")
+ treatment = models.ForeignKey(Treatment, verbose_name=_(u"Treatment"),
+ related_name="source")
+
+class Property(LightHistorizedItem):
+ item = models.ForeignKey(Item, verbose_name=_(u"Item"))
+ administrative_act = models.ForeignKey(AdministrativeAct,
+ verbose_name=_(u"Administrative act"))
+ person = models.ForeignKey(Person, verbose_name=_(u"Person"))
+ start_date = models.DateField(_(u"Start date"))
+ end_date = models.DateField(_(u"End date"))
+
+ class Meta:
+ verbose_name = _(u"Property")
+ verbose_name_plural = _(u"Properties")
+
+ def __unicode__(self):
+ return self.person + JOINT + self.item
+