Commit ad769efa authored by Ramiro Morales's avatar Ramiro Morales
Browse files

Expanded tests added when fixing #14529.

To make sure changes in 35d1cd0b don't break anything. Refs #19505.
parent f56f6cfa
Loading
Loading
Loading
Loading
+38 −6
Original line number Diff line number Diff line
@@ -27,7 +27,8 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
    Album, Question, Answer, ComplexSortedPerson, PrePopulatedPostLargeSlug,
    AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
    AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
    RelatedPrepopulated, UndeletableObject, UserMessenger, Simple, Choice)
    RelatedPrepopulated, UndeletableObject, UserMessenger, Simple, Choice,
    ShortMessage, Telegram)


def callable_year(dt_value):
@@ -439,25 +440,54 @@ class FoodDeliveryAdmin(admin.ModelAdmin):
    list_editable = ('driver', 'restaurant')


class CoverLetterAdmin(admin.ModelAdmin):
    """
    A ModelAdmin with a custom queryset() method that uses defer(), to test
    verbose_name display in messages shown after adding/editing CoverLetter
    instances.
    Note that the CoverLetter model defines a __unicode__ method.
    For testing fix for ticket #14529.
    """

    def queryset(self, request):
        return super(CoverLetterAdmin, self).queryset(request).defer('date_written')


class PaperAdmin(admin.ModelAdmin):
    """
    A ModelAdmin with a custom queryset() method that uses only(), to test
    verbose_name display in messages shown after adding Paper instances.
    verbose_name display in messages shown after adding/editing Paper
    instances.
    For testing fix for ticket #14529.
    """

    def queryset(self, request):
        return super(PaperAdmin, self).queryset(request).only('title')


class CoverLetterAdmin(admin.ModelAdmin):
class ShortMessageAdmin(admin.ModelAdmin):
    """
    A ModelAdmin with a custom queryset() method that uses defer(), to test
    verbose_name display in messages shown after adding/editing ShortMessage
    instances.
    For testing fix for ticket #14529.
    """

    def queryset(self, request):
        return super(ShortMessageAdmin, self).queryset(request).defer('timestamp')


class TelegramAdmin(admin.ModelAdmin):
    """
    A ModelAdmin with a custom queryset() method that uses only(), to test
    verbose_name display in messages shown after adding CoverLetter instances.
    Note that the CoverLetter model defines a __unicode__ method.
    verbose_name display in messages shown after adding/editing Telegram
    instances.
    Note that the Telegram model defines a __unicode__ method.
    For testing fix for ticket #14529.
    """

    def queryset(self, request):
        return super(CoverLetterAdmin, self).queryset(request).defer('date_written')
        return super(TelegramAdmin, self).queryset(request).only('title')


class StoryForm(forms.ModelForm):
@@ -665,6 +695,8 @@ site.register(FoodDelivery, FoodDeliveryAdmin)
site.register(RowLevelChangePermissionModel, RowLevelChangePermissionModelAdmin)
site.register(Paper, PaperAdmin)
site.register(CoverLetter, CoverLetterAdmin)
site.register(ShortMessage, ShortMessageAdmin)
site.register(Telegram, TelegramAdmin)
site.register(Story, StoryAdmin)
site.register(OtherStory, OtherStoryAdmin)
site.register(Report, ReportAdmin)
+18 −4
Original line number Diff line number Diff line
@@ -548,18 +548,32 @@ class FoodDelivery(models.Model):
        unique_together = (("driver", "restaurant"),)


@python_2_unicode_compatible
class CoverLetter(models.Model):
    author = models.CharField(max_length=30)
    date_written = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.author


class Paper(models.Model):
    title = models.CharField(max_length=30)
    author = models.CharField(max_length=30, blank=True, null=True)


class ShortMessage(models.Model):
    content = models.CharField(max_length=140)
    timestamp = models.DateTimeField(null=True, blank=True)


@python_2_unicode_compatible
class CoverLetter(models.Model):
    author = models.CharField(max_length=30)
    date_written = models.DateField(null=True, blank=True)
class Telegram(models.Model):
    title = models.CharField(max_length=30)
    date_sent = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.author
        return self.title


class Story(models.Model):
+152 −11
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ from .models import (Article, BarAccount, CustomArticle, EmptyModel, FooAccount,
    OtherStory, ComplexSortedPerson, Parent, Child, AdminOrderedField,
    AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable,
    Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject,
    Simple, UndeletableObject, Choice)
    Simple, UndeletableObject, Choice, ShortMessage, Telegram)


