diff --git a/calendars/migrations/0005_auto_20210817_1818.py b/calendars/migrations/0005_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..3e2cec2f23af75e3d14dfbe7a8082b690c306d3c --- /dev/null +++ b/calendars/migrations/0005_auto_20210817_1818.py @@ -0,0 +1,25 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('calendars', '0004_eventexception'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='creator', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_team_events', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='event', + name='team', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='events', to='person.Team'), + ), + ] diff --git a/calendars/models.py b/calendars/models.py index 9bb223e146a7652e7a8c1ee521eaa8057871843e..e582a4969744b0adab1cd1bde4f5ef956e9b08c0 100644 --- a/calendars/models.py +++ b/calendars/models.py @@ -25,7 +25,7 @@ from datetime import timedelta from django.utils.translation import ugettext_lazy as _ from django.db.models import ( Model, Manager, QuerySet, TextField, CharField, URLField, BooleanField, - DateTimeField, ForeignKey + DateTimeField, ForeignKey, SET_NULL, CASCADE ) from django.utils.timezone import now from django.dispatch import receiver @@ -64,9 +64,9 @@ class EventQuerySet(QuerySet): class Event(Model): """A single event""" - team = ForeignKey(Team, related_name='events') - creator = ForeignKey(User, related_name='created_team_events') - + team = ForeignKey(Team, on_delete=SET_NULL, related_name='events', null=True) + creator = ForeignKey(User, on_delete=SET_NULL, related_name='created_team_events', + null=True) title = CharField(max_length=255) description = TextField(validators=[MaxLengthValidator(4096)]) recurrences = RecurrenceField(null=True, blank=True) @@ -137,7 +137,7 @@ class ExceptionQuerySet(QuerySet): class EventException(Model): """A single exception to a regular event""" - event = ForeignKey(Event, related_name='exceptions') + event = ForeignKey(Event, on_delete=CASCADE, related_name='exceptions') old_start = DateTimeField() new_start = DateTimeField(null=True, blank=True) diff --git a/calendars/urls.py b/calendars/urls.py index c43f37c446e5ab4354ca1c301b965f561c9cefb1..0ff16080c226fdbeab45b96f04e94c9f85bb0cb5 100644 --- a/calendars/urls.py +++ b/calendars/urls.py @@ -26,6 +26,8 @@ from person import user_urls, team_urls from .views import EventList, TeamEventFeed, TeamEvent, TeamEventList +app_name = 'calendars' + team_urls.urlpatterns += [ url(r'^calendar.ics$', TeamEventFeed(), name='team_calendar_feed'), url(r'^calendar/$', TeamEventList.as_view(), name='team_calendar'), diff --git a/cmsplugin_image/migrations/0001_initial.py b/cmsplugin_image/migrations/0001_initial.py index 978848756e1f6eeb7f09206b3390d96b70c9fd16..a7e401bb2eaf370d446d4a0ccc01d736d9e94949 100644 --- a/cmsplugin_image/migrations/0001_initial.py +++ b/cmsplugin_image/migrations/0001_initial.py @@ -16,7 +16,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Image', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=False, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=False, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('image', models.ImageField(upload_to=cms.models.pluginmodel.get_plugin_media_path, verbose_name='image', max_length=200)), ('url', models.CharField(help_text='If present, clicking on image will take user to link.', max_length=255, null=True, verbose_name='Link', blank=True)), ('page_link', models.ForeignKey(blank=True, to='cms.Page', help_text='If present, clicking on image will take user to specified cms page.', null=True, verbose_name='CMS page link', on_delete=models.CASCADE)), diff --git a/cmsplugin_image/migrations/0003_auto_20160907_2241.py b/cmsplugin_image/migrations/0003_auto_20160907_2241.py index e6e27b1161c3a11fc3d58b7e062f11c172b740a5..6536cc0a6e7fc4ca11e841745dda01f389616419 100644 --- a/cmsplugin_image/migrations/0003_auto_20160907_2241.py +++ b/cmsplugin_image/migrations/0003_auto_20160907_2241.py @@ -5,6 +5,7 @@ from django.db import migrations, models class Migration(migrations.Migration): + atomic = False dependencies = [ ('cmsplugin_image', '0002_auto_20160907_2044'), diff --git a/cmsplugin_image/migrations/0005_auto_20180504_2002.py b/cmsplugin_image/migrations/0005_auto_20180504_2002.py index a57257f2f776e7190c8296f60b2184da931184c7..8bc0e01c86ec057bb3a69706ef44916a4dc4405c 100644 --- a/cmsplugin_image/migrations/0005_auto_20180504_2002.py +++ b/cmsplugin_image/migrations/0005_auto_20180504_2002.py @@ -19,6 +19,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='image', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='cmsplugin_image_image', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='cmsplugin_image_image', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), ] diff --git a/cmsplugin_image/migrations/0006_auto_20210817_1818.py b/cmsplugin_image/migrations/0006_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..575d620ad0a27d19d87ca8258f2c0ee169870976 --- /dev/null +++ b/cmsplugin_image/migrations/0006_auto_20210817_1818.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cmsplugin_image', '0005_auto_20180504_2002'), + ] + + operations = [ + migrations.AlterField( + model_name='image', + name='page_link', + field=models.ForeignKey(blank=True, help_text='If present, clicking on image will take user to specified cms page.', limit_choices_to={'publisher_is_draft': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cms.Page', verbose_name='CMS page link'), + ), + ] diff --git a/cmsplugin_image/models.py b/cmsplugin_image/models.py index b23178a791a7b6c9afae7b2bd6b392e935cd7a5e..785d82789b67637d5e2da84c34742d10ca1fdcfb 100644 --- a/cmsplugin_image/models.py +++ b/cmsplugin_image/models.py @@ -40,7 +40,7 @@ class Image(CMSPlugin): help_text=_("If present, clicking on image will take user to link.")) page_link = ForeignKey( - Page, verbose_name=_("CMS page link"), null=True, + Page, on_delete=SET_NULL, verbose_name=_("CMS page link"), null=True, limit_choices_to={'publisher_is_draft': True}, blank=True, help_text=_("If present, clicking on image will take user to " "specified cms page.")) diff --git a/cmsplugin_news/feeds.py b/cmsplugin_news/feeds.py index 0e880c9f326bf490c4badb09e4cb6f85d354a8f2..8227d836c7532a884953a88e0d27aa04e3edca43 100644 --- a/cmsplugin_news/feeds.py +++ b/cmsplugin_news/feeds.py @@ -19,7 +19,7 @@ # from django.contrib.syndication.views import Feed -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.translation import get_language from django.utils.encoding import force_text diff --git a/cmsplugin_news/menu.py b/cmsplugin_news/menu.py index 32d11f55e268bfdbee0ce1cd635945c7f1ee3ee3..26e9c4bff3691439a8a22b87eeabbc1fc6abc709 100644 --- a/cmsplugin_news/menu.py +++ b/cmsplugin_news/menu.py @@ -23,7 +23,7 @@ This module hooks into django-cms' menu system by providing a clear menu hierarchy for every news item. """ from django.utils.translation import ugettext_lazy as _ -from django.core.urlresolvers import reverse +from django.urls import reverse from menus.menu_pool import menu_pool from menus.base import NavigationNode diff --git a/cmsplugin_news/migrations/0001_initial.py b/cmsplugin_news/migrations/0001_initial.py index 36381abe98a2dc92305c9c1d5cc83eb8b3a53558..f211ddec56107247fb3301c5e5015c8982d5565b 100644 --- a/cmsplugin_news/migrations/0001_initial.py +++ b/cmsplugin_news/migrations/0001_initial.py @@ -18,7 +18,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='LatestNewsPlugin', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('limit', models.PositiveIntegerField(help_text='Limits the number of items that will be displayed', verbose_name='Number of news items to show')), ], options={ diff --git a/cmsplugin_news/migrations/0007_auto_20170614_2059.py b/cmsplugin_news/migrations/0007_auto_20170614_2059.py index 14a1517ac7ceb567969951611e836d133590aecd..abce0e421bf637e7a4a6491fe076f7b66ac3919e 100644 --- a/cmsplugin_news/migrations/0007_auto_20170614_2059.py +++ b/cmsplugin_news/migrations/0007_auto_20170614_2059.py @@ -41,7 +41,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='latestnewsplugin', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='cmsplugin_news_latestnewsplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='cmsplugin_news_latestnewsplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), migrations.AddField( model_name='newsbacklink', diff --git a/cmsplugin_news/migrations/0010_auto_20210817_1818.py b/cmsplugin_news/migrations/0010_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..f5b72d1e5472d522040ab5339d228044e71aed95 --- /dev/null +++ b/cmsplugin_news/migrations/0010_auto_20210817_1818.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cmsplugin_news', '0009_newsmedia'), + ] + + operations = [ + migrations.AlterField( + model_name='news', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_index=True, help_text='Translated version of another news item.', max_length=8, verbose_name='Language'), + ), + ] diff --git a/cmsplugin_news/mixins.py b/cmsplugin_news/mixins.py index 43ff9687f090e0643880b41aa77461f47194c75b..77c2229e8dafd430a392969202ced3e75a37bdcc 100644 --- a/cmsplugin_news/mixins.py +++ b/cmsplugin_news/mixins.py @@ -25,7 +25,7 @@ Provide news mixins from datetime import date from django.utils.translation import ugettext_lazy as _ -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import dateformat from django.utils.decorators import method_decorator diff --git a/cmsplugin_news/models.py b/cmsplugin_news/models.py index f4c9505488976a0ddcf999573f8d6488294690e3..2edce91032ab05cf1fd765b360bf334e3fb89675 100644 --- a/cmsplugin_news/models.py +++ b/cmsplugin_news/models.py @@ -24,7 +24,7 @@ from django.db.models import Model, Manager,\ ImageField, FileField, URLField, PositiveIntegerField, SET_NULL, CASCADE from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import Group -from django.core.urlresolvers import reverse +from django.urls import reverse from django.conf import settings from django.utils import timezone diff --git a/cmsplugin_news/urls.py b/cmsplugin_news/urls.py index d3bc4d0f98a4fd825a09006096f5f5394b35a12e..161fdfc1a985c4fb1459e78dddf14cb942068c2d 100644 --- a/cmsplugin_news/urls.py +++ b/cmsplugin_news/urls.py @@ -28,6 +28,8 @@ from .views import ( DetailView, DetailNews, UploadMedia, ) +app_name = 'news' + urlpatterns = [ # pylint: disable=invalid-name url(r'^$', ArchiveIndexView.as_view(), name='archive_index'), url(r'^unpublished/(?P\d+)/$', DetailNews.as_view(), name="item"), diff --git a/cmsplugin_toc/migrations/0001_initial.py b/cmsplugin_toc/migrations/0001_initial.py index 4693314f886456ddf5f5f4cb196c2accd9155c36..d473d2e08123a4ce88bb1f419127bcc93a72d5ac 100644 --- a/cmsplugin_toc/migrations/0001_initial.py +++ b/cmsplugin_toc/migrations/0001_initial.py @@ -14,7 +14,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='TableOfContents', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('title', models.CharField(max_length=128, verbose_name='Title')), ('bullet', models.BooleanField(default=False, verbose_name='Use Bullets')), ], diff --git a/cmstabs/cms_toolbar_objects.py b/cmstabs/cms_toolbar_objects.py index e55b6276e609685951ca9299a83520f48b690807..1e93715cc56f1312ffbb98f54b018a62b699e73d 100644 --- a/cmstabs/cms_toolbar_objects.py +++ b/cmstabs/cms_toolbar_objects.py @@ -20,7 +20,7 @@ Provide django cms with object editing toolbar. from django.db.models import QuerySet, Model -from django.core.urlresolvers import NoReverseMatch, reverse +from django.urls import NoReverseMatch, reverse from django.utils.translation import ugettext_lazy as _, get_language_from_path from django.urls import translate_url from django.contrib.contenttypes.models import ContentType @@ -41,7 +41,7 @@ CMSToolbar.render_with_structure = new_rws class ObjectsToolbar(SubToolbar): """Adds an Objects menu item for quick admin access to current context""" def populate(self): - if self.request.user.is_authenticated() and self.request.user.is_staff: + if self.request.user.is_authenticated and self.request.user.is_staff: if hasattr(self.toolbar, 'response_context'): self.add_menu(self.toolbar.response_context) diff --git a/cmstabs/migrations/0001_initial.py b/cmstabs/migrations/0001_initial.py index ba46015a49eed3ee4a10d07f9ec87e1b92f1a8b9..fa51e5fcb75b08bb94c0cc5e46435efe05ce5721 100644 --- a/cmstabs/migrations/0001_initial.py +++ b/cmstabs/migrations/0001_initial.py @@ -18,7 +18,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ShieldPlugin', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ], options={ 'db_table': 'extra_shieldplugin', @@ -77,7 +77,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='GroupPhotoPlugin', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('style', models.CharField(max_length=1, verbose_name='Display Style', choices=[('L', 'Simple List'), ('P', 'Photo Heads'), ('B', 'Photo Bios')])), ('source', models.ForeignKey(to='auth.Group', on_delete=models.CASCADE)), ], diff --git a/cmstabs/migrations/0002_add_inlinepages.py b/cmstabs/migrations/0002_add_inlinepages.py index 34ac548457891988a47bc288a4586383601b7153..e26ee8a0be57b04b72eee66e7c52a3f128dd706e 100644 --- a/cmstabs/migrations/0002_add_inlinepages.py +++ b/cmstabs/migrations/0002_add_inlinepages.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='InlinePage', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('title', models.CharField(max_length=64)), ], options={ @@ -26,7 +26,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='InlinePages', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ], options={ 'db_table': 'extra_inlinepages', diff --git a/cmstabs/migrations/0004_auto_20180324_1620.py b/cmstabs/migrations/0004_auto_20180324_1620.py index d527a7f5634ebe95a569ccf283fe48e5b92b31a9..d89215ff28c178c8428d35d504eb74f487c44568 100644 --- a/cmstabs/migrations/0004_auto_20180324_1620.py +++ b/cmstabs/migrations/0004_auto_20180324_1620.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='groupphotoplugin', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='cmstabs_groupphotoplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='cmstabs_groupphotoplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), migrations.AlterField( model_name='groupphotoplugin', @@ -25,17 +25,17 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='inlinepage', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='cmstabs_inlinepage', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='cmstabs_inlinepage', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), migrations.AlterField( model_name='inlinepages', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='cmstabs_inlinepages', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='cmstabs_inlinepages', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete= models.CASCADE), ), migrations.AlterField( model_name='shieldplugin', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='cmstabs_shieldplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='cmstabs_shieldplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), migrations.AlterField( model_name='tabcategory', diff --git a/cmstabs/migrations/0007_auto_20210817_1818.py b/cmstabs/migrations/0007_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..efc787b19ca8113a2feb9654b5789459cf888614 --- /dev/null +++ b/cmstabs/migrations/0007_auto_20210817_1818.py @@ -0,0 +1,30 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cmstabs', '0006_auto_20210517_1418'), + ] + + operations = [ + migrations.AlterField( + model_name='tab', + name='license', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='resources.License'), + ), + migrations.AlterField( + model_name='tab', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='front_tabs', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='teamplugin', + name='role', + field=models.ForeignKey(blank=True, help_text='Limit to just this role.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='person.MembershipRole'), + ), + ] diff --git a/cmstabs/models.py b/cmstabs/models.py index 1c22e29d0fd508817aa90daf19365ff7bb3d583f..7f08b8b3cd30ce69870385bf0ca045912450dbba 100644 --- a/cmstabs/models.py +++ b/cmstabs/models.py @@ -27,7 +27,7 @@ import sys from django.conf import settings from django.db.models import ( Model, ForeignKey, CharField, IntegerField, FileField, URLField, - BooleanField, TextField, AutoField, SET_NULL, + BooleanField, TextField, AutoField, SET_NULL, CASCADE ) from django.utils.translation import ugettext_lazy as _ from django.utils.text import slugify @@ -65,15 +65,15 @@ class Tab(Model): """ link = URLField(_('External Link'), **null) name = CharField(max_length=64) - user = ForeignKey(settings.AUTH_USER_MODEL, related_name='front_tabs', **null) + user = ForeignKey(settings.AUTH_USER_MODEL, on_delete=SET_NULL, related_name='front_tabs', **null) download = FileField(_('Background'), upload_to='shields/backgrounds') - license = ForeignKey(License) + license = ForeignKey(License, on_delete=SET_NULL, null=True) order = IntegerField(editable=True, **null) tab_name = CharField(_("Heading"), max_length=64) tab_text = CharField(_("Sub-Heading"), max_length=128) - tab_cat = ForeignKey(TabCategory, verbose_name=_("Tab Icon")) + tab_cat = ForeignKey(TabCategory, on_delete=CASCADE ,verbose_name=_("Tab Icon")) banner_text = CharField(max_length=255, **null) banner_foot = CharField(max_length=128, **null) @@ -83,7 +83,7 @@ class Tab(Model): btn_icon = CharField(_("Button Icon"), max_length=12, choices=BTNS, **null) # The backwards linking here is because django can't inline ManyToMany fields - shield = ForeignKey('ShieldPlugin', related_name='tabs') + shield = ForeignKey('ShieldPlugin', on_delete=CASCADE, related_name='tabs') draft = ForeignKey('self', on_delete=SET_NULL, **null) is_visible = BooleanField(default=True) @@ -174,7 +174,7 @@ class GroupPhotoPlugin(CMSPlugin): ('3', _('Link Only Sponsors')), ) - source = ForeignKey(Group) + source = ForeignKey(Group, on_delete=CASCADE) style = CharField(_('Display Style'), max_length=1, choices=STYLES) class Meta: @@ -191,6 +191,6 @@ class TeamPlugin(CMSPlugin): ('small_horz', _('Links Only')), ) - team = ForeignKey(Team) - role = ForeignKey(MembershipRole, help_text='Limit to just this role.', **null) + team = ForeignKey(Team, on_delete=CASCADE) + role = ForeignKey(MembershipRole, on_delete=SET_NULL, help_text='Limit to just this role.', **null) template = CharField(max_length=32, default='small_horz', choices=TEMPLATES) diff --git a/cmstabs/templatetags/user_session.py b/cmstabs/templatetags/user_session.py index 3bada66113b0061e5656d20d1d177896e323df70..99f53733ad52f9e171912cacc64a866b3f180956 100644 --- a/cmstabs/templatetags/user_session.py +++ b/cmstabs/templatetags/user_session.py @@ -25,7 +25,7 @@ import re import warnings from django import template -from django.contrib.gis.geoip import HAS_GEOIP +from django.contrib.gis.geoip2 import HAS_GEOIP2 from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _, ugettext @@ -110,7 +110,7 @@ _geoip = None def geoip(): global _geoip - if _geoip is None and HAS_GEOIP: + if _geoip is None and HAS_GEOIP2: from django.contrib.gis.geoip import GeoIP try: _geoip = GeoIP() diff --git a/cog/middleware.py b/cog/middleware.py index aafa701b8db176e3b92dc296d050524274011b8b..b0de3ee00cc3a1fd674f6a74175b2ae055953294 100644 --- a/cog/middleware.py +++ b/cog/middleware.py @@ -24,12 +24,17 @@ from django.conf import settings # We could add this to middleware.py, but it's getting a bit full # and this file is empty enough that it won't bother anyone. -class UserOnErrorMiddleware(object): +class UserOnErrorMiddleware: """Add a link to the user in errors (if possible)""" cookie_key = getattr(settings, 'SESSION_COOKIE_NAME', None) - def __init__(self): + def __init__(self, get_response): + self.get_response = get_response self.server = None + + def __call__(self, request): + response = self.get_response(request) + return response def process_exception(self, request, exception): """When each request is made, this is run to add users""" @@ -49,7 +54,7 @@ class UserOnErrorMiddleware(object): def direct_link(self, request): """But try and put a direct link in anyway (if possible)""" try: - if request.user.is_authenticated(): + if request.user.is_authenticated: url = request.user.get_absolute_url() request.META['USER_URL'] = self.server + url except KeyError: diff --git a/cog/models.py b/cog/models.py index 69e37df8a2a7230a7b320d439a34d63cdeda5d09..97d6cc439e61c4d4300e484b307b8c1a1afabba7 100644 --- a/cog/models.py +++ b/cog/models.py @@ -23,7 +23,7 @@ Utility models which store data for the whole website's use. import json from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db.models import ( Model, CharField, IntegerField, DateTimeField, TextField, URLField, PositiveIntegerField ) diff --git a/cog/urls.py b/cog/urls.py index 4c4396b7e1d6634c8d76fb500ae1ea05d8b9f882..cac4b2009dc568b235275e6dc2ad3c18b0e114c0 100644 --- a/cog/urls.py +++ b/cog/urls.py @@ -23,6 +23,8 @@ from django.conf.urls import url from .views import ErrorList, ErrorDetail, MarkFixed, WebsiteStats +app_name = 'cog' + urlpatterns = [ url(r'^errors/$', ErrorList.as_view(), name='errors'), url(r'^errors/(?P[^\/]*)/$', ErrorDetail.as_view(), name='error'), diff --git a/cog/views.py b/cog/views.py index 2371ab65928a2aa1e64353d38d5ec44190473d87..6e02ec5151eae3f2b918fd0fc2638dac8a6ac0ec 100644 --- a/cog/views.py +++ b/cog/views.py @@ -30,7 +30,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views.generic import ListView, DetailView, TemplateView from django.views.generic.base import RedirectView from django.views.generic.detail import SingleObjectMixin -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.timezone import now from django.conf import settings diff --git a/el_menu/migrations/0006_auto_20210817_1818.py b/el_menu/migrations/0006_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..22802ff24c90f80e2eefb72901a7b6831cb081e6 --- /dev/null +++ b/el_menu/migrations/0006_auto_20210817_1818.py @@ -0,0 +1,23 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('el_menu', '0005_auto_20200609_1139'), + ] + + operations = [ + migrations.AlterField( + model_name='menuitem', + name='lang', + field=models.CharField(choices=[('all', 'All Languages'), ('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_column='root_id', db_index=True, default='all', help_text='If set, this menu will only be available to this language. DO NOT use this for translations!', max_length=12), + ), + migrations.AlterField( + model_name='menutranslation', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_index=True, max_length=12), + ), + ] diff --git a/elections/migrations/0006_auto_20210817_1818.py b/elections/migrations/0006_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..ab95b84ab9bc7f655a37a2f606c7632191176da1 --- /dev/null +++ b/elections/migrations/0006_auto_20210817_1818.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('elections', '0005_auto_20200609_1139'), + ] + + operations = [ + migrations.AlterField( + model_name='vote', + name='candidate', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='votes', to='elections.Candidate'), + ), + ] diff --git a/elections/mixins.py b/elections/mixins.py index 3c80a7becee6b256dbd11de3019292aaaa46c905..5ba970d759e6d048205a1342c9df5040126749a2 100644 --- a/elections/mixins.py +++ b/elections/mixins.py @@ -38,5 +38,5 @@ class TeamMemberMixin(RestrictedMixin): def is_allowed(self, user): """Test this user is a constituent of this election (voter)""" team = self.get_object().constituents - return user.is_authenticated() and team.has_member(user) + return user.is_authenticated and team.has_member(user) diff --git a/elections/urls.py b/elections/urls.py index 6b9e9d0b2cf26cb1f2c5a119251c43fe722c8503..444c27a1253b281578b4b9aa00f55b4738fc9cbd 100644 --- a/elections/urls.py +++ b/elections/urls.py @@ -28,6 +28,8 @@ from .views import ( ElectionInviteMessage, ElectionVote ) +app_name = 'elections' + urlpatterns = [ # pylint: disable=invalid-name url(r'^$', ElectionList.as_view(), name='list'), url_tree( diff --git a/forums/admin.py b/forums/admin.py index 1d016f45443e8841190e36e0a8c41eec286ddf63..42eb76a7692d264f5eea4543cc7923b1b87b090b 100644 --- a/forums/admin.py +++ b/forums/admin.py @@ -24,7 +24,7 @@ Admin interfaces for comments and forums. from django_comments.models import CommentFlag, Comment from django_comments.admin import CommentsAdmin -from django.utils.text import mark_safe +from django.utils.safestring import mark_safe from django.contrib.admin import ModelAdmin, register, TabularInline from django.contrib.contenttypes.admin import GenericTabularInline diff --git a/forums/alert.py b/forums/alert.py index dd5c7e95bfbc4a377228f0b12141bcb724308af9..9e1fb185e970929a576d78e19047d98f1cd4460d 100644 --- a/forums/alert.py +++ b/forums/alert.py @@ -99,7 +99,7 @@ class ForumTopicAlert(BaseAlert): @classmethod def subscriptions_for(cls, user): """Return a list of subscriptions for this user""" - if user is not None and user.is_authenticated(): + if user is not None and user.is_authenticated: return user.alert_subscriptions.filter(alert__slug=cls.slug) return AlertSubscription.objects.none() diff --git a/forums/fixtures/forums.json b/forums/fixtures/forums.json index 8bdecbfb6e2a836cbd766ae6fb3fcabadd4cc717..d25b4465ded6bf383e4d86cd68836fa2fd83eec6 100644 --- a/forums/fixtures/forums.json +++ b/forums/fixtures/forums.json @@ -46,7 +46,6 @@ "resources", "resource" ], - "sync": null, "post_count": 1214, "last_posted": "2018-11-13T15:37:35Z" } @@ -63,7 +62,6 @@ "icon": "forum/icon/art_general.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 25, "last_posted": "2018-11-24T01:09:40.097Z" } @@ -80,7 +78,6 @@ "icon": "forum/icon/school.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 4, "last_posted": "2016-06-22T02:30:05Z" } @@ -97,7 +94,6 @@ "icon": "forum/icon/ext.png", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -114,7 +110,6 @@ "icon": "forum/icon/bugs.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -131,7 +126,6 @@ "icon": "forum/icon/basic_q.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 4, "last_posted": "2018-11-23T15:45:34.843Z" } @@ -148,7 +142,6 @@ "icon": "forum/icon/basic_b.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -165,7 +158,6 @@ "icon": "forum/icon/compet.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -182,7 +174,6 @@ "icon": "forum/icon/graph.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -199,7 +190,6 @@ "icon": "forum/icon/laser.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -216,7 +206,6 @@ "icon": "forum/icon/www.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -233,7 +222,6 @@ "icon": "forum/icon/ani.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -250,7 +238,6 @@ "icon": "forum/icon/pony.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -267,7 +254,6 @@ "icon": "forum/icon/art_gallery.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } @@ -284,7 +270,6 @@ "icon": "forum/icon/educators.svg", "lang": null, "content_type": null, - "sync": null, "post_count": 0, "last_posted": null } diff --git a/forums/migrations/0005_auto_20160915_1734.py b/forums/migrations/0005_auto_20160915_1734.py index 5c78c8be96ef7ce4b705e91ea459a1be21f01bef..1a6b569104235b1aee07bab365986acde9feab07 100644 --- a/forums/migrations/0005_auto_20160915_1734.py +++ b/forums/migrations/0005_auto_20160915_1734.py @@ -20,7 +20,7 @@ class Migration(migrations.Migration): ('reply_id', models.CharField(help_text='Either the previous message in the chain, or the parent id', max_length=255, null=True, db_index=True, blank=True)), ('subject', models.CharField(help_text='A matchable subject line for this comment.', max_length=255, null=True, db_index=True, blank=True)), ('extra_data', models.TextField(null=True, blank=True)), - ('comment', models.OneToOneField(related_name='link', to='django_comments.Comment')), + ('comment', models.OneToOneField(related_name='link', to='django_comments.Comment', on_delete=models.CASCADE)), ], ), migrations.AddField( diff --git a/forums/migrations/0031_auto_20210817_1818.py b/forums/migrations/0031_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..693dc9d5d32506f1afa6709974966f8eef87f717 --- /dev/null +++ b/forums/migrations/0031_auto_20210817_1818.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('forums', '0030_auto_20210705_2035'), + ] + + operations = [ + migrations.AlterField( + model_name='bannedwords', + name='moderator', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/forums/models.py b/forums/models.py index 68ef7d2ec6bc268eae0097a47f9d5d2099fd23fc..7b4d88111a3add8b6a3d53f46954a1b1e18de52f 100644 --- a/forums/models.py +++ b/forums/models.py @@ -417,7 +417,7 @@ class BannedWords(Model): """ If these words/phrases are used, then the poster can be instantly banned. """ - moderator = ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) + moderator = ForeignKey(settings.AUTH_USER_MODEL, on_delete=SET_NULL ,null=True, blank=True) created = DateTimeField(auto_now_add=True, null=True, blank=True) phrase = CharField(max_length=32, unique=True) in_title = BooleanField(default=True,\ diff --git a/forums/querysets.py b/forums/querysets.py index 93abe8c4da8a26124c5c43fd598bf810e9379b82..ae934db9bda67ee5317b67efaeed0f2100b033d3 100644 --- a/forums/querysets.py +++ b/forums/querysets.py @@ -42,7 +42,7 @@ class ForumQuerySet(QuerySet): def for_user(self, user): """Filter out un-needed forums""" - if user and user.is_authenticated(): + if user and user.is_authenticated: teams = user.teams.all() return self.filter(Q(team__isnull=True) | Q(team__in=teams)) return self.filter(team__isnull=True) @@ -64,7 +64,7 @@ class TopicQuerySet(QuerySet): def for_user(self, user): """Set the user and filter out un-needed topics""" - if user and user.is_authenticated(): + if user and user.is_authenticated: teams = user.teams.all() return self.filter(Q(forum__team__isnull=True) | Q(forum__team__in=teams)) return self.filter(forum__team__isnull=True) diff --git a/forums/rss.py b/forums/rss.py index 89278c75c67a22a5a3184e2c9ca20960bc796f7b..4bfdcb059bce876b4d1421bbb22ae8bc57dcdb82 100644 --- a/forums/rss.py +++ b/forums/rss.py @@ -24,7 +24,7 @@ All views required to show a list of forum topics. from django.utils.translation import ugettext_lazy as _ from django.contrib.syndication.views import Feed -from django.core.urlresolvers import reverse +from django.urls import reverse from .models import Forum, ForumTopic diff --git a/forums/tests/test_forms.py b/forums/tests/test_forms.py index 8884a91608ef32161fffaf1fe379710b3fcc59e0..81d0ce1847169c3438aad12f3b1ef92ea4b33cee 100644 --- a/forums/tests/test_forms.py +++ b/forums/tests/test_forms.py @@ -156,7 +156,6 @@ class TestAttachmentMixin(GetTestUsersMixin, TestCase): flag=UserFlag.FLAG_BANNED, title='Banned' ) - self.user.forum_flags.add(flag=flag) with self.assertRaises(ValidationError) as err: mixin = self.get_mixin_instance() diff --git a/forums/urls.py b/forums/urls.py index db3c721145766f0867d73a15299ceb43650568f2..896dc4a80f46e370232b2e8696d5236582fd7d51 100644 --- a/forums/urls.py +++ b/forums/urls.py @@ -39,6 +39,8 @@ from .rss import ForumTopicFeed from .search_views import CommentSearch, TopicSearch, TopicSubjectSearch +app_name = 'forums' + user_urls.urlpatterns += [ url(r'^comments/$', CommentList.as_view(), name="comment_list"), url(r'^topics/$', UserTopicList.as_view(), name="topic_list"), diff --git a/forums/views.py b/forums/views.py index 2321987b13deff3889dd374513fe1cd75a062824..830f1d06b23c1a4921e49a70ed1ee33e5bc20384 100644 --- a/forums/views.py +++ b/forums/views.py @@ -33,7 +33,7 @@ from django.contrib.auth.models import Permission from django.utils.translation import ugettext_lazy as _ from django.utils.timezone import make_aware from django.shortcuts import get_object_or_404 -from django.core.urlresolvers import reverse +from django.urls import reverse from django_comments.models import CommentFlag @@ -100,7 +100,7 @@ class TopicList(UserVisit, ForumMixin, ListView): user = get_object_or_404(get_user_model(), username=self.kwargs['username']) qset = qset.filter(first_username=self.kwargs['username']) self.set_context_datum('forum_user', user) - if self.request.user.is_authenticated(): + if self.request.user.is_authenticated: qset.set_user(self.request.user) if self.kwargs: self.set_context_datum('rss', reverse("forums:topic_feed", kwargs=self.kwargs)) diff --git a/forums/widgets.py b/forums/widgets.py index 0b31230bfba0c34482ea75da7fe14a4502f61d8e..79f493490cac7019df21ff0dd91294eda4688afb 100644 --- a/forums/widgets.py +++ b/forums/widgets.py @@ -49,8 +49,8 @@ class TextEditorWidget(Textarea): self.action_token = action_token self.delete_on_cancel = delete_on_cancel - def render_textarea(self, name, value, attrs=None): - return super(TextEditorWidget, self).render(name, value, attrs) + def render_textarea(self, name, value, attrs=None, renderer=None): + return super(TextEditorWidget, self).render(name, value, attrs, renderer) def render_additions(self, name, value, attrs=None): # id attribute is always present when rendering a widget @@ -65,7 +65,7 @@ class TextEditorWidget(Textarea): } return mark_safe(render_to_string('forums/ckeditor.html', context)) - def render(self, name, value, attrs=None): + def render(self, name, value, attrs=None, renderer=None): return ( - self.render_textarea(name, value, attrs) + self.render_additions(name, value, attrs) + self.render_textarea(name, value, attrs, renderer) + self.render_additions(name, value, attrs) ) diff --git a/inkscape/context_processors.py b/inkscape/context_processors.py index 06fafeebf2229d3adb18c59ffd031bf78e3bffe8..4a9f6a5f28d3042cab50d6c0739d03f429c465ea 100644 --- a/inkscape/context_processors.py +++ b/inkscape/context_processors.py @@ -58,8 +58,9 @@ def proc_date(d): VERSION_FILE = os.path.join(PATH, 'version') if os.path.isfile(VERSION_FILE): - MSG = email.message_from_file(open(VERSION_FILE)) - WEBSITE_VERSION = str(MSG["version"]) + with open(VERSION_FILE, 'r') as fhl: + MSG = email.message_from_file(fhl) + WEBSITE_VERSION = str(MSG["version"]) REVISION_FILE = os.path.join(PATH, 'data', 'revision') if os.path.isfile(REVISION_FILE): diff --git a/inkscape/middleware.py b/inkscape/middleware.py index c45649f56108aa72e5518fe8ab0c0ada48ce3452..460ddfea01c674047f4bff0e6b92895a7ddd25dc 100644 --- a/inkscape/middleware.py +++ b/inkscape/middleware.py @@ -58,10 +58,19 @@ class TrackCacheMiddleware(BaseMiddleware): does not understand what they are for or how they work during the FetchCache process. """ + cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX cache = caches[settings.CACHE_MIDDLEWARE_ALIAS] + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + response = self.process_response(request, response) + return response + @classmethod def fastly_cache(cls): if not hasattr(cls, '_fastly'): @@ -276,6 +285,13 @@ class AutoBreadcrumbMiddleware(BaseMiddleware): """ keys = ('breadcrumbs', 'title') + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + return response + def process_template_response(self, request, response): if not hasattr(response, 'context_data'): return response diff --git a/inkscape/migrations/0007_auto_20210817_1818.py b/inkscape/migrations/0007_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..d95c1ce1653e12ae944866ae017d139b0ec08029 --- /dev/null +++ b/inkscape/migrations/0007_auto_20210817_1818.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models +import inkscape.models +import inkscape.utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('inkscape', '0006_localstatic'), + ] + + operations = [ + migrations.AlterField( + model_name='localstatic', + name='static_file', + field=models.FileField(storage=inkscape.utils.StaticStore(), upload_to=inkscape.models.static_to), + ), + ] diff --git a/inkscape/settings.py b/inkscape/settings.py index b7ef35d4f465000f262c42d4ea8af02f89da40a7..d665d2ed3a53b953743c18a9ac9523feee34171b 100644 --- a/inkscape/settings.py +++ b/inkscape/settings.py @@ -130,7 +130,7 @@ TEMPLATES = [{ } }] -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = [ 'cog.middleware.UserOnErrorMiddleware', 'inkscape.middleware.AutoBreadcrumbMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -138,7 +138,6 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', 'cms.middleware.page.CurrentPageMiddleware', @@ -148,11 +147,11 @@ MIDDLEWARE_CLASSES = ( 'person.middleware.SetLastVisitMiddleware', 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', 'forums.middleware.RecentUsersMiddleware' -) +] # ===== CACHING ===== # -if ENABLE_CACHING or IS_TEST: +if ENABLE_CACHING: # Caching Middleware caches whole pages, can cause issues CMS_CACHE_DURATIONS = { 'content': CACHE_PAGE_SETTING, @@ -160,10 +159,10 @@ if ENABLE_CACHING or IS_TEST: 'menus': 0, } - MIDDLEWARE_CLASSES = \ - ('django.middleware.cache.UpdateCacheMiddleware',) + \ - MIDDLEWARE_CLASSES + \ - ('django.middleware.cache.FetchFromCacheMiddleware',) + MIDDLEWARE = \ + ['django.middleware.cache.UpdateCacheMiddleware'] + \ + MIDDLEWARE + \ + ['django.middleware.cache.FetchFromCacheMiddleware'] # Template caching allows quicker fetches TEMPLATES[0]['OPTIONS']['loaders'] = [( diff --git a/inkscape/testlib.py b/inkscape/testlib.py index ad5789dfabb077809c5a2c6f8500710351e3efa9..2125c0085b9a0c5b1d2bbc3992189550c3532748 100644 --- a/inkscape/testlib.py +++ b/inkscape/testlib.py @@ -44,7 +44,7 @@ from django.test import TestCase from django.test.utils import override_settings from django.db.models import Model -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.management import call_command from django.core.files.base import File from django.conf import settings diff --git a/inkscape/urls.py b/inkscape/urls.py index a9af6d5bcb858e7676b8573302d917099dcec543..09866563d6579340c5585e3df48f636b6bb05cd3 100644 --- a/inkscape/urls.py +++ b/inkscape/urls.py @@ -51,16 +51,16 @@ urlpatterns += i18n_patterns( url(r'^search/$', SearchView(), name='search'), url(r'^search/json/$', SearchJson(), name='search.json'), url(r'^credits/$', Authors.as_view(), name='authors'), - url(r'^admin/', include(admin.site.urls)), - url(r'^cog/', include('cog.urls', namespace='cog')), - url(r'^forums/', include('forums.urls', namespace='forums')), - url(r'^cals/', include('calendars.urls', namespace='calendars')), - url(r'^releases?/', include('releases.urls', namespace='releases')), + url(r'^admin/', admin.site.urls), + url(r'^cog/', include('cog.urls')), + url(r'^forums/', include('forums.urls')), + url(r'^cals/', include('calendars.urls')), + url(r'^releases?/', include('releases.urls')), url(r'^alerts/', include('alerts.urls')), url(r'^comments/', include('django_comments.urls')), - url(r'^moderation/', include('moderation.urls', namespace='moderation')), - url(r'^news/', include('cmsplugin_news.urls', namespace='news')), - url(r'^diff/', include('cmsplugin_diff.urls', namespace='cmsplugin_diff')), + url(r'^moderation/', include('moderation.urls')), + url(r'^news/', include('cmsplugin_news.urls')), + url(r'^diff/', include('cmsplugin_diff.urls')), url(r'^doc/', include('docs.urls')), url(r'^~(?P[^\/]+)/', include('person.user_urls')), url(r'^\*(?P[^\/]+)/', include('person.team_urls')), diff --git a/inkscape/views.py b/inkscape/views.py index e3dcb2a0bb8f085ddeac9d4172432389a6476417..5e2433fb92a36d9133d1a08745720a29cadf5715 100644 --- a/inkscape/views.py +++ b/inkscape/views.py @@ -84,7 +84,7 @@ class ContactUs(FormView): def get_initial(self): ret = {'subject': self.request.GET.get('subject', "Website Feedback")} - if self.request.user.is_authenticated(): + if self.request.user.is_authenticated: ret['email'] = self.request.user.email return ret @@ -97,7 +97,7 @@ class ContactUs(FormView): return super(ContactUs, self).form_valid(form) def get_sender(self, email): - if self.request.user.is_authenticated(): + if self.request.user.is_authenticated: user = self.request.user if not user.first_name: return email diff --git a/moderation/mixins.py b/moderation/mixins.py index ba8432fdb643e5f0ee3329780e7120f0ce87085a..c92ba5807e1c500e43dec419df61ce20d701bff5 100644 --- a/moderation/mixins.py +++ b/moderation/mixins.py @@ -26,7 +26,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.auth.decorators import login_required, permission_required from django.utils.translation import ugettext_lazy as _ from django.utils.decorators import method_decorator -from django.core.urlresolvers import reverse +from django.urls import reverse from django.shortcuts import get_object_or_404, redirect from django.views.generic import DetailView from django.http import JsonResponse diff --git a/moderation/templatetags/moderator.py b/moderation/templatetags/moderator.py index b5cf5f4e73f814fddbd39510ad6778e2c79c87cd..0894c50b23021035538c7ba72c76f6f472b70e37 100644 --- a/moderation/templatetags/moderator.py +++ b/moderation/templatetags/moderator.py @@ -21,7 +21,7 @@ Provide a tool for getting moderation urls. """ -from django.core.urlresolvers import reverse +from django.urls import reverse from django.template import Library from django.conf import settings @@ -47,7 +47,7 @@ def flag_url(context, obj=None): @register.filter def is_flagged(obj, user): - if user and user.is_authenticated(): + if user and user.is_authenticated: ct = ContentType.objects.get_for_model(obj) return FlagVote.objects.filter( moderator_id=user.pk, diff --git a/moderation/urls.py b/moderation/urls.py index f22eba08053e07247ce927cc2f6a2b8a8706f3ce..fcf521dc074ef4f55221f0ed19a88a6373bce1c5 100644 --- a/moderation/urls.py +++ b/moderation/urls.py @@ -27,6 +27,8 @@ from .views import ( ApproveObject, NoteObject, ) +app_name = 'moderation' + urlpatterns = [ # pylint: disable=invalid-name url(r'^$', Moderation.as_view(), name="index"), url_tree( diff --git a/moderation/views.py b/moderation/views.py index 2c05411ff84e16d8f716ef19dc5a75f5b5114377..df69217b475aa450ff6f0a0ea22812a95aa45c5b 100644 --- a/moderation/views.py +++ b/moderation/views.py @@ -24,7 +24,7 @@ from datetime import timedelta from django.db import utils from django.utils.translation import ugettext_lazy as _ from django.views.generic import TemplateView, ListView -from django.core.urlresolvers import reverse +from django.urls import reverse from .models import * from .mixins import * diff --git a/person/middleware.py b/person/middleware.py index f1aa42d2703c4cc74bd498d39fe41cdf144e5e8b..3175cdbe473565fc217a07fb0db2422d011263c6 100644 --- a/person/middleware.py +++ b/person/middleware.py @@ -23,13 +23,18 @@ Model for specific user middleware from django.utils.timezone import now -class SetLastVisitMiddleware(object): + +class SetLastVisitMiddleware: """ Provide a user tracking date/time stamp update middleware. """ - def process_request(self, request): - """Process request happens before page view""" - if request.user.is_authenticated(): + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + if request.user.is_authenticated: request.user.last_seen = now() request.user.save(update_fields=['last_seen']) - + response = self.get_response(request) + return response diff --git a/person/migrations/0001_initial.py b/person/migrations/0001_initial.py index b76fa3ae8c7d63ff927d6b1c9cb5e68b7fdcdcc2..2a88d4533e8023e87c026fd4054afd6a46fbdad7 100644 --- a/person/migrations/0001_initial.py +++ b/person/migrations/0001_initial.py @@ -43,7 +43,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=32, verbose_name='User Team')), ('icon', models.ImageField(upload_to='teams', verbose_name='Display Icon')), ('desc', models.TextField(blank=True, null=True, verbose_name='Full Description', validators=[django.core.validators.MaxLengthValidator(10240)])), - ('group', models.OneToOneField(related_name='team', null=True, blank=True, to='auth.Group')), + ('group', models.OneToOneField(related_name='team', null=True, blank=True, to='auth.Group', on_delete=models.CASCADE)), ], options={ 'db_table': 'person_userroll', @@ -65,7 +65,7 @@ class Migration(migrations.Migration): ('gpg_key', models.TextField(blank=True, null=True, verbose_name='GPG Public Key', validators=[django.core.validators.MaxLengthValidator(262144)])), ('last_seen', models.DateTimeField(null=True, blank=True)), ('visits', models.IntegerField(default=0)), - ('user', models.OneToOneField(related_name='details', to=settings.AUTH_USER_MODEL)), + ('user', models.OneToOneField(related_name='details', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ }, diff --git a/person/migrations/0003_auto_20160122_0915.py b/person/migrations/0003_auto_20160122_0915.py index 79fd2144ae249ab3006baa79651e39c5430bcf78..12b06821cb5cc578b2c918ec8b3b08c015ee7c26 100644 --- a/person/migrations/0003_auto_20160122_0915.py +++ b/person/migrations/0003_auto_20160122_0915.py @@ -86,7 +86,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='team', name='group', - field=models.OneToOneField(related_name='team', default=1, to='auth.Group'), + field=models.OneToOneField(related_name='team', default=1, to='auth.Group', on_delete=models.CASCADE), preserve_default=False, ), migrations.AlterField( diff --git a/person/migrations/0017_auto_20170814_0703.py b/person/migrations/0017_auto_20170814_0703.py index d883e73d57a03485d00ad4e4fbd9bba096d9618f..36739f5c81af3209fddec4e9b7d506822d2eacca 100644 --- a/person/migrations/0017_auto_20170814_0703.py +++ b/person/migrations/0017_auto_20170814_0703.py @@ -35,7 +35,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='team', name='group', - field=inkscape.fields.AutoOneToOneField(related_name='team', to='auth.Group'), + field=inkscape.fields.AutoOneToOneField(related_name='team', to='auth.Group', on_delete=models.CASCADE), ), migrations.AlterField( model_name='user', diff --git a/person/migrations/0033_auto_20210817_1818.py b/person/migrations/0033_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..60379961d7e47146f0840fa0fd96e407ee3e7340 --- /dev/null +++ b/person/migrations/0033_auto_20210817_1818.py @@ -0,0 +1,34 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('person', '0032_socialmediasite_is_funding'), + ] + + operations = [ + migrations.AlterField( + model_name='teamchatroom', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], default='en', max_length=5), + ), + migrations.AlterField( + model_name='user', + name='language', + field=models.CharField(blank=True, choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], max_length=8, null=True, verbose_name='Default Language'), + ), + migrations.AlterField( + model_name='user', + name='last_name', + field=models.CharField(blank=True, max_length=150, verbose_name='last name'), + ), + migrations.AlterField( + model_name='usersocialmedia', + name='site', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='users', to='person.SocialMediaSite'), + ), + ] diff --git a/person/models.py b/person/models.py index acc1b063e2b5a495deb5647240e37012a56face2..5cd54dc3d157b83a5a8bef58e7b4f8d8fa660689 100644 --- a/person/models.py +++ b/person/models.py @@ -234,7 +234,7 @@ class User(AbstractUser): def viewer_is_subscribed(self, user): """Returns true if the calling user is subscribed to this user's resources.""" - if user.is_authenticated(): + if user.is_authenticated: try: return bool(self.resources.subscriptions().get(user=user.pk)) except AlertSubscription.DoesNotExist: @@ -269,8 +269,9 @@ class SocialMediaSite(Model): class UserSocialMedia(Model): """Link users to social media sites""" - site = ForeignKey(SocialMediaSite, related_name='users') - user = ForeignKey(User, related_name='social_media_urls') + site = ForeignKey(SocialMediaSite, on_delete=SET_NULL, + related_name='users', null=True) + user = ForeignKey(User, on_delete=CASCADE, related_name='social_media_urls') socid = CharField(_("Username on Website"), max_length=128) url = property(lambda self: self.site.get_url(self.socid)) @@ -313,7 +314,7 @@ class TwilightSparkle(Manager): def i_added(self, user): """Return true if I have added this friend before""" try: - return user.is_authenticated() and bool(self.get(from_user=user.pk)) + return user.is_authenticated and bool(self.get(from_user=user.pk)) except Friendship.DoesNotExist: return False diff --git a/person/team_urls.py b/person/team_urls.py index dc5d31a13e999330b9a9b3bdaed75aca24fbac9c..80b134996f91730a71d93d335a89a52306b8f3a1 100644 --- a/person/team_urls.py +++ b/person/team_urls.py @@ -43,7 +43,7 @@ urlpatterns = [ # pylint: disable=invalid-name url(r'^membership/(?P\d+)/$', MembershipRequestView.as_view(), name='team.membership'), url(r'^charter/$', TeamCharter.as_view(), name='team.charter'), url(r'^list.txt$', TeamMemberList.as_view(), name='team.list'), - url(r'^elections/', include('elections.urls', namespace='elections')), + url(r'^elections/', include('elections.urls')), url(r'^chat/$', ChatWithTeam.as_view(), name='team.chat'), url_tree( diff --git a/person/templatetags/memberships.py b/person/templatetags/memberships.py index e5d7305e2b425adc014d5d8dde431d52047f386b..ed07db1678816aa84e92cfb59ec0830d2a5365c7 100644 --- a/person/templatetags/memberships.py +++ b/person/templatetags/memberships.py @@ -30,7 +30,7 @@ register = Library() # pylint: disable=invalid-name @register.filter() def is_subscribed(this_user, that_user): """Returns true if that_user is subscribed to this_user""" - if this_user.is_authenticated(): + if this_user.is_authenticated: return this_user.viewer_is_subscribed(that_user) return False diff --git a/releases/migrations/0031_auto_20210817_1818.py b/releases/migrations/0031_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..64f6a5e9f4988b3d788ec8d42e10bdfb53a3a255 --- /dev/null +++ b/releases/migrations/0031_auto_20210817_1818.py @@ -0,0 +1,28 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('releases', '0030_auto_20210717_1913'), + ] + + operations = [ + migrations.AlterField( + model_name='platformtranslation', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_index=True, help_text='Which language is this translated into.', max_length=8, verbose_name='Language'), + ), + migrations.AlterField( + model_name='releaseplatformtranslation', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_index=True, help_text='Which language is this translated into.', max_length=8, verbose_name='Language'), + ), + migrations.AlterField( + model_name='releasetranslation', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_index=True, help_text='Which language is this translated into.', max_length=8, verbose_name='Language'), + ), + ] diff --git a/releases/models.py b/releases/models.py index 275b2d1969b1fd5bda774f5fc1bafc3293527238..3a18955b77e6812f6b96f0e678277e204ee35fb6 100644 --- a/releases/models.py +++ b/releases/models.py @@ -197,7 +197,7 @@ class ReleaseFile(Model): disk_file = FileField(upload_to=os.path.join('release', 'media')) original_url = URLField(unique=True, max_length=500, db_index=True) - first_seen = ForeignKey(Release, related_name='auto_media', **null) + first_seen = ForeignKey(Release, on_delete=CASCADE, related_name='auto_media', **null) uploaded_by = ForeignKey(User, on_delete=SET_NULL, **null) def __str__(self): diff --git a/releases/tests/test_admin.py b/releases/tests/test_admin.py index 7812fc5e684e85881a5124603da88ed4db61d1e2..e135c2f4a9129c75ae693a814a8302f18bd5043b 100644 --- a/releases/tests/test_admin.py +++ b/releases/tests/test_admin.py @@ -93,7 +93,7 @@ class TestReleaseForm(AdminFormTestMixin, TestCase): returned = form.parent_queryset(Release.objects.all()) expected = [ Release.objects.get(version=version) - for version in ['1.1', '1.0.x', '0.91', '0.48'] + for version in ['0.91', '0.48', '1.1', '1.0.x'] ] self.assertQuerysetEqual(returned, expected, transform=lambda x: x) diff --git a/releases/tests/test_models.py b/releases/tests/test_models.py index d1cb356b1f4f685bde2cc475cadd4f0c77c608e4..304290e06e57e56608f2d41dbf8e21641a6977a5 100644 --- a/releases/tests/test_models.py +++ b/releases/tests/test_models.py @@ -148,7 +148,8 @@ class TestRelease(base.ModelTestCase): self.instance = self.release = Release.objects.get(version='1.1') def test_model_meta_has_correct_ordering(self): - self.assertEqual(self.release._meta.ordering, ('-release_date', '-version')) + self.assertEqual(self.release._meta.ordering, + ('-release_date', '-version')) def test_model_meta_has_correct_get_latest_by(self): self.assertEqual(self.release._meta.get_latest_by, 'release_date') @@ -232,8 +233,8 @@ class TestRelease(base.ModelTestCase): # We expect all versions to be present since all the versions either # have no parent or they are the children of 1.0 (parent of 1.0.1) - versions = ['1.1', '1.0.x', '1.0.2', '1.0.1', '1.0', - '1.0alpha2', '1.0alpha0', '0.91', '0.48'] + versions = ['1.0.2', '1.0.1', '1.0', '1.0alpha2', '1.0alpha0', + '0.91', '0.48', '1.1', '1.0.x'] self.assertListEqual(list(returned_versions), versions) diff --git a/releases/tests/test_views.py b/releases/tests/test_views.py index d8dda887bb3111743b037c391878a57740d87472..e3ed5d93849fb7d8886817fcbf069ef6bbb3eae8 100644 --- a/releases/tests/test_views.py +++ b/releases/tests/test_views.py @@ -265,16 +265,16 @@ class TestReleaseView(GetTestUsersMixin, base.ViewTestCase): TestData( input='1.1', expected={ - 'revisions': ['1.1', '1.1rc1'], - 'hidden_versions': ['1.1', '1.1rc1'], + 'revisions': ['1.1rc1', '1.1'], + 'hidden_versions': ['1.1rc1', '1.1'], }, case="A top level release that hasn't been released yet." ), TestData( input='1.1rc1', expected={ - 'revisions': ['1.1', '1.1rc1'], - 'hidden_versions': ['1.1', '1.1rc1'], + 'revisions': ['1.1rc1', '1.1'], + 'hidden_versions': ['1.1rc1', '1.1'], }, case="A pre-release whose parent release(1.1) hasn't been released." ), diff --git a/releases/urls.py b/releases/urls.py index 7004d42e41dddbd9508f6294fe0c0a21d2a171dd..2bbc63faa8d75af2a170e39f48a2efad731d3c62 100644 --- a/releases/urls.py +++ b/releases/urls.py @@ -26,6 +26,8 @@ from .views import DownloadRedirect, ReleaseView, PlatformList,\ ReleasePlatformStage, ReleasePlatformView, PlatformView,\ GitMergeRequestList +app_name = 'releases' + version_urls = url_tree( # pylint: disable=invalid-name r'^(?P[\w\+\.-]+)/', url('^$', ReleaseView.as_view(), name="release"), diff --git a/requirements.txt b/requirements.txt index 780882e14946489d957634fc82f11252238c5564..834262de7cc0109578ed4e46e105e8c0bfa04135 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,12 +4,13 @@ unidecode python-dateutil==2.7.3 whoosh==2.7.4 pygments==2.2.0 -django==1.11.15 +django==2.1.15 django-ajax-selects==1.7.0 django-haystack==2.8.1 django-contrib-comments==1.8.0 django-markdown-deux==1.0.5 -django-boxed-alerts==1.3.5 +# django-boxed-alerts==1.3.5 +git+https://gitlab.com/doctormo/django-boxed-alerts#egg=django-boxed-alerts django-ical==1.7.0 django-recurrence==1.10.3 @@ -17,8 +18,10 @@ django-recurrence==1.10.3 django-cms==3.7.3 djangocms-file==2.4.0 cmsplugin-search==0.8.0 -cmsplugin-alerts==1.2.2 -cmsplugin-diff==1.2.3 +# cmsplugin-alerts==1.2.2 +git+https://gitlab.com/pulsar17/django-cmsplugin-alerts#egg=cmsplugin-alerts +# cmsplugin-diff==1.2.3 +git+https://gitlab.com/pulsar17/django-cmsplugin-diff#egg=cmsplugin-diff djangocms-text-ckeditor==3.9.1 # download_remote_images command diff --git a/resources/alert.py b/resources/alert.py index abe9ce9bf78a3819d3881fd4269b93b9d5498905..a6aee6653edd2fb62c4fe22f85443ff2c481905d 100644 --- a/resources/alert.py +++ b/resources/alert.py @@ -106,6 +106,6 @@ class GalleryAlert(AddedAlert): @classmethod def subscriptions_for(cls, user): """Return a list of subscriptions for this user""" - if user is not None and user.is_authenticated(): + if user is not None and user.is_authenticated: return user.alert_subscriptions.filter(alert__slug=cls.slug) return AlertSubscription.objects.none() diff --git a/resources/forms.py b/resources/forms.py index cd2c2ef1d0c030f8fdfc1e2aeab45bbfeb10f053..5669b6308c86588d227c3d687593bd4981e9eb1e 100644 --- a/resources/forms.py +++ b/resources/forms.py @@ -157,7 +157,7 @@ class ResourceBaseForm(ModelForm): for key in self.Meta.required: self.fields[key].required = True - if not self.user.is_authenticated(): + if not self.user.is_authenticated: raise ValueError("Anonymous user can't create or edit resources!") if not self.user.has_perm('resources.change_resourcemirror'): diff --git a/resources/migrations/0001_initial.py b/resources/migrations/0001_initial.py index 3712fe10e9a83d8762f28d9dadabee94a6fab1f5..f226c2a76528558b5f30c3015fa5938d8e12c07c 100644 --- a/resources/migrations/0001_initial.py +++ b/resources/migrations/0001_initial.py @@ -31,7 +31,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='CategoryPlugin', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('limit', models.PositiveIntegerField(verbose_name='Number of items per page')), ('display', models.CharField(blank=True, max_length=32, null=True, verbose_name='Display Style', choices=[('list', 'Gallery List'), ('rows', 'Gallery Rows')])), ('source', models.ForeignKey(to='resources.Category', on_delete=models.CASCADE)), @@ -53,7 +53,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='GalleryPlugin', fields=[ - ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE)), ('limit', models.PositiveIntegerField(verbose_name='Number of items per page')), ('display', models.CharField(blank=True, max_length=32, null=True, verbose_name='Display Style', choices=[('list', 'Gallery List'), ('rows', 'Gallery Rows')])), ('source', models.ForeignKey(to='resources.Gallery', on_delete=models.CASCADE)), diff --git a/resources/migrations/0011_auto_20160131_1814.py b/resources/migrations/0011_auto_20160131_1814.py index 9baf0754a6c0de0520af3b8f82194f5780f6008f..98c82b6b48051a576564fb267835a18c3e8af8db 100644 --- a/resources/migrations/0011_auto_20160131_1814.py +++ b/resources/migrations/0011_auto_20160131_1814.py @@ -6,6 +6,8 @@ from django.db import models, migrations class Migration(migrations.Migration): + atomic = False + dependencies = [ ('resources', '0010_auto_20160130_0259'), ] diff --git a/resources/migrations/0036_auto_20170316_1158.py b/resources/migrations/0036_auto_20170316_1158.py index 9633f15a739abc8e38948ba72ffb9fadf000a31f..48f177b8a3805bbf84c48ce08ddf2f56efacc18c 100644 --- a/resources/migrations/0036_auto_20170316_1158.py +++ b/resources/migrations/0036_auto_20170316_1158.py @@ -15,12 +15,12 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='categoryplugin', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='resources_categoryplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='resources_categoryplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), migrations.AlterField( model_name='galleryplugin', name='cmsplugin_ptr', - field=models.OneToOneField(parent_link=True, related_name='resources_galleryplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin'), + field=models.OneToOneField(parent_link=True, related_name='resources_galleryplugin', auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin', on_delete=models.CASCADE), ), migrations.AlterField( model_name='resource', diff --git a/resources/migrations/0039_auto_20170505_1443.py b/resources/migrations/0039_auto_20170505_1443.py index 1b0d83b7b8dbf74910fdd021f6b1bf951c20b0ab..1723fe4676d925ce51e13774b7f782f86d87b60f 100644 --- a/resources/migrations/0039_auto_20170505_1443.py +++ b/resources/migrations/0039_auto_20170505_1443.py @@ -6,6 +6,8 @@ from django.db import migrations, models class Migration(migrations.Migration): + atomic = False + dependencies = [ ('resources', '0038_resource_is_removed'), ] diff --git a/resources/migrations/0051_auto_20210817_1818.py b/resources/migrations/0051_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..e5228c48e0519a5fc417147b3a5a71ea85334ac7 --- /dev/null +++ b/resources/migrations/0051_auto_20210817_1818.py @@ -0,0 +1,21 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +import cms.utils.permissions +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('resources', '0050_auto_20210617_0027'), + ] + + operations = [ + migrations.AlterField( + model_name='resourcemirror', + name='manager', + field=models.ForeignKey(default=cms.utils.permissions.get_current_user, on_delete=django.db.models.deletion.SET_DEFAULT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/resources/mixins.py b/resources/mixins.py index 43f8fc0b297f74502a14d818169f82a2c056b0eb..d144ce21db7712bd2523f9ebf4ea901124a85115 100644 --- a/resources/mixins.py +++ b/resources/mixins.py @@ -84,7 +84,7 @@ class OwnerUpdateMixin(object): def dispatch(self, request, *args, **kwargs): """ Making sure that only authors can update stories """ if not self.is_allowed(): - if not request.user.is_authenticated() and request.method == 'GET': + if not request.user.is_authenticated and request.method == 'GET': return redirect_to_login(request.build_absolute_uri()) raise PermissionDenied() @@ -125,7 +125,7 @@ class OwnerUpdateMixin(object): class OwnerCreateMixin(OwnerUpdateMixin): """Who is allowed to create things""" def is_allowed(self): - return self.request.user.is_authenticated() + return self.request.user.is_authenticated def get_context_data(self, **kwargs): data = super(OwnerCreateMixin, self).get_context_data(**kwargs) diff --git a/resources/models.py b/resources/models.py index f345bdc713cb8e920dbb059895f79ab3de34bece..b1cd2aefdc3011a3bd5aedb68808ee9196dc7d4f 100644 --- a/resources/models.py +++ b/resources/models.py @@ -30,7 +30,7 @@ from django.db.models import ( ForeignKey, ManyToManyField, OneToOneField, CharField, SlugField, TextField, BooleanField, URLField, FileField, IntegerField, DateTimeField, DateField, PositiveIntegerField, PositiveSmallIntegerField, - SET_NULL, CASCADE, + SET_NULL, CASCADE, SET_DEFAULT ) from django.conf import settings from django.urls import reverse @@ -860,7 +860,8 @@ class MirrorQuerySet(QuerySet): class ResourceMirror(Model): uuid = CharField(_("Unique Identifier"), max_length=64, default=uuid4) name = CharField(max_length=64) - manager = ForeignKey(settings.AUTH_USER_MODEL, default=get_user) + manager = ForeignKey(settings.AUTH_USER_MODEL, on_delete=SET_DEFAULT, + default=get_user) url = URLField(_("Full Base URL")) capacity = PositiveIntegerField(_("Capacity (MB/s)")) created = DateTimeField(default=now) @@ -1143,14 +1144,14 @@ ORDERS = ( class GalleryPlugin(CMSPlugin): limit = PositiveIntegerField(_('Number of items per page')) - source = ForeignKey(Gallery) + source = ForeignKey(Gallery, on_delete=CASCADE) display = CharField(_("Display Style"), max_length=32, choices=DISPLAYS, **NULL) order = CharField(_("Sort Order"), max_length=32, choices=ORDERS, **NULL) class CategoryPlugin(CMSPlugin): limit = PositiveIntegerField(_('Number of items per page')) - source = ForeignKey(Category) + source = ForeignKey(Category, on_delete=CASCADE) display = CharField(_("Display Style"), max_length=32, choices=DISPLAYS, **NULL) order = CharField(_("Sort Order"), max_length=32, choices=ORDERS, **NULL) diff --git a/resources/templatetags/galleries.py b/resources/templatetags/galleries.py index c62b6b5869b1e21c16842d89d4c1032ec3e15989..8abed1a7025d009e568237996284d4f306c81a97 100644 --- a/resources/templatetags/galleries.py +++ b/resources/templatetags/galleries.py @@ -29,7 +29,7 @@ register = Library() # pylint: disable=invalid-name def is_gallery_subscribed(user, gallery): """Is the user subscribed to this gallery""" from ..alert import GalleryAlert - if user.is_authenticated(): + if user.is_authenticated: subs = GalleryAlert.subscriptions_for(user) return subs.filter(target=gallery.pk) return False diff --git a/resources/video_url.py b/resources/video_url.py index 5097fae977a542bebe0f67bc8c3f6cec5292470f..ae62e151492f03ddb865db7d66a612a60423c620 100644 --- a/resources/video_url.py +++ b/resources/video_url.py @@ -112,7 +112,7 @@ def parse_any_url(query, user, allow_any=False): and match_v['type'] == is_video['type']: return match - if user.is_authenticated(): + if user.is_authenticated: # Create a new video object in our resource database. details = video_detect(query, True) obj = Resource( @@ -149,7 +149,7 @@ def parse_any_url(query, user, allow_any=False): desc = details['description'] rendering = url_filefield(details['image']) - if user.is_authenticated(): + if user.is_authenticated: # Create a new link object in our resource database. ret = Resource(user=user, name=name, owner_name='Internet', desc=desc, rendering=rendering, link=query, owner=False, published=False) diff --git a/resources/views.py b/resources/views.py index c824826d8c593dc9e2043a1eaa4988765a8805b4..6a489f8c18cb4e97d182796f53b39602a18635b8 100644 --- a/resources/views.py +++ b/resources/views.py @@ -134,7 +134,7 @@ class CheckResource(SingleObjectMixin, RedirectView): obj = self.get_object() gallery = obj.gallery - if not request.user.is_authenticated() and gallery.user != request.user and \ + if not request.user.is_authenticated and gallery.user != request.user and \ (gallery.group not in request.user.groups.all()): raise PermissionDenied() @@ -265,7 +265,7 @@ class QuotaJson(View): """Returns a Json snippet with information about a user's quota""" def get(self, request): context = {'user': 'unknown', 'quota': 0, 'used': 0} - if request.user.is_authenticated(): + if request.user.is_authenticated: context.update({ 'user': request.user.username, 'used': request.user.resources.disk_usage(), @@ -527,7 +527,7 @@ class UnpublishedGallery(ListView): def get_queryset(self): qset = super().get_queryset() - if self.request.user.is_authenticated(): + if self.request.user.is_authenticated: qset = qset.filter(published=False, is_removed=False, user=self.request.user) else: qset = qset.none() @@ -602,7 +602,7 @@ class ResourceList(CategoryListView): def in_team(self): """Returns True if the user is in a team""" if not hasattr(self.request, 'my_in_team'): - if self.request.user.is_authenticated(): + if self.request.user.is_authenticated: teams = self.request.user.teams else: teams = Team.objects.none() diff --git a/stats/admin.py b/stats/admin.py index 8397855781ada64028207708bb9a27358db595e5..fe554181acba83fb3d9d501b73dce64d0f4d250d 100644 --- a/stats/admin.py +++ b/stats/admin.py @@ -21,7 +21,6 @@ Admin for website stats (mostly debugging) """ -#from django.utils.text import mark_safe from django.contrib.admin import ModelAdmin, register from .models import ( diff --git a/stats/migrations/0004_auto_20210817_1818.py b/stats/migrations/0004_auto_20210817_1818.py new file mode 100644 index 0000000000000000000000000000000000000000..9ec5bf057148892428e90f70c8bd66a391cf848f --- /dev/null +++ b/stats/migrations/0004_auto_20210817_1818.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0 on 2021-08-17 18:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('stats', '0003_auto_20200916_0806'), + ] + + operations = [ + migrations.AlterField( + model_name='languageaccess', + name='language', + field=models.CharField(choices=[('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kab', 'Kabyle'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokmål'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')], db_index=True, max_length=8), + ), + ] diff --git a/utils/reset_password_url.py b/utils/reset_password_url.py index ba4fa74a1666e58bbe4b9f821a166984f2aafdb6..b251eb98a8bdad0e8a54bb6ef29bfd6add28b2d9 100644 --- a/utils/reset_password_url.py +++ b/utils/reset_password_url.py @@ -22,7 +22,7 @@ except ImportError as err: from django.contrib.auth.tokens import default_token_generator from django.utils.http import urlsafe_base64_encode from django.utils.encoding import force_bytes -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.sites.models import Site from person.models import User