From 08569f23cefd3a57fe6b11897fe08b91231d3ae0 Mon Sep 17 00:00:00 2001 From: Marco Bonetti Date: Wed, 27 Feb 2013 18:24:53 +0100 Subject: [PATCH] wip python 3 support --- rosetta/storage.py | 3 +- rosetta/templatetags/rosetta.py | 4 +- rosetta/tests/__init__.py | 123 ++++++++++++++++---------------- rosetta/tests/urls.py | 7 +- rosetta/urls.py | 6 +- rosetta/views.py | 25 +++---- runtests_multi_venv.sh | 8 +++ testproject/urls.py | 6 +- 8 files changed, 103 insertions(+), 79 deletions(-) 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: