Skip to content

Commit 8a3b523

Browse files
committed
Patch form_url in render_change_form so it carries over the language tab selection.
This is required, otherwise it gets lost if form_url is not empty. Fixes #202, closes #204.
1 parent 6c1ce9d commit 8a3b523

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

docs/public/release_notes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Fixes:
1414
not break anymore. — :issue:`206`.
1515
- Language tabs URI are now correctly generated when changelist filters are used.
1616
:issue:`203`.
17+
- Admin language tab selection is no longer lost when change filters are active.
18+
:issue:`202`.
1719

1820
.. release 0.5.0
1921

hvad/admin.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from django.forms.utils import ErrorList
1818
else:
1919
from django.forms.util import ErrorList
20-
from django.http import Http404, HttpResponseRedirect
20+
from django.http import Http404, HttpResponseRedirect, QueryDict
2121
from django.shortcuts import render_to_response
2222
from django.template import TemplateDoesNotExist
2323
from django.template.context import RequestContext
@@ -27,7 +27,7 @@
2727
from django.utils.translation import ugettext_lazy as _, get_language
2828
from functools import update_wrapper
2929
from hvad.compat.force_unicode import force_unicode
30-
from hvad.compat.urls import urlencode
30+
from hvad.compat.urls import urlencode, urlparse
3131
from hvad.forms import TranslatableModelForm, translatable_inlineformset_factory, translatable_modelform_factory
3232
from hvad.utils import get_cached_translation, get_translation
3333
from hvad.manager import FALLBACK_LANGUAGES
@@ -225,6 +225,16 @@ def render_change_form(self, request, context, add=False, change=False,
225225
context['allow_deletion'] = len(available_languages) > 1
226226
context['language_tabs'] = self.get_language_tabs(request, available_languages)
227227
context['base_template'] = self.get_change_form_base_template()
228+
229+
# Ensure form action url carries over tab language
230+
qs_language = request.GET.get('language')
231+
if qs_language:
232+
form_url = urlparse(form_url or request.get_full_path())
233+
query = QueryDict(form_url.query, mutable=True)
234+
if 'language' not in query:
235+
query['language'] = qs_language
236+
form_url = form_url._replace(query=query.urlencode()).geturl()
237+
228238
return super(TranslatableAdmin, self).render_change_form(request,
229239
context,
230240
add, change,

hvad/tests/admin.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from django.http import HttpResponseForbidden, HttpResponseRedirect, QueryDict
1010
from hvad.admin import InlineModelForm
1111
from hvad.admin import translatable_modelform_factory
12+
from hvad.compat.urls import urlparse
1213
from hvad.forms import TranslatableModelForm
1314
from hvad.test_utils.context_managers import LanguageOverride
1415
from hvad.test_utils.fixtures import NormalFixture, SuperuserFixture
@@ -232,28 +233,44 @@ def test_admin_change_form_title(self):
232233
self.assertTrue('en' in response.content.decode('utf-8'))
233234

234235
def test_admin_change_form_language_tabs_urls(self):
235-
from hvad.compat.urls import urlparse
236-
237236
with LanguageOverride('en'):
238237
with self.login_user_context(username='admin', password='admin'):
239238
get_url = reverse('admin:app_normal_change', args=(self.normal_id[1],))
240239
test_urls = [
241240
'%s?%s' % (get_url, '_changelist_filters=q%3Dsearchparam'),
241+
'%s?%s' % (get_url, '_changelist_filters=q%3Dsearchparam&language=fr'),
242242
]
243243

244244
for test_url in test_urls:
245245
response = self.client.get(test_url)
246246
self.assertEqual(response.status_code, 200)
247247
tabs = response.context['language_tabs']
248248

249-
test_querydict = QueryDict(urlparse(test_url).query, mutable=True)
249+
expected_querydict = QueryDict(urlparse(test_url).query, mutable=True)
250250

251251
for actual_tab_url, name, key, status in tabs:
252-
expected_querydict = test_querydict.copy()
253252
expected_querydict['language'] = key
254253
actual_querydict = QueryDict(urlparse(actual_tab_url).query)
255254
self.assertEqual(expected_querydict, actual_querydict)
256255

256+
def test_admin_change_form_action_url(self):
257+
with LanguageOverride('en'):
258+
with self.login_user_context(username='admin', password='admin'):
259+
url = reverse('admin:app_normal_change', args=(self.normal_id[1],))
260+
tests = (
261+
'',
262+
'language=fr',
263+
'_changelist_filters=q%3Dparam&language=fr',
264+
)
265+
for query_string in tests:
266+
expected_dict = QueryDict(query_string)
267+
full_url = '%s?%s' % (url, query_string) if query_string else url
268+
response = self.client.get(full_url)
269+
form_url = urlparse(response.context['form_url'])
270+
self.assertEqual(expected_dict, QueryDict(form_url.query),
271+
'query_string=%r' % query_string)
272+
273+
257274
def test_admin_change_form_redirect_add_another(self):
258275
lang = 'en'
259276
with LanguageOverride('ja'):

0 commit comments

Comments
 (0)