Support unicode in URL querystring. GitLab issue #423.
Thanks to Gustavo Teixeira (@gsteixei) for the find. Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -1,3 +1,9 @@
|
||||
2.7.1 (2017-XX-XX)
|
||||
==================
|
||||
- Support unicode in URL querystring. GitLab issue #423.
|
||||
Thanks to Gustavo Teixeira (@gsteixei) for the find.
|
||||
|
||||
|
||||
2.7 (2017-08-30)
|
||||
================
|
||||
- Add workaround for PDF with IndirectObject as the
|
||||
|
||||
@@ -3,6 +3,8 @@ from __future__ import unicode_literals
|
||||
import inspect
|
||||
import logging
|
||||
|
||||
from furl import furl
|
||||
|
||||
from django.apps import apps
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import PermissionDenied
|
||||
@@ -10,11 +12,7 @@ from django.shortcuts import resolve_url
|
||||
from django.template import VariableDoesNotExist, Variable
|
||||
from django.template.defaulttags import URLNode
|
||||
from django.urls import resolve
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.http import urlquote
|
||||
from django.utils.six.moves.urllib.parse import (
|
||||
parse_qs, unquote_plus, urlencode, urlparse
|
||||
)
|
||||
from django.utils.encoding import force_str, force_text
|
||||
|
||||
from common.utils import return_attrib
|
||||
from permissions import Permission
|
||||
@@ -351,31 +349,21 @@ class Link(object):
|
||||
# Lets a new link keep the same URL query string of the current URL
|
||||
if self.keep_query:
|
||||
# Sometimes we are required to remove a key from the URL QS
|
||||
previous_path = force_text(
|
||||
unquote_plus(
|
||||
force_text(
|
||||
request.get_full_path()
|
||||
) or force_text(
|
||||
request.META.get(
|
||||
'HTTP_REFERER',
|
||||
resolve_url(settings.LOGIN_REDIRECT_URL)
|
||||
)
|
||||
parsed_url = furl(
|
||||
force_str(
|
||||
request.get_full_path() or request.META.get(
|
||||
'HTTP_REFERER', resolve_url(settings.LOGIN_REDIRECT_URL)
|
||||
)
|
||||
)
|
||||
)
|
||||
query_string = urlparse(previous_path).query
|
||||
parsed_query_string = parse_qs(query_string)
|
||||
|
||||
for key in self.remove_from_query:
|
||||
try:
|
||||
del parsed_query_string[key]
|
||||
parsed_url.query.remove(key)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
resolved_link.url = '%s?%s' % (
|
||||
urlquote(resolved_link.url),
|
||||
urlencode(parsed_query_string, doseq=True)
|
||||
)
|
||||
resolved_link.url = parsed_url.url
|
||||
|
||||
resolved_link.context = context
|
||||
return resolved_link
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
TEST_PERMISSION_NAMESPACE_NAME = 'test namespace name'
|
||||
@@ -7,3 +8,4 @@ TEST_PERMISSION_LABEL = 'test permission label'
|
||||
TEST_LINK_TEXT = 'test link text'
|
||||
TEST_MENU_NAME = 'menu test'
|
||||
TEST_SUBMENU_NAME = 'submenu test'
|
||||
TEST_UNICODE_STRING = 'úñí©óðé'
|
||||
|
||||
@@ -3,18 +3,19 @@ from __future__ import absolute_import, unicode_literals
|
||||
from django.template import Context
|
||||
from django.urls import reverse
|
||||
|
||||
from furl import furl
|
||||
|
||||
from acls.models import AccessControlList
|
||||
from common.tests.literals import TEST_VIEW_NAME
|
||||
from common.tests.test_views import GenericViewTestCase
|
||||
from permissions import Permission, PermissionNamespace
|
||||
from user_management.tests import TEST_USER_PASSWORD, TEST_USER_USERNAME
|
||||
|
||||
from ..classes import Link, Menu
|
||||
|
||||
from .literals import (
|
||||
TEST_PERMISSION_NAMESPACE_NAME, TEST_PERMISSION_NAMESPACE_TEXT,
|
||||
TEST_PERMISSION_NAME, TEST_PERMISSION_LABEL, TEST_LINK_TEXT,
|
||||
TEST_MENU_NAME, TEST_SUBMENU_NAME
|
||||
TEST_MENU_NAME, TEST_SUBMENU_NAME, TEST_UNICODE_STRING
|
||||
)
|
||||
|
||||
|
||||
@@ -44,9 +45,7 @@ class LinkClassTestCase(GenericViewTestCase):
|
||||
self.assertEqual(resolved_link.url, reverse(TEST_VIEW_NAME))
|
||||
|
||||
def test_link_permission_resolve_no_permission(self):
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||
)
|
||||
self.login_user()
|
||||
|
||||
link = Link(
|
||||
permissions=(self.permission,), text=TEST_LINK_TEXT,
|
||||
@@ -62,9 +61,7 @@ class LinkClassTestCase(GenericViewTestCase):
|
||||
self.assertEqual(resolved_link, None)
|
||||
|
||||
def test_link_permission_resolve_with_permission(self):
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||
)
|
||||
self.login_user()
|
||||
|
||||
link = Link(
|
||||
permissions=(self.permission,), text=TEST_LINK_TEXT,
|
||||
@@ -83,9 +80,7 @@ class LinkClassTestCase(GenericViewTestCase):
|
||||
|
||||
def test_link_permission_resolve_with_acl(self):
|
||||
# ACL is tested agains the resolved_object or just {{ object }} if not
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||
)
|
||||
self.login_user()
|
||||
|
||||
link = Link(
|
||||
permissions=(self.permission,), text=TEST_LINK_TEXT,
|
||||
@@ -106,6 +101,19 @@ class LinkClassTestCase(GenericViewTestCase):
|
||||
self.assertNotEqual(resolved_link, None)
|
||||
self.assertEqual(resolved_link.url, reverse(TEST_VIEW_NAME))
|
||||
|
||||
def test_link_with_unicode_querystring_request(self):
|
||||
url = furl(reverse(TEST_VIEW_NAME))
|
||||
url.args['unicode_key'] = TEST_UNICODE_STRING
|
||||
|
||||
self.link.keep_query = True
|
||||
response = self.get(path=url.url)
|
||||
|
||||
context = Context({'request': response.wsgi_request})
|
||||
|
||||
resolved_link = self.link.resolve(context=context)
|
||||
|
||||
self.assertEqual(resolved_link.url, url.url)
|
||||
|
||||
|
||||
class MenuClassTestCase(GenericViewTestCase):
|
||||
def setUp(self):
|
||||
|
||||
Reference in New Issue
Block a user