Commit ade54ffa authored by Alexander Gaevsky's avatar Alexander Gaevsky Committed by Tim Graham
Browse files

Refs #25165 -- Fixed JSON serialization for add/edit popup in the admin.

Forwardport of test in o839d71d8562abe0b245024e55ca1d02a45e58fd from stable/1.9.x
(refs #25997).
parent 822a03b3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1135,9 +1135,9 @@ class ModelAdmin(BaseModelAdmin):
            new_value = obj.serializable_value(attr)
            popup_response_data = json.dumps({
                'action': 'change',
                'value': value,
                'value': six.text_type(value),
                'obj': six.text_type(obj),
                'new_value': new_value,
                'new_value': six.text_type(new_value),
            })
            return SimpleTemplateResponse('admin/popup_response.html', {
                'popup_response_data': popup_response_data,
+4 −0
Original line number Diff line number Diff line
@@ -21,3 +21,7 @@ Bugfixes
* Fixed a regression that caused the incorrect day to be selected when opening
  the admin calendar widget for timezones from GMT+0100 to GMT+1200
  (:ticket:`24980`).

* Fixed a regression in the admin's edit related model popup that caused an
  escaped value to be displayed in the select dropdown of the parent window
  (:ticket:`25997`).
+12 −10
Original line number Diff line number Diff line
@@ -34,16 +34,16 @@ from .models import (
    GenRelReference, Grommet, ImplicitlyGeneratedPK, Ingredient,
    InlineReference, InlineReferer, Inquisition, Language, Link,
    MainPrepopulated, ModelWithStringPrimaryKey, NotReferenced, OldSubscriber,
    OtherStory, Paper, Parent, ParentWithDependentChildren, Person, Persona,
    Picture, Pizza, Plot, PlotDetails, PluggableSearchPerson, Podcast, Post,
    PrePopulatedPost, PrePopulatedPostLargeSlug, PrePopulatedSubPost, Promo,
    Question, Recipe, Recommendation, Recommender, ReferencedByGenRel,
    ReferencedByInline, ReferencedByParent, RelatedPrepopulated, Report,
    Reservation, Restaurant, RowLevelChangePermissionModel, Section,
    ShortMessage, Simple, Sketch, State, Story, StumpJoke, Subscriber,
    SuperVillain, Telegram, Thing, Topping, UnchangeableObject,
    UndeletableObject, UnorderedObject, UserMessenger, Villain, Vodcast,
    Whatsit, Widget, Worker, WorkHour,
    OtherStory, Paper, Parent, ParentWithDependentChildren, ParentWithUUIDPK,
    Person, Persona, Picture, Pizza, Plot, PlotDetails, PluggableSearchPerson,
    Podcast, Post, PrePopulatedPost, PrePopulatedPostLargeSlug,
    PrePopulatedSubPost, Promo, Question, Recipe, Recommendation, Recommender,
    ReferencedByGenRel, ReferencedByInline, ReferencedByParent,
    RelatedPrepopulated, RelatedWithUUIDPKModel, Report, Reservation,
    Restaurant, RowLevelChangePermissionModel, Section, ShortMessage, Simple,
    Sketch, State, Story, StumpJoke, Subscriber, SuperVillain, Telegram, Thing,
    Topping, UnchangeableObject, UndeletableObject, UnorderedObject,
    UserMessenger, Villain, Vodcast, Whatsit, Widget, Worker, WorkHour,
)


@@ -949,6 +949,8 @@ site.register(ReferencedByInline)
site.register(InlineReferer, InlineRefererAdmin)
site.register(ReferencedByGenRel)
site.register(GenRelReference)
site.register(ParentWithUUIDPK)
site.register(RelatedWithUUIDPKModel)

# We intentionally register Promo and ChapterXtra1 but not Chapter nor ChapterXtra2.
# That way we cover all four cases:
+13 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
import datetime
import os
import tempfile
import uuid

from django.contrib.auth.models import User
from django.contrib.contenttypes.fields import (
@@ -956,3 +957,15 @@ class ReferencedByGenRel(models.Model):

class GenRelReference(models.Model):
    references = GenericRelation(ReferencedByGenRel)


class ParentWithUUIDPK(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=100)

    def __str__(self):
        return str(self.id)


class RelatedWithUUIDPKModel(models.Model):
    parent = models.ForeignKey(ParentWithUUIDPK, on_delete=models.CASCADE)
+24 −8
Original line number Diff line number Diff line
@@ -52,14 +52,14 @@ from .models import (
    Fabric, FancyDoodad, FieldOverridePost, FilteredManager, FooAccount,
    FoodDelivery, FunkyTag, Gallery, Grommet, Inquisition, Language, Link,
    MainPrepopulated, ModelWithStringPrimaryKey, OtherStory, Paper, Parent,
    ParentWithDependentChildren, Person, Persona, Picture, Pizza, Plot,
    PlotDetails, PluggableSearchPerson, Podcast, Post, PrePopulatedPost, Promo,
    Question, Recommendation, Recommender, RelatedPrepopulated, Report,
    Restaurant, RowLevelChangePermissionModel, SecretHideout, Section,
    ShortMessage, Simple, State, Story, Subscriber, SuperSecretHideout,
    SuperVillain, Telegram, TitleTranslation, Topping, UnchangeableObject,
    UndeletableObject, UnorderedObject, Villain, Vodcast, Whatsit, Widget,
    Worker, WorkHour,
    ParentWithDependentChildren, ParentWithUUIDPK, Person, Persona, Picture,
    Pizza, Plot, PlotDetails, PluggableSearchPerson, Podcast, Post,
    PrePopulatedPost, Promo, Question, Recommendation, Recommender,
    RelatedPrepopulated, RelatedWithUUIDPKModel, Report, Restaurant,
    RowLevelChangePermissionModel, SecretHideout, Section, ShortMessage,
    Simple, State, Story, Subscriber, SuperSecretHideout, SuperVillain,
    Telegram, TitleTranslation, Topping, UnchangeableObject, UndeletableObject,
    UnorderedObject, Villain, Vodcast, Whatsit, Widget, Worker, WorkHour,
)


@@ -4515,6 +4515,22 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase):
        select = Select(self.selenium.find_element_by_id('id_form-0-section'))
        self.assertEqual(select.first_selected_option.text, 'new section')

    def test_inline_uuid_pk_edit_with_popup(self):
        from selenium.webdriver.support.ui import Select
        parent = ParentWithUUIDPK.objects.create(title='test')
        related_with_parent = RelatedWithUUIDPKModel.objects.create(parent=parent)
        self.admin_login(username='super', password='secret', login_url=reverse('admin:index'))
        change_url = reverse('admin:admin_views_relatedwithuuidpkmodel_change', args=(related_with_parent.id,))
        self.selenium.get(self.live_server_url + change_url)
        self.selenium.find_element_by_id('change_id_parent').click()
        self.wait_for_popup()
        self.selenium.switch_to.window(self.selenium.window_handles[-1])
        self.selenium.find_element_by_xpath('//input[@value="Save"]').click()
        self.selenium.switch_to.window(self.selenium.window_handles[0])
        select = Select(self.selenium.find_element_by_id('id_parent'))
        self.assertEqual(select.first_selected_option.text, str(parent.id))
        self.assertEqual(select.first_selected_option.get_attribute('value'), str(parent.id))


class SeleniumAdminViewsChromeTests(SeleniumAdminViewsFirefoxTests):
    webdriver_class = 'selenium.webdriver.chrome.webdriver.WebDriver'