add support of Django 1.11 (#19614)

This commit is contained in:
Serghei Mihai 2017-10-24 09:56:49 +02:00 committed by Frédéric Péters
parent b71bff0cab
commit 4cd434e631
12 changed files with 68 additions and 66 deletions

View File

@ -14,13 +14,13 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf.urls import patterns, url
from django.conf.urls import url
from .api_views import NewslettersView, SubscriptionsView, SubscribeView
urlpatterns = patterns('',
urlpatterns = [
url(r'^newsletters/', NewslettersView.as_view(), name='newsletters'),
url(r'^subscriptions/', SubscriptionsView.as_view(), name='subscriptions'),
url(r'^subscribe/', SubscribeView.as_view(), name='subscribe'),
)
]

View File

@ -1,11 +1,11 @@
from django.conf.urls import patterns, include, url
from django.conf.urls import url
from .views import add_announce, edit_announce, delete_announce, \
add_category, edit_category, view_category, delete_category, manage, \
subscriptions_import, view_announce, email_announce, sms_announce, \
menu_json, subscription_delete, subscription_search
urlpatterns = patterns('',
urlpatterns = [
url(r'^$', manage, name='manage'),
url(r'^category/(?P<slug>[\w-]+)/announce/$', add_announce,
name='add_announce'),
@ -34,4 +34,4 @@ urlpatterns = patterns('',
url(r'^subscriptions/search$', subscription_search,
name='subscription-search'),
url(r'^menu.json$', menu_json),
)
]

View File

@ -80,7 +80,7 @@ USE_L10N = True
USE_TZ = True
STATICFILES_FINDERS = global_settings.STATICFILES_FINDERS + ('gadjo.finders.XStaticFinder',)
STATICFILES_FINDERS = tuple(global_settings.STATICFILES_FINDERS) + ('gadjo.finders.XStaticFinder',)
# Templates
TEMPLATES = [
@ -148,6 +148,7 @@ except ImportError:
mellon = None
if mellon is not None:
INSTALLED_APPS += ('mellon',)
AUTHENTICATION_BACKENDS = (
'mellon.backends.SAMLBackend',
'django.contrib.auth.backends.ModelBackend',

View File

@ -1,5 +1,5 @@
from django.conf import settings
from django.conf.urls import patterns, include, url
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin
@ -15,7 +15,8 @@ from api_urls import urlpatterns as api_urls
import ckeditor.views as ckeditor_views
urlpatterns = patterns('',
urlpatterns = [
url(r'^$', homepage, name='home'),
url(r'^atom$', atom, name='atom'),
url(r'^manage/', decorated_includes(manager_required,
@ -32,10 +33,10 @@ urlpatterns = patterns('',
name='ckeditor_upload'),
url(r'^ckeditor/browse/', never_cache(staff_member_required(ckeditor_views.browse)),
name='ckeditor_browse'),
)
]
if 'mellon' in settings.INSTALLED_APPS:
urlpatterns += patterns('', url(r'^accounts/mellon/', include('mellon.urls')))
urlpatterns.append(url(r'^accounts/mellon/', include('mellon.urls')))
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()

View File

@ -25,7 +25,7 @@ from emails.django import Message
from lxml import etree
from django.conf import settings
from django.template import loader, Context
from django.template import loader
from django.utils.translation import activate
from django.core.files.storage import DefaultStorage
from django.core.urlresolvers import reverse
@ -46,8 +46,7 @@ def send_email(title, content, destinations, category_id):
template = loader.get_template('corbo/announce.html')
message = Message(subject=title, mail_from=settings.DEFAULT_FROM_EMAIL,
html=template.render(
Context({'content': content,
'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER})))
{'content': content, 'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER}))
# perform transformations in message html, like inline css parsing
message.transformer.apply_to_images(func=transform_image_src)

View File

@ -72,7 +72,7 @@ class AnnounceCreateView(CreateView):
def get_context_data(self, **kwargs):
context = super(AnnounceCreateView, self).get_context_data(**kwargs)
context['category'] = kwargs['form'].initial['category']
context['category'] = context['form'].initial['category']
return context
@ -85,7 +85,7 @@ class AnnounceEditView(UpdateView):
def get_context_data(self, **kwargs):
context = super(AnnounceEditView, self).get_context_data(**kwargs)
category_id = kwargs['form'].initial['category']
category_id = context['form'].initial['category']
context['category'] = models.Category.objects.get(pk=category_id)
return context

View File

@ -1,4 +1,4 @@
Django>1.7, <1.9
Django>1.7, <1.12
django-ckeditor<4.5.3
djangorestframework>=3.3,<3.4
html2text

View File

@ -93,9 +93,9 @@ setup(
'Programming Language :: Python',
'Programming Language :: Python :: 2',
],
install_requires=['django>1.7, <1.9',
install_requires=['django>1.7, <1.12',
'django-ckeditor<4.5.3',
'djangorestframework>=3.3,<3.4',
'djangorestframework>=3.3,<3.7',
'html2text',
'gadjo',
'emails',

View File

@ -1,2 +1,2 @@
# Add corbo hobo agent
INSTALLED_APPS = ('corbo.hobo_agent', ) + INSTALLED_APPS
INSTALLED_APPS = ('corbo.hobo_agent', 'hobo.agent.common') + INSTALLED_APPS

View File

@ -21,7 +21,7 @@ def admin_user():
return user
def login(app, username='admin', password='admin'):
login_page = app.get('/login/')
login_page = app.get(reverse('auth_login'))
login_form = login_page.forms[0]
login_form['username'] = username
login_form['password'] = password
@ -31,18 +31,18 @@ def login(app, username='admin', password='admin'):
def test_unlogged_access(app):
# connect while not being logged in
assert app.get('/', status=302).location == 'http://testserver/manage/'
assert app.get('/manage/', status=302).location == 'http://testserver/login/?next=/manage/'
assert app.get('/', status=302).location.endswith(reverse('manage'))
assert app.get('/manage/', status=302).location.endswith(reverse('auth_login') + '?next=/manage/')
def test_access(app, admin_user):
app = login(app)
resp = app.get('/manage/', status=200)
resp = app.get(reverse('manage'), status=200)
assert 'New category' in resp.body
def test_logout(app, admin_user):
app = login(app)
app.get('/logout/')
assert app.get('/', status=302).location == 'http://testserver/manage/'
app.get(reverse('auth_logout'))
assert app.get('/', status=302).location.endswith(reverse('manage'))
def test_create_category(app, admin_user):
app = login(app)
@ -53,21 +53,21 @@ def test_create_category(app, admin_user):
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
resp = app.get('http://testserver/manage/')
assert resp.location.endswith(reverse('manage'))
resp = resp.follow()
assert 'Alerts' in resp.content
def test_edit_category(app, admin_user):
app = login(app)
resp = app.get('/manage/')
resp = app.get(reverse('manage'))
assert 'New category' in resp.content
category_page = resp.click('New category')
category_form = category_page.forms[0]
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
resp = app.get('http://testserver/manage/')
assert resp.location.endswith(reverse('manage'))
resp = app.get(reverse('manage'))
assert 'Alerts' in resp.content
assert '0 announces' in resp.content
assert '0 subscriptions' in resp.content
@ -78,19 +78,19 @@ def test_edit_category(app, admin_user):
edit_form['name'] = 'New Alerts'
resp = edit_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
def test_delete_category(app, admin_user):
app = login(app)
resp = app.get('/manage/')
resp = app.get(reverse('manage'))
assert 'New category' in resp.content
category_page = resp.click('New category')
category_form = category_page.forms[0]
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
resp = app.get('http://testserver/manage/')
assert resp.location.endswith(reverse('manage'))
resp = app.get(reverse('manage'))
assert 'Alerts' in resp.content
assert '0 announces' in resp.content
assert '0 subscriptions' in resp.content
@ -100,7 +100,7 @@ def test_delete_category(app, admin_user):
delete_form = delete_page.forms[0]
resp = delete_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
assert resp.location.endswith(reverse('manage'))
def test_create_announce(app, admin_user):
app = login(app)
@ -111,8 +111,8 @@ def test_create_announce(app, admin_user):
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
resp = app.get('http://testserver/manage/')
assert resp.location.endswith(reverse('manage'))
resp = app.get(reverse('manage'))
assert 'Alerts' in resp.content
resp = resp.click('Alerts')
assert 'New announce' in resp.content
@ -122,8 +122,9 @@ def test_create_announce(app, admin_user):
announce_form['text'] = 'announce content'
resp = announce_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
resp = app.get('http://testserver/manage/category/alerts/')
category_url = reverse('view_category', kwargs={'slug': 'alerts'})
assert resp.location.endswith(category_url)
resp = resp.follow()
assert 'First announce' in resp.content
def test_edit_announce(app, admin_user):
@ -135,7 +136,7 @@ def test_edit_announce(app, admin_user):
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
assert resp.location.endswith(reverse('manage'))
resp = app.get(resp.location)
resp = resp.click('Alerts')
assert 'New announce' in resp.content
@ -145,8 +146,8 @@ def test_edit_announce(app, admin_user):
announce_form['text'] = 'announce content'
resp = announce_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
resp = app.get(resp.location)
assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
resp = resp.follow()
assert 'First announce' in resp.content
announce_page = resp.click('First announce')
assert 'First announce' in announce_page.content
@ -159,7 +160,7 @@ def test_edit_announce(app, admin_user):
edit_form['expiration_time'] = '2017-12-31 23:00:00'
resp = edit_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/announce/1/'
assert resp.location.endswith(reverse('view_announce', kwargs={'pk': 1}))
# simulate announce deliver
broadcast = Broadcast.objects.get(announce__pk=1)
@ -191,8 +192,8 @@ def test_delete_announce(app, admin_user):
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
resp = app.get('http://testserver/manage/')
assert resp.location.endswith(reverse('manage'))
resp = app.get(reverse('manage'))
resp = resp.click('Alerts')
assert 'New announce' in resp.content
announce_page = resp.click('New announce')
@ -201,8 +202,8 @@ def test_delete_announce(app, admin_user):
announce_form['text'] = 'announce content'
resp = announce_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
resp = app.get('http://testserver/manage/category/alerts/')
assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
resp = resp.follow()
assert 'First announce' in resp.content
resp = resp.click('First announce')
assert 'Delete' in resp.content
@ -211,7 +212,7 @@ def test_delete_announce(app, admin_user):
announce_delete_form = announce_delete_page.forms[0]
resp = announce_delete_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
def test_email_announce(app, admin_user):
app = login(app)
@ -222,8 +223,8 @@ def test_email_announce(app, admin_user):
category_form['name'] = 'Alerts'
resp = category_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/'
resp = app.get('http://testserver/manage/')
assert resp.location.endswith(reverse('manage'))
resp = resp.follow()
resp = resp.click('Alerts')
assert 'New announce' in resp.content
announce_page = resp.click('New announce')
@ -232,8 +233,8 @@ def test_email_announce(app, admin_user):
announce_form['text'] = 'announce content'
resp = announce_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
resp = app.get(resp.location)
assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
resp = resp.follow()
assert 'First announce' in resp.content
resp = resp.click('First announce')
assert 'Send test email' in resp.content
@ -247,7 +248,7 @@ def test_email_announce(app, admin_user):
assert 'Cancel' in resp.content
resp = send_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/announce/1/'
assert resp.location.endswith(reverse('view_announce', kwargs={'pk': '1'}))
@mock.patch('corbo.utils.requests.post')
def test_sms_announce(mocked_post, app, admin_user, settings):
@ -293,7 +294,7 @@ def test_sms_announce(mocked_post, app, admin_user, settings):
session = app.session
session['mellon_session'] = {'mobile': ['00000000']}
session.save()
app.set_cookie(settings.SESSION_COOKIE_NAME, session.session_key)
app.set_cookie(str(settings.SESSION_COOKIE_NAME), str(session.session_key))
resp = resp.click('First announce')
resp = resp.click('Send test SMS')
send_form = resp.forms[0]
@ -337,7 +338,7 @@ def test_sms_announce_with_invalid_gateway_url(app, admin_user, settings, caplog
announce_form['text'] = 'announce content'
resp = announce_form.submit()
assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/'
assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
resp = resp.follow()
assert 'First announce' in resp.content
settings.SMS_GATEWAY_URL='invalid_url'

View File

@ -1,7 +1,6 @@
import pytest
from webtest import TestApp, Upload
from webtest import Upload
from django.core.wsgi import get_wsgi_application
from django.utils.text import slugify
from django.core.urlresolvers import reverse
from django.contrib.auth import get_user_model
@ -42,8 +41,8 @@ def login(app, username='admin', password='password'):
assert resp.status_int == 302
return app
def test_subscribe_from_csv(admin, categories):
app = login(TestApp(get_wsgi_application()))
def test_subscribe_from_csv(app, admin, categories):
app = login(app)
for c in categories:
page = app.get(reverse('subscriptions-import', kwargs={'slug': c.slug}))
form = page.form
@ -52,8 +51,8 @@ def test_subscribe_from_csv(admin, categories):
assert res.status_code == 302
assert Subscription.objects.filter(category=c).count() == len(CSV_CONTENT.splitlines())
def test_subscribe_from_csv_with_empty_lines(admin, categories):
app = login(TestApp(get_wsgi_application()))
def test_subscribe_from_csv_with_empty_lines(app, admin, categories):
app = login(app)
content = CSV_CONTENT + '\n\n\n'
for c in categories:
page = app.get(reverse('subscriptions-import', kwargs={'slug': c.slug}))
@ -63,8 +62,8 @@ def test_subscribe_from_csv_with_empty_lines(admin, categories):
assert res.status_code == 302
assert Subscription.objects.filter(category=c).count() == len(CSV_CONTENT.splitlines())
def test_subscribe_with_invalid_email(admin, categories):
app = login(TestApp(get_wsgi_application()))
def test_subscribe_with_invalid_email(app, admin, categories):
app = login(app)
content = CSV_CONTENT + '\nwrong, Wrong user,'
for category in categories:
page = app.get(reverse('subscriptions-import', kwargs={'slug': category.slug}))

View File

@ -1,5 +1,5 @@
[tox]
envlist = coverage-django18
envlist = coverage-django18,coverage-django111
[testenv]
usedevelop =
@ -10,13 +10,14 @@ setenv =
coverage: COVERAGE=--junitxml=test_results.xml --cov-report xml --cov=corbo/ --cov-config .coveragerc
deps =
django18: django>=1.8,<1.9
django111: django>=1.11,<1.12
http://git.entrouvert.org/hobo.git/snapshot/hobo-master.tar.gz
pytest-cov
pytest-django>=3.1.1
pytest>=3.0.4
django-webtest<1.9.3
django-ckeditor<4.5.3
djangorestframework>=3.3,<3.4
djangorestframework>=3.3,<3.7
pylint==1.4.0
astroid==1.3.2
mock