diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-04-13 17:11:50 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-04-13 17:13:06 +0200 |
commit | 96422251b70120d5299b264397166e160f2fb180 (patch) | |
tree | 938b4e94156cc9fe39fa7e7218b66aeafe709214 | |
parent | 6c1bdfa9c4def194a608deaccae259125c3b175d (diff) | |
download | Ishtar-96422251b70120d5299b264397166e160f2fb180.tar.bz2 Ishtar-96422251b70120d5299b264397166e160f2fb180.zip |
Finds - fields: add clutter dimensions and material, object type quality types
-rw-r--r-- | archaeological_finds/admin.py | 7 | ||||
-rw-r--r-- | archaeological_finds/forms.py | 38 | ||||
-rw-r--r-- | archaeological_finds/migrations/0023_auto_20180413_1637.py | 103 | ||||
-rw-r--r-- | archaeological_finds/models.py | 5 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 42 | ||||
-rw-r--r-- | archaeological_finds/templates/ishtar/sheet_find.html | 7 |
6 files changed, 192 insertions, 10 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index 91cbbada7..970cd8845 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/admin.py @@ -170,6 +170,7 @@ class MaterialTypeAdmin(HierarchicalTypeAdmin): list_display = HierarchicalTypeAdmin.list_display + ['recommendation'] search_fields = ('label', 'parent__label', 'comment',) + admin_site.register(models.MaterialType, MaterialTypeAdmin) @@ -180,6 +181,8 @@ class TreatmentTypeAdmin(GeneralTypeAdmin): list_display = HierarchicalTypeAdmin.list_display + [ 'order', 'virtual', 'upstream_is_many', 'downstream_is_many'] model = models.TreatmentType + + admin_site.register(models.TreatmentType, TreatmentTypeAdmin) general_models = [ @@ -187,7 +190,9 @@ general_models = [ models.IntegrityType, models.TreatmentFileType, models.TreatmentState, models.BatchType, models.AlterationCauseType, models.AlterationType, - models.TreatmentEmergencyType + models.TreatmentEmergencyType, models.ObjectTypeQualityType, + models.MaterialTypeQualityType ] + for model in general_models: admin_site.register(model, GeneralTypeAdmin) diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index 15d86f91f..ac58780f0 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -135,12 +135,15 @@ class FindForm(CustomForm, ManageOldType): form_slug = "find-020-general" base_models = ['get_first_base_find', 'object_type', 'material_type', 'communicabilitie'] - associated_models = {'material_type': models.MaterialType, - 'object_type': models.ObjectType, - 'communicabilitie': models.CommunicabilityType, - 'get_first_base_find__batch': models.BatchType, - 'get_first_base_find__spatial_reference_system': - SpatialReferenceSystem} + associated_models = { + 'material_type': models.MaterialType, + 'object_type': models.ObjectType, + 'communicabilitie': models.CommunicabilityType, + 'get_first_base_find__batch': models.BatchType, + 'get_first_base_find__spatial_reference_system': SpatialReferenceSystem, + 'material_type_quality': models.MaterialTypeQualityType, + 'object_type_quality': models.ObjectTypeQualityType + } HEADERS = {} HEADERS['label'] = FormHeader(_(u"Identification")) @@ -171,9 +174,13 @@ class FindForm(CustomForm, ManageOldType): material_type = widgets.Select2MultipleField( label=_(u"Material types"), required=False ) + material_type_quality = forms.ChoiceField( + label=_(u"Material type quality"), required=False, choices=[]) object_type = widgets.Select2MultipleField( label=_(u"Object types"), required=False, ) + object_type_quality = forms.ChoiceField( + label=_(u"Object type quality"), required=False, choices=[]) find_number = forms.IntegerField(label=_(u"Find number"), required=False) min_number_of_individuals = forms.IntegerField( label=_(u"Minimum number of individuals (MNI)"), required=False) @@ -203,6 +210,12 @@ class FindForm(CustomForm, ManageOldType): thickness = FloatField(label=_(u"Thickness (cm)"), required=False) volume = FloatField(label=_(u"Volume (l)"), required=False) weight = FloatField(label=_(u"Weight (g)"), required=False) + clutter_long_side = FloatField( + label=_(u"Clutter long side (cm)"), required=False) + clutter_short_side = FloatField( + label=_(u"Clutter short side (cm)"), required=False) + clutter_height = FloatField( + label=_(u"Clutter height (cm)"), required=False) dimensions_comment = forms.CharField( label=_(u"Dimensions comment"), required=False, widget=forms.Textarea) @@ -232,7 +245,9 @@ class FindForm(CustomForm, ManageOldType): TYPES = [ FieldType('material_type', models.MaterialType, is_multiple=True), + FieldType('material_type_quality', models.MaterialTypeQualityType), FieldType('object_type', models.ObjectType, is_multiple=True), + FieldType('object_type_quality', models.ObjectTypeQualityType), FieldType('communicabilitie', models.CommunicabilityType, is_multiple=True), FieldType('get_first_base_find__batch', models.BatchType), @@ -273,6 +288,17 @@ class FindForm(CustomForm, ManageOldType): unicode(_(u"Discovery date: TAQ date must be older than TPQ " u"date."))) + clutter_long_side = self.cleaned_data.get('clutter_long_side', None) + clutter_short_side = self.cleaned_data.get('clutter_short_side', None) + + if clutter_long_side and clutter_short_side and \ + clutter_short_side > clutter_long_side: + raise forms.ValidationError( + unicode(_( + u"Clutter: short side cannot be bigger than the long side." + )) + ) + if not get_current_profile().mapping: return self.cleaned_data x = self.cleaned_data.get('get_first_base_find__x', None) diff --git a/archaeological_finds/migrations/0023_auto_20180413_1637.py b/archaeological_finds/migrations/0023_auto_20180413_1637.py new file mode 100644 index 000000000..9d5172a1e --- /dev/null +++ b/archaeological_finds/migrations/0023_auto_20180413_1637.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-04-13 16:37 +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', '0022_auto_20180413_1147'), + ] + + operations = [ + migrations.CreateModel( + name='MaterialTypeQualityType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', 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')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'ordering': ('order',), + 'verbose_name': 'Material type quality type', + 'verbose_name_plural': 'Material type quality types', + }, + bases=(ishtar_common.models.Cached, models.Model), + ), + migrations.CreateModel( + name='ObjectTypeQualityType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', 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')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'ordering': ('order',), + 'verbose_name': 'Object type quality type', + 'verbose_name_plural': 'Object type quality types', + }, + bases=(ishtar_common.models.Cached, models.Model), + ), + migrations.AddField( + model_name='find', + name='clutter_height', + field=models.FloatField(blank=True, null=True, verbose_name='Clutter - height (cm)'), + ), + migrations.AddField( + model_name='find', + name='clutter_long_side', + field=models.FloatField(blank=True, null=True, verbose_name='Clutter - long side (cm)'), + ), + migrations.AddField( + model_name='find', + name='clutter_short_side', + field=models.FloatField(blank=True, null=True, verbose_name='Clutter - short side (cm)'), + ), + migrations.AddField( + model_name='historicalfind', + name='clutter_height', + field=models.FloatField(blank=True, null=True, verbose_name='Clutter - height (cm)'), + ), + migrations.AddField( + model_name='historicalfind', + name='clutter_long_side', + field=models.FloatField(blank=True, null=True, verbose_name='Clutter - long side (cm)'), + ), + migrations.AddField( + model_name='historicalfind', + name='clutter_short_side', + field=models.FloatField(blank=True, null=True, verbose_name='Clutter - short side (cm)'), + ), + migrations.AddField( + model_name='find', + name='material_type_quality', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='finds', to='archaeological_finds.MaterialTypeQualityType', verbose_name='Material type quality'), + ), + migrations.AddField( + model_name='find', + name='object_type_quality', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='finds', to='archaeological_finds.ObjectTypeQualityType', verbose_name='Object type quality'), + ), + migrations.AddField( + model_name='historicalfind', + name='material_type_quality', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.MaterialTypeQualityType'), + ), + migrations.AddField( + model_name='historicalfind', + name='object_type_quality', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_finds.ObjectTypeQualityType'), + ), + ] diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index a0f387620..774b3c98b 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -3,7 +3,7 @@ from archaeological_finds.models_finds import MaterialType, ConservatoryState,\ FindBasket, Find, FindSource, Property, CHECK_CHOICES, BatchType, \ BFBulkView, FBulkView, FirstBaseFindView, AlterationType, \ AlterationCauseType, TreatmentEmergencyType, TreatmentType, \ - CommunicabilityType + CommunicabilityType, MaterialTypeQualityType, ObjectTypeQualityType from archaeological_finds.models_treatments import Treatment, \ AbsFindTreatments, FindUpstreamTreatments, FindDownstreamTreatments, \ FindTreatments, TreatmentSource, TreatmentFile, TreatmentFileType, \ @@ -18,4 +18,5 @@ __all__ = ['MaterialType', 'ConservatoryState', 'Treatment', 'AbsFindTreatments', 'FindUpstreamTreatments', 'FindDownstreamTreatments', 'FindTreatments', 'TreatmentSource', 'TreatmentFile', 'TreatmentFileType', 'TreatmentFileSource', - 'CommunicabilityType'] + 'CommunicabilityType', 'MaterialTypeQualityType', + 'ObjectTypeQualityType'] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index ecb4d049b..31ec20785 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -58,6 +58,19 @@ post_save.connect(post_save_cache, sender=MaterialType) post_delete.connect(post_save_cache, sender=MaterialType) +class MaterialTypeQualityType(GeneralType): + order = models.IntegerField(_(u"Order"), default=10) + + class Meta: + verbose_name = _(u"Material type quality type") + verbose_name_plural = _(u"Material type quality types") + ordering = ('order',) + + +post_save.connect(post_save_cache, sender=MaterialTypeQualityType) +post_delete.connect(post_save_cache, sender=MaterialTypeQualityType) + + class ConservatoryState(HierarchicalType): class Meta: verbose_name = _(u"Conservatory state") @@ -140,6 +153,19 @@ post_save.connect(post_save_cache, sender=ObjectType) post_delete.connect(post_save_cache, sender=ObjectType) +class ObjectTypeQualityType(GeneralType): + order = models.IntegerField(_(u"Order"), default=10) + + class Meta: + verbose_name = _(u"Object type quality type") + verbose_name_plural = _(u"Object type quality types") + ordering = ('order',) + + +post_save.connect(post_save_cache, sender=ObjectTypeQualityType) +post_delete.connect(post_save_cache, sender=ObjectTypeQualityType) + + class AlterationType(HierarchicalType): class Meta: verbose_name = _(u"Alteration type") @@ -701,6 +727,11 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, MaterialType, verbose_name=_(u"Material types"), related_name='finds', blank=True ) + material_type_quality = models.ForeignKey( + MaterialTypeQualityType, + verbose_name=_(u"Material type quality"), related_name='finds', + blank=True, null=True + ) volume = models.FloatField(_(u"Volume (l)"), blank=True, null=True) weight = models.FloatField(_(u"Weight"), blank=True, null=True) weight_unit = models.CharField(_(u"Weight unit"), max_length=4, @@ -725,6 +756,11 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, ObjectType, verbose_name=_(u"Object types"), related_name='find', blank=True ) + object_type_quality = models.ForeignKey( + ObjectTypeQualityType, + verbose_name=_(u"Object type quality"), related_name='finds', + blank=True, null=True + ) integrities = models.ManyToManyField( IntegrityType, verbose_name=_(u"Integrity / interest"), related_name='find', blank=True) @@ -741,6 +777,12 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, height = models.FloatField(_(u"Height (cm)"), blank=True, null=True) diameter = models.FloatField(_(u"Diameter (cm)"), blank=True, null=True) thickness = models.FloatField(_(u"Thickness (cm)"), blank=True, null=True) + clutter_long_side = models.FloatField( + _(u"Clutter - long side (cm)"), blank=True, null=True) + clutter_short_side = models.FloatField( + _(u"Clutter - short side (cm)"), blank=True, null=True) + clutter_height = models.FloatField( + _(u"Clutter - height (cm)"), blank=True, null=True) dimensions_comment = models.TextField(_(u"Dimensions comment"), blank=True, null=True) mark = models.TextField(_(u"Mark"), blank=True, null=True) diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html index 5062963ba..af7997e67 100644 --- a/archaeological_finds/templates/ishtar/sheet_find.html +++ b/archaeological_finds/templates/ishtar/sheet_find.html @@ -53,7 +53,9 @@ {% field_flex_full "Description" item.description "<pre>" "</pre>" %} {% field_flex "Is complete?" item.is_complete %} {% field_flex_multiple "Material types" item.material_types %} + {% field_flex "Material type quality" item.material_type_quality %} {% field_flex_multiple "Object types" item.object_types %} + {% field_flex "Object type quality" item.object_type_quality %} {% field_flex "Find number" item.find_number %} {% field_flex "Minimum number of individuals (MNI)" item.min_number_of_individuals %} {% field_flex_full "Decoration" item.decoration "<pre>" "</pre>" %} @@ -63,7 +65,7 @@ {% field_flex_full "Comment" item.comment "<pre>" "</pre>" %} </div> -{% if item.length or item.width or item.height or item.diameter or item.thickness or item.volume or item.weight_string or item.dimensions_comment %} +{% if item.length or item.width or item.height or item.diameter or item.thickness or item.volume or item.weight_string or item.dimensions_comment or item.clutter_long_side or item.clutter_short_side or item.clutter_height %} <h3>{% trans "Dimensions" %}</h3> <div class='row'> {% field_flex "Length (cm)" item.length %} @@ -74,6 +76,9 @@ {% field_flex "Volume (l)" item.volume %} {% trans "Weight (g)" as weight_label %} {% field_flex weight_label item.weight_string %} + {% field_flex "Clutter long side (cm)" item.clutter_long_side %} + {% field_flex "Clutter short side (cm)" item.clutter_short_side %} + {% field_flex "Clutter height (cm)" item.clutter_height %} {% field_flex_full "Dimensions comment" item.dimensions_comment "<pre>" "</pre>" %} </div> {% endif %} |