diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-06-02 22:53:12 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-06-02 22:53:12 +0200 |
commit | b78fa1d244be029d49966a920f00f178ee2ef9ae (patch) | |
tree | 5ccf9926aed3e4fee4dce8594f69010ae2b00520 | |
parent | 914fca851a55d60a25eee0a0848175f68f8c4b4c (diff) | |
download | Ishtar-b78fa1d244be029d49966a920f00f178ee2ef9ae.tar.bz2 Ishtar-b78fa1d244be029d49966a920f00f178ee2ef9ae.zip |
Find: add functional area field
-rw-r--r-- | archaeological_finds/admin.py | 10 | ||||
-rw-r--r-- | archaeological_finds/forms.py | 26 | ||||
-rw-r--r-- | archaeological_finds/lookups.py | 5 | ||||
-rw-r--r-- | archaeological_finds/migrations/0108_auto_20210602_2234.py | 51 | ||||
-rw-r--r-- | archaeological_finds/models.py | 2 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 24 | ||||
-rw-r--r-- | archaeological_finds/templates/ishtar/sheet_find.html | 1 | ||||
-rw-r--r-- | archaeological_finds/urls.py | 5 | ||||
-rw-r--r-- | archaeological_finds/views.py | 1 |
9 files changed, 121 insertions, 4 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index e3c573e65..17ac6d49b 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/admin.py @@ -190,6 +190,16 @@ class ObjectTypeAdmin(GeneralTypeAdmin): admin_site.register(models.ObjectType, ObjectTypeAdmin) +class FunctionalAreaAdmin(GeneralTypeAdmin): + model = models.FunctionalArea + form = make_ajax_form(model, { + 'parent': 'functional_area', + }) + + +admin_site.register(models.FunctionalArea, FunctionalAreaAdmin) + + class MaterialTypeAdmin(GeneralTypeAdmin): search_fields = ('label', 'parent__label', 'comment',) model = models.MaterialType diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index dd0074ea3..a2326e4f2 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -140,11 +140,12 @@ class BasicFindForm(CustomForm, ManageOldType): form_admin_name = _("Simple find - 020 - General") form_slug = "simplefind-020-general" base_models = ['object_type', 'material_type', 'communicabilitie', - 'cultural_attribution'] + 'cultural_attribution', 'functional_area'] associated_models = { 'material_type': models.MaterialType, 'cultural_attribution': CulturalAttributionType, 'object_type': models.ObjectType, + 'functional_area': models.FunctionalArea, 'communicabilitie': models.CommunicabilityType, 'material_type_quality': models.MaterialTypeQualityType, 'object_type_quality': models.ObjectTypeQualityType, @@ -155,7 +156,8 @@ class BasicFindForm(CustomForm, ManageOldType): 'label', 'denomination', 'previous_id', 'museum_id', 'laboratory_id', 'seal_number', 'mark', 'description', 'public_description', 'is_complete', 'material_type', 'material_type_quality', - 'material_comment', 'object_type', 'object_type_quality', 'find_number', + 'material_comment', 'object_type', 'object_type_quality', + 'functional_area', 'find_number', 'min_number_of_individuals', 'inscription', 'decoration', 'manufacturing_place', 'communicabilitie', 'comment', 'cultural_attribution', 'dating_comment', @@ -202,6 +204,9 @@ class BasicFindForm(CustomForm, ManageOldType): ) object_type_quality = forms.ChoiceField( label=_("Object type quality"), required=False, choices=[]) + functional_area = widgets.Select2MultipleField( + label=_("Functional areas"), required=False, + ) find_number = forms.IntegerField(label=_("Find number"), required=False) min_number_of_individuals = forms.IntegerField( label=_("Minimum number of individuals (MNI)"), required=False) @@ -266,6 +271,7 @@ class BasicFindForm(CustomForm, ManageOldType): FieldType('object_type', models.ObjectType, is_multiple=True, extra_args={"full_hierarchy": True}), FieldType('object_type_quality', models.ObjectTypeQualityType), + FieldType('functional_area', models.FunctionalArea, is_multiple=True), FieldType('communicabilitie', models.CommunicabilityType, is_multiple=True), FieldType('checked_type', models.CheckedType, is_multiple=True), @@ -310,8 +316,8 @@ class FindForm(BasicFindForm): 'public_description', 'get_first_base_find__discovery_date', 'get_first_base_find__discovery_date_taq', 'get_first_base_find__batch', 'is_complete', 'material_type', 'material_type_quality', - 'material_comment', 'object_type', - 'object_type_quality', 'find_number', 'min_number_of_individuals', + 'material_comment', 'object_type', 'object_type_quality', + 'functional_area', 'find_number', 'min_number_of_individuals', 'inscription', 'manufacturing_place', 'communicabilitie', 'comment', 'cultural_attribution', 'dating_comment', 'length', 'width', 'height', 'thickness', 'diameter', @@ -571,11 +577,13 @@ class QAFindFormMulti(QAForm): form_admin_name = _("Find - Quick action - Modify") form_slug = "find-quickaction-modify" base_models = ['get_first_base_find', 'qa_object_types', + 'qa_functional_areas', 'qa_material_types', 'qa_communicabilities', 'qa_alterations', 'qa_alteration_causes'] associated_models = { 'qa_material_types': models.MaterialType, 'qa_object_types': models.ObjectType, + 'qa_functional_areas': models.FunctionalArea, 'qa_communicabilities': models.CommunicabilityType, 'qa_alterations': models.AlterationType, 'qa_alteration_causes': models.AlterationCauseType, @@ -639,6 +647,9 @@ class QAFindFormMulti(QAForm): qa_object_types = widgets.Select2MultipleField( label=_("Object types"), required=False, ) + qa_functional_areas = widgets.Select2MultipleField( + label=_("Functional areas"), required=False, + ) qa_manufacturing_place = forms.CharField( label=_("Manufacturing place"), required=False) qa_communicabilities = widgets.Select2MultipleField( @@ -677,6 +688,7 @@ class QAFindFormMulti(QAForm): TYPES = [ FieldType('qa_material_types', models.MaterialType, is_multiple=True), FieldType('qa_object_types', models.ObjectType, is_multiple=True), + FieldType('qa_functional_areas', models.FunctionalArea, is_multiple=True), FieldType('qa_communicabilities', models.CommunicabilityType, is_multiple=True), FieldType('qa_alterations', models.AlterationType, is_multiple=True), @@ -1103,6 +1115,12 @@ class FindSelect(DocumentItemSelect, PeriodSelect): ) object_type_quality = forms.ChoiceField( label=_("Object type quality"), choices=[]) + functional_areas = forms.IntegerField( + label=_("Functional areas"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-functionalarea'), + associated_model=models.FunctionalArea), + ) find_number = forms.IntegerField(label=_("Find number")) min_number_of_individuals = forms.IntegerField( diff --git a/archaeological_finds/lookups.py b/archaeological_finds/lookups.py index acf8895cb..439bda3a4 100644 --- a/archaeological_finds/lookups.py +++ b/archaeological_finds/lookups.py @@ -82,3 +82,8 @@ class MaterialTypeLookup(TypeLookupChannel): @register("object_type") class MaterialTypeLookup(TypeLookupChannel): model = models.ObjectType + + +@register("functional_area") +class FunctionalAreaLookup(TypeLookupChannel): + model = models.FunctionalArea diff --git a/archaeological_finds/migrations/0108_auto_20210602_2234.py b/archaeological_finds/migrations/0108_auto_20210602_2234.py new file mode 100644 index 000000000..96adb16a8 --- /dev/null +++ b/archaeological_finds/migrations/0108_auto_20210602_2234.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2021-06-02 22:34 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import ishtar_common.models_common +import re + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0107_auto_20201203_1453'), + ] + + operations = [ + migrations.CreateModel( + name='FunctionalArea', + 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', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='archaeological_finds.FunctionalArea', verbose_name='Parent')), + ], + options={ + 'verbose_name': 'Functional area', + 'verbose_name_plural': 'Functional areas', + 'ordering': ('parent__label', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AlterField( + model_name='find', + name='collection', + field=models.ForeignKey(blank=True, help_text='Do not use - need evolutions', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='finds', to='archaeological_warehouse.Warehouse', verbose_name='Collection'), + ), + migrations.AlterField( + model_name='historicalfind', + name='collection', + field=models.ForeignKey(blank=True, db_constraint=False, help_text='Do not use - need evolutions', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='archaeological_warehouse.Warehouse', verbose_name='Collection'), + ), + migrations.AddField( + model_name='find', + name='functional_areas', + field=models.ManyToManyField(blank=True, related_name='find', to='archaeological_finds.FunctionalArea', verbose_name='Functional area'), + ), + ] diff --git a/archaeological_finds/models.py b/archaeological_finds/models.py index cd8100aaa..9f562c703 100644 --- a/archaeological_finds/models.py +++ b/archaeological_finds/models.py @@ -21,6 +21,7 @@ from archaeological_finds.models_finds import ( MaterialTypeQualityType, ObjectTypeQualityType, FindInsideContainer, + FunctionalArea ) from archaeological_finds.models_treatments import ( Treatment, @@ -60,6 +61,7 @@ __all__ = [ "FindNonModifTreatments", "FindDownstreamTreatments", "FindTreatments", + "FunctionalArea", "TreatmentFile", "TreatmentFileType", "CommunicabilityType", diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 1f2c692e1..e53706e9a 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -270,6 +270,20 @@ post_save.connect(post_save_cache, sender=ObjectType) post_delete.connect(post_save_cache, sender=ObjectType) +class FunctionalArea(HierarchicalType): + class Meta: + verbose_name = _("Functional area") + verbose_name_plural = _("Functional areas") + ordering = ( + "parent__label", + "label", + ) + + +post_save.connect(post_save_cache, sender=FunctionalArea) +post_delete.connect(post_save_cache, sender=FunctionalArea) + + class ObjectTypeQualityType(GeneralType): order = models.IntegerField(_("Order"), default=10) @@ -1562,6 +1576,10 @@ class Find( pgettext_lazy("key for text search", "cultural-attribution"), "cultural_attributions__label__iexact", ), + "functional_areas": SearchAltName( + pgettext_lazy("key for text search", "functional-area"), + "functional_areas__label__iexact", + ), } ALT_NAMES.update(BaseHistorizedItem.ALT_NAMES) ALT_NAMES.update(DocumentItem.ALT_NAMES) @@ -1683,6 +1701,7 @@ class Find( "material_types", "datings", "object_types", + "functional_areas", "integrities", "remarkabilities", "communicabilities", @@ -1694,6 +1713,7 @@ class Find( GET_VALUES_EXTRA_TYPES = ValueGetter.GET_VALUES_EXCLUDE_FIELDS + [ "material_types", "object_types", + "functional_areas", "integrities", "remarkabilities", "communicabilities", @@ -1801,6 +1821,10 @@ class Find( blank=True, null=True, ) + functional_areas = models.ManyToManyField( + FunctionalArea, verbose_name=_("Functional area"), related_name="find", + blank=True + ) integrities = models.ManyToManyField( IntegrityType, verbose_name=_("Integrity / interest"), diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html index 57bcc9aef..8d933d3fb 100644 --- a/archaeological_finds/templates/ishtar/sheet_find.html +++ b/archaeological_finds/templates/ishtar/sheet_find.html @@ -154,6 +154,7 @@ {% field_flex_full "Comment on the material" item.material_comment "<pre>" "</pre>" %} {% field_flex_multiple_obj "Object types" item 'object_types' %} {% field_flex "Object type quality" item.object_type_quality %} + {% field_flex_multiple_obj "Functional areas" item 'functional_areas' %} {% 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>" %} diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py index 8d49e7acb..631d587e6 100644 --- a/archaeological_finds/urls.py +++ b/archaeological_finds/urls.py @@ -398,6 +398,11 @@ urlpatterns = [ name="autocomplete-objecttype", ), url( + r"autocomplete-functionalarea/$", + views.autocomplete_functionalarea, + name="autocomplete-functionalarea", + ), + url( r"autocomplete-materialtype/$", views.autocomplete_materialtype, name="autocomplete-materialtype", diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index 561227f7c..10d074d64 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -462,6 +462,7 @@ autocomplete_objecttype = get_autocomplete_generic(models.ObjectType) autocomplete_materialtype = get_autocomplete_generic(models.MaterialType) autocomplete_treatmenttype = get_autocomplete_generic(models.TreatmentType) autocomplete_integritytype = get_autocomplete_generic(models.IntegrityType) +autocomplete_functionalarea = get_autocomplete_generic(models.FunctionalArea) class NewFindBasketView(IshtarMixin, LoginRequiredMixin, CreateView): |