Exemple #1
0
 def test_get_paginator(self):
     """Search results are paginated."""
     Question.objects.bulk_create(Question(question=str(i)) for i in range(PAGINATOR_SIZE + 10))
     model_admin = QuestionAdmin(Question, site)
     model_admin.ordering = ['pk']
     # The first page of results.
     request = self.factory.get(self.url, {'term': ''})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(model_admin=model_admin)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode('utf-8'))
     self.assertEqual(data, {
         'results': [{'id': str(q.pk), 'text': q.question} for q in Question.objects.all()[:PAGINATOR_SIZE]],
         'pagination': {'more': True},
     })
     # The second page of results.
     request = self.factory.get(self.url, {'term': '', 'page': '2'})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(model_admin=model_admin)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode('utf-8'))
     self.assertEqual(data, {
         'results': [{'id': str(q.pk), 'text': q.question} for q in Question.objects.all()[PAGINATOR_SIZE:]],
         'pagination': {'more': False},
     })
 def test_has_view_or_change_permission_required(self):
     """
     Users require the change permission for the related model to the
     autocomplete view for it.
     """
     request = self.factory.get(self.url, {'term': 'is'})
     self.user.is_staff = True
     self.user.save()
     request.user = self.user
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 403)
     self.assertJSONEqual(response.content.decode('utf-8'),
                          {'error': '403 Forbidden'})
     for permission in ('view', 'change'):
         with self.subTest(permission=permission):
             self.user.user_permissions.clear()
             p = Permission.objects.get(
                 content_type=ContentType.objects.get_for_model(Question),
                 codename='%s_question' % permission,
             )
             self.user.user_permissions.add(p)
             request.user = User.objects.get(pk=self.user.pk)
             response = AutocompleteJsonView.as_view(
                 **self.as_view_args)(request)
             self.assertEqual(response.status_code, 200)
Exemple #3
0
 def test_field_no_related_field(self):
     request = self.factory.get(self.url, {
         'term': 'is',
         **self.opts, 'field_name': 'answer'
     })
     request.user = self.superuser
     with self.assertRaises(PermissionDenied):
         AutocompleteJsonView.as_view(**self.as_view_args)(request)
Exemple #4
0
 def test_field_no_related_field(self):
     request = self.factory.get(self.url, {
         "term": "is",
         **self.opts, "field_name": "answer"
     })
     request.user = self.superuser
     with self.assertRaises(PermissionDenied):
         AutocompleteJsonView.as_view(**self.as_view_args)(request)
Exemple #5
0
 def test_custom_to_field_permission_denied(self):
     Question.objects.create(question='Is this a question?')
     request = self.factory.get(
         self.url, {
             'term': 'is',
             **self.opts, 'field_name': 'question_with_to_field'
         })
     request.user = self.user
     with self.assertRaises(PermissionDenied):
         AutocompleteJsonView.as_view(**self.as_view_args)(request)
Exemple #6
0
 def test_custom_to_field_permission_denied(self):
     Question.objects.create(question="Is this a question?")
     request = self.factory.get(
         self.url,
         {
             "term": "is",
             **self.opts, "field_name": "question_with_to_field"
         },
     )
     request.user = self.user
     with self.assertRaises(PermissionDenied):
         AutocompleteJsonView.as_view(**self.as_view_args)(request)
Exemple #7
0
    def test_get_paginator(self):
        """Search results are paginated."""
        class PKOrderingQuestionAdmin(QuestionAdmin):
            ordering = ["pk"]

        Question.objects.bulk_create(
            Question(question=str(i)) for i in range(PAGINATOR_SIZE + 10))
        # The first page of results.
        request = self.factory.get(self.url, {"term": "", **self.opts})
        request.user = self.superuser
        with model_admin(Question, PKOrderingQuestionAdmin):
            response = AutocompleteJsonView.as_view(
                **self.as_view_args)(request)
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content.decode("utf-8"))
        self.assertEqual(
            data,
            {
                "results": [{
                    "id": str(q.pk),
                    "text": q.question
                } for q in Question.objects.all()[:PAGINATOR_SIZE]],
                "pagination": {
                    "more": True
                },
            },
        )
        # The second page of results.
        request = self.factory.get(self.url, {
            "term": "",
            "page": "2",
            **self.opts
        })
        request.user = self.superuser
        with model_admin(Question, PKOrderingQuestionAdmin):
            response = AutocompleteJsonView.as_view(
                **self.as_view_args)(request)
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content.decode("utf-8"))
        self.assertEqual(
            data,
            {
                "results": [{
                    "id": str(q.pk),
                    "text": q.question
                } for q in Question.objects.all()[PAGINATOR_SIZE:]],
                "pagination": {
                    "more": False
                },
            },
        )
