diff options
| -rw-r--r-- | archaeological_finds/models_finds.py | 3 | ||||
| -rw-r--r-- | archaeological_finds/tests.py | 2 | ||||
| -rw-r--r-- | archaeological_warehouse/forms.py | 15 | ||||
| -rw-r--r-- | archaeological_warehouse/models.py | 11 | ||||
| -rw-r--r-- | archaeological_warehouse/tests.py | 104 | ||||
| -rw-r--r-- | archaeological_warehouse/views.py | 2 | ||||
| -rw-r--r-- | ishtar_common/static/media/images/ishtar-bg.jpg | bin | 21188 -> 0 bytes | 
7 files changed, 126 insertions, 11 deletions
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index c83e78eaa..3adaf90dd 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -2220,7 +2220,8 @@ class Find(BulkUpdatedItem, ValueGetter, DocumentItem, BaseHistorizedItem,              container = self.container          if not container:              return "" -        locas = container.get_localisations() +        ## first localisation is the warehouse +        locas = list(container.get_localisations())[1:]          if len(locas) < (place + 1):              return ""          return locas[place] diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 80202f442..9387840a0 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -1930,7 +1930,7 @@ class TreatmentTest(FindInit, TestCase):          self.create_finds(data_base={"label": u"Find 1"}, force=True)          self.create_finds(data_base={"label": u"Find 2"}, force=True)          image = Document.objects.create(title="Image!") -        image.image.save('ishtar-bg.jpg', File(open(img))) +        image.image.save('ishtar-bg.jpg', File(open(img, "rb")))          self.finds[0].documents.add(image)          self.finds[0].save() diff --git a/archaeological_warehouse/forms.py b/archaeological_warehouse/forms.py index 6ea1ae4f6..170edce1f 100644 --- a/archaeological_warehouse/forms.py +++ b/archaeological_warehouse/forms.py @@ -596,7 +596,7 @@ class QAContainerFormMulti(QAForm):          self.items = kwargs["items"]          super(QAContainerFormMulti, self).__init__(*args, **kwargs)          locations = set([item.location_id for item in self.items]) -        if len(locations) == 1: +        if len(locations) == 1 and "qalocation" in self.fields:              self.fields["qalocation"].initial = locations.pop()      def _get_qalocation(self, value): @@ -641,7 +641,7 @@ class QAContainerFormMulti(QAForm):                          _("Cannot do this changes because it would generate "                            "many containers with location: {}, container type: "                            "{}, parent: {} {} and reference: {}. " -                          "Merge theses containers first?")).format( +                          "Merge these containers first?")).format(                          models.Warehouse.objects.get(pk=vals["location_id"]),                          models.ContainerType.objects.get(                              pk=vals["container_type_id"]), @@ -650,3 +650,14 @@ class QAContainerFormMulti(QAForm):                      )                  )          return self.cleaned_data + +    def save(self, items, user): +        super(QAContainerFormMulti, self).save(items, user) +        if self.cleaned_data.get("qaparent", None): +            return +        for item in items: +            item = models.Container.objects.get(pk=item.pk) +            # remove parent if do not share the same location +            if item.parent and item.parent.location != item.location: +                item.parent = None +                item.save() diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py index 565b64af2..04936d7a5 100644 --- a/archaeological_warehouse/models.py +++ b/archaeological_warehouse/models.py @@ -821,12 +821,12 @@ class Container(DocumentItem, Merge, LightHistorizedItem, QRCodeItem, GeoItem,          return self.location._get_base_image_path() + "/" + self.external_id      @classmethod -    def _change_parent_location(cls, parent): +    def _change_child_location(cls, parent):          for child in cls.objects.filter(parent=parent).all():              if child.location != parent.location:                  child.location = parent.location                  child.save() -            cls._change_parent_location(child) +            cls._change_child_location(child)      def merge(self, item, keep_old=False, exclude_fields=None):          # merge child containers @@ -844,7 +844,7 @@ class Container(DocumentItem, Merge, LightHistorizedItem, QRCodeItem, GeoItem,              else:                  child.parent = self                  child.save() -        self._change_parent_location(self) +        self._change_child_location(self)          super(Container, self).merge(item, keep_old=keep_old,                                       exclude_fields=exclude_fields) @@ -980,7 +980,8 @@ class Container(DocumentItem, Merge, LightHistorizedItem, QRCodeItem, GeoItem,              return          # modify existing -        current_localisations = self.get_localisations() +        ## first localisation is the warehouse +        current_localisations = list(self.get_localisations())[1:]          current_localisation, current_parent = None, None          for loca in current_localisations:              if loca.container_type == current_container_type: @@ -1143,7 +1144,7 @@ class Container(DocumentItem, Merge, LightHistorizedItem, QRCodeItem, GeoItem,      def save(self, *args, **kwargs):          self.pre_save()          super(Container, self).save(*args, **kwargs) -        self._change_parent_location(self) +        self._change_child_location(self)          updated = False          if not self.index: diff --git a/archaeological_warehouse/tests.py b/archaeological_warehouse/tests.py index 81b8b3df5..126cc0420 100644 --- a/archaeological_warehouse/tests.py +++ b/archaeological_warehouse/tests.py @@ -19,10 +19,15 @@  import json +from django.contrib.auth.models import Permission +from django.core.urlresolvers import reverse +from django.test.client import Client +  from archaeological_finds.tests import FindInit  from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \ -    TestCase, WAREHOUSE_FIXTURES, GenericSerializationTest, COMMON_FIXTURES +    TestCase, WAREHOUSE_FIXTURES, GenericSerializationTest, COMMON_FIXTURES, \ +    create_user  from ishtar_common.models import IshtarSiteProfile, SpatialReferenceSystem  from archaeological_operations.models import Operation @@ -832,5 +837,102 @@ class ContainerTest(FindInit, TestCase):          self.assertEqual(bottom.parent, middle)          self.assertEqual(bottom.location, self.main_warehouse) +    def test_bulk_update(self): +        username, password, user = create_user() +        user.user_permissions.add(Permission.objects.get( +            codename='change_container')) +        client = Client() + +        ct = models.ContainerType.objects.all()[0] +        ct2 = models.ContainerType.objects.all()[1] +        container_parent = models.Container.objects.create( +            reference="Parent container", +            location=self.main_warehouse, +            container_type=ct) +        container_parent2 = models.Container.objects.create( +            reference="Parent container 2", +            location=self.alt_warehouse, +            container_type=ct) + +        container = models.Container.objects.create( +            reference="Test", +            location=self.main_warehouse, +            parent=container_parent, +            container_type=ct2) + +        # base modification +        url = reverse('container-qa-bulk-update', args=[container.pk]) +        data = { +            "qacontainer_type": ct.pk, +            "qalocation": '', +            "qaparent": '' +        } +        response = client.post(url, data) +        self.assertRedirects(response, '/') +        client.login(username=username, password=password) +        response = client.post(url, data) +        self.assertEqual(response.status_code, 200) +        confirm_url = reverse( +            'container-qa-bulk-update-confirm', args=[container.pk]) +        response = client.post(confirm_url, data) +        self.assertRedirects(response, '/success/') + +        container = models.Container.objects.get(pk=container.pk) +        self.assertEqual(container.container_type_id, ct.pk) + +        container.container_type = ct2 +        container.save() + +        data = { +            "qacontainer_type": '', +            "qalocation": self.alt_warehouse.pk, +            "qaparent": container_parent2.pk +        } +        response = client.post(confirm_url, data) +        self.assertRedirects(response, '/success/') + +        container = models.Container.objects.get(pk=container.pk) +        self.assertEqual(container.location, self.alt_warehouse) +        self.assertEqual(container.parent, container_parent2) + +        container.location = self.main_warehouse +        container.parent = container_parent +        container.save() + +        # change location of children + +        data = { +            "qacontainer_type": '', +            "qalocation": self.alt_warehouse.pk, +            "qaparent": '' +        } +        confirm_parent_url = reverse( +            'container-qa-bulk-update-confirm', args=[container_parent.pk]) +        response = client.post(confirm_parent_url, data) +        self.assertRedirects(response, '/success/') + +        container_parent = models.Container.objects.get(pk=container_parent.pk) +        self.assertEqual(container_parent.location, self.alt_warehouse) +        container = models.Container.objects.get(pk=container.pk) +        self.assertEqual(container.location, self.alt_warehouse) + +        container_parent.location = self.main_warehouse +        container_parent.save() +        container.location = self.main_warehouse +        container.parent = container_parent +        container.save() + +        # reinit parent when not provided and location changed + +        data = { +            "qacontainer_type": '', +            "qalocation": self.alt_warehouse.pk, +            "qaparent": '' +        } +        response = client.post(confirm_url, data) +        self.assertRedirects(response, '/success/') +        container = models.Container.objects.get(pk=container.pk) +        self.assertEqual(container.location, self.alt_warehouse) +        self.assertEqual(container.parent, None) diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py index 6675addca..3a11c0e05 100644 --- a/archaeological_warehouse/views.py +++ b/archaeological_warehouse/views.py @@ -302,6 +302,6 @@ class QAContainerForm(QAItemEditForm):      def get_form_kwargs(self):          kwargs = super(QAContainerForm, self).get_form_kwargs() -        # item list is necessary to verify unicity rules +        # item list is necessary to verify uniqueness rules          kwargs['items'] = self.items          return kwargs diff --git a/ishtar_common/static/media/images/ishtar-bg.jpg b/ishtar_common/static/media/images/ishtar-bg.jpg Binary files differindex 6c1dd0a74..e69de29bb 100644 --- a/ishtar_common/static/media/images/ishtar-bg.jpg +++ b/ishtar_common/static/media/images/ishtar-bg.jpg  | 
