add support of Django 1.11 (#19614)
This commit is contained in:
parent
b71bff0cab
commit
4cd434e631
|
@ -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'),
|
||||
)
|
||||
]
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
]
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
4
setup.py
4
setup.py
|
@ -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',
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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}))
|
||||
|
|
5
tox.ini
5
tox.ini
|
@ -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
|
||||
|
|
Reference in New Issue