diff options
| -rw-r--r-- | archaeological_operations/tests.py | 49 | ||||
| -rw-r--r-- | ishtar_common/urls.py | 4 | ||||
| -rw-r--r-- | ishtar_common/views.py | 34 | 
3 files changed, 79 insertions, 8 deletions
| diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index b3eac54d3..72cecee95 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -3167,6 +3167,14 @@ class OperationQATest(OperationInitTest, TestCase):              self.assertEqual(ope.locked, True)              self.assertEqual(ope.lock_user, self.user) +        response = c.post(url, {"action": "unlock"}) +        if response.status_code != 200: +            self.assertRedirects(response, '/success/') +        for ope in (op0, op1): +            ope = models.Operation.objects.get(pk=ope.pk) +            self.assertEqual(ope.locked, False) +            self.assertEqual(ope.lock_user, None) +          c = Client()          c.login(username=self.alt_username, password=self.alt_password)          response = c.get(reverse('operation-qa-lock', args=[pks])) @@ -3180,6 +3188,35 @@ class OperationQATest(OperationInitTest, TestCase):              self.assertEqual(ope.locked, True)              self.assertEqual(ope.lock_user, self.alt_user) +        response = c.post(url, {"action": "unlock"}) +        if response.status_code != 200: +            self.assertRedirects(response, '/success/') +        for ope in (op0, op1): +            ope = models.Operation.objects.get(pk=ope.pk) +            self.assertEqual(ope.locked, False) +            self.assertEqual(ope.lock_user, None) + +        # one item lock by another user +        op0 = models.Operation.objects.get(pk=op0.pk) +        op0.locked = True +        op0.lock_user = self.user +        op0.save() +        op1 = models.Operation.objects.get(pk=op1.pk) +        op1.locked = True +        op1.lock_user = self.alt_user +        op1.save() + +        response = c.post(url, {"action": "unlock"}) +        self.assertRedirects(response, '/qa-not-available/locked-by-others/') + +        op0 = models.Operation.objects.get(pk=op0.pk) +        self.assertEqual(op0.locked, True) +        self.assertEqual(op0.lock_user, self.user) + +        op1 = models.Operation.objects.get(pk=op1.pk) +        self.assertEqual(op1.locked, True) +        self.assertEqual(op1.lock_user, self.alt_user) +      def test_bulk_update(self):          c = Client()          pks = u"{}-{}".format(self.operations[0].pk, self.operations[1].pk) @@ -3232,6 +3269,18 @@ class OperationQATest(OperationInitTest, TestCase):              operation_type          ) +        # one item lock by another user +        op0 = models.Operation.objects.get(pk=self.operations[0].pk) +        op0.locked = True +        op0.lock_user = self.user +        op0.save() + +        response = c.post( +            reverse('operation-qa-bulk-update-confirm', args=[pks]), +            {'qa_operation_type': operation_type.pk} +        ) +        self.assertRedirects(response, '/qa-not-available/') +  class DocumentQATest(OperationInitTest, TestCase):      fixtures = OPERATION_FIXTURES diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 13694b10f..b8ccb5172 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -292,8 +292,8 @@ urlpatterns += [              views.QADocumentForm.as_view()),          name='document-qa-bulk-update-confirm', kwargs={"confirm": True}), -    url(r'^qa-not-available/$', views.QANotAvailable.as_view(), -        name='qa-not-available'), +    url(r'^qa-not-available(?:/(?P<context>[0-9a-z-]+))?/$', +        views.QANotAvailable.as_view(), name='qa-not-available'),  ]  urlpatterns += get_urls_for_model(models.Document, views) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index c663eccbc..db0d3631b 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -2113,11 +2113,17 @@ class AlertList(JSONResponseMixin, LoginRequiredMixin,  class QANotAvailable(IshtarMixin, LoginRequiredMixin, TemplateView):      template_name = 'ishtar/forms/qa_message.html'      modal_size = "small" +    contexts = {"locked-by-others": _("Some items have been locked by other " +                                      "user")}      def get_context_data(self, **kwargs):          data = super(QANotAvailable, self).get_context_data(**kwargs)          data["page_name"] = _("Not available")          data['message'] = _("Action not available for these items.") +        if self.kwargs.get("context"): +            context = self.kwargs.get("context") +            if context in self.contexts: +                data["message"] += " {}".format(self.contexts[context])          return data @@ -2134,7 +2140,7 @@ class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView):          # if not listed in QUICK_ACTIONS overload this method          return self.model.get_quick_action_by_url(self.base_url) -    def dispatch(self, request, *args, **kwargs): +    def pre_dispatch(self, request, *args, **kwargs):          assert self.model          pks = [int(pk) for pk in kwargs.get('pks').split('-')]          self.items = list(self.model.objects.filter(pk__in=pks)) @@ -2151,6 +2157,11 @@ class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView):                      raise Http404()          self.url = request.get_full_path() + +    def dispatch(self, request, *args, **kwargs): +        redirected = self.pre_dispatch(request, *args, **kwargs) +        if redirected: +            return redirected          return super(QAItemForm, self).dispatch(request, *args, **kwargs)      def get_form_kwargs(self): @@ -2175,15 +2186,18 @@ class QAItemEditForm(QAItemForm):      def get_quick_action(self):          return self.model.QA_EDIT -    def dispatch(self, request, *args, **kwargs): +    def pre_dispatch(self, request, *args, **kwargs):          self.confirm = kwargs.get('confirm', False) and True -        returned = super(QAItemEditForm, self).dispatch(request, *args, -                                                        **kwargs) +        redirected = super(QAItemEditForm, self).pre_dispatch( +            request, *args, **kwargs) +        if redirected: +            return redirected          if hasattr(self.model, "locked"):              for item in self.items:                  if item.locked: -                    return HttpResponseRedirect(reverse("qa-not-available")) -        return returned +                    redirected = HttpResponseRedirect( +                        reverse("qa-not-available")) +        return redirected      def get_form_class(self):          if len(self.items) > 1 and self.form_class_multi: @@ -2222,6 +2236,14 @@ class QABaseLockView(QAItemForm):      form_class = forms.QALockForm      page_name = _("lock/unlock") +    def pre_dispatch(self, request, *args, **kwargs): +        super(QABaseLockView, self).pre_dispatch( +            request, *args, **kwargs) +        if [True for item in self.items +                if item.lock_user and item.lock_user != request.user]: +            url = reverse("qa-not-available", args=["locked-by-others"]) +            return HttpResponseRedirect(url) +      def form_valid(self, form):          form.save(self.items, self.request.user)          return HttpResponseRedirect(reverse("success")) | 
