diff options
Diffstat (limited to 'tests/admin_views')
| -rw-r--r-- | tests/admin_views/models.py | 32 | ||||
| -rw-r--r-- | tests/admin_views/test_autocomplete_view.py | 56 |
2 files changed, 87 insertions, 1 deletions
diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py index 4ab2bc8eee..284a4cfacb 100644 --- a/tests/admin_views/models.py +++ b/tests/admin_views/models.py @@ -338,6 +338,24 @@ class Child(models.Model): raise ValidationError('invalid') +class PKChild(models.Model): + """ + Used to check autocomplete to_field resolution when ForeignKey is PK. + """ + parent = models.ForeignKey(Parent, models.CASCADE, primary_key=True) + name = models.CharField(max_length=128) + + class Meta: + ordering = ['parent'] + + def __str__(self): + return self.name + + +class Toy(models.Model): + child = models.ForeignKey(PKChild, models.CASCADE) + + class EmptyModel(models.Model): def __str__(self): return "Primary key = %s" % self.id @@ -615,12 +633,26 @@ class Song(models.Model): class Employee(Person): code = models.CharField(max_length=20) + class Meta: + ordering = ['name'] + class WorkHour(models.Model): datum = models.DateField() employee = models.ForeignKey(Employee, models.CASCADE) +class Manager(Employee): + """ + A multi-layer MTI child. + """ + pass + + +class Bonus(models.Model): + recipient = models.ForeignKey(Manager, on_delete=models.CASCADE) + + class Question(models.Model): big_id = models.BigAutoField(primary_key=True) question = models.CharField(max_length=20) diff --git a/tests/admin_views/test_autocomplete_view.py b/tests/admin_views/test_autocomplete_view.py index c57fb106ed..aa978f7a83 100644 --- a/tests/admin_views/test_autocomplete_view.py +++ b/tests/admin_views/test_autocomplete_view.py @@ -12,7 +12,10 @@ from django.test import RequestFactory, override_settings from django.urls import reverse, reverse_lazy from .admin import AnswerAdmin, QuestionAdmin -from .models import Answer, Author, Authorship, Book, Question +from .models import ( + Answer, Author, Authorship, Bonus, Book, Employee, Manager, Parent, + PKChild, Question, Toy, WorkHour, +) from .tests import AdminViewBasicTestCase PAGINATOR_SIZE = AutocompleteJsonView.paginate_by @@ -37,6 +40,12 @@ site.register(Question, QuestionAdmin) site.register(Answer, AnswerAdmin) site.register(Author, AuthorAdmin) site.register(Book, BookAdmin) +site.register(Employee, search_fields=['name']) +site.register(WorkHour, autocomplete_fields=['employee']) +site.register(Manager, search_fields=['name']) +site.register(Bonus, autocomplete_fields=['recipient']) +site.register(PKChild, search_fields=['name']) +site.register(Toy, autocomplete_fields=['child']) @contextmanager @@ -118,6 +127,51 @@ class AutocompleteJsonViewTests(AdminViewBasicTestCase): '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_field_does_not_exist(self): request = self.factory.get(self.url, {'term': 'is', **self.opts, 'field_name': 'does_not_exist'}) request.user = self.superuser |
