summaryrefslogtreecommitdiff
path: root/archaeological_warehouse
diff options
context:
space:
mode:
Diffstat (limited to 'archaeological_warehouse')
-rw-r--r--archaeological_warehouse/admin.py11
-rw-r--r--archaeological_warehouse/forms.py21
-rw-r--r--archaeological_warehouse/models.py53
-rw-r--r--archaeological_warehouse/tests.py97
4 files changed, 139 insertions, 43 deletions
diff --git a/archaeological_warehouse/admin.py b/archaeological_warehouse/admin.py
index 1284fe676..22e53490b 100644
--- a/archaeological_warehouse/admin.py
+++ b/archaeological_warehouse/admin.py
@@ -37,11 +37,15 @@ class WarehouseAdmin(HistorizedObjectAdmin):
list_filter = ('warehouse_type',)
search_fields = ('name', 'town')
model = models.Warehouse
- form = make_ajax_form(model, {
+ ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
+ ajax_form_dict.update({
'town': 'town',
+ 'precise_town': 'town',
'person_in_charge': 'person'
})
+ form = make_ajax_form(model, ajax_form_dict)
inlines = [DivisionInline]
+ exclude = ["documents", "main_image"]
admin_site.register(models.Warehouse, WarehouseAdmin)
@@ -63,10 +67,13 @@ class ContainerAdmin(HistorizedObjectAdmin):
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'history_date'
]
- form = make_ajax_form(model, {
+ ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
+ ajax_form_dict.update({
'location': 'warehouse',
'responsible': 'warehouse'
})
+ form = make_ajax_form(model, ajax_form_dict)
+ exclude = ["documents", "main_image"]
admin_site.register(models.Container, ContainerAdmin)
diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py
index b950a5d3c..a7b6c575e 100644
--- a/archaeological_warehouse/forms.py
+++ b/archaeological_warehouse/forms.py
@@ -27,7 +27,7 @@ from django.forms.formsets import formset_factory
from ishtar_common.utils import ugettext_lazy as _
from ishtar_common.models import Person, valid_id, Town, \
- SpatialReferenceSystem, Organization, valid_ids
+ SpatialReferenceSystem, Organization, valid_ids, person_type_pks_lazy
from archaeological_operations.models import ArchaeologicalSite
from archaeological_context_records.models import ContextRecord
from archaeological_finds.models import TreatmentType, FindBasket, \
@@ -42,7 +42,7 @@ from bootstrap_datepicker.widgets import DatePicker
from ishtar_common.forms import name_validator, reverse_lazy, \
get_form_selection, ManageOldType, FinalForm, FormSet, \
- CustomForm, FieldType, HistorySelect, FormHeader, TableSelect, \
+ CustomForm, FieldType, DocumentItemSelect, FormHeader, TableSelect, \
CustomFormSearch, MultiSearchForm, LockForm
from ishtar_common.forms_common import get_town_field
from archaeological_finds.forms import FindMultipleFormSelection, \
@@ -99,8 +99,9 @@ class WarehouseSelect(CustomForm, TableSelect):
label=_(u"Full text search"), widget=widgets.SearchWidget(
'archaeological-warehouse', 'warehouse'
))
- name = forms.CharField(label=_(u"Name"))
- warehouse_type = forms.ChoiceField(label=_(u"Warehouse type"), choices=[])
+ name = forms.CharField(label=_("Name"))
+ warehouse_type = forms.ChoiceField(label=_("Warehouse type"), choices=[])
+ town = get_town_field(label=_("Town"))
def __init__(self, *args, **kwargs):
super(WarehouseSelect, self).__init__(*args, **kwargs)
@@ -353,7 +354,7 @@ class ContainerModifyForm(ContainerForm):
return cleaned_data
-class ContainerSelect(HistorySelect):
+class ContainerSelect(DocumentItemSelect):
_model = models.Container
form_admin_name = _(u"Container - 001 - Search")
form_slug = "container-001-search"
@@ -390,14 +391,22 @@ class ContainerSelect(HistorySelect):
archaeological_sites_context_record_name = forms.CharField(
label=_(u"Archaeological site name (attached to the context record)")
)
- code_patriarche = forms.IntegerField(label=_(u"Code PATRIARCHE"),
+ code_patriarche = forms.IntegerField(label=_("Operation - Code PATRIARCHE"),
widget=OAWidget)
+ operation_town = get_town_field(label=_("Operation - town"))
+ operation_scientist = forms.IntegerField(
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person-permissive'),
+ associated_model=Person),
+ label=_("Operation - Scientist"))
context_record = forms.IntegerField(
label=_("Context record"),
widget=widgets.JQueryAutoComplete(
reverse_lazy('autocomplete-contextrecord'),
associated_model=ContextRecord),
validators=[valid_id(ContextRecord)])
+ find_label = forms.CharField(label=_("Find - Label"))
+ find_denomination = forms.CharField(label=_("Find - Denomination"))
description = forms.CharField(label=_(u"Find - Description"))
material_types = forms.IntegerField(
label=_(u"Material type"),
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index 64a766cea..63d4497ac 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -20,7 +20,6 @@
import datetime
import uuid
-from django.conf import settings
from django.contrib.gis.db import models
from django.contrib.postgres.indexes import GinIndex
from django.core.urlresolvers import reverse
@@ -66,6 +65,7 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem,
SearchVectorConfig("warehouse_type__label"),
SearchVectorConfig("external_id"),
SearchVectorConfig("town"),
+ SearchVectorConfig("precise_town__name"),
SearchVectorConfig("comment", "local"),
]
@@ -84,6 +84,11 @@ class Warehouse(Address, DocumentItem, GeoItem, QRCodeItem, DashboardFormItem,
pgettext_lazy("key for text search", "type"),
'warehouse_type__label__iexact'
),
+ 'town':
+ SearchAltName(
+ pgettext_lazy("key for text search", "town"),
+ 'precise_town__cached_label__iexact'
+ ),
}
GEO_LABEL = "name"
DOWN_MODEL_UPDATE = ["containers"]
@@ -497,6 +502,18 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,
pgettext_lazy("key for text search", "comment"),
'comment__iexact'
),
+ 'operation_town':
+ SearchAltName(
+ pgettext_lazy("key for text search", "operation-town"),
+ 'finds__base_finds__context_record__operation__'
+ 'towns__cached_label__iexact'
+ ),
+ 'operation_scientist':
+ SearchAltName(
+ pgettext_lazy("key for text search", "operation-scientist"),
+ 'finds__base_finds__context_record__operation__'
+ 'scientist__cached_label__iexact'
+ ),
'code_patriarche':
SearchAltName(
pgettext_lazy("key for text search", "code-patriarche"),
@@ -528,6 +545,14 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,
SearchAltName(
pgettext_lazy("key for text search", "context-record"),
'finds__base_finds__context_record__cached_label__icontains'),
+ 'find_label':
+ SearchAltName(
+ pgettext_lazy("key for text search", "find-label"),
+ 'finds__label__icontains'),
+ 'find_denomination':
+ SearchAltName(
+ pgettext_lazy("key for text search", "find-denomination"),
+ 'finds__denomination__icontains'),
'material_types':
SearchAltName(
pgettext_lazy("key for text search", "material"),
@@ -578,9 +603,15 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,
),
}
+ REVERSED_BOOL_FIELDS = [
+ 'documents__image__isnull',
+ 'documents__associated_file__isnull',
+ 'documents__associated_url__isnull',
+ ]
REVERSED_MANY_COUNTED_FIELDS = ['finds', 'finds_ref']
ALT_NAMES.update(LightHistorizedItem.ALT_NAMES)
+ ALT_NAMES.update(DocumentItem.ALT_NAMES)
DYNAMIC_REQUESTS = {
'division': DynamicRequest(
@@ -909,7 +940,25 @@ class Container(DocumentItem, LightHistorizedItem, QRCodeItem, GeoItem,
loca.delete()
-post_save.connect(cached_label_and_geo_changed, sender=Container)
+def container_post_save(sender, **kwargs):
+ cached_label_and_geo_changed(sender=sender, **kwargs)
+ if not kwargs.get('instance'):
+ return
+ instance = kwargs.get('instance')
+ for loca in ContainerLocalisation.objects.filter(
+ container=instance).exclude(
+ division__warehouse=instance.location).all():
+ q = WarehouseDivisionLink.objects.filter(
+ warehouse=instance.location,
+ division=loca.division.division
+ )
+ if not q.count():
+ continue
+ loca.division = q.all()[0]
+ loca.save()
+
+
+post_save.connect(container_post_save, sender=Container)
m2m_changed.connect(document_attached_changed,
sender=Container.documents.through)
diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py
index 72124e685..37c342ef7 100644
--- a/archaeological_warehouse/tests.py
+++ b/archaeological_warehouse/tests.py
@@ -527,15 +527,23 @@ class WarehouseTest(TestCase):
class ContainerTest(FindInit, TestCase):
fixtures = WAREHOUSE_FIXTURES
- def test_form_creation(self):
- main_warehouse = models.Warehouse.objects.create(
+ def setUp(self):
+ self.main_warehouse = models.Warehouse.objects.create(
name="Main",
warehouse_type=models.WarehouseType.objects.all()[0]
)
+ self.division = models.WarehouseDivision.objects.create(
+ label='division')
+ self.alt_division = models.WarehouseDivision.objects.create(
+ label='division2')
+ self.div_link = models.WarehouseDivisionLink.objects.create(
+ warehouse=self.main_warehouse, division=self.division)
+
+ def test_form_creation(self):
data = {
'reference': 'hop-ref',
- "responsible": main_warehouse.pk,
- "location": main_warehouse.pk,
+ "responsible": self.main_warehouse.pk,
+ "location": self.main_warehouse.pk,
"container_type": models.ContainerType.objects.all()[0].pk
}
form = forms.ContainerForm(data=data)
@@ -547,29 +555,21 @@ class ContainerTest(FindInit, TestCase):
self.container_number + 1)
def test_change_location(self):
- main_warehouse = models.Warehouse.objects.create(
- name="Main",
- warehouse_type=models.WarehouseType.objects.all()[0]
- )
- div = models.WarehouseDivision.objects.create(label='division')
- div_link = models.WarehouseDivisionLink.objects.create(
- warehouse=main_warehouse, division=div)
-
container = models.Container.objects.create(
- reference="Test", responsible=main_warehouse,
- location=main_warehouse,
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
container_type=models.ContainerType.objects.all()[0]
)
container.save()
container = models.Container.objects.get(pk=container.pk)
- self.assertIn(main_warehouse.name, container.cached_location)
+ self.assertIn(self.main_warehouse.name, container.cached_location)
models.ContainerLocalisation.objects.create(
- container=container, division=div_link,
+ container=container, division=self.div_link,
)
self.assertTrue(models.ContainerLocalisation.objects.filter(
- division__warehouse=main_warehouse).count())
+ division__warehouse=self.main_warehouse).count())
# changing location remove irrelevant localisation
other_warehouse = models.Warehouse.objects.create(
name="Other",
@@ -578,23 +578,58 @@ class ContainerTest(FindInit, TestCase):
container.location = other_warehouse
container.save()
self.assertFalse(models.ContainerLocalisation.objects.filter(
- division__warehouse=main_warehouse).count())
+ division__warehouse=self.main_warehouse).count())
- def test_update_containers_on_warehouse_update(self):
- main_warehouse = models.Warehouse.objects.create(
- name="Main",
+ def test_reassign_existing_division_on_warehouse_change(self):
+ container = models.Container.objects.create(
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
+ container_type=models.ContainerType.objects.all()[0]
+ )
+ container_loca = models.ContainerLocalisation.objects.create(
+ container=container, division=self.div_link,
+ )
+
+ alt_warehouse = models.Warehouse.objects.create(
+ name="Alternative",
warehouse_type=models.WarehouseType.objects.all()[0]
)
+ new_div_link = models.WarehouseDivisionLink.objects.create(
+ warehouse=alt_warehouse, division=self.division)
+
+ nb_container_loca = models.ContainerLocalisation.objects.count()
+
+ container.location = alt_warehouse
+ container.save()
+
+ # no new container localisation
+ self.assertEqual(nb_container_loca,
+ models.ContainerLocalisation.objects.count())
+ # but the new one is reaffected
+ container_loca = models.ContainerLocalisation.objects.get(
+ pk=container_loca.pk)
+ self.assertEqual(container_loca.division, new_div_link)
+
+ # reaffect first division link
+ self.div_link.division = self.alt_division
+ self.div_link.save()
+ container.location = self.main_warehouse
+ container.save()
+ # cannot reaffect -> the location is not preserved
+ self.assertEqual(nb_container_loca,
+ models.ContainerLocalisation.objects.count() + 1)
+
+ def test_update_containers_on_warehouse_update(self):
container = models.Container.objects.create(
- reference="Test", responsible=main_warehouse,
- location=main_warehouse,
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
container_type=models.ContainerType.objects.all()[0]
)
container.save()
container = models.Container.objects.get(pk=container.pk)
- self.assertIn(main_warehouse.name, container.cached_location)
- main_warehouse.name = "New name"
- main_warehouse.save()
+ self.assertIn(self.main_warehouse.name, container.cached_location)
+ self.main_warehouse.name = "New name"
+ self.main_warehouse.save()
self.assertEqual(
models.Container.objects.filter(
need_update=True
@@ -619,19 +654,15 @@ class ContainerTest(FindInit, TestCase):
profile.locate_warehouses = True
profile.save()
wgs84 = SpatialReferenceSystem.objects.get(srid=4326)
- main_warehouse = models.Warehouse.objects.create(
- name="Main",
- warehouse_type=models.WarehouseType.objects.all()[0],
- )
container = models.Container.objects.create(
- reference="Test", responsible=main_warehouse,
- location=main_warehouse,
+ reference="Test", responsible=self.main_warehouse,
+ location=self.main_warehouse,
container_type=models.ContainerType.objects.all()[0]
)
container.save()
self.assertEqual(container.x, None)
- main_warehouse = models.Warehouse.objects.get(pk=main_warehouse.pk)
+ main_warehouse = models.Warehouse.objects.get(pk=self.main_warehouse.pk)
main_warehouse.x, main_warehouse.y = 33, 42
main_warehouse.spatial_reference_system = wgs84
main_warehouse.save()