Skip to content

Commit bf67e8b

Browse files
SmileyChrisjgmize
authored andcommitted
Django 2.2 (#7196)
* Complete removal of nose test artifacts * Update base requirements to Django 2.2 and python 3 compatibile packages
1 parent 301bcfb commit bf67e8b

File tree

177 files changed

+3599
-3009
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

177 files changed

+3599
-3009
lines changed

.dockerignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
.git
22
.env
3+
**/__pycache__
4+
**/*.pyc

Dockerfile

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ RUN gulp build --production
2323
########
2424
# Python dependencies builder
2525
#
26-
FROM python:2-stretch AS python-builder
26+
FROM python:3-slim AS python-builder
2727

2828
WORKDIR /app
2929
ENV LANG=C.UTF-8
@@ -34,6 +34,7 @@ ENV PATH="/venv/bin:$PATH"
3434
COPY docker/bin/apt-install /usr/local/bin/
3535
RUN apt-install gettext build-essential libxml2-dev libxslt1-dev libxslt1.1
3636

37+
RUN pip install virtualenv
3738
RUN virtualenv /venv
3839

3940
COPY requirements/base.txt requirements/prod.txt ./requirements/
@@ -45,7 +46,7 @@ RUN pip install --no-cache-dir -r requirements/prod.txt
4546
########
4647
# django app container
4748
#
48-
FROM python:2-slim-stretch AS app-base
49+
FROM python:3-slim AS app-base
4950

5051
# Extra python env
5152
ENV PYTHONDONTWRITEBYTECODE=1

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ clean:
7979
git clean -f
8080

8181
lint: .docker-build-pull
82-
${DC} run test flake8 bedrock lib tests
82+
${DC} run test flake8
8383
${DC} run assets gulp js:lint css:lint
8484

8585
test: .docker-build-pull

bedrock/base/cache.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class SimpleDictCache(LocMemCache):
1212
def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
1313
key = self.make_key(key, version=version)
1414
self.validate_key(key)
15-
with self._lock.writer():
15+
with self._lock:
1616
if self._has_expired(key):
1717
self._set(key, value, timeout)
1818
return True
@@ -22,13 +22,13 @@ def get(self, key, default=None, version=None):
2222
key = self.make_key(key, version=version)
2323
self.validate_key(key)
2424
value = default
25-
with self._lock.reader():
25+
with self._lock:
2626
if not self._has_expired(key):
2727
value = self._cache[key]
2828
if value is not default:
2929
return value
3030

31-
with self._lock.writer():
31+
with self._lock:
3232
try:
3333
del self._cache[key]
3434
del self._expire_info[key]
@@ -39,7 +39,7 @@ def get(self, key, default=None, version=None):
3939
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
4040
key = self.make_key(key, version=version)
4141
self.validate_key(key)
42-
with self._lock.writer():
42+
with self._lock:
4343
self._set(key, value, timeout)
4444

4545
def incr(self, key, delta=1, version=None):
@@ -48,6 +48,6 @@ def incr(self, key, delta=1, version=None):
4848
raise ValueError("Key '%s' not found" % key)
4949
new_value = value + delta
5050
key = self.make_key(key, version=version)
51-
with self._lock.writer():
51+
with self._lock:
5252
self._cache[key] = new_value
5353
return new_value

bedrock/base/log_settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def emit(self, record):
9191
cfg[key] = value
9292

9393
# Set the level and handlers for all loggers.
94-
for logger in cfg['loggers'].values() + [cfg['root']]:
94+
for logger in list(cfg['loggers'].values()) + [cfg['root']]:
9595
if 'handlers' not in logger:
9696
logger['handlers'] = ['syslog' if use_syslog else 'console']
9797
if 'level' not in logger:

bedrock/base/management/commands/update_www_config.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from __future__ import print_function
21

32
import os
43

@@ -27,7 +26,7 @@ def refresh_db_values():
2726

2827
ConfigValue.objects.all().delete()
2928
count = 0
30-
for name, value in values.iteritems():
29+
for name, value in values.items():
3130
if value:
3231
ConfigValue.objects.create(name=name, value=value)
3332
count += 1

bedrock/base/middleware.py

+37-11
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,41 @@
55
the locale codes.
66
"""
77
import base64
8-
import urllib
8+
import urllib.parse
9+
from urllib.parse import unquote
910
from warnings import warn
1011

12+
from commonware.middleware import FrameOptionsHeader as OldFrameOptionsHeader
13+
from commonware.middleware import RobotsTagHeader as OldRobotsTagHeader
1114
from django.conf import settings
1215
from django.core.exceptions import MiddlewareNotUsed
13-
from django.http import HttpResponsePermanentRedirect, HttpResponse
14-
from django.utils.encoding import force_text
16+
from django.http import HttpResponse, HttpResponsePermanentRedirect
17+
from django.utils.deprecation import MiddlewareMixin
1518

16-
from . import urlresolvers
1719
from lib.l10n_utils import translation
1820

21+
from . import urlresolvers
22+
1923

20-
class LocaleURLMiddleware(object):
24+
class LocaleURLMiddleware:
2125
"""
2226
1. Search for the locale.
2327
2. Save it in the request.
2428
3. Strip them from the URL.
2529
"""
2630

27-
def __init__(self):
31+
def __init__(self, get_response=None):
2832
if not settings.USE_I18N or not settings.USE_L10N:
2933
warn("USE_I18N or USE_L10N is False but LocaleURLMiddleware is "
3034
"loaded. Consider removing bedrock.base.middleware."
31-
"LocaleURLMiddleware from your MIDDLEWARE_CLASSES setting.")
35+
"LocaleURLMiddleware from your MIDDLEWARE setting.")
36+
self.get_response = get_response
37+
38+
def __call__(self, request):
39+
response = self.process_request(request)
40+
if response:
41+
return response
42+
return self.get_response(request)
3243

3344
def process_request(self, request):
3445
prefixer = urlresolvers.Prefixer(request)
@@ -37,11 +48,11 @@ def process_request(self, request):
3748

3849
if full_path != request.path:
3950
query_string = request.META.get('QUERY_STRING', '')
40-
full_path = urllib.quote(full_path.encode('utf-8'))
51+
full_path = urllib.parse.quote(full_path.encode('utf-8'))
4152

4253
if query_string:
4354
full_path = '?'.join(
44-
[full_path, force_text(query_string, errors='ignore')])
55+
[full_path, unquote(query_string, errors='ignore')])
4556

4657
response = HttpResponsePermanentRedirect(full_path)
4758

@@ -58,14 +69,21 @@ def process_request(self, request):
5869
translation.activate(prefixer.locale or settings.LANGUAGE_CODE)
5970

6071

61-
class BasicAuthMiddleware(object):
72+
class BasicAuthMiddleware:
6273
"""
6374
Middleware to protect the entire site with a single basic-auth username and password.
6475
Set the BASIC_AUTH_CREDS environment variable to enable.
6576
"""
66-
def __init__(self):
77+
def __init__(self, get_response=None):
6778
if not settings.BASIC_AUTH_CREDS:
6879
raise MiddlewareNotUsed
80+
self.get_response = None
81+
82+
def __call__(self, request):
83+
response = self.process_request(request)
84+
if response:
85+
return response
86+
return self.get_response(request)
6987

7088
def process_request(self, request):
7189
required_auth = settings.BASIC_AUTH_CREDS
@@ -85,3 +103,11 @@ def process_request(self, request):
85103
realm = settings.APP_NAME or 'bedrock-demo'
86104
response['WWW-Authenticate'] = 'Basic realm="{}"'.format(realm)
87105
return response
106+
107+
108+
class RobotsTagHeader(OldRobotsTagHeader, MiddlewareMixin):
109+
pass
110+
111+
112+
class FrameOptionsHeader(OldFrameOptionsHeader, MiddlewareMixin):
113+
pass

bedrock/base/migrations/0001_initial.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# -*- coding: utf-8 -*-
2-
from __future__ import unicode_literals
32

43
from django.db import migrations, models
54

bedrock/base/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class ConfigValue(models.Model):
88
class Meta:
99
app_label = 'base'
1010

11-
def __unicode__(self):
11+
def __str__(self):
1212
return '%s=%s' % (self.name, self.value)
1313

1414

bedrock/base/templatetags/helpers.py

+11-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import datetime
2-
import urllib
3-
import urlparse
2+
import urllib.parse
43

54
from django.conf import settings
65
from django.contrib.staticfiles.storage import staticfiles_storage
@@ -73,43 +72,43 @@ def urlparams(url_, hash=None, **query):
7372
New query params will be appended to exising parameters, except duplicate
7473
names, which will be replaced.
7574
"""
76-
url = urlparse.urlparse(url_)
75+
url = urllib.parse.urlparse(url_)
7776
fragment = hash if hash is not None else url.fragment
7877

7978
# Use dict(parse_qsl) so we don't get lists of values.
8079
q = url.query
81-
query_dict = dict(urlparse.parse_qsl(smart_str(q))) if q else {}
80+
query_dict = dict(urllib.parse.parse_qsl(smart_str(q))) if q else {}
8281
query_dict.update((k, v) for k, v in query.items())
8382

8483
query_string = _urlencode([(k, v) for k, v in query_dict.items()
8584
if v is not None])
86-
new = urlparse.ParseResult(url.scheme, url.netloc, url.path, url.params,
87-
query_string, fragment)
85+
new = urllib.parse.ParseResult(
86+
url.scheme, url.netloc, url.path, url.params, query_string, fragment)
8887
return new.geturl()
8988

9089

9190
def _urlencode(items):
9291
"""A Unicode-safe URLencoder."""
9392
try:
94-
return urllib.urlencode(items)
93+
return urllib.parse.urlencode(items)
9594
except UnicodeEncodeError:
96-
return urllib.urlencode([(k, smart_str(v)) for k, v in items])
95+
return urllib.parse.urlencode([(k, smart_str(v)) for k, v in items])
9796

9897

9998
@library.filter
10099
def mailtoencode(txt):
101100
"""Url encode a string using %20 for spaces."""
102-
if isinstance(txt, unicode):
101+
if isinstance(txt, str):
103102
txt = txt.encode('utf-8')
104-
return urllib.quote(txt)
103+
return urllib.parse.quote(txt)
105104

106105

107106
@library.filter
108107
def urlencode(txt):
109108
"""Url encode a string using + for spaces."""
110-
if isinstance(txt, unicode):
109+
if isinstance(txt, str):
111110
txt = txt.encode('utf-8')
112-
return urllib.quote_plus(txt)
111+
return urllib.parse.quote_plus(txt)
113112

114113

115114
@library.global_function

bedrock/base/tests/test_accepted_locales.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ def test_dev_languages(self):
8282
# simulate the successful result of the DEV_LANGUAGES list
8383
# comprehension defined in settings.
8484
settings.DEV_LANGUAGES = ['en-US', 'fr']
85-
assert settings.LANGUAGE_URL_MAP == {'en-us': 'en-US', 'fr': 'fr'}, \
86-
('DEV is True, but DEV_LANGUAGES are not used to define the '
87-
'allowed locales.')
85+
assert settings.LANGUAGE_URL_MAP == {'en-us': 'en-US', 'fr': 'fr'}, (
86+
'DEV is True, but DEV_LANGUAGES are not used to define the '
87+
'allowed locales.')
8888

8989
def test_prod_languages(self):
9090
"""Test the accepted locales on prod instances.

bedrock/base/tests/test_middleware.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from urllib.parse import urlencode
2+
13
from django.test import TestCase, RequestFactory
24
from django.test.utils import override_settings
35

@@ -15,7 +17,7 @@ def test_redirects_to_correct_language(self):
1517
"""Should redirect to lang prefixed url."""
1618
path = '/the/dude/'
1719
req = self.rf.get(path, HTTP_ACCEPT_LANGUAGE='de')
18-
resp = LocaleURLMiddleware().process_request(req)
20+
resp = self.middleware.process_request(req)
1921
self.assertEqual(resp['Location'], '/de' + path)
2022

2123
@override_settings(DEV_LANGUAGES=('es', 'fr'),
@@ -24,17 +26,18 @@ def test_redirects_to_default_language(self):
2426
"""Should redirect to default lang if not in settings."""
2527
path = '/the/dude/'
2628
req = self.rf.get(path, HTTP_ACCEPT_LANGUAGE='de')
27-
resp = LocaleURLMiddleware().process_request(req)
29+
resp = self.middleware.process_request(req)
2830
self.assertEqual(resp['Location'], '/en-US' + path)
2931

3032
@override_settings(DEV_LANGUAGES=('de', 'fr'))
3133
def test_redirects_to_correct_language_despite_unicode_errors(self):
3234
"""Should redirect to lang prefixed url, stripping invalid chars."""
3335
path = '/the/dude/'
34-
corrupt_querystring = '?a\xa4\x91b\xa4\x91i\xc0de=s'
36+
corrupt_querystring = '?' + urlencode(
37+
{b'a\xa4\x91b\xa4\x91i\xc0de': 's'})
3538
corrected_querystring = '?abide=s'
3639
req = self.rf.get(path + corrupt_querystring,
3740
HTTP_ACCEPT_LANGUAGE='de')
38-
resp = LocaleURLMiddleware().process_request(req)
41+
resp = self.middleware.process_request(req)
3942
self.assertEqual(resp['Location'],
4043
'/de' + path + corrected_querystring)

0 commit comments

Comments
 (0)