Exemple #8
0
 def test_limit_choices_to(self):
     # Answer.question_with_to_field defines limit_choices_to to "those not
     # starting with 'not'".
     q = Question.objects.create(question="Is this a question?")
     Question.objects.create(question="Not a question.")
     request = self.factory.get(
         self.url,
         {
             "term": "is",
             **self.opts, "field_name": "question_with_to_field"
         },
     )
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode("utf-8"))
     self.assertEqual(
         data,
         {
             "results": [{
                 "id": str(q.uuid),
                 "text": q.question
             }],
             "pagination": {
                 "more": False
             },
         },
     )
Exemple #9
0
 def test_to_field_resolution_with_fk_pk(self):
     p = Parent.objects.create(name="Bertie")
     c = PKChild.objects.create(parent=p, name="Anna")
     opts = {
         "app_label": Toy._meta.app_label,
         "model_name": Toy._meta.model_name,
         "field_name": "child",
     }
     request = self.factory.get(self.url, {"term": "anna", **opts})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode("utf-8"))
     self.assertEqual(
         data,
         {
             "results": [{
                 "id": str(c.pk),
                 "text": c.name
             }],
             "pagination": {
                 "more": False
             },
         },
     )
Exemple #10
0
 def test_success(self):
     q = Question.objects.create(question='Is this a question?')
     request = self.factory.get(self.url, {'term': 'is'})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode('utf-8'))
     self.assertEqual(data, {
         'results': [{'id': str(q.pk), 'text': q.question}],
         'pagination': {'more': False},
     })
Exemple #11
0
 def test_has_view_or_change_permission_required(self):
     """
     Users require the change permission for the related model to the
     autocomplete view for it.
     """
     request = self.factory.get(self.url, {'term': 'is', **self.opts})
     request.user = self.user
     with self.assertRaises(PermissionDenied):
         AutocompleteJsonView.as_view(**self.as_view_args)(request)
     for permission in ('view', 'change'):
         with self.subTest(permission=permission):
             self.user.user_permissions.clear()
             p = Permission.objects.get(
                 content_type=ContentType.objects.get_for_model(Question),
                 codename='%s_question' % permission,
             )
             self.user.user_permissions.add(p)
             request.user = User.objects.get(pk=self.user.pk)
             response = AutocompleteJsonView.as_view(
                 **self.as_view_args)(request)
             self.assertEqual(response.status_code, 200)
 def test_has_change_permission_required(self):
     """
     Users require the change permission for the related model to the
     autocomplete view for it.
     """
     request = self.factory.get(self.url, {'term': 'is'})
     self.user.is_staff = True
     self.user.save()
     request.user = self.user
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 403)
     self.assertJSONEqual(response.content.decode('utf-8'), {'error': '403 Forbidden'})
     # Add the change permission and retry.
     p = Permission.objects.get(
         content_type=ContentType.objects.get_for_model(Question),
         codename='change_question',
     )
     self.user.user_permissions.add(p)
     request.user = User.objects.get(pk=self.user.pk)
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
Exemple #13
0
 def test_success(self):
     q = Question.objects.create(question="Is this a question?")
     request = self.factory.get(self.url, {"term": "is", **self.opts})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode("utf-8"))
     self.assertEqual(
         data,
         {
             "results": [{
                 "id": str(q.pk),
                 "text": q.question
             }],
             "pagination": {
                 "more": False
             },
         },
     )
Exemple #14
0
    def test_search_use_distinct(self):
        """
        Searching across model relations use QuerySet.distinct() to avoid
        duplicates.
        """
        q1 = Question.objects.create(question='question 1')
        q2 = Question.objects.create(question='question 2')
        q2.related_questions.add(q1)
        q3 = Question.objects.create(question='question 3')
        q3.related_questions.add(q1)
        request = self.factory.get(self.url, {'term': 'question'})
        request.user = self.superuser

        class DistinctQuestionAdmin(QuestionAdmin):
            search_fields = ['related_questions__question', 'question']

        model_admin = DistinctQuestionAdmin(Question, site)
        response = AutocompleteJsonView.as_view(model_admin=model_admin)(request)
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content.decode('utf-8'))
        self.assertEqual(len(data['results']), 3)
Exemple #15
0
 def test_to_field_resolution_with_mti(self):
     """
     to_field resolution should correctly resolve for target models using
     MTI. Tests for single and multi-level cases.
     """
     tests = [
         (Employee, WorkHour, "employee"),
         (Manager, Bonus, "recipient"),
     ]
     for Target, Remote, related_name in tests:
         with self.subTest(target_model=Target,
                           remote_model=Remote,
                           related_name=related_name):
             o = Target.objects.create(name="Frida Kahlo",
                                       gender=2,
                                       code="painter",
                                       alive=False)
             opts = {
                 "app_label": Remote._meta.app_label,
                 "model_name": Remote._meta.model_name,
                 "field_name": related_name,
             }
             request = self.factory.get(self.url, {"term": "frida", **opts})
             request.user = self.superuser
             response = AutocompleteJsonView.as_view(
                 **self.as_view_args)(request)
             self.assertEqual(response.status_code, 200)
             data = json.loads(response.content.decode("utf-8"))
             self.assertEqual(
                 data,
                 {
                     "results": [{
                         "id": str(o.pk),
                         "text": o.name
                     }],
                     "pagination": {
                         "more": False
                     },
                 },
             )
