Ticket #12241: preserve_query_string_with_tests_2.diff

File preserve_query_string_with_tests_2.diff, 7.7 KB (added by Batiste Bieler, 14 years ago)

Better tests that goes trough all the use case

  • django/contrib/admin/options.py

     
    2424from django.utils.translation import ungettext, ugettext_lazy
    2525from django.utils.encoding import force_unicode
    2626
     27import urllib
     28import urlparse
     29
    2730HORIZONTAL, VERTICAL = 1, 2
    2831# returns the <ul> class for a given radio_admin field
    2932get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
     
    633636            "admin/change_form.html"
    634637        ], context, context_instance=context_instance)
    635638
     639    def redirect_with_query_string(self, request, url_continue, msg):
     640        """
     641        Handle a redirect URL and preserve the query string.
     642        """
     643        self.message_user(request, msg + ' ' + _("You may edit it again below."))
     644        string_dict = urlparse.parse_qs(request.META.get('QUERY_STRING'))
     645        if request.POST.has_key("_popup"):
     646            string_dict['_popup'] = 1
     647
     648        if string_dict:
     649            return url_continue + '?' + urllib.urlencode(string_dict)
     650       
     651        return url_continue
     652
    636653    def response_add(self, request, obj, post_url_continue='../%s/'):
    637654        """
    638655        Determines the HttpResponse for the add_view stage.
     
    644661        # Here, we distinguish between different save types by checking for
    645662        # the presence of keys in request.POST.
    646663        if request.POST.has_key("_continue"):
    647             self.message_user(request, msg + ' ' + _("You may edit it again below."))
    648             if request.POST.has_key("_popup"):
    649                 post_url_continue += "?_popup=1"
    650             return HttpResponseRedirect(post_url_continue % pk_value)
     664            url = post_url_continue % pk_value
     665            url = self.redirect_with_query_string(request, url, msg)
     666            return HttpResponseRedirect(url)
    651667
    652         if request.POST.has_key("_popup"):
     668        if request.POST.has_key('_popup'):
    653669            return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \
    654670                # escape() calls force_unicode.
    655671                (escape(pk_value), escape(obj)))
     
    677693
    678694        msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)}
    679695        if request.POST.has_key("_continue"):
    680             self.message_user(request, msg + ' ' + _("You may edit it again below."))
    681             if request.REQUEST.has_key('_popup'):
    682                 return HttpResponseRedirect(request.path + "?_popup=1")
    683             else:
    684                 return HttpResponseRedirect(request.path)
     696            url = self.redirect_with_query_string(request, request.path, msg)
     697            return HttpResponseRedirect(url)
    685698        elif request.POST.has_key("_saveasnew"):
    686699            msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': force_unicode(opts.verbose_name), 'obj': obj}
    687700            self.message_user(request, msg)
  • tests/regressiontests/admin_views/tests.py

     
    22
    33import re
    44import datetime
     5import urlparse
    56from django.conf import settings
    67from django.core.files import temp as tempfile
    78from django.contrib.auth import admin # Register auth models with the admin.
     
    16231624            else:
    16241625                self.assertEqual(response.status_code, 404)
    16251626
     1627class AdminResponseChangeTest(TestCase):
     1628    fixtures = ['admin-views-users.xml']
     1629
     1630    def setUp(self):
     1631        self.client.login(username='super', password='secret')
     1632        self.data = {'title':"I Could Go Anywhere", 'content':"Versatile", 'date':datetime.datetime.now()}
     1633        article = Article.objects.create(**self.data)
     1634        self.pk = article.id
     1635
     1636    def test_response_add(self):
     1637        """Add test for #12241: ModelAdmin.response_add should preserve the request
     1638        query string after the redirection if the "save and continue" button
     1639        is used within the admin."""
     1640       
     1641        self.data['_continue'] = True
     1642        self.data['date_0'] = u"2008-03-18"
     1643        self.data['date_1'] = u"11:54:58"
     1644        response = self.client.post('/test_admin/admin/admin_views/article/%d/?test=1' % self.pk, self.data)
     1645        self.assertEqual(response.status_code, 302)
     1646        location = urlparse.urlparse(response['Location'])
     1647        parsed_query_string = urlparse.parse_qs(location.query)
     1648        self.assertTrue('test' in parsed_query_string.keys())
     1649
     1650        response = self.client.post('/test_admin/admin/admin_views/article/add/?test=1', self.data)
     1651        self.assertEqual(response.status_code, 302)
     1652        location = urlparse.urlparse(response['Location'])
     1653        parsed_query_string = urlparse.parse_qs(location.query)
     1654        self.assertTrue('test' in parsed_query_string.keys())
     1655
     1656        # test the popup redirection
     1657        self.data['_popup'] = 1
     1658        response = self.client.post('/test_admin/admin/admin_views/article/add/', self.data)
     1659        self.assertEqual(response.status_code, 302)
     1660        location = urlparse.urlparse(response['Location'])
     1661        parsed_query_string = urlparse.parse_qs(location.query)
     1662        self.assertTrue('_popup' in parsed_query_string.keys())
     1663
     1664        # test the popup redirection and another GET parameter
     1665        response = self.client.post('/test_admin/admin/admin_views/article/add/?test=1', self.data)
     1666        self.assertEqual(response.status_code, 302)
     1667        location = urlparse.urlparse(response['Location'])
     1668        parsed_query_string = urlparse.parse_qs(location.query)
     1669        self.assertTrue('test' in parsed_query_string.keys())
     1670        self.assertTrue('_popup' in parsed_query_string.keys())
     1671
     1672        # without anything
     1673        self.data['date_0'] = u"2008-03-18"
     1674        self.data['date_1'] = u"11:54:58"
     1675        del self.data['_popup']
     1676        response = self.client.post('/test_admin/admin/admin_views/article/add/', self.data)
     1677        self.assertEqual(response.status_code, 302)
     1678        location = urlparse.urlparse(response['Location'])
     1679        parsed_query_string = urlparse.parse_qs(location.query)
     1680        self.assertFalse('test' in parsed_query_string.keys())
     1681        self.assertFalse('_popup' in parsed_query_string.keys())
     1682
     1683    def test_response_change(self):
     1684        """Change test for issue #12241. ModelAdmin.response_change should
     1685        preserve the query string."""
     1686
     1687        self.data['date_0'] = u"2008-03-18"
     1688        self.data['date_1'] = u"11:54:58"
     1689        self.data['_continue'] = True
     1690
     1691        response = self.client.post('/test_admin/admin/admin_views/article/%d/?test=1' % self.pk, self.data)
     1692        self.assertEqual(response.status_code, 302)
     1693        location = urlparse.urlparse(response['Location'])
     1694        parsed_query_string = urlparse.parse_qs(location.query)
     1695        self.assertTrue('test' in parsed_query_string.keys())
     1696        self.assertFalse('_popup' in parsed_query_string.keys())
     1697       
     1698        response = self.client.post('/test_admin/admin/admin_views/article/%d/' % self.pk, self.data)
     1699        self.assertEqual(response.status_code, 302)
     1700        location = urlparse.urlparse(response['Location'])
     1701        parsed_query_string = urlparse.parse_qs(location.query)
     1702        self.assertFalse('test' in parsed_query_string.keys())
     1703        self.assertFalse('_popup' in parsed_query_string.keys())
     1704
     1705
     1706
    16261707class AdminInlineFileUploadTest(TestCase):
    16271708    fixtures = ['admin-views-users.xml', 'admin-views-actions.xml']
    16281709    urlbit = 'admin'
Back to Top