diff options
| -rw-r--r-- | archaeological_finds/models_finds.py | 2 | ||||
| -rw-r--r-- | archaeological_finds/views.py | 16 | ||||
| -rw-r--r-- | archaeological_operations/tests.py | 134 | ||||
| -rw-r--r-- | ishtar_common/models.py | 6 | ||||
| -rw-r--r-- | ishtar_common/tests.py | 45 | ||||
| -rw-r--r-- | ishtar_common/views.py | 4 | 
6 files changed, 191 insertions, 16 deletions
| diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 4f28b977c..becbea68e 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -681,7 +681,7 @@ class FindBasket(Basket, MainItem, ValueGetter):                   _(u"Add treatment file"), "fa fa-file-text-o", "", "", False),              ] -        duplicate = self.QUICK_ACTIONS[0] +        duplicate = self.get_quick_action_by_url("find-qa-duplicate")          actions += [              (reverse(duplicate.url, args=[self.pk]),               duplicate.text, duplicate.icon_class, diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py index ed0389cff..7b7bf20ad 100644 --- a/archaeological_finds/views.py +++ b/archaeological_finds/views.py @@ -922,9 +922,7 @@ class QAFindBasketFormView(QAItemForm):      form_class = forms.QAFindBasketForm      page_name = _(u"Basket")      modal_size = "small" - -    def get_quick_action(self): -        return models.Find.QUICK_ACTIONS[1] +    base_url = "find-qa-basket"      def get_form_kwargs(self):          kwargs = super(QAFindBasketFormView, self).get_form_kwargs() @@ -941,9 +939,7 @@ class QAFindDuplicateFormView(QAItemForm):      model = models.Find      page_name = _(u"Duplicate")      form_class = forms.QAFindDuplicateForm - -    def get_quick_action(self): -        return models.Find.QUICK_ACTIONS[1] +    base_url = "find-qa-duplicate"      def get_form_kwargs(self):          kwargs = super(QAFindDuplicateFormView, self).get_form_kwargs() @@ -970,9 +966,7 @@ class QAFindTreatmentFormView(QAItemForm):      model = models.Find      form_class = forms.QAFindTreatmentForm      page_name = _(u"Packaging") - -    def get_quick_action(self): -        return models.Find.QUICK_ACTIONS[2] +    base_url = "find-qa-packaging"      def get_form_kwargs(self):          kwargs = super(QAFindTreatmentFormView, self).get_form_kwargs() @@ -991,9 +985,7 @@ class QAFindbasketDuplicateFormView(QAItemForm):      page_name = _(u"Duplicate")      modal_size = "small"      form_class = forms.QAFindbasketDuplicateForm - -    def get_quick_action(self): -        return models.FindBasket.QUICK_ACTIONS[0] +    base_url = "findbasket-qa-duplicate"      def get_form_kwargs(self):          kwargs = super(QAFindbasketDuplicateFormView, self).get_form_kwargs() diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 42ceea292..8e956c3ab 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -990,9 +990,11 @@ def create_orga(user):      return orga -def create_operation(user, orga=None, values={}): +def create_operation(user, orga=None, values=None):      operation_type = models.OperationType.objects.get(          txt_idx="arch_diagnostic") +    if not values: +        values = {}      dct = {'year': 2010, 'operation_type_id': operation_type.pk,             'history_modifier': user}      dct.update(values) @@ -2992,3 +2994,133 @@ class AutocompleteTest(AutocompleteTestBase, TestCase):              operation_type=models.OperationType.objects.all()[0]          )          return item, None + + +class OperationQATest(OperationInitTest, TestCase): +    fixtures = OPERATION_FIXTURES +    model = models.Operation + +    def setUp(self): +        self.username, self.password, self.user = create_superuser() +        self.orgas = self.create_orgas(self.user) +        self.create_operation(self.user, self.orgas[0]) +        self.create_operation(self.user, self.orgas[0]) +        self.alt_username, self.alt_password, self.alt_user = create_user() +        self.alt_user.user_permissions.add(Permission.objects.get( +            codename='change_operation')) + +    def test_bulk_update(self): +        c = Client() +        pks = u"{}-{}".format(self.operations[0].pk, self.operations[1].pk) +        response = c.get(reverse('operation-qa-bulk-update', args=[pks])) +        self.assertRedirects(response, '/') + +        c = Client() +        c.login(username=self.username, password=self.password) +        response = c.get(reverse('operation-qa-bulk-update', args=[pks])) +        self.assertEqual(response.status_code, 200) + +        c = Client() +        c.login(username=self.alt_username, password=self.alt_password) +        response = c.get(reverse('operation-qa-bulk-update', args=[pks])) +        self.assertEqual(response.status_code, 200) + +        operation_0 = self.operations[0] +        operation_1 = self.operations[1] +        base_desc_0 = u"Base description 1" +        operation_0.description = base_desc_0 +        operation_0.save() +        base_desc_1 = u"Base description 2" +        operation_1.description = base_desc_1 +        operation_1.save() + +        operation_type = models.OperationType.objects.exclude( +            txt_idx="arch_diagnostic").all()[0] + +        self.assertNotEqual( +            models.Operation.objects.get(pk=operation_0.pk).operation_type, +            operation_type +        ) +        self.assertNotEqual( +            models.Operation.objects.get(pk=operation_1.pk).operation_type, +            operation_type +        ) + +        response = c.post( +            reverse('operation-qa-bulk-update-confirm', args=[pks]), +            {'qa_operation_type': operation_type.pk} +        ) +        if response.status_code != 200: +            self.assertRedirects(response, '/success/') +        self.assertEqual( +            models.Operation.objects.get(pk=operation_0.pk).operation_type, +            operation_type +        ) +        self.assertEqual( +            models.Operation.objects.get(pk=operation_1.pk).operation_type, +            operation_type +        ) + + +class DocumentQATest(OperationInitTest, TestCase): +    fixtures = OPERATION_FIXTURES +    model = Document + +    def setUp(self): +        self.username, self.password, self.user = create_superuser() +        self.alt_username, self.alt_password, self.alt_user = create_user() +        self.alt_user.user_permissions.add(Permission.objects.get( +            codename='change_document')) +        self.source_1 = models.Document.objects.create( +            title="Source title", +            source_type=models.SourceType.objects.all()[0] +        ) +        self.source_2 = models.Document.objects.create( +            title="Source title2", +            source_type=models.SourceType.objects.all()[0] +        ) + +    def test_bulk_update(self): +        c = Client() +        pks = u"{}-{}".format(self.source_1.pk, self.source_2.pk) +        response = c.get(reverse('document-qa-bulk-update', args=[pks])) +        self.assertRedirects(response, '/') + +        c = Client() +        c.login(username=self.username, password=self.password) +        response = c.get(reverse('document-qa-bulk-update', args=[pks])) +        self.assertEqual(response.status_code, 200) + +        c = Client() +        c.login(username=self.alt_username, password=self.alt_password) +        response = c.get(reverse('document-qa-bulk-update', args=[pks])) +        self.assertEqual(response.status_code, 200) + +        document_0 = self.source_1 +        document_1 = self.source_2 +        source_type = models.SourceType.objects.exclude( +            txt_idx=self.source_1.source_type.txt_idx).all()[0] + +        self.assertNotEqual( +            models.Document.objects.get(pk=document_0.pk).source_type, +            source_type +        ) +        self.assertNotEqual( +            models.Document.objects.get(pk=document_1.pk).source_type, +            source_type +        ) + +        response = c.post( +            reverse('document-qa-bulk-update-confirm', args=[pks]), +            {'qa_source_type': source_type.pk} +        ) +        if response.status_code != 200: +            self.assertRedirects(response, '/success/') +        self.assertEqual( +            models.Document.objects.get(pk=document_0.pk).source_type, +            source_type +        ) +        self.assertEqual( +            models.Document.objects.get(pk=document_1.pk).source_type, +            source_type +        ) diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1c841a984..d8cc862f6 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2403,6 +2403,12 @@ class MainItem(ShortMenuItem):                          action.target or ""])          return qas +    @classmethod +    def get_quick_action_by_url(cls, url): +        for action in cls.QUICK_ACTIONS: +            if action.url == url: +                return action +  class LightHistorizedItem(BaseHistorizedItem):      history_date = models.DateTimeField(default=datetime.datetime.now) diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 0f00322fe..b056359ec 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -29,7 +29,7 @@ from io import StringIO  from django.apps import apps  from django.conf import settings -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Permission  from django.contrib.contenttypes.models import ContentType  from django.core.cache import cache  from django.core.exceptions import ValidationError @@ -1902,3 +1902,46 @@ class CleanMedia(TestCase):              found = try_fix_file(name, make_copy=False)              self.assertEqual(found, expected) + + +class PersonQATest(TestCase): +    model = models.Person + +    def setUp(self): +        self.username, self.password, self.user = create_superuser() +        self.user.user_permissions.add(Permission.objects.get( +            codename='change_person')) +        self.title_1 = models.TitleType.objects.create(label="T1", txt_idx="t1") +        self.title_2 = models.TitleType.objects.create(label="T2", txt_idx="t2") +        self.person_1 = models.Person.objects.create(title=self.title_1) +        self.person_2 = models.Person.objects.create(title=self.title_1) + +    def test_bulk_update(self): +        c = Client() +        pks = u"{}-{}".format(self.person_1.pk, self.person_2.pk) +        response = c.get(reverse('person-qa-bulk-update', args=[pks])) +        self.assertRedirects(response, '/') + +        c = Client() +        c.login(username=self.username, password=self.password) +        response = c.get(reverse('person-qa-bulk-update', args=[pks])) +        self.assertEqual(response.status_code, 200) + +        self.assertNotEqual(self.person_1.title, self.title_2) +        self.assertNotEqual(self.person_2.title, self.title_2) + +        response = c.post( +            reverse('person-qa-bulk-update-confirm', args=[pks]), +            {'qa_title': self.title_2.pk} +        ) +        if response.status_code != 200: +            self.assertRedirects(response, '/success/') +        self.assertEqual( +            models.Person.objects.get(pk=self.person_1.pk).title, +            self.title_2 +        ) +        self.assertEqual( +            models.Person.objects.get(pk=self.person_2.pk).title, +            self.title_2 +        ) + diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 98c538c66..bb68f6044 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -2059,13 +2059,15 @@ class AlertList(JSONResponseMixin, LoginRequiredMixin,  class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView):      template_name = 'ishtar/forms/qa_form.html'      model = None +    base_url = None      form_class = None      page_name = u""      success_url = "/success/"      modal_size = None  # large, small or None (medium)      def get_quick_action(self): -        raise NotImplementedError() +        # 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):          assert self.model | 
