summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitb78fa1d244be029d49966a920f00f178ee2ef9ae (patch)
tree5ccf9926aed3e4fee4dce8594f69010ae2b00520
parent914fca851a55d60a25eee0a0848175f68f8c4b4c (diff)
downloadIshtar-b78fa1d244be029d49966a920f00f178ee2ef9ae.tar.bz2
Ishtar-b78fa1d244be029d49966a920f00f178ee2ef9ae.zip
Find: add functional area field
-rw-r--r--archaeological_finds/admin.py10
-rw-r--r--archaeological_finds/forms.py26
-rw-r--r--archaeological_finds/lookups.py5
-rw-r--r--archaeological_finds/migrations/0108_auto_20210602_2234.py51
-rw-r--r--archaeological_finds/models.py2
-rw-r--r--archaeological_finds/models_finds.py24
-rw-r--r--archaeological_finds/templates/ishtar/sheet_find.html1
-rw-r--r--archaeological_finds/urls.py5
-rw-r--r--archaeological_finds/views.py1
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):