Merge pull request #14901 from OmarIthawi/omar/commentable-id-unicode
Unicode fixes for django_comment_client and request_cached decorator
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
An implementation of a RequestCache. This cache is reset at the beginning
|
||||
and end of every request.
|
||||
"""
|
||||
from django.utils.encoding import force_text
|
||||
|
||||
import crum
|
||||
import threading
|
||||
@@ -108,7 +109,7 @@ def func_call_cache_key(func, *args, **kwargs):
|
||||
the function's name, and a stringified list of arguments
|
||||
and a query string-style stringified list of keyword arguments.
|
||||
"""
|
||||
converted_args = map(str, args)
|
||||
converted_kwargs = map(str, reduce(list.__add__, map(list, sorted(kwargs.iteritems())), []))
|
||||
converted_args = map(force_text, args)
|
||||
converted_kwargs = map(force_text, reduce(list.__add__, map(list, sorted(kwargs.iteritems())), []))
|
||||
cache_keys = [func.__module__, func.func_name] + converted_args + converted_kwargs
|
||||
return '.'.join(cache_keys)
|
||||
return u'.'.join(cache_keys)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Tests for the request cache.
|
||||
"""
|
||||
@@ -183,6 +184,28 @@ class TestRequestCache(TestCase):
|
||||
self.assertEqual(result, 4)
|
||||
self.assertEqual(to_be_wrapped.call_count, 4)
|
||||
|
||||
def test_request_cached_mixed_unicode_str_args(self):
|
||||
"""
|
||||
Ensure that request_cached can work with mixed str and Unicode parameters.
|
||||
"""
|
||||
RequestCache.clear_request_cache()
|
||||
|
||||
def dummy_function(arg1, arg2):
|
||||
"""
|
||||
A dummy function that expects an str and unicode arguments.
|
||||
"""
|
||||
assert isinstance(arg1, str), 'First parameter has to be of type `str`'
|
||||
assert isinstance(arg2, unicode), 'Second parameter has to be of type `unicode`'
|
||||
return True
|
||||
|
||||
self.assertTrue(dummy_function('Hello', u'World'), 'Should be callable with ASCII chars')
|
||||
self.assertTrue(dummy_function('H∂llå', u'Wørld'), 'Should be callable with non-ASCII chars')
|
||||
|
||||
wrapped = request_cached(dummy_function)
|
||||
|
||||
self.assertTrue(wrapped('Hello', u'World'), 'Wrapper should handle ASCII only chars')
|
||||
self.assertTrue(wrapped('H∂llå', u'Wørld'), 'Wrapper should handle non-ASCII chars')
|
||||
|
||||
def test_request_cached_with_none_result(self):
|
||||
"""
|
||||
Ensure that calling a decorated function that returns None
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for django comment client views."""
|
||||
from contextlib import contextmanager
|
||||
import logging
|
||||
@@ -1165,7 +1166,8 @@ class CreateThreadUnicodeTestCase(
|
||||
request.user = self.student
|
||||
request.view_name = "create_thread"
|
||||
response = views.create_thread(
|
||||
request, course_id=unicode(self.course.id), commentable_id="non_team_dummy_id"
|
||||
# The commentable ID contains a username, the Unicode char below ensures it works fine
|
||||
request, course_id=unicode(self.course.id), commentable_id=u"non_tåem_dummy_id"
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
@@ -81,7 +81,7 @@ def _check_condition(user, condition, content):
|
||||
try:
|
||||
commentable_id = content['commentable_id']
|
||||
request_cache_dict = RequestCache.get_request_cache().data
|
||||
cache_key = "django_comment_client.check_team_member.{}.{}".format(user.id, commentable_id)
|
||||
cache_key = u"django_comment_client.check_team_member.{}.{}".format(user.id, commentable_id)
|
||||
if cache_key in request_cache_dict:
|
||||
return request_cache_dict[cache_key]
|
||||
team = get_team(commentable_id)
|
||||
|
||||
Reference in New Issue
Block a user