Skip to content

Commit c480efe

Browse files
committed
django 1.8, 1.11, 2.0
1 parent 68dcd79 commit c480efe

File tree

27 files changed

+168
-101
lines changed

27 files changed

+168
-101
lines changed

.travis.yml

+19-10
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,28 @@ python:
44
- "3.4"
55
- "3.5"
66
env:
7-
- DJANGO="Django>=1.8,<1.9" DB=sqlite DJANGO_LTS=true
8-
- DJANGO="Django>=1.8,<1.9" DB=postgres DJANGO_LTS=true
9-
- DJANGO="Django>=1.8,<1.9" DB=mysql DJANGO_LTS=true
10-
- DJANGO="Django>=1.9,<1.10" DB=sqlite
11-
- DJANGO="Django>=1.9,<1.10" DB=postgres
12-
- DJANGO="Django>=1.9,<1.10" DB=mysql
13-
- DJANGO="Django>=1.10,<1.11" DB=sqlite
14-
- DJANGO="Django>=1.10,<1.11" DB=postgres
15-
- DJANGO="Django>=1.10,<1.11" DB=mysql
7+
- DJANGO="Django>=1.8,<1.9" DB=sqlite
8+
- DJANGO="Django>=1.8,<1.9" DB=postgres
9+
- DJANGO="Django>=1.8,<1.9" DB=mysql
10+
- DJANGO="Django>=1.11,<2.0" DB=sqlite DJANGO_LTS=true
11+
- DJANGO="Django>=1.11,<2.0" DB=postgres DJANGO_LTS=true
12+
- DJANGO="Django>=1.11,<2.0" DB=mysql DJANGO_LTS=true
13+
- DJANGO="Django>=2.0,<2.1" DB=sqlite
14+
- DJANGO="Django>=2.0,<2.1" DB=postgres
15+
- DJANGO="Django>=2.0,<2.1" DB=mysql
16+
matrix:
17+
exclude:
18+
- python: "2.7"
19+
env: DJANGO="Django>=2.0,<2.1" DB=sqlite
20+
- python: "2.7"
21+
env: DJANGO="Django>=2.0,<2.1" DB=postgres
22+
- python: "2.7"
23+
env: DJANGO="Django>=2.0,<2.1" DB=mysql
1624
install:
1725
- if [[ $DB == mysql ]]; then pip install -qU mysqlclient; fi
1826
- if [[ $DB == postgres ]]; then pip install -qU psycopg2; fi
1927
- pip install -qU $DJANGO
20-
- if [[ $DB == postgres && $TRAVIS_PYTHON_VERSION == '2.7' && $DJANGO_LTS == true ]] ; then export WITH_COVERALL=true ; fi
28+
- if [[ $DB == postgres && $TRAVIS_PYTHON_VERSION == '3.5' && $DJANGO_LTS == true ]] ; then export WITH_COVERALL=true ; fi
2129
- if [[ $WITH_COVERALL == true ]]; then pip install -qU coveralls ; fi
2230
- CFLAGS="-O0" pip install -qU -r test/test_project/requirements_test.txt
2331
before_script:
@@ -26,4 +34,5 @@ before_script:
2634
script:
2735
- if [[ $WITH_COVERALL == true ]]; then coverage run setup.py test; else python setup.py test ; fi
2836
after_success:
37+
2938
- if [[ $WITH_COVERALL == true ]]; then coveralls ; fi

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ Luke Petre
99
Filip Wasilewski ([email protected])
1010
Sergey Fursov <[email protected]>
1111
Dylann Cordel <[email protected]>
12+
Maksim Iakovlev <[email protected]>

pybb/admin.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
from copy import deepcopy
44
from django.utils.translation import ugettext_lazy as _
55
from django.contrib import admin
6-
from django.core.urlresolvers import reverse
6+
try:
7+
from django.core.urlresolvers import reverse
8+
except ImportError:
9+
from django.urls import reverse
710

811
from pybb import permissions
912
from pybb.models import Category, Forum, Topic, Post, Profile, Attachment, PollAnswer

pybb/compat.py