Exemple #16
0
    def test_search_use_distinct(self):
        """
        Searching across model relations use QuerySet.distinct() to avoid
        duplicates.
        """
        q1 = Question.objects.create(question="question 1")
        q2 = Question.objects.create(question="question 2")
        q2.related_questions.add(q1)
        q3 = Question.objects.create(question="question 3")
        q3.related_questions.add(q1)
        request = self.factory.get(self.url, {"term": "question", **self.opts})
        request.user = self.superuser

        class DistinctQuestionAdmin(QuestionAdmin):
            search_fields = ["related_questions__question", "question"]

        with model_admin(Question, DistinctQuestionAdmin):
            response = AutocompleteJsonView.as_view(
                **self.as_view_args)(request)
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content.decode("utf-8"))
        self.assertEqual(len(data["results"]), 3)
Exemple #17
0
 def test_custom_to_field_custom_pk(self):
     q = Question.objects.create(question='Is this a question?')
     opts = {
         'app_label': Question._meta.app_label,
         'model_name': Question._meta.model_name,
         'field_name': 'related_questions',
     }
     request = self.factory.get(self.url, {'term': 'is', **opts})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode('utf-8'))
     self.assertEqual(
         data, {
             'results': [{
                 'id': str(q.big_id),
                 'text': q.question
             }],
             'pagination': {
                 'more': False
             },
         })
Exemple #18
0
 def test_to_field_resolution_with_mti(self):
     """
     to_field resolution should correctly resolve for target models using
     MTI. Tests for single and multi-level cases.
     """
     tests = [
         (Employee, WorkHour, 'employee'),
         (Manager, Bonus, 'recipient'),
     ]
     for Target, Remote, related_name in tests:
         with self.subTest(target_model=Target,
                           remote_model=Remote,
                           related_name=related_name):
             o = Target.objects.create(name="Frida Kahlo",
                                       gender=2,
                                       code="painter",
                                       alive=False)
             opts = {
                 'app_label': Remote._meta.app_label,
                 'model_name': Remote._meta.model_name,
                 'field_name': related_name,
             }
             request = self.factory.get(self.url, {'term': 'frida', **opts})
             request.user = self.superuser
             response = AutocompleteJsonView.as_view(
                 **self.as_view_args)(request)
             self.assertEqual(response.status_code, 200)
             data = json.loads(response.content.decode('utf-8'))
             self.assertEqual(
                 data, {
                     'results': [{
                         'id': str(o.pk),
                         'text': o.name
                     }],
                     'pagination': {
                         'more': False
                     },
                 })
Exemple #19
0
 def test_to_field_resolution_with_fk_pk(self):
     p = Parent.objects.create(name="Bertie")
     c = PKChild.objects.create(parent=p, name="Anna")
     opts = {
         'app_label': Toy._meta.app_label,
         'model_name': Toy._meta.model_name,
         'field_name': 'child',
     }
     request = self.factory.get(self.url, {'term': 'anna', **opts})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode('utf-8'))
     self.assertEqual(
         data, {
             'results': [{
                 'id': str(c.pk),
                 'text': c.name
             }],
             'pagination': {
                 'more': False
             },
         })
Exemple #20
0
 def test_limit_choices_to(self):
     # Answer.question_with_to_field defines limit_choices_to to "those not
     # starting with 'not'".
     q = Question.objects.create(question='Is this a question?')
     Question.objects.create(question='Not a question.')
     request = self.factory.get(
         self.url, {
             'term': 'is',
             **self.opts, 'field_name': 'question_with_to_field'
         })
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode('utf-8'))
     self.assertEqual(
         data, {
             'results': [{
                 'id': str(q.uuid),
                 'text': q.question
             }],
             'pagination': {
                 'more': False
             },
         })
Exemple #21
0
 def test_custom_to_field_custom_pk(self):
     q = Question.objects.create(question="Is this a question?")
     opts = {
         "app_label": Question._meta.app_label,
         "model_name": Question._meta.model_name,
         "field_name": "related_questions",
     }
     request = self.factory.get(self.url, {"term": "is", **opts})
     request.user = self.superuser
     response = AutocompleteJsonView.as_view(**self.as_view_args)(request)
     self.assertEqual(response.status_code, 200)
     data = json.loads(response.content.decode("utf-8"))
     self.assertEqual(
         data,
         {
             "results": [{
                 "id": str(q.big_id),
                 "text": q.question
             }],
             "pagination": {
                 "more": False
             },
         },
     )
Exemple #22
0
 def autocomplete_view(request):
     return self.admin_view(
         AutocompleteJsonView.as_view(
             model_admin=ProposalAdmin(Proposal, self)))(request)
Exemple #23
0
 def autocomplete_view(self, request):
     return AutocompleteJsonView.as_view(admin_site=self)(request)