Projet

Général

Profil

« Précédent | Suivant » 

Révision 4cd434e6

Ajouté par Serghei Mihai (congés, retour 15/05) il y a plus de 5 ans

add support of Django 1.11 (#19614)

Voir les différences:

corbo/api_urls.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from django.conf.urls import patterns, url
17
from django.conf.urls import url
18 18

  
19 19
from .api_views import NewslettersView, SubscriptionsView, SubscribeView
20 20

  
21 21

  
22
urlpatterns = patterns('',
22
urlpatterns = [
23 23
            url(r'^newsletters/', NewslettersView.as_view(), name='newsletters'),
24 24
            url(r'^subscriptions/', SubscriptionsView.as_view(), name='subscriptions'),
25 25
            url(r'^subscribe/', SubscribeView.as_view(), name='subscribe'),
26
)
26
]
corbo/manage_urls.py
1
from django.conf.urls import patterns, include, url
1
from django.conf.urls import url
2 2

  
3 3
from .views import add_announce, edit_announce, delete_announce, \
4 4
    add_category, edit_category, view_category, delete_category, manage, \
5 5
    subscriptions_import, view_announce, email_announce, sms_announce, \
6 6
    menu_json, subscription_delete, subscription_search
7 7

  
8
urlpatterns = patterns('',
8
urlpatterns = [
9 9
            url(r'^$', manage, name='manage'),
10 10
            url(r'^category/(?P<slug>[\w-]+)/announce/$', add_announce,
11 11
                name='add_announce'),
......
34 34
            url(r'^subscriptions/search$', subscription_search,
35 35
                name='subscription-search'),
36 36
            url(r'^menu.json$', menu_json),
37
)
37
]
corbo/settings.py
80 80

  
81 81
USE_TZ = True
82 82

  
83
STATICFILES_FINDERS = global_settings.STATICFILES_FINDERS + ('gadjo.finders.XStaticFinder',)
83
STATICFILES_FINDERS = tuple(global_settings.STATICFILES_FINDERS) + ('gadjo.finders.XStaticFinder',)
84 84

  
85 85
# Templates
86 86
TEMPLATES = [
......
148 148
    mellon = None
149 149

  
150 150
if mellon is not None:
151
    INSTALLED_APPS += ('mellon',)
151 152
    AUTHENTICATION_BACKENDS = (
152 153
        'mellon.backends.SAMLBackend',
153 154
        'django.contrib.auth.backends.ModelBackend',
corbo/urls.py
1 1
from django.conf import settings
2
from django.conf.urls import patterns, include, url
2
from django.conf.urls import include, url
3 3
from django.conf.urls.static import static
4 4
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
5 5
from django.contrib import admin
......
15 15

  
16 16
import ckeditor.views as ckeditor_views
17 17

  
18
urlpatterns = patterns('',
18

  
19
urlpatterns = [
19 20
    url(r'^$', homepage, name='home'),
20 21
    url(r'^atom$', atom, name='atom'),
21 22
    url(r'^manage/', decorated_includes(manager_required,
......
32 33
        name='ckeditor_upload'),
33 34
    url(r'^ckeditor/browse/', never_cache(staff_member_required(ckeditor_views.browse)),
34 35
         name='ckeditor_browse'),
35
)
36
]
36 37

  
37 38
if 'mellon' in settings.INSTALLED_APPS:
38
    urlpatterns += patterns('', url(r'^accounts/mellon/', include('mellon.urls')))
39
    urlpatterns.append(url(r'^accounts/mellon/', include('mellon.urls')))
39 40

  
40 41
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
41 42
urlpatterns += staticfiles_urlpatterns()
corbo/utils.py
25 25
from lxml import etree
26 26

  
27 27
from django.conf import settings
28
from django.template import loader, Context
28
from django.template import loader
29 29
from django.utils.translation import activate
30 30
from django.core.files.storage import DefaultStorage
31 31
from django.core.urlresolvers import reverse
......
46 46
    template = loader.get_template('corbo/announce.html')
47 47
    message = Message(subject=title, mail_from=settings.DEFAULT_FROM_EMAIL,
48 48
            html=template.render(
49
            Context({'content': content,
50
            'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER})))
49
            {'content': content, 'unsubscribe_link_placeholder': UNSUBSCRIBE_LINK_PLACEHOLDER}))
51 50

  
52 51
    # perform transformations in message html, like inline css parsing
53 52
    message.transformer.apply_to_images(func=transform_image_src)
corbo/views.py
72 72

  
73 73
    def get_context_data(self, **kwargs):
74 74
        context = super(AnnounceCreateView, self).get_context_data(**kwargs)
75
        context['category'] = kwargs['form'].initial['category']
75
        context['category'] = context['form'].initial['category']
76 76
        return context
77 77

  
78 78

  
......
85 85

  
86 86
    def get_context_data(self, **kwargs):
87 87
        context = super(AnnounceEditView, self).get_context_data(**kwargs)
88
        category_id = kwargs['form'].initial['category']
88
        category_id = context['form'].initial['category']
89 89
        context['category'] = models.Category.objects.get(pk=category_id)
90 90
        return context
91 91

  
requirements.txt
1
Django>1.7, <1.9
1
Django>1.7, <1.12
2 2
django-ckeditor<4.5.3
3 3
djangorestframework>=3.3,<3.4
4 4
html2text
setup.py
93 93
        'Programming Language :: Python',
94 94
        'Programming Language :: Python :: 2',
95 95
    ],
96
    install_requires=['django>1.7, <1.9',
96
    install_requires=['django>1.7, <1.12',
97 97
        'django-ckeditor<4.5.3',
98
        'djangorestframework>=3.3,<3.4',
98
        'djangorestframework>=3.3,<3.7',
99 99
        'html2text',
100 100
        'gadjo',
101 101
        'emails',
tests/settings.py
1 1
# Add corbo hobo agent
2
INSTALLED_APPS = ('corbo.hobo_agent', ) + INSTALLED_APPS
2
INSTALLED_APPS = ('corbo.hobo_agent', 'hobo.agent.common') + INSTALLED_APPS
tests/test_manager.py
21 21
    return user
22 22

  
23 23
def login(app, username='admin', password='admin'):
24
    login_page = app.get('/login/')
24
    login_page = app.get(reverse('auth_login'))
25 25
    login_form = login_page.forms[0]
26 26
    login_form['username'] = username
27 27
    login_form['password'] = password
......
31 31

  
32 32
def test_unlogged_access(app):
33 33
    # connect while not being logged in
34
    assert app.get('/', status=302).location == 'http://testserver/manage/'
35
    assert app.get('/manage/', status=302).location == 'http://testserver/login/?next=/manage/'
34
    assert app.get('/', status=302).location.endswith(reverse('manage'))
35
    assert app.get('/manage/', status=302).location.endswith(reverse('auth_login') + '?next=/manage/')
36 36

  
37 37
def test_access(app, admin_user):
38 38
    app = login(app)
39
    resp = app.get('/manage/', status=200)
39
    resp = app.get(reverse('manage'), status=200)
40 40
    assert 'New category' in resp.body
41 41

  
42 42
def test_logout(app, admin_user):
43 43
    app = login(app)
44
    app.get('/logout/')
45
    assert app.get('/', status=302).location == 'http://testserver/manage/'
44
    app.get(reverse('auth_logout'))
45
    assert app.get('/', status=302).location.endswith(reverse('manage'))
46 46

  
47 47
def test_create_category(app, admin_user):
48 48
    app = login(app)
......
53 53
    category_form['name'] = 'Alerts'
54 54
    resp = category_form.submit()
55 55
    assert resp.status_int == 302
56
    assert resp.location == 'http://testserver/manage/'
57
    resp = app.get('http://testserver/manage/')
56
    assert resp.location.endswith(reverse('manage'))
57
    resp = resp.follow()
58 58
    assert 'Alerts' in resp.content
59 59

  
60 60
def test_edit_category(app, admin_user):
61 61
    app = login(app)
62
    resp = app.get('/manage/')
62
    resp = app.get(reverse('manage'))
63 63
    assert 'New category' in resp.content
64 64
    category_page = resp.click('New category')
65 65
    category_form = category_page.forms[0]
66 66
    category_form['name'] = 'Alerts'
67 67
    resp = category_form.submit()
68 68
    assert resp.status_int == 302
69
    assert resp.location == 'http://testserver/manage/'
70
    resp = app.get('http://testserver/manage/')
69
    assert resp.location.endswith(reverse('manage'))
70
    resp = app.get(reverse('manage'))
71 71
    assert 'Alerts' in resp.content
72 72
    assert '0 announces' in resp.content
73 73
    assert '0 subscriptions' in resp.content
......
78 78
    edit_form['name'] = 'New Alerts'
79 79
    resp = edit_form.submit()
80 80
    assert resp.status_int == 302
81
    assert resp.location == 'http://testserver/manage/category/alerts/'
81
    assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
82 82

  
83 83
def test_delete_category(app, admin_user):
84 84
    app = login(app)
85
    resp = app.get('/manage/')
85
    resp = app.get(reverse('manage'))
86 86
    assert 'New category' in resp.content
87 87
    category_page = resp.click('New category')
88 88
    category_form = category_page.forms[0]
89 89
    category_form['name'] = 'Alerts'
90 90
    resp = category_form.submit()
91 91
    assert resp.status_int == 302
92
    assert resp.location == 'http://testserver/manage/'
93
    resp = app.get('http://testserver/manage/')
92
    assert resp.location.endswith(reverse('manage'))
93
    resp = app.get(reverse('manage'))
94 94
    assert 'Alerts' in resp.content
95 95
    assert '0 announces' in resp.content
96 96
    assert '0 subscriptions' in resp.content
......
100 100
    delete_form = delete_page.forms[0]
101 101
    resp = delete_form.submit()
102 102
    assert resp.status_int == 302
103
    assert resp.location == 'http://testserver/manage/'
103
    assert resp.location.endswith(reverse('manage'))
104 104

  
105 105
def test_create_announce(app, admin_user):
106 106
    app = login(app)
......
111 111
    category_form['name'] = 'Alerts'
112 112
    resp = category_form.submit()
113 113
    assert resp.status_int == 302
114
    assert resp.location == 'http://testserver/manage/'
115
    resp = app.get('http://testserver/manage/')
114
    assert resp.location.endswith(reverse('manage'))
115
    resp = app.get(reverse('manage'))
116 116
    assert 'Alerts' in resp.content
117 117
    resp = resp.click('Alerts')
118 118
    assert 'New announce' in resp.content
......
122 122
    announce_form['text'] = 'announce content'
123 123
    resp = announce_form.submit()
124 124
    assert resp.status_int == 302
125
    assert resp.location == 'http://testserver/manage/category/alerts/'
126
    resp = app.get('http://testserver/manage/category/alerts/')
125
    category_url = reverse('view_category', kwargs={'slug': 'alerts'})
126
    assert resp.location.endswith(category_url)
127
    resp = resp.follow()
127 128
    assert 'First announce' in resp.content
128 129

  
129 130
def test_edit_announce(app, admin_user):
......
135 136
    category_form['name'] = 'Alerts'
136 137
    resp = category_form.submit()
137 138
    assert resp.status_int == 302
138
    assert resp.location == 'http://testserver/manage/'
139
    assert resp.location.endswith(reverse('manage'))
139 140
    resp = app.get(resp.location)
140 141
    resp = resp.click('Alerts')
141 142
    assert 'New announce' in resp.content
......
145 146
    announce_form['text'] = 'announce content'
146 147
    resp = announce_form.submit()
147 148
    assert resp.status_int == 302
148
    assert resp.location == 'http://testserver/manage/category/alerts/'
149
    resp = app.get(resp.location)
149
    assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
150
    resp = resp.follow()
150 151
    assert 'First announce' in resp.content
151 152
    announce_page = resp.click('First announce')
152 153
    assert 'First announce' in announce_page.content
......
159 160
    edit_form['expiration_time'] = '2017-12-31 23:00:00'
160 161
    resp = edit_form.submit()
161 162
    assert resp.status_int == 302
162
    assert resp.location == 'http://testserver/manage/announce/1/'
163
    assert resp.location.endswith(reverse('view_announce', kwargs={'pk': 1}))
163 164

  
164 165
    # simulate announce deliver
165 166
    broadcast = Broadcast.objects.get(announce__pk=1)
......
191 192
    category_form['name'] = 'Alerts'
192 193
    resp = category_form.submit()
193 194
    assert resp.status_int == 302
194
    assert resp.location == 'http://testserver/manage/'
195
    resp = app.get('http://testserver/manage/')
195
    assert resp.location.endswith(reverse('manage'))
196
    resp = app.get(reverse('manage'))
196 197
    resp = resp.click('Alerts')
197 198
    assert 'New announce' in resp.content
198 199
    announce_page = resp.click('New announce')
......
201 202
    announce_form['text'] = 'announce content'
202 203
    resp = announce_form.submit()
203 204
    assert resp.status_int == 302
204
    assert resp.location == 'http://testserver/manage/category/alerts/'
205
    resp = app.get('http://testserver/manage/category/alerts/')
205
    assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
206
    resp = resp.follow()
206 207
    assert 'First announce' in resp.content
207 208
    resp = resp.click('First announce')
208 209
    assert 'Delete' in resp.content
......
211 212
    announce_delete_form = announce_delete_page.forms[0]
212 213
    resp = announce_delete_form.submit()
213 214
    assert resp.status_int == 302
214
    assert resp.location == 'http://testserver/manage/category/alerts/'
215
    assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
215 216

  
216 217
def test_email_announce(app, admin_user):
217 218
    app = login(app)
......
222 223
    category_form['name'] = 'Alerts'
223 224
    resp = category_form.submit()
224 225
    assert resp.status_int == 302
225
    assert resp.location == 'http://testserver/manage/'
226
    resp = app.get('http://testserver/manage/')
226
    assert resp.location.endswith(reverse('manage'))
227
    resp = resp.follow()
227 228
    resp = resp.click('Alerts')
228 229
    assert 'New announce' in resp.content
229 230
    announce_page = resp.click('New announce')
......
232 233
    announce_form['text'] = 'announce content'
233 234
    resp = announce_form.submit()
234 235
    assert resp.status_int == 302
235
    assert resp.location == 'http://testserver/manage/category/alerts/'
236
    resp = app.get(resp.location)
236
    assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
237
    resp = resp.follow()
237 238
    assert 'First announce' in resp.content
238 239
    resp = resp.click('First announce')
239 240
    assert 'Send test email' in resp.content
......
247 248
    assert 'Cancel' in resp.content
248 249
    resp = send_form.submit()
249 250
    assert resp.status_int == 302
250
    assert resp.location == 'http://testserver/manage/announce/1/'
251
    assert resp.location.endswith(reverse('view_announce', kwargs={'pk': '1'}))
251 252

  
252 253
@mock.patch('corbo.utils.requests.post')
253 254
def test_sms_announce(mocked_post, app, admin_user, settings):
......
293 294
    session = app.session
294 295
    session['mellon_session'] = {'mobile': ['00000000']}
295 296
    session.save()
296
    app.set_cookie(settings.SESSION_COOKIE_NAME, session.session_key)
297
    app.set_cookie(str(settings.SESSION_COOKIE_NAME), str(session.session_key))
297 298
    resp = resp.click('First announce')
298 299
    resp = resp.click('Send test SMS')
299 300
    send_form = resp.forms[0]
......
337 338
    announce_form['text'] = 'announce content'
338 339
    resp = announce_form.submit()
339 340
    assert resp.status_int == 302
340
    assert resp.location == 'http://testserver/manage/category/alerts/'
341
    assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'}))
341 342
    resp = resp.follow()
342 343
    assert 'First announce' in resp.content
343 344
    settings.SMS_GATEWAY_URL='invalid_url'
tests/test_subscribers.py
1 1
import pytest
2
from webtest import TestApp, Upload
2
from webtest import Upload
3 3

  
4
from django.core.wsgi import get_wsgi_application
5 4
from django.utils.text import slugify
6 5
from django.core.urlresolvers import reverse
7 6
from django.contrib.auth import get_user_model
......
42 41
    assert resp.status_int == 302
43 42
    return app
44 43

  
45
def test_subscribe_from_csv(admin, categories):
46
    app = login(TestApp(get_wsgi_application()))
44
def test_subscribe_from_csv(app, admin, categories):
45
    app = login(app)
47 46
    for c in categories:
48 47
        page = app.get(reverse('subscriptions-import', kwargs={'slug': c.slug}))
49 48
        form = page.form
......
52 51
        assert res.status_code == 302
53 52
        assert Subscription.objects.filter(category=c).count() == len(CSV_CONTENT.splitlines())
54 53

  
55
def test_subscribe_from_csv_with_empty_lines(admin, categories):
56
    app = login(TestApp(get_wsgi_application()))
54
def test_subscribe_from_csv_with_empty_lines(app, admin, categories):
55
    app = login(app)
57 56
    content = CSV_CONTENT + '\n\n\n'
58 57
    for c in categories:
59 58
        page = app.get(reverse('subscriptions-import', kwargs={'slug': c.slug}))
......
63 62
        assert res.status_code == 302
64 63
        assert Subscription.objects.filter(category=c).count() == len(CSV_CONTENT.splitlines())
65 64

  
66
def test_subscribe_with_invalid_email(admin, categories):
67
    app = login(TestApp(get_wsgi_application()))
65
def test_subscribe_with_invalid_email(app, admin, categories):
66
    app = login(app)
68 67
    content = CSV_CONTENT + '\nwrong, Wrong user,'
69 68
    for category in categories:
70 69
        page = app.get(reverse('subscriptions-import', kwargs={'slug': category.slug}))
tox.ini
1 1
[tox]
2
envlist = coverage-django18
2
envlist = coverage-django18,coverage-django111
3 3

  
4 4
[testenv]
5 5
usedevelop =
......
10 10
  coverage: COVERAGE=--junitxml=test_results.xml --cov-report xml --cov=corbo/ --cov-config .coveragerc
11 11
deps =
12 12
  django18: django>=1.8,<1.9
13
  django111: django>=1.11,<1.12
13 14
  http://git.entrouvert.org/hobo.git/snapshot/hobo-master.tar.gz
14 15
  pytest-cov
15 16
  pytest-django>=3.1.1
16 17
  pytest>=3.0.4
17 18
  django-webtest<1.9.3
18 19
  django-ckeditor<4.5.3
19
  djangorestframework>=3.3,<3.4
20
  djangorestframework>=3.3,<3.7
20 21
  pylint==1.4.0
21 22
  astroid==1.3.2
22 23
  mock

Formats disponibles : Unified diff