+16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# coding=utf-8
22
from __future__ import unicode_literals
3+
4+
import django
35
from django.conf import settings
46
from django.utils.encoding import force_text
57
from unidecode import unidecode
@@ -115,3 +117,17 @@ def slugify(text):
115117
from django.utils.text import slugify as django_slugify
116118

117119
return django_slugify(force_text(unidecode(text)))
120+
121+
122+
def is_authenticated(user):
123+
if django.VERSION > (1, 9):
124+
return user.is_authenticated
125+
126+
return user.is_authenticated()
127+
128+
129+
def is_anonymous(user):
130+
if django.VERSION > (1, 9):
131+
return user.is_anonymous
132+
133+
return user.is_anonymous()

pybb/feeds.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
from __future__ import unicode_literals
44
from django.contrib.syndication.views import Feed
5-
from django.core.urlresolvers import reverse
5+
try:
6+
from django.core.urlresolvers import reverse
7+
except ImportError:
8+
from django.urls import reverse
69
from django.utils.feedgenerator import Atom1Feed
710
from django.utils.translation import ugettext_lazy as _
811

pybb/forms.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import re
55
import inspect
66

7+
import django
78
from django import forms
89
from django.core.exceptions import FieldError, PermissionDenied
910
from django.forms.models import inlineformset_factory, BaseInlineFormSet
@@ -468,4 +469,7 @@ def process(self, target_user):
468469
checked_forums = [forum for queryset in cleaned_forums for forum in queryset]
469470
# keep all the forums, the request user does't have the permisssion to change
470471
untouchable_forums = [forum for forum in initial_forum_set if forum.pk not in self.authorized_forums]
471-
target_user.forum_set = checked_forums + untouchable_forums
472+
if django.VERSION < (1, 9):
473+
target_user.forum_set = checked_forums + untouchable_forums
474+
else:
475+
target_user.forum_set.set(checked_forums + untouchable_forums)

pybb/middleware.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.utils import translation
77
from django.db.models import ObjectDoesNotExist
88
from pybb import util
9-
9+
from pybb.compat import is_authenticated
1010

1111
if django.VERSION < (1, 10): # pragma: no cover
1212
MiddlewareParentClass = object
@@ -17,7 +17,7 @@
1717

1818
class PybbMiddleware(MiddlewareParentClass):
1919
def process_request(self, request):
20-
if request.user.is_authenticated():
20+
if is_authenticated(request.user):
2121
try:
2222
# Here we try to load profile, but can get error
2323
# if user created during syncdb but profile model

pybb/migrations/0001_initial.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ class Migration(migrations.Migration):
5555
('topic_count', models.IntegerField(default=0, verbose_name='Topic count', blank=True)),
5656
('hidden', models.BooleanField(default=False, verbose_name='Hidden')),
5757
('headline', models.TextField(null=True, verbose_name='Headline', blank=True)),
58-
('category', models.ForeignKey(related_name='forums', verbose_name='Category', to='pybb.Category')),
58+
('category', models.ForeignKey(related_name='forums', on_delete=models.CASCADE, verbose_name='Category', to='pybb.Category')),
5959
('moderators', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Moderators', blank=True)),
60-
('parent', models.ForeignKey(related_name='child_forums', verbose_name='Parent forum', blank=True, to='pybb.Forum', null=True)),
60+
('parent', models.ForeignKey(related_name='child_forums', on_delete=models.CASCADE, verbose_name='Parent forum', blank=True, to='pybb.Forum', null=True)),
6161
],
6262
options={
6363
'ordering': ['position'],
@@ -71,8 +71,8 @@ class Migration(migrations.Migration):
7171
fields=[
7272
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
7373
('time_stamp', models.DateTimeField(auto_now=True)),
74-
('forum', models.ForeignKey(blank=True, to='pybb.Forum', null=True)),
75-
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
74+
('forum', models.ForeignKey(blank=True, on_delete=models.CASCADE, to='pybb.Forum', null=True)),
75+
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
7676
],
7777
options={
7878
'verbose_name': 'Forum read tracker',
@@ -97,8 +97,8 @@ class Migration(migrations.Migration):
9797
fields=[
9898
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
9999
('timestamp', models.DateTimeField(auto_now_add=True)),
100-
('poll_answer', models.ForeignKey(related_name='users', verbose_name='Poll answer', to='pybb.PollAnswer')),
101-
('user', models.ForeignKey(related_name='poll_answers', verbose_name='User', to=settings.AUTH_USER_MODEL)),
100+
('poll_answer', models.ForeignKey(related_name='users', on_delete=models.CASCADE, verbose_name='Poll answer', to='pybb.PollAnswer')),
101+
('user', models.ForeignKey(related_name='poll_answers', on_delete=models.CASCADE, verbose_name='User', to=settings.AUTH_USER_MODEL)),
102102
],
103103
options={
104104
'verbose_name': 'Poll answer user',
@@ -137,7 +137,7 @@ class Migration(migrations.Migration):
137137
('post_count', models.IntegerField(default=0, verbose_name='Post count', blank=True)),
138138
('avatar', get_image_field_class()(upload_to=pybb.util.FilePathGenerator(to=b'pybb/avatar'), null=True, verbose_name='Avatar', blank=True)),
139139
('autosubscribe', models.BooleanField(default=True, help_text='Automatically subscribe to topics that you answer', verbose_name='Automatically subscribe')),
140-
('user', annoying.fields.AutoOneToOneField(related_name='pybb_profile', verbose_name='User', to=settings.AUTH_USER_MODEL)),
140+
('user', annoying.fields.AutoOneToOneField(related_name='pybb_profile', on_delete=models.CASCADE, verbose_name='User', to=settings.AUTH_USER_MODEL)),
141141
],
142142
options={
143143
'verbose_name': 'Profile',
@@ -159,7 +159,7 @@ class Migration(migrations.Migration):
159159
('on_moderation', models.BooleanField(default=False, verbose_name='On moderation')),
160160
('poll_type', models.IntegerField(default=0, verbose_name='Poll type', choices=[(0, 'None'), (1, 'Single answer'), (2, 'Multiple answers')])),
161161
('poll_question', models.TextField(null=True, verbose_name='Poll question', blank=True)),
162-
('forum', models.ForeignKey(related_name='topics', verbose_name='Forum', to='pybb.Forum')),
162+
('forum', models.ForeignKey(related_name='topics', on_delete=models.CASCADE, verbose_name='Forum', to='pybb.Forum')),
163163
],
164164
options={
165165
'ordering': ['-created'],
@@ -173,8 +173,8 @@ class Migration(migrations.Migration):
173173
fields=[
174174
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
175175
('time_stamp', models.DateTimeField(auto_now=True)),
176-
('topic', models.ForeignKey(blank=True, to='pybb.Topic', null=True)),
177-
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
176+
('topic', models.ForeignKey(blank=True, on_delete=models.CASCADE, to='pybb.Topic', null=True)),
177+
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
178178
],
179179
options={
180180
'verbose_name': 'Topic read tracker',
@@ -201,19 +201,19 @@ class Migration(migrations.Migration):
201201
migrations.AddField(
202202
model_name='topic',
203203
name='user',
204-
field=models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL),
204+
field=models.ForeignKey(verbose_name='User', on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL),
205205
preserve_default=True,
206206
),
207207
migrations.AddField(
208208
model_name='post',
209209
name='topic',
210-
field=models.ForeignKey(related_name='posts', verbose_name='Topic', to='pybb.Topic'),
210+
field=models.ForeignKey(related_name='posts', on_delete=models.CASCADE, verbose_name='Topic', to='pybb.Topic'),
211211
preserve_default=True,
212212
),
213213
migrations.AddField(
214214
model_name='post',
215215
name='user',
216-
field=models.ForeignKey(related_name='posts', verbose_name='User', to=settings.AUTH_USER_MODEL),
216+
field=models.ForeignKey(related_name='posts', on_delete=models.CASCADE, verbose_name='User', to=settings.AUTH_USER_MODEL),
217217
preserve_default=True,
218218
),
219219
migrations.AlterUniqueTogether(
@@ -223,7 +223,7 @@ class Migration(migrations.Migration):
223223
migrations.AddField(
224224
model_name='pollanswer',
225225
name='topic',
226-
field=models.ForeignKey(related_name='poll_answers', verbose_name='Topic', to='pybb.Topic'),
226+
field=models.ForeignKey(related_name='poll_answers', on_delete=models.CASCADE, verbose_name='Topic', to='pybb.Topic'),
227227
preserve_default=True,
228228
),
229229
migrations.AlterUniqueTogether(
@@ -239,7 +239,7 @@ class Migration(migrations.Migration):
239239
migrations.AddField(
240240
model_name='attachment',
241241
name='post',
242-
field=models.ForeignKey(related_name='attachments', verbose_name='Post', to='pybb.Post'),
242+
field=models.ForeignKey(related_name='attachments', on_delete=models.CASCADE, verbose_name='Post', to='pybb.Post'),
243243
preserve_default=True,
244244
),
245245
]

pybb/migrations/0006_forum_subscriptions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Migration(migrations.Migration):
2525
'you won\'t be notified for the answers.',
2626
verbose_name='Subscription type', choices=[(1, 'be notified only when a new topic is added'), (2, 'be auto-subscribed to topics')])),
2727
('forum', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subscriptions+', verbose_name='Forum', to='pybb.Forum')),
28-
('user', models.ForeignKey(related_name='forum_subscriptions+', verbose_name='Subscriber', to=settings.AUTH_USER_MODEL)),
28+
('user', models.ForeignKey(related_name='forum_subscriptions+', on_delete=models.CASCADE, verbose_name='Subscriber', to=settings.AUTH_USER_MODEL)),
2929
],
3030
options={
3131
'verbose_name': 'Subscription to forum',

pybb/models.py

+22-17
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
from __future__ import unicode_literals
33

44
from django.core.exceptions import ValidationError
5-
from django.core.urlresolvers import reverse
5+
try:
6+
from django.core.urlresolvers import reverse
7+
except ImportError:
8+
from django.urls import reverse
69
from django.db import models, transaction, DatabaseError
710
from django.utils.encoding import python_2_unicode_compatible
811
from django.utils.functional import cached_property
@@ -53,8 +56,8 @@ def posts(self):
5356

5457
@python_2_unicode_compatible
5558
class Forum(models.Model):
56-
category = models.ForeignKey(Category, related_name='forums', verbose_name=_('Category'))
57-
parent = models.ForeignKey('self', related_name='child_forums', verbose_name=_('Parent forum'),
59+
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='forums', verbose_name=_('Category'))
60+
parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name='child_forums', verbose_name=_('Parent forum'),
5861
blank=True, null=True)
5962
name = models.CharField(_('Name'), max_length=80)
6063
position = models.IntegerField(_('Position'), blank=True, default=0)
@@ -132,7 +135,7 @@ class ForumSubscription(models.Model):
132135

133136
user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE,
134137
related_name='forum_subscriptions+', verbose_name=_('Subscriber'))
135-
forum = models.ForeignKey(Forum,
138+
forum = models.ForeignKey(Forum, on_delete=models.CASCADE,
136139
related_name='subscriptions+', verbose_name=_('Forum'))
137140
type = models.PositiveSmallIntegerField(
138141
_('Subscription type'), choices=TYPE_CHOICES,
@@ -179,11 +182,11 @@ class Topic(models.Model):
179182
(POLL_TYPE_MULTIPLE, _('Multiple answers')),
180183
)
181184

182-
forum = models.ForeignKey(Forum, related_name='topics', verbose_name=_('Forum'))
185+
forum = models.ForeignKey(Forum, on_delete=models.CASCADE, related_name='topics', verbose_name=_('Forum'))
183186
name = models.CharField(_('Subject'), max_length=255)
184187
created = models.DateTimeField(_('Created'), null=True, db_index=True)
185188
updated = models.DateTimeField(_('Updated'), null=True, db_index=True)
186-
user = models.ForeignKey(get_user_model_path(), verbose_name=_('User'))
189+
user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, verbose_name=_('User'))
187190
views = models.IntegerField(_('Views count'), blank=True, default=0)
188191
sticky = models.BooleanField(_('Sticky'), default=False)
189192
closed = models.BooleanField(_('Closed'), default=False)
@@ -291,8 +294,8 @@ def render(self):
291294

292295
@python_2_unicode_compatible
293296
class Post(RenderableItem):
294-
topic = models.ForeignKey(Topic, related_name='posts', verbose_name=_('Topic'))
295-
user = models.ForeignKey(get_user_model_path(), related_name='posts', verbose_name=_('User'))
297+
topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='posts', verbose_name=_('Topic'))
298+
user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, related_name='posts', verbose_name=_('User'))
296299
created = models.DateTimeField(_('Created'), blank=True, db_index=True)
297300
updated = models.DateTimeField(_('Updated'), blank=True, null=True, db_index=True)
298301
user_ip = models.GenericIPAddressField(_('User IP'), blank=True, null=True, default='0.0.0.0')
@@ -369,7 +372,9 @@ class Profile(PybbProfile):
369372
Profile class that can be used if you doesn't have
370373
your site profile.
371374
"""
372-
user = AutoOneToOneField(get_user_model_path(), related_name='pybb_profile', verbose_name=_('User'))
375+
user = AutoOneToOneField(
376+
get_user_model_path(), on_delete=models.CASCADE,
377+
related_name='pybb_profile', verbose_name=_('User'))
373378

374379
class Meta(object):
375380
verbose_name = _('Profile')
@@ -387,7 +392,7 @@ class Meta(object):
387392
verbose_name = _('Attachment')
388393
verbose_name_plural = _('Attachments')
389394

390-
post = models.ForeignKey(Post, verbose_name=_('Post'), related_name='attachments')
395+
post = models.ForeignKey(Post, on_delete=models.CASCADE, verbose_name=_('Post'), related_name='attachments')
391396
size = models.IntegerField(_('Size'))
392397
file = models.FileField(_('File'),
393398
upload_to=FilePathGenerator(to=defaults.PYBB_ATTACHMENT_UPLOAD_TO))
@@ -432,8 +437,8 @@ class TopicReadTracker(models.Model):
432437
"""
433438
Save per user topic read tracking
434439
"""
435-
user = models.ForeignKey(get_user_model_path(), blank=False, null=False)
436-
topic = models.ForeignKey(Topic, blank=True, null=True)
440+
user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, blank=False, null=False)
441+
topic = models.ForeignKey(Topic, on_delete=models.CASCADE, blank=True, null=True)
437442
time_stamp = models.DateTimeField(auto_now=True)
438443

439444
objects = TopicReadTrackerManager()
@@ -470,8 +475,8 @@ class ForumReadTracker(models.Model):
470475
"""
471476
Save per user forum read tracking
472477
"""
473-
user = models.ForeignKey(get_user_model_path(), blank=False, null=False)
474-
forum = models.ForeignKey(Forum, blank=True, null=True)
478+
user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, blank=False, null=False)
479+
forum = models.ForeignKey(Forum, on_delete=models.CASCADE, blank=True, null=True)
475480
time_stamp = models.DateTimeField(auto_now=True)
476481

477482
objects = ForumReadTrackerManager()
@@ -484,7 +489,7 @@ class Meta(object):
484489

485490
@python_2_unicode_compatible
486491
class PollAnswer(models.Model):
487-
topic = models.ForeignKey(Topic, related_name='poll_answers', verbose_name=_('Topic'))
492+
topic = models.ForeignKey(Topic, on_delete=models.CASCADE, related_name='poll_answers', verbose_name=_('Topic'))
488493
text = models.CharField(max_length=255, verbose_name=_('Text'))
489494

490495
class Meta:
@@ -507,8 +512,8 @@ def votes_percent(self):
507512

508513
@python_2_unicode_compatible
509514
class PollAnswerUser(models.Model):
510-
poll_answer = models.ForeignKey(PollAnswer, related_name='users', verbose_name=_('Poll answer'))
511-
user = models.ForeignKey(get_user_model_path(), related_name='poll_answers', verbose_name=_('User'))
515+
poll_answer = models.ForeignKey(PollAnswer, on_delete=models.CASCADE, related_name='users', verbose_name=_('Poll answer'))
516+
user = models.ForeignKey(get_user_model_path(), on_delete=models.CASCADE, related_name='poll_answers', verbose_name=_('User'))
512517
timestamp = models.DateTimeField(auto_now_add=True)
513518

514519
class Meta:

0 commit comments

Comments
 (0)