diff options
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 |
commit | 1282a64bcdca8d928f44a94bfdaaf47b934b4246 (patch) | |
tree | 5c00627c49f90a62627a283f8d131c2c25a5619d /archaeological_finds | |
parent | acbcf670ff45881da68897112d82aeb392dc9363 (diff) | |
download | Ishtar-1282a64bcdca8d928f44a94bfdaaf47b934b4246.tar.bz2 Ishtar-1282a64bcdca8d928f44a94bfdaaf47b934b4246.zip |
Preservation module: add fields to models (refs #3639)
Diffstat (limited to 'archaeological_finds')
-rw-r--r-- | archaeological_finds/migrations/0008_auto_20171004_1125.py | 129 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 116 |
2 files changed, 210 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 |