diff options
| -rw-r--r-- | archaeological_finds/migrations/0008_auto_20171004_1125.py | 129 | ||||
| -rw-r--r-- | archaeological_finds/models_finds.py | 116 | ||||
| -rw-r--r-- | archaeological_warehouse/migrations/0007_auto_20171004_1125.py | 19 | ||||
| -rw-r--r-- | ishtar_common/migrations/0014_ishtarsiteprofile_preservation.py | 20 | ||||
| -rw-r--r-- | ishtar_common/models.py | 18 | 
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)', | 