ERROR_MESSAGE = "Please enter the correct username and password \
@@ -2505,27 +2505,93 @@ class AdminCustomQuerysetTest(TestCase):
            else:
                self.assertEqual(response.status_code, 404)

    def test_add_model_modeladmin_defer_qs(self):
        # Test for #14529. defer() is used in ModelAdmin.queryset()

        # model has __unicode__ method
        self.assertEqual(CoverLetter.objects.count(), 0)
        # Emulate model instance creation via the admin
        post_data = {
            "author": "Candidate, Best",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/coverletter/add/',
                                    post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(CoverLetter.objects.count(), 1)
        # Message should contain non-ugly model verbose name
        self.assertContains(
            response,
            '<li class="info">The cover letter &quot;Candidate, Best&quot; was added successfully.</li>',
            html=True
        )

        # model has no __unicode__ method
        self.assertEqual(ShortMessage.objects.count(), 0)
        # Emulate model instance creation via the admin
        post_data = {
            "content": "What's this SMS thing?",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/shortmessage/add/',
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(ShortMessage.objects.count(), 1)
        # Message should contain non-ugly model verbose name
        self.assertContains(
            response,
            '<li class="info">The short message &quot;ShortMessage object&quot; was added successfully.</li>',
            html=True
        )

    def test_add_model_modeladmin_only_qs(self):
        # only() is used in ModelAdmin.queryset()
        p = Paper.objects.create(title="My Paper Title")
        self.assertEqual(Paper.objects.count(), 1)
        response = self.client.get('/test_admin/admin/admin_views/paper/%s/' % p.pk)
        # Test for #14529. only() is used in ModelAdmin.queryset()

        # model has __unicode__ method
        self.assertEqual(Telegram.objects.count(), 0)
        # Emulate model instance creation via the admin
        post_data = {
            "title": "Urgent telegram",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/telegram/add/',
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Telegram.objects.count(), 1)
        # Message should contain non-ugly model verbose name
        self.assertContains(
            response,
            '<li class="info">The telegram &quot;Urgent telegram&quot; was added successfully.</li>',
            html=True
        )

        # model has no __unicode__ method
        self.assertEqual(Paper.objects.count(), 0)
        # Emulate model instance creation via the admin
        post_data = {
            "title": "My Modified Paper Title",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/paper/%s/' % p.pk,
        response = self.client.post('/test_admin/admin/admin_views/paper/add/',
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        # Message should contain non-ugly model name. Instance representation is set by six.text_type() (ugly)
        self.assertContains(response, '<li class="info">The paper &quot;Paper_Deferred_author object&quot; was changed successfully.</li>', html=True)
        self.assertEqual(Paper.objects.count(), 1)
        # Message should contain non-ugly model verbose name
        self.assertContains(
            response,
            '<li class="info">The paper &quot;Paper object&quot; was added successfully.</li>',
            html=True
        )

    def test_edit_model_modeladmin_defer_qs(self):
        # Test for #14529. defer() is used in ModelAdmin.queryset()

        # defer() is used in ModelAdmin.queryset()
        # model has __unicode__ method
        cl = CoverLetter.objects.create(author="John Doe")
        self.assertEqual(CoverLetter.objects.count(), 1)
        response = self.client.get('/test_admin/admin/admin_views/coverletter/%s/' % cl.pk)
        self.assertEqual(response.status_code, 200)
        # Emulate model instance edit via the admin
        post_data = {
            "author": "John Doe II",
            "_save": "Save",
@@ -2533,8 +2599,83 @@ class AdminCustomQuerysetTest(TestCase):
        response = self.client.post('/test_admin/admin/admin_views/coverletter/%s/' % cl.pk,
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        # Message should contain non-ugly model name. Instance representation is set by model's __unicode__()
        self.assertContains(response, '<li class="info">The cover letter &quot;John Doe II&quot; was changed successfully.</li>', html=True)
        self.assertEqual(CoverLetter.objects.count(), 1)
        # Message should contain non-ugly model verbose name. Instance
        # representation is set by model's __unicode__()
        self.assertContains(
            response,
            '<li class="info">The cover letter &quot;John Doe II&quot; was changed successfully.</li>',
            html=True
        )

        # model has no __unicode__ method
        sm = ShortMessage.objects.create(content="This is expensive")
        self.assertEqual(ShortMessage.objects.count(), 1)
        response = self.client.get('/test_admin/admin/admin_views/shortmessage/%s/' % sm.pk)
        self.assertEqual(response.status_code, 200)
        # Emulate model instance edit via the admin
        post_data = {
            "content": "Too expensive",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/shortmessage/%s/' % sm.pk,
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(ShortMessage.objects.count(), 1)
        # Message should contain non-ugly model verbose name. The ugly(!)
        # instance representation is set by six.text_type()
        self.assertContains(
            response,
            '<li class="info">The short message &quot;ShortMessage_Deferred_timestamp object&quot; was changed successfully.</li>',
            html=True
        )

    def test_edit_model_modeladmin_only_qs(self):
        # Test for #14529. only() is used in ModelAdmin.queryset()

        # model has __unicode__ method
        t = Telegram.objects.create(title="Frist Telegram")
        self.assertEqual(Telegram.objects.count(), 1)
        response = self.client.get('/test_admin/admin/admin_views/telegram/%s/' % t.pk)
        self.assertEqual(response.status_code, 200)
        # Emulate model instance edit via the admin
        post_data = {
            "title": "Telegram without typo",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/telegram/%s/' % t.pk,
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Telegram.objects.count(), 1)
        # Message should contain non-ugly model verbose name. The instance
        # representation is set by model's __unicode__()
        self.assertContains(
            response,
            '<li class="info">The telegram &quot;Telegram without typo&quot; was changed successfully.</li>',
            html=True
        )

        # model has no __unicode__ method
        p = Paper.objects.create(title="My Paper Title")
        self.assertEqual(Paper.objects.count(), 1)
        response = self.client.get('/test_admin/admin/admin_views/paper/%s/' % p.pk)
        self.assertEqual(response.status_code, 200)
        # Emulate model instance edit via the admin
        post_data = {
            "title": "My Modified Paper Title",
            "_save": "Save",
        }
        response = self.client.post('/test_admin/admin/admin_views/paper/%s/' % p.pk,
                post_data, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(Paper.objects.count(), 1)
        # Message should contain non-ugly model verbose name. The ugly(!)
        # instance representation is set by six.text_type()
        self.assertContains(
            response,
            '<li class="info">The paper &quot;Paper_Deferred_author object&quot; was changed successfully.</li>',
            html=True
        )


@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))