diff options
Diffstat (limited to 'archaeological_warehouse')
| -rw-r--r-- | archaeological_warehouse/admin.py | 11 | ||||
| -rw-r--r-- | archaeological_warehouse/forms.py | 21 | ||||
| -rw-r--r-- | archaeological_warehouse/models.py | 53 | ||||
| -rw-r--r-- | archaeological_warehouse/tests.py | 97 |
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() |
