diff --git a/rosetta/storage.py b/rosetta/storage.py
index 7c2d77d..2faf605 100644
--- a/rosetta/storage.py
+++ b/rosetta/storage.py
@@ -4,6 +4,7 @@ from django.utils import importlib
from django.core.exceptions import ImproperlyConfigured
import hashlib
import time
+import six
class BaseRosettaStorage(object):
@@ -62,7 +63,7 @@ class CacheRosettaStorage(BaseRosettaStorage):
if 'rosetta_cache_storage_key_prefix' in self.request.session:
self._key_prefix = self.request.session['rosetta_cache_storage_key_prefix']
else:
- self._key_prefix = hashlib.new('sha1', str(time.time())).hexdigest()
+ self._key_prefix = hashlib.new('sha1', six.text_type(time.time()).encode('utf8')).hexdigest()
self.request.session['rosetta_cache_storage_key_prefix'] = self._key_prefix
if self.request.session['rosetta_cache_storage_key_prefix'] != self._key_prefix:
diff --git a/rosetta/templatetags/rosetta.py b/rosetta/templatetags/rosetta.py
index 4eeec2a..3cb7f09 100644
--- a/rosetta/templatetags/rosetta.py
+++ b/rosetta/templatetags/rosetta.py
@@ -3,7 +3,7 @@ from django.utils.safestring import mark_safe
from django.utils.html import escape
import re
from django.template import Node
-from django.utils.encoding import smart_unicode
+import six
register = template.Library()
@@ -60,7 +60,7 @@ class IncrNode(template.Node):
def render(self, context):
self.val += 1
- return smart_unicode(self.val)
+ return six.text_type(self.val)
def is_fuzzy(message):
diff --git a/rosetta/tests/__init__.py b/rosetta/tests/__init__.py
index 21e0e1a..656d1cb 100644
--- a/rosetta/tests/__init__.py
+++ b/rosetta/tests/__init__.py
@@ -9,6 +9,7 @@ from rosetta.conf import settings as rosetta_settings
from rosetta.signals import entry_changed, post_save
import os
import shutil
+import six
import django
@@ -59,14 +60,14 @@ class RosettaTestCase(TestCase):
def test_1_ListLoading(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in r.content)
+ self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
def test_2_PickFile(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()) + '?rosetta')
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('dummy language' in r.content)
+ self.assertTrue('dummy language' in str(r.content))
def test_3_DownloadZIP(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
@@ -86,10 +87,10 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-home') + '?filter=untranslated')
r = self.client.get(reverse('rosetta-home'))
# make sure both strings are untranslated
- self.assertTrue('dummy language' in r.content)
- self.assertTrue('String 1' in r.content)
- self.assertTrue('String 2' in r.content)
- self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content)
+ self.assertTrue('dummy language' in str(r.content))
+ self.assertTrue('String 1' in str(r.content))
+ self.assertTrue('String 2' in str(r.content))
+ self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
@@ -100,17 +101,17 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-home'))
# the translated string no longer is up for translation
- self.assertTrue('String 1' in r.content)
- self.assertTrue('String 2' not in r.content)
+ self.assertTrue('String 1' in str(r.content))
+ self.assertTrue('String 2' not in str(r.content))
# display only translated strings
r = self.client.get(reverse('rosetta-home') + '?filter=translated')
r = self.client.get(reverse('rosetta-home'))
# The tranlsation was persisted
- self.assertTrue('String 1' not in r.content)
- self.assertTrue('String 2' in r.content)
- self.assertTrue('Hello, world' in r.content)
+ self.assertTrue('String 1' not in str(r.content))
+ self.assertTrue('String 2' in str(r.content))
+ self.assertTrue('Hello, world' in str(r.content))
def test_5_TestIssue67(self):
# testcase for issue 67: http://code.google.com/p/django-rosetta/issues/detail?id=67
@@ -131,10 +132,10 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-home'))
# make sure all strings are untranslated
- self.assertTrue('dummy language' in r.content)
- self.assertTrue('String 1' in r.content)
- self.assertTrue('String 2' in r.content)
- self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content)
+ self.assertTrue('dummy language' in str(r.content))
+ self.assertTrue('String 1' in str(r.content))
+ self.assertTrue('String 2' in str(r.content))
+ self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
@@ -154,21 +155,21 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in r.content)
+ self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in str(r.content))
rosetta_settings.EXCLUDED_APPLICATIONS = ()
r = self.client.get(reverse('rosetta-pick-file') + '?rosetta')
- self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in r.content)
+ self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in str(r.content))
def test_7_selfInApplist(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in r.content)
+ self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=project')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in r.content)
+ self.assertTrue('rosetta/locale/xx/LC_MESSAGES/django.po' not in str(r.content))
def test_8_hideObsoletes(self):
r = self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
@@ -178,12 +179,12 @@ class RosettaTestCase(TestCase):
# not in listing
for p in range(1, 5):
r = self.client.get(reverse('rosetta-home') + '?page=%d' % p)
- self.assertTrue('dummy language' in r.content)
- self.assertTrue('Les deux' not in r.content)
+ self.assertTrue('dummy language' in str(r.content))
+ self.assertTrue('Les deux' not in str(r.content))
r = self.client.get(reverse('rosetta-home') + '?query=Les%20Deux')
- self.assertTrue('dummy language' in r.content)
- self.assertTrue('Les deux' not in r.content)
+ self.assertTrue('dummy language' in str(r.content))
+ self.assertTrue('Les deux' not in str(r.content))
def test_9_concurrency(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.template')), self.dest_file)
@@ -200,9 +201,9 @@ class RosettaTestCase(TestCase):
r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated')
r2 = self.client2.get(reverse('rosetta-home'))
- self.assertTrue('String 1' in r.content)
+ self.assertTrue('String 1' in str(r.content))
self.assertTrue('String 1' in r2.content)
- self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in r.content)
+ self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(m_08e4e11e2243d764fc45a5a4fba5d0f2='Hello, world', _next='_next'), follow=True)
r2 = self.client2.get(reverse('rosetta-home'))
@@ -216,8 +217,8 @@ class RosettaTestCase(TestCase):
r2 = self.client2.get(reverse('rosetta-home') + '?filter=untranslated')
r2 = self.client2.get(reverse('rosetta-home'))
- self.assertTrue('String 2' in r2.content and 'm_e48f149a8b2e8baa81b816c0edf93890' in r2.content)
- self.assertTrue('String 2' in r.content and 'm_e48f149a8b2e8baa81b816c0edf93890' in r.content)
+ self.assertTrue('String 2' in str(r2.content) and 'm_e48f149a8b2e8baa81b816c0edf93890' in str(r2.content))
+ self.assertTrue('String 2' in str(r.content) and 'm_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# client 2 posts!
r2 = self.client2.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client two!', _next='_next'), follow=True)
@@ -227,7 +228,7 @@ class RosettaTestCase(TestCase):
# uh-oh here comes client 1
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world, from client one!', _next='_next'), follow=True)
# An error message is displayed
- self.assertTrue('save-conflict' in r.content)
+ self.assertTrue('save-conflict' in str(r.content))
# client 2 won
pofile_content = open(self.dest_file, 'r').read()
@@ -235,34 +236,34 @@ class RosettaTestCase(TestCase):
# Both clients show all strings, error messages are gone
r = self.client.get(reverse('rosetta-home') + '?filter=translated')
- self.assertTrue('save-conflict' not in r.content)
+ self.assertTrue('save-conflict' not in str(r.content))
r2 = self.client2.get(reverse('rosetta-home') + '?filter=translated')
self.assertTrue('save-conflict' not in r2.content)
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('save-conflict' not in r.content)
+ self.assertTrue('save-conflict' not in str(r.content))
r2 = self.client2.get(reverse('rosetta-home'))
self.assertTrue('save-conflict' not in r2.content)
# Both have client's two version
- self.assertTrue('Hello, world, from client two!' in r.content)
+ self.assertTrue('Hello, world, from client two!' in str(r.content))
self.assertTrue('Hello, world, from client two!' in r2.content)
self.assertTrue('save-conflict' not in r2.content)
- self.assertTrue('save-conflict' not in r.content)
+ self.assertTrue('save-conflict' not in str(r.content))
def test_10_issue_79_num_entries(self):
shutil.copy(os.path.normpath(os.path.join(self.curdir, './django.po.issue79.template')), self.dest_file)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue('
1 | ' in r.content)
- self.assertTrue('%s%% | ' % str(floatformat(0.0, 2)) in r.content)
- self.assertTrue('1 | ' in r.content)
+ self.assertTrue('1 | ' in str(r.content))
+ self.assertTrue('%s%% | ' % str(floatformat(0.0, 2)) in str(r.content))
+ self.assertTrue('1 | ' in str(r.content))
def test_11_issue_80_tab_indexes(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0,), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('tabindex="3"' in r.content)
+ self.assertTrue('tabindex="3"' in str(r.content))
def test_12_issue_82_staff_user(self):
settings.ROSETTA_REQUIRES_AUTH = True
@@ -286,35 +287,35 @@ class RosettaTestCase(TestCase):
settings.LANGUAGES = (('fr', 'French'), ('xx', 'Dummy Language'),)
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in r.content)
- self.assertTrue(('contrib') not in r.content)
+ self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
+ self.assertTrue(('contrib') not in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=django')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in r.content)
+ self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
- self.assertTrue(('contrib') in r.content)
+ self.assertTrue(('contrib') in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=all')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in r.content)
+ self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
- self.assertTrue(('contrib') in r.content)
+ self.assertTrue(('contrib') in str(r.content))
self.client.get(reverse('rosetta-pick-file') + '?filter=project')
r = self.client.get(reverse('rosetta-pick-file'))
- self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in r.content)
+ self.assertTrue(os.path.normpath('rosetta/locale/xx/LC_MESSAGES/django.po') not in str(r.content))
if self.django_version_major >= 1 and self.django_version_minor >= 3:
- self.assertTrue(('contrib') not in r.content)
+ self.assertTrue(('contrib') not in str(r.content))
def test_14_issue_99_context_and_comments(self):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('This is a text of the base template' in r.content)
- self.assertTrue('Context hint' in r.content)
+ self.assertTrue('This is a text of the base template' in str(r.content))
+ self.assertTrue('Context hint' in str(r.content))
def test_14_issue_87_entry_changed_signal(self):
# copy the template file
@@ -329,7 +330,7 @@ class RosettaTestCase(TestCase):
self.test_old_msgstr = kwargs.get('old_msgstr')
self.test_new_msgstr = sender.msgstr
self.test_msg_id = sender.msgid
- self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content)
+ self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
@@ -350,7 +351,7 @@ class RosettaTestCase(TestCase):
def test_receiver(sender, **kwargs):
self.test_sig_lang = kwargs.get('language_code')
- self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content)
+ self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
@@ -369,7 +370,7 @@ class RosettaTestCase(TestCase):
def test_receiver(sender, **kwargs):
self.test_16_has_request = 'request' in kwargs
- self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in r.content)
+ self.assertTrue('m_e48f149a8b2e8baa81b816c0edf93890' in str(r.content))
# post a translation
r = self.client.post(reverse('rosetta-home'), dict(m_e48f149a8b2e8baa81b816c0edf93890='Hello, world', _next='_next'))
@@ -385,7 +386,7 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in r.content)
+ self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in str(r.content))
# post a translation, it should have properly wrapped lines
r = self.client.post(reverse('rosetta-home'), dict(m_bb9d8fe6159187b9ea494c1b313d23d4='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.', _next='_next'))
@@ -397,7 +398,7 @@ class RosettaTestCase(TestCase):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in r.content)
+ self.assertTrue('m_bb9d8fe6159187b9ea494c1b313d23d4' in str(r.content))
rosetta_settings.POFILE_WRAP_WIDTH = 0
r = self.client.post(reverse('rosetta-home'), dict(m_bb9d8fe6159187b9ea494c1b313d23d4='Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.', _next='_next'))
pofile_content = open(self.dest_file, 'r').read()
@@ -409,9 +410,9 @@ class RosettaTestCase(TestCase):
self.client.get(reverse('rosetta-pick-file') + '?filter=third-party')
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_1' in r.content)
- self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_0' in r.content)
- self.assertTrue('m_09f7e02f1290be211da707a266f153b3' in r.content)
+ self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_1' in str(r.content))
+ self.assertTrue('m_ff7060c1a9aae9c42af4d54ac8551f67_0' in str(r.content))
+ self.assertTrue('m_09f7e02f1290be211da707a266f153b3' in str(r.content))
# post a translation, it should have properly wrapped lines
r = self.client.post(reverse('rosetta-home'), dict(
@@ -438,7 +439,7 @@ class RosettaTestCase(TestCase):
self.client.get(reverse('rosetta-language-selection', args=('xx', 0, ), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
self.assertFalse(len(str(self.client.cookies.get('sessionid'))) > 4096)
- self.assertTrue('m_9efd113f7919952523f06e0d88da9c54' in r.content)
+ self.assertTrue('m_9efd113f7919952523f06e0d88da9c54' in str(r.content))
r = self.client.post(reverse('rosetta-home'), dict(
m_9efd113f7919952523f06e0d88da9c54='Testing cookie length',
_next='_next'
@@ -448,8 +449,8 @@ class RosettaTestCase(TestCase):
self.client.get(reverse('rosetta-home') + '?filter=translated')
r = self.client.get(reverse('rosetta-home'))
- self.assertTrue('Testing cookie length' in r.content)
- self.assertTrue('m_9f6c442c6d579707440ba9dada0fb373' in r.content)
+ self.assertTrue('Testing cookie length' in str(r.content))
+ self.assertTrue('m_9f6c442c6d579707440ba9dada0fb373' in str(r.content))
# Two, the cookie backend
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.SessionRosettaStorage'
@@ -461,10 +462,10 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-home'))
self.assertTrue(len(str(self.client.cookies.get('sessionid'))) > 4096)
# boom: be a good browser, truncate the cookie
- self.client.cookies['sessionid'] = unicode(self.client.cookies.get('sessionid'))[:4096]
+ self.client.cookies['sessionid'] = six.text_type(self.client.cookies.get('sessionid'))[:4096]
r = self.client.get(reverse('rosetta-home'))
- self.assertFalse('m_9efd113f7919952523f06e0d88da9c54' in r.content)
+ self.assertFalse('m_9efd113f7919952523f06e0d88da9c54' in str(r.content))
def test_20_concurrency_of_cache_backend(self):
rosetta_settings.STORAGE_CLASS = 'rosetta.storage.CacheRosettaStorage'
@@ -485,6 +486,6 @@ class RosettaTestCase(TestCase):
r = self.client.get(reverse('rosetta-language-selection', args=('xx', 0), kwargs=dict()))
r = self.client.get(reverse('rosetta-home'))
# We have distinct hashes, even though the msgid and msgstr are identical
- self.assertTrue('m_4765f7de94996d3de5975fa797c3451f' in r.content)
- self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in r.content)
+ self.assertTrue('m_4765f7de94996d3de5975fa797c3451f' in str(r.content))
+ self.assertTrue('m_08e4e11e2243d764fc45a5a4fba5d0f2' in str(r.content))
diff --git a/rosetta/tests/urls.py b/rosetta/tests/urls.py
index 0f9c199..f5cfe8b 100644
--- a/rosetta/tests/urls.py
+++ b/rosetta/tests/urls.py
@@ -1,4 +1,9 @@
-from django.conf.urls.defaults import *
+try:
+ from django.conf.urls import patterns, include, url
+except ImportError:
+ from django.conf.urls.defaults import patterns, include, url
+
+
urlpatterns = patterns('',
url(r'^rosetta/',include('rosetta.urls')),
url(r'^admin/$','rosetta.tests.views.dummy', name='dummy-login')
diff --git a/rosetta/urls.py b/rosetta/urls.py
index b701b69..4c493fc 100644
--- a/rosetta/urls.py
+++ b/rosetta/urls.py
@@ -1,4 +1,8 @@
-from django.conf.urls.defaults import url, patterns
+try:
+ from django.conf.urls import patterns, url
+except ImportError:
+ from django.conf.urls.defaults import patterns, url
+
urlpatterns = patterns('rosetta.views',
url(r'^$', 'home', name='rosetta-home'),
diff --git a/rosetta/views.py b/rosetta/views.py
index cfbb818..8203353 100644
--- a/rosetta/views.py
+++ b/rosetta/views.py
@@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect, HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
-from django.utils.encoding import smart_unicode, iri_to_uri
+from django.utils.encoding import iri_to_uri
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.cache import never_cache
from rosetta.conf import settings as rosetta_settings
@@ -18,6 +18,7 @@ import rosetta
import unicodedata
import hashlib
import os
+import six
def home(request):
@@ -57,9 +58,9 @@ def home(request):
rosetta_i18n_pofile = pofile(rosetta_i18n_fn, wrapwidth=rosetta_settings.POFILE_WRAP_WIDTH)
for entry in rosetta_i18n_pofile:
entry.md5hash = hashlib.md5(
- entry.msgid.encode("utf8") +
- entry.msgstr.encode("utf8") +
- (entry.msgctxt and entry.msgctxt.encode("utf8") or "")
+ (six.text_type(entry.msgid) +
+ six.text_type(entry.msgstr) +
+ six.text_type(entry.msgctxt and entry.msgctxt.encode("utf8") or "")).encode('utf8')
).hexdigest()
else:
@@ -86,7 +87,7 @@ def home(request):
# polib parses .po files into unicode strings, but
# doesn't bother to convert plural indexes to int,
# so we need unicode here.
- plural_id = unicode(rx_plural.match(key).groups()[1])
+ plural_id = six.text_type(rx_plural.match(key).groups()[1])
elif rx.match(key):
md5hash = str(rx.match(key).groups()[0])
@@ -183,7 +184,7 @@ def home(request):
if 'query' in request.REQUEST and request.REQUEST.get('query', '').strip():
query = request.REQUEST.get('query').strip()
rx = re.compile(re.escape(query), re.IGNORECASE)
- paginator = Paginator([e for e in rosetta_i18n_pofile if not e.obsolete and rx.search(smart_unicode(e.msgstr) + smart_unicode(e.msgid) + u''.join([o[0] for o in e.occurrences]))], rosetta_settings.MESSAGES_PER_PAGE)
+ paginator = Paginator([e for e in rosetta_i18n_pofile if not e.obsolete and rx.search(six.text_type(e.msgstr) + six.text_type(e.msgid) + u''.join([o[0] for o in e.occurrences]))], rosetta_settings.MESSAGES_PER_PAGE)
else:
if rosetta_i18n_filter == 'untranslated':
paginator = Paginator(rosetta_i18n_pofile.untranslated_entries(), rosetta_settings.MESSAGES_PER_PAGE)
@@ -271,7 +272,7 @@ def download_file(request):
mo_fn = str(po_fn.replace('.po', '.mo')) # not so smart, huh
zipdata = StringIO()
zipf = zipfile.ZipFile(zipdata, mode="w")
- zipf.writestr(po_fn, unicode(rosetta_i18n_pofile).encode("utf8"))
+ zipf.writestr(po_fn, six.text_type(rosetta_i18n_pofile).encode("utf8"))
zipf.writestr(mo_fn, rosetta_i18n_pofile.to_binary())
zipf.close()
zipdata.seek(0)
@@ -351,14 +352,14 @@ def lang_sel(request, langid, idx):
file_ = find_pos(langid, project_apps=project_apps, django_apps=django_apps, third_party_apps=third_party_apps)[int(idx)]
storage.set('rosetta_i18n_lang_code', langid)
- storage.set('rosetta_i18n_lang_name', unicode([l[1] for l in settings.LANGUAGES if l[0] == langid][0]))
+ storage.set('rosetta_i18n_lang_name', six.text_type([l[1] for l in settings.LANGUAGES if l[0] == langid][0]))
storage.set('rosetta_i18n_fn', file_)
po = pofile(file_)
for entry in po:
- entry.md5hash = hashlib.md5(
- entry.msgid.encode("utf8") +
- entry.msgstr.encode("utf8") +
- (entry.msgctxt and entry.msgctxt.encode("utf8") or "")
+ entry.md5hash = hashlib.new('md5',
+ (six.text_type(entry.msgid) +
+ six.text_type(entry.msgstr) +
+ six.text_type(entry.msgctxt and entry.msgctxt.encode("utf8") or "")).encode('utf8')
).hexdigest()
storage.set('rosetta_i18n_pofile', po)
diff --git a/runtests_multi_venv.sh b/runtests_multi_venv.sh
index 36cc9db..e8801f2 100644
--- a/runtests_multi_venv.sh
+++ b/runtests_multi_venv.sh
@@ -21,3 +21,11 @@ python manage.py test rosetta
cd ..
deactivate
+. venv_15_p3/bin/activate
+cd testproject
+python manage.py --version
+python --version
+python manage.py test rosetta
+cd ..
+deactivate
+
diff --git a/testproject/urls.py b/testproject/urls.py
index 5bdc133..485c9e5 100644
--- a/testproject/urls.py
+++ b/testproject/urls.py
@@ -1,4 +1,8 @@
-from django.conf.urls.defaults import patterns, include, url
+try:
+ from django.conf.urls import patterns, include, url
+except ImportError:
+ from django.conf.urls.defaults import patterns, include, url
+
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# Uncomment the next two lines to enable the admin: