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)
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)
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)
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)
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)
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 }, }, )
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 }, }, )
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 }, }, )
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}, })
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)
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 }, }, )
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)
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 }, }, )
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)
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 }, })
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 }, })
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 }, })
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 }, })
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 }, }, )
def autocomplete_view(request): return self.admin_view( AutocompleteJsonView.as_view( model_admin=ProposalAdmin(Proposal, self)))(request)
def autocomplete_view(self, request): return AutocompleteJsonView.as_view(admin_site=self)(request)