Merge pull request #35 from revsys/django-2-bump

Django 2 bump
This commit is contained in:
Nicholas Serra 2020-04-10 12:21:23 -04:00 committed by GitHub
commit d66d25cde7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 124 additions and 97 deletions

2
.gitignore vendored
View file

@ -1,3 +1,5 @@
*.pyc
.coverage
htmlcov/
venv
.python-version

View file

@ -1,71 +1,47 @@
language: python
cache: pip
python:
- "2.6"
- "2.7"
- "3.4"
- "3.5"
- "3.6"
install:
- pip install coveralls coverage
- pip install $DJANGO
script:
- coverage run runtests.py
- coverage report -m
after_script:
- coverage combine
- coveralls
- "3.7"
sudo: false
env:
- DJANGO="Django>=1.4,<1.5"
- DJANGO="Django>=1.5,<1.6"
- DJANGO="Django>=1.6,<1.7"
- DJANGO="Django>=1.7,<1.8"
- DJANGO="Django>=1.8,<1.9"
- DJANGO="Django>=1.9,<1.10"
- DJANGO="Django>=1.10,<1.11"
- DJANGO="Django>=1.11,<2.0"
- DJANGO="Django>=2.0,<2.1"
- DJANGO="Django==2.2.12"
- DJANGO="https://github.com/django/django/archive/master.tar.gz"
matrix:
fast_finish: true
exclude:
# Python 2.6 support has been dropped in Django 1.7
- python: "2.6"
env: DJANGO="Django>=1.7,<1.8"
- python: "2.6"
env: DJANGO="Django>=1.8,<1.9"
- python: "2.6"
env: DJANGO="Django>=1.9,<1.10"
- python: "2.6"
env: DJANGO="Django>=1.10,<1.11"
- python: "2.6"
env: DJANGO="Django>=1.11,<2.0"
- python: "2.6"
env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
- python: "2.7"
env: DJANGO="Django>=2.0,<2.1"
- python: "2.7"
env: DJANGO="Django==2.2.12"
- python: "2.7"
env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
- python: "3.4"
env: DJANGO="Django>=1.4,<1.5"
- python: "3.4"
env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
- python: "3.5"
env: DJANGO="Django>=1.4,<1.5"
- python: "3.5"
env: DJANGO="Django>=1.5,<1.6"
- python: "3.5"
env: DJANGO="Django>=1.6,<1.7"
- python: "3.5"
env: DJANGO="Django>=1.7,<1.8"
- python: "3.6"
env: DJANGO="Django>=1.4,<1.5"
- python: "3.6"
env: DJANGO="Django>=1.5,<1.6"
- python: "3.6"
env: DJANGO="Django>=1.6,<1.7"
- python: "3.6"
env: DJANGO="Django>=1.7,<1.8"
- python: "3.6"
env: DJANGO="Django>=1.8,<1.9"
- python: "3.6"
env: DJANGO="Django>=1.9,<1.10"
- python: "3.6"
env: DJANGO="Django>=1.10,<1.11"
env: DJANGO="Django>=1.8,<1.11"
allow_failures:
- env: DJANGO="https://github.com/django/django/archive/master.tar.gz"
install:
- pip install coveralls coverage
- pip install $DJANGO
script:
- coverage run runtests.py
- coverage report -m
after_script:
- coverage combine
- coveralls

View file

@ -1,2 +1 @@
Django>=1.4
coverage

View file

@ -1,4 +1,5 @@
#!/usr/bin/env python
import logging
import sys
import django
@ -6,15 +7,20 @@ import django
from django.conf import settings
from django.core.management import execute_from_command_line
from tos.compat import get_middleware_settings_key
middleware_settings_key = get_middleware_settings_key()
if not settings.configured:
settings.configure(
DATABASES={
django_settings = {
'DATABASES': {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
}
},
INSTALLED_APPS=[
'INSTALLED_APPS': [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
@ -23,14 +29,7 @@ if not settings.configured:
'tos',
'tos.tests'
],
MIDDLEWARE_CLASSES=[
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
],
TEMPLATES=[
'TEMPLATES': [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
@ -45,10 +44,10 @@ if not settings.configured:
},
},
],
ROOT_URLCONF='tos.tests.test_urls',
LOGIN_URL='/login/',
SITE_ID='1',
CACHES = {
'ROOT_URLCONF': 'tos.tests.test_urls',
'LOGIN_URL': '/login/',
'SITE_ID': '1',
'CACHES': {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
},
@ -56,11 +55,34 @@ if not settings.configured:
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
},
TOS_CACHE_NAME = 'tos'
)
'TOS_CACHE_NAME': 'tos'
}
if django.VERSION >= (1, 10, 0):
django_settings[middleware_settings_key] = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
else:
django_settings[middleware_settings_key] = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
settings.configure(**django_settings)
import logging
logging.basicConfig(
level = logging.DEBUG,
format = '%(asctime)s %(levelname)s %(message)s',

View file

@ -1,3 +1,3 @@
default_app_config = 'tos.apps.TOSConfig'
VERSION = (0, 7, 2)
VERSION = (0, 8, 0)

View file

@ -4,7 +4,11 @@ from django.db.models.signals import pre_save
from .signal_handlers import invalidate_cached_agreements
MIDDLEWARES = getattr(settings, 'MIDDLEWARE_CLASSES', [])
from .compat import get_middleware_settings_key
middleware_settings_key = get_middleware_settings_key()
MIDDLEWARES = getattr(settings, middleware_settings_key, [])
class TOSConfig(AppConfig):

View file

@ -1,5 +1,6 @@
import django
from django.conf import settings
from django.utils import deprecation
def patterns(mod, *urls):
@ -50,7 +51,26 @@ def get_cache(cache_name):
return get_cache(cache_name)
def get_middleware_mixin():
if django.VERSION >= (1, 10, 0):
return deprecation.MiddlewareMixin
else:
return object
def get_middleware_settings_key():
if django.VERSION >= (1, 10, 0):
return 'MIDDLEWARE'
else:
return 'MIDDLEWARE_CLASSES'
if django.VERSION < (1, 5):
from django.templatetags.future import url
else:
from django.template.defaulttags import url
if django.VERSION >= (1, 10, 0):
from django.urls import reverse
else:
from django.core.urlresolvers import reverse

View file

@ -1,22 +1,22 @@
from django import VERSION as DJANGO_VERSION
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME, SESSION_KEY as session_key
from django.core.urlresolvers import reverse
from django.contrib.auth import SESSION_KEY as session_key
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.http import HttpResponseRedirect
from django.utils import deprecation
from django.utils.cache import add_never_cache_headers
from .compat import get_cache
from .compat import get_cache, get_middleware_mixin, reverse
from .models import UserAgreement
cache = get_cache(getattr(settings, 'TOS_CACHE_NAME', 'default'))
tos_check_url = reverse('tos_check_tos')
middleware_mixin = get_middleware_mixin()
class UserAgreementMiddleware(deprecation.MiddlewareMixin if DJANGO_VERSION >= (1, 10, 0) else object):
class UserAgreementMiddleware(middleware_mixin):
"""
Some middleware to check if users have agreed to the latest TOS
"""
def process_request(self, request):
# Don't get in the way of any mutating requests
if request.method != 'GET':

View file

@ -68,8 +68,8 @@ class TermsOfService(BaseModel):
class UserAgreement(BaseModel):
terms_of_service = models.ForeignKey(TermsOfService, related_name='terms')
user = models.ForeignKey(get_fk_user_model(), related_name='user_agreement')
terms_of_service = models.ForeignKey(TermsOfService, related_name='terms', on_delete=models.CASCADE)
user = models.ForeignKey(get_fk_user_model(), related_name='user_agreement', on_delete=models.CASCADE)
def __unicode__(self):
return u'%s agreed to TOS: %s' % (self.user.username,

View file

@ -1,19 +1,21 @@
from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.core.urlresolvers import reverse
from django.test import TestCase
from django.test.utils import override_settings
from django.test.utils import modify_settings
from tos.compat import get_cache, get_runtime_user_model
from tos.compat import get_cache, get_runtime_user_model, reverse
from tos.middleware import UserAgreementMiddleware
from tos.models import TermsOfService, UserAgreement
from tos.signal_handlers import invalidate_cached_agreements
@override_settings(
MIDDLEWARE_CLASSES=settings.MIDDLEWARE_CLASSES + [
'tos.middleware.UserAgreementMiddleware',
]
@modify_settings(
MIDDLEWARE_CLASSES={
'append': 'tos.middleware.UserAgreementMiddleware',
},
MIDDLEWARE={
'append': 'tos.middleware.UserAgreementMiddleware',
},
)
class TestMiddleware(TestCase):
@ -86,10 +88,13 @@ class TestMiddleware(TestCase):
self.assertEqual(response.url.replace('http://testserver', ''), str(reverse('index')))
@override_settings(
MIDDLEWARE_CLASSES=settings.MIDDLEWARE_CLASSES + [
'tos.middleware.UserAgreementMiddleware',
]
@modify_settings(
MIDDLEWARE_CLASSES={
'append': 'tos.middleware.UserAgreementMiddleware',
},
MIDDLEWARE={
'append': 'tos.middleware.UserAgreementMiddleware',
},
)
class BumpCoverage(TestCase):

View file

@ -1,8 +1,7 @@
from django.conf import settings
from django.core.urlresolvers import reverse
from django.test import TestCase
from tos.compat import get_runtime_user_model
from tos.compat import get_runtime_user_model, reverse
from tos.models import TermsOfService, UserAgreement, has_user_agreed_latest_tos
@ -80,14 +79,14 @@ class TestViews(TestCase):
self.assertTrue(has_user_agreed_latest_tos(self.user1))
response = self.client.post(self.login_url, dict(username='user1',
password='user1pass'))
password='user1pass'))
self.assertEqual(302, response.status_code)
def test_redirect_security(self):
""" redirect to outside url not allowed, should redirect to login url"""
response = self.client.post(self.login_url, dict(username='user1',
password='user1pass', next='http://example.com'))
password='user1pass', next='http://example.com'))
self.assertEqual(302, response.status_code)
self.assertIn(settings.LOGIN_REDIRECT_URL, response._headers['location'][1])