summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-10-04 11:29:13 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-10-04 11:30:48 +0200
commit1282a64bcdca8d928f44a94bfdaaf47b934b4246 (patch)
tree5c00627c49f90a62627a283f8d131c2c25a5619d
parentacbcf670ff45881da68897112d82aeb392dc9363 (diff)
downloadIshtar-1282a64bcdca8d928f44a94bfdaaf47b934b4246.tar.bz2
Ishtar-1282a64bcdca8d928f44a94bfdaaf47b934b4246.zip
Preservation module: add fields to models (refs #3639)
-rw-r--r--archaeological_finds/migrations/0008_auto_20171004_1125.py129
-rw-r--r--archaeological_finds/models_finds.py116
-rw-r--r--archaeological_warehouse/migrations/0007_auto_20171004_1125.py19
-rw-r--r--ishtar_common/migrations/0014_ishtarsiteprofile_preservation.py20
-rw-r--r--ishtar_common/models.py18
5 files changed, 267 insertions, 35 deletions
diff --git a/archaeological_finds/migrations/0008_auto_20171004_1125.py b/archaeological_finds/migrations/0008_auto_20171004_1125.py
new file mode 100644
index 000000000..72d8f8973
--- /dev/null
+++ b/archaeological_finds/migrations/0008_auto_20171004_1125.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-10-04 11:25
+from __future__ import unicode_literals
+
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import ishtar_common.models
+import re
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0007_auto_20170829_1639'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='AlterationCauseType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.CharField(max_length=100, verbose_name='Label')),
+ ('txt_idx', models.CharField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', max_length=100, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, null=True, verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.AlterationCauseType', verbose_name='Parent')),
+ ],
+ options={
+ 'ordering': ('parent__label', 'label'),
+ 'verbose_name': 'Alteration cause type',
+ 'verbose_name_plural': 'Alteration cause types',
+ },
+ bases=(ishtar_common.models.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='AlterationType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.CharField(max_length=100, verbose_name='Label')),
+ ('txt_idx', models.CharField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', max_length=100, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, null=True, verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.AlterationType', verbose_name='Parent')),
+ ],
+ options={
+ 'ordering': ('parent__label', 'label'),
+ 'verbose_name': 'Alteration type',
+ 'verbose_name_plural': 'Alteration types',
+ },
+ bases=(ishtar_common.models.Cached, models.Model),
+ ),
+ migrations.CreateModel(
+ name='TreatmentEmergencyType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('label', models.CharField(max_length=100, verbose_name='Label')),
+ ('txt_idx', models.CharField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', max_length=100, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')),
+ ('comment', models.TextField(blank=True, null=True, verbose_name='Comment')),
+ ('available', models.BooleanField(default=True, verbose_name='Available')),
+ ],
+ options={
+ 'ordering': ('label',),
+ 'verbose_name': 'Treatment emergency type',
+ 'verbose_name_plural': 'Treatment emergency types',
+ },
+ bases=(ishtar_common.models.Cached, models.Model),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='appraisal_date',
+ field=models.DateField(blank=True, null=True, verbose_name='Appraisal date'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='insurance_value',
+ field=models.FloatField(blank=True, null=True, verbose_name='Insurance value'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='appraisal_date',
+ field=models.DateField(blank=True, null=True, verbose_name='Appraisal date'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='insurance_value',
+ field=models.FloatField(blank=True, null=True, verbose_name='Insurance value'),
+ ),
+ migrations.AlterField(
+ model_name='conservatorystate',
+ name='parent',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.ConservatoryState', verbose_name='Parent'),
+ ),
+ migrations.AlterField(
+ model_name='materialtype',
+ name='parent',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.MaterialType', verbose_name='Parent'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='alteration',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.AlterationType', verbose_name='Alteration'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='alteration_cause',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.AlterationCauseType', verbose_name='Alteration cause'),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='treatment_emergency',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archaeological_finds.TreatmentEmergencyType', verbose_name='Treatment emergency'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='alteration',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.AlterationType'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='alteration_cause',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.AlterationCauseType'),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='treatment_emergency',
+ field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.TreatmentEmergencyType'),
+ ),
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 891d99d28..bf026c03f 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2012-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2012-2017 É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
@@ -22,19 +22,19 @@ import datetime
from django.conf import settings
from django.contrib.gis.db import models
from django.core.urlresolvers import reverse
-from django.db import connection, transaction
+from django.db import connection
from django.db.models import Max, Q
from django.db.models.signals import m2m_changed, post_save, post_delete, \
pre_delete
-from django.utils.translation import ugettext_lazy as _, ugettext
+from django.utils.translation import ugettext_lazy as _
from ishtar_common.data_importer import post_importer_action, ImporterError
from ishtar_common.utils import cached_label_changed, post_save_point
-from ishtar_common.models import GeneralType, ImageModel, BaseHistorizedItem, \
- ShortMenuItem, LightHistorizedItem, HistoricalRecords, OwnPerms, Source, \
- Person, Basket, post_save_cache, ValueGetter, \
- get_current_profile
+from ishtar_common.models import GeneralType, HierarchicalType, ImageModel, \
+ BaseHistorizedItem, ShortMenuItem, LightHistorizedItem, \
+ HistoricalRecords, OwnPerms, Source, Person, Basket, post_save_cache, \
+ ValueGetter, get_current_profile
from archaeological_operations.models import AdministrativeAct
from archaeological_context_records.models import ContextRecord, Dating
@@ -43,29 +43,28 @@ from ishtar_common.models import PRIVATE_FIELDS, SpatialReferenceSystem, \
BulkUpdatedItem
-class MaterialType(GeneralType):
+class MaterialType(HierarchicalType):
code = models.CharField(_(u"Code"), max_length=10, blank=True, null=True)
recommendation = models.TextField(_(u"Recommendation"), blank=True,
null=True)
- 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")
ordering = ('label',)
+
+
post_save.connect(post_save_cache, sender=MaterialType)
post_delete.connect(post_save_cache, sender=MaterialType)
-class ConservatoryState(GeneralType):
- parent = models.ForeignKey("ConservatoryState", blank=True, null=True,
- verbose_name=_(u"Parent conservatory state"))
-
+class ConservatoryState(HierarchicalType):
class Meta:
verbose_name = _(u"Conservatory state")
verbose_name_plural = _(u"Conservatory states")
ordering = ('label',)
+
+
post_save.connect(post_save_cache, sender=ConservatoryState)
post_delete.connect(post_save_cache, sender=ConservatoryState)
@@ -75,6 +74,8 @@ class PreservationType(GeneralType):
verbose_name = _(u"Preservation type")
verbose_name_plural = _(u"Preservation types")
ordering = ('label',)
+
+
post_save.connect(post_save_cache, sender=PreservationType)
post_delete.connect(post_save_cache, sender=PreservationType)
@@ -84,6 +85,8 @@ class IntegrityType(GeneralType):
verbose_name = _(u"Integrity / interest type")
verbose_name_plural = _(u"Integrity / interest types")
ordering = ('label',)
+
+
post_save.connect(post_save_cache, sender=IntegrityType)
post_delete.connect(post_save_cache, sender=IntegrityType)
@@ -93,6 +96,8 @@ class RemarkabilityType(GeneralType):
verbose_name = _(u"Remarkability type")
verbose_name_plural = _(u"Remarkability types")
ordering = ('label',)
+
+
post_save.connect(post_save_cache, sender=RemarkabilityType)
post_delete.connect(post_save_cache, sender=RemarkabilityType)
@@ -103,33 +108,56 @@ class BatchType(GeneralType):
verbose_name = _(u"Batch type")
verbose_name_plural = _(u"Batch types")
ordering = ('order',)
+
+
post_save.connect(post_save_cache, sender=BatchType)
post_delete.connect(post_save_cache, sender=BatchType)
-class ObjectType(GeneralType):
- parent = models.ForeignKey("ObjectType", blank=True, null=True,
- verbose_name=_(u"Parent"))
-
+class ObjectType(HierarchicalType):
class Meta:
verbose_name = _(u"Object type")
verbose_name_plural = _(u"Object types")
ordering = ('parent__label', 'label',)
- def full_label(self):
- lbls = [self.label]
- item = self
- while item.parent:
- item = item.parent
- lbls.append(item.label)
- return u" > ".join(reversed(lbls))
- def __unicode__(self):
- return self.label
post_save.connect(post_save_cache, sender=ObjectType)
post_delete.connect(post_save_cache, sender=ObjectType)
+class AlterationType(HierarchicalType):
+ class Meta:
+ verbose_name = _(u"Alteration type")
+ verbose_name_plural = _(u"Alteration types")
+ ordering = ('parent__label', 'label',)
+
+
+post_save.connect(post_save_cache, sender=AlterationType)
+post_delete.connect(post_save_cache, sender=AlterationType)
+
+
+class AlterationCauseType(HierarchicalType):
+ class Meta:
+ verbose_name = _(u"Alteration cause type")
+ verbose_name_plural = _(u"Alteration cause types")
+ ordering = ('parent__label', 'label',)
+
+
+post_save.connect(post_save_cache, sender=AlterationCauseType)
+post_delete.connect(post_save_cache, sender=AlterationCauseType)
+
+
+class TreatmentEmergencyType(GeneralType):
+ class Meta:
+ verbose_name = _(u"Treatment emergency type")
+ verbose_name_plural = _(u"Treatment emergency types")
+ ordering = ('label',)
+
+
+post_save.connect(post_save_cache, sender=TreatmentEmergencyType)
+post_delete.connect(post_save_cache, sender=TreatmentEmergencyType)
+
+
class BFBulkView(object):
CREATE_SQL = """
CREATE VIEW basefind_cached_bulk_update
@@ -624,14 +652,6 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel,
MaterialType, verbose_name=_(u"Material types"), related_name='finds',
blank=True
)
- conservatory_state = models.ForeignKey(
- ConservatoryState, verbose_name=_(u"Conservatory state"), blank=True,
- null=True, on_delete=models.SET_NULL)
- conservatory_comment = models.TextField(_(u"Conservatory comment"),
- blank=True, null=True)
- preservation_to_considers = models.ManyToManyField(
- PreservationType, verbose_name=_(u"Type of preservation to consider"),
- related_name='finds', blank=True)
volume = models.FloatField(_(u"Volume (l)"), blank=True, null=True)
weight = models.FloatField(_(u"Weight (g)"), blank=True, null=True)
weight_unit = models.CharField(_(u"Weight unit"), max_length=4,
@@ -686,6 +706,32 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel,
collection = models.ForeignKey(
"archaeological_warehouse.Collection", verbose_name=_(u"Collection"),
blank=True, null=True, related_name='finds', on_delete=models.SET_NULL)
+
+ # preservation module
+ conservatory_state = models.ForeignKey(
+ ConservatoryState, verbose_name=_(u"Conservatory state"), blank=True,
+ null=True, on_delete=models.SET_NULL)
+ conservatory_comment = models.TextField(_(u"Conservatory comment"),
+ blank=True, null=True)
+ preservation_to_considers = models.ManyToManyField(
+ PreservationType, verbose_name=_(u"Type of preservation to consider"),
+ related_name='finds', blank=True)
+ alteration = models.ForeignKey(
+ AlterationType, verbose_name=_(u"Alteration"), blank=True, null=True
+ )
+ alteration_cause = models.ForeignKey(
+ AlterationCauseType, verbose_name=_(u"Alteration cause"), blank=True,
+ null=True
+ )
+ treatment_emergency = models.ForeignKey(
+ TreatmentEmergencyType, verbose_name=_(u"Treatment emergency"),
+ blank=True, null=True
+ )
+ insurance_value = models.FloatField(_(u"Insurance value"), blank=True,
+ null=True)
+ appraisal_date = models.DateField(_(u"Appraisal date"), blank=True,
+ null=True)
+
cached_label = models.TextField(_(u"Cached name"), null=True, blank=True)
history = HistoricalRecords()
BASKET_MODEL = FindBasket
diff --git a/archaeological_warehouse/migrations/0007_auto_20171004_1125.py b/archaeological_warehouse/migrations/0007_auto_20171004_1125.py
new file mode 100644
index 000000000..43f89031c
--- /dev/null
+++ b/archaeological_warehouse/migrations/0007_auto_20171004_1125.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-10-04 11:25
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_warehouse', '0006_auto_20170829_1639'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='container',
+ options={'ordering': ('cached_label',), 'permissions': (('view_container', 'Can view all Containers'), ('view_own_container', 'Can view own Container'), ('add_own_container', 'Can add own Container'), ('change_own_container', 'Can change own Container'), ('delete_own_container', 'Can delete own Container')), 'verbose_name': 'Container', 'verbose_name_plural': 'Containers'},
+ ),
+ ]
diff --git a/ishtar_common/migrations/0014_ishtarsiteprofile_preservation.py b/ishtar_common/migrations/0014_ishtarsiteprofile_preservation.py
new file mode 100644
index 000000000..90e6571ac
--- /dev/null
+++ b/ishtar_common/migrations/0014_ishtarsiteprofile_preservation.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-10-04 11:25
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0013_importertype_available'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='ishtarsiteprofile',
+ name='preservation',
+ field=models.BooleanField(default=False, verbose_name='Preservation module'),
+ ),
+ ]
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index b0b050c6c..28a24115b 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -765,6 +765,22 @@ class GeneralType(Cached, models.Model):
item.generate_key()
+class HierarchicalType(GeneralType):
+ parent = models.ForeignKey('self', blank=True, null=True,
+ verbose_name=_(u"Parent"))
+
+ class Meta:
+ abstract = True
+
+ def full_label(self):
+ lbls = [self.label]
+ item = self
+ while item.parent:
+ item = item.parent
+ lbls.append(item.label)
+ return u" > ".join(reversed(lbls))
+
+
class ItemKey(models.Model):
key = models.CharField(_(u"Key"), max_length=100)
content_type = models.ForeignKey(ContentType)
@@ -1255,6 +1271,8 @@ class IshtarSiteProfile(models.Model, Cached):
warehouse_color = models.CharField(
_(u"CSS code for warehouse module"), default=u'rgba(10,20,200,0.15)',
max_length=200)
+ preservation = models.BooleanField(_(u"Preservation module"),
+ default=False)
mapping = models.BooleanField(_(u"Mapping module"), default=False)
mapping_color = models.CharField(
_(u"CSS code for mapping module"), default=u'rgba(72, 236, 0, 0.15)',