diff --git a/fargo/fargo/api_views.py b/fargo/fargo/api_views.py index b514cea..222b44b 100644 --- a/fargo/fargo/api_views.py +++ b/fargo/fargo/api_views.py @@ -17,7 +17,7 @@ import datetime from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from django.utils.text import slugify from django.utils.timezone import now diff --git a/fargo/fargo/migrations/0001_initial.py b/fargo/fargo/migrations/0001_initial.py index 13ad4a9..cb00a77 100644 --- a/fargo/fargo/migrations/0001_initial.py +++ b/fargo/fargo/migrations/0001_initial.py @@ -19,7 +19,7 @@ class Migration(migrations.Migration): ('document_filename', models.CharField(max_length=512, verbose_name='document filename')), ('document_file', models.FileField(upload_to=b'', verbose_name='file')), ('creation', models.DateTimeField(auto_now_add=True, verbose_name='creation date')), - ('user', models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ }, diff --git a/fargo/fargo/migrations/0001_squashed_0017_auto_20180331_1532.py b/fargo/fargo/migrations/0001_squashed_0017_auto_20180331_1532.py index 8de7d37..63528ea 100644 --- a/fargo/fargo/migrations/0001_squashed_0017_auto_20180331_1532.py +++ b/fargo/fargo/migrations/0001_squashed_0017_auto_20180331_1532.py @@ -53,9 +53,9 @@ class Migration(migrations.Migration): ('title', models.CharField(max_length=200, verbose_name='title', blank=True)), ('description', models.TextField(verbose_name='description', blank=True)), ('expiration_date', models.DateField(null=True, verbose_name='expiration date', blank=True)), - ('document', models.ForeignKey(related_name='user_documents', verbose_name='document', to='fargo.Document')), - ('origin', models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True)), - ('user', models.ForeignKey(related_name='user_documents', verbose_name='user', to=settings.AUTH_USER_MODEL)), + ('document', models.ForeignKey(related_name='user_documents', verbose_name='document', to='fargo.Document', on_delete=models.CASCADE)), + ('origin', models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True, on_delete=models.CASCADE)), + ('user', models.ForeignKey(related_name='user_documents', verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ 'ordering': ('-created', 'user'), @@ -74,8 +74,8 @@ class Migration(migrations.Migration): ('end', models.DateField(verbose_name='end date')), ('creator', models.CharField(max_length=256, verbose_name='creator')), ('created', models.DateTimeField(verbose_name='creation date')), - ('origin', models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True)), - ('user', models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL)), + ('origin', models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True, on_delete=models.CASCADE)), + ('user', models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], ), ] diff --git a/fargo/fargo/migrations/0003_auto_20150924_1056.py b/fargo/fargo/migrations/0003_auto_20150924_1056.py index e566aac..61804ac 100644 --- a/fargo/fargo/migrations/0003_auto_20150924_1056.py +++ b/fargo/fargo/migrations/0003_auto_20150924_1056.py @@ -49,7 +49,7 @@ class Migration(migrations.Migration): ('end', models.DateField(verbose_name='end date')), ('creator', models.CharField(max_length=256, verbose_name='creator')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='creation date')), - ('user_document', models.ForeignKey(verbose_name='user document', to='fargo.UserDocument')), + ('user_document', models.ForeignKey(verbose_name='user document', to='fargo.UserDocument', on_delete=models.CASCADE)), ], ), migrations.AlterModelOptions( @@ -86,12 +86,12 @@ class Migration(migrations.Migration): migrations.AddField( model_name='userdocument', name='document', - field=models.ForeignKey(related_name='user_documents', verbose_name='document', to='fargo.Document'), + field=models.ForeignKey(related_name='user_documents', verbose_name='document', to='fargo.Document', on_delete=models.CASCADE), ), migrations.AddField( model_name='userdocument', name='user', - field=models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), migrations.RunPython(noop, clear_document), ] diff --git a/fargo/fargo/migrations/0004_auto_20160212_0936.py b/fargo/fargo/migrations/0004_auto_20160212_0936.py index 83ce764..46eb22d 100644 --- a/fargo/fargo/migrations/0004_auto_20160212_0936.py +++ b/fargo/fargo/migrations/0004_auto_20160212_0936.py @@ -25,7 +25,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='userdocument', name='origin', - field=models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True), + field=models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True, on_delete=models.CASCADE), preserve_default=True, ), ] diff --git a/fargo/fargo/migrations/0005_auto_20160312_1809.py b/fargo/fargo/migrations/0005_auto_20160312_1809.py index b750e8c..41f4579 100644 --- a/fargo/fargo/migrations/0005_auto_20160312_1809.py +++ b/fargo/fargo/migrations/0005_auto_20160312_1809.py @@ -21,6 +21,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='validation', name='user', - field=models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL, null=True), + field=models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE), ), ] diff --git a/fargo/fargo/migrations/0007_auto_20160312_1816.py b/fargo/fargo/migrations/0007_auto_20160312_1816.py index 71210fb..b2f4985 100644 --- a/fargo/fargo/migrations/0007_auto_20160312_1816.py +++ b/fargo/fargo/migrations/0007_auto_20160312_1816.py @@ -19,6 +19,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='validation', name='user', - field=models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), ] diff --git a/fargo/fargo/migrations/0008_validation_origin.py b/fargo/fargo/migrations/0008_validation_origin.py index e392eb6..955e2fb 100644 --- a/fargo/fargo/migrations/0008_validation_origin.py +++ b/fargo/fargo/migrations/0008_validation_origin.py @@ -14,6 +14,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='validation', name='origin', - field=models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True), + field=models.ForeignKey(verbose_name='origin', to='fargo.Origin', null=True, on_delete=models.CASCADE), ), ] diff --git a/fargo/fargo/migrations/0010_auto_20160413_0809.py b/fargo/fargo/migrations/0010_auto_20160413_0809.py index eafd66c..3e28d92 100644 --- a/fargo/fargo/migrations/0010_auto_20160413_0809.py +++ b/fargo/fargo/migrations/0010_auto_20160413_0809.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='userdocument', name='user', - field=models.ForeignKey(related_name='user_documents', verbose_name='user', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(related_name='user_documents', verbose_name='user', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), migrations.AlterField( model_name='validation', diff --git a/fargo/fargo/models.py b/fargo/fargo/models.py index 547d16a..677456d 100644 --- a/fargo/fargo/models.py +++ b/fargo/fargo/models.py @@ -22,7 +22,7 @@ import re import threading from django.conf import settings -from django.core.urlresolvers import reverse +from django.urls import reverse from django.db import models from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ @@ -62,11 +62,13 @@ class UserDocument(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_('user'), - related_name='user_documents') + related_name='user_documents', + on_delete=models.CASCADE) document = models.ForeignKey( 'Document', related_name='user_documents', - verbose_name=_('document')) + verbose_name=_('document'), + on_delete=models.CASCADE) filename = models.CharField( verbose_name=_('filename'), max_length=512) @@ -76,7 +78,8 @@ class UserDocument(models.Model): origin = models.ForeignKey( Origin, verbose_name=_('origin'), - null=True) + null=True, + on_delete=models.CASCADE) deletable_by_user = models.BooleanField( verbose_name=_('deletable by user'), default=True) @@ -132,7 +135,8 @@ class Validation(models.Model): ''' user = models.ForeignKey( settings.AUTH_USER_MODEL, - verbose_name=_('user')) + verbose_name=_('user'), + on_delete=models.CASCADE) content_hash = models.CharField( max_length=128, verbose_name=_('content hash'), @@ -141,7 +145,8 @@ class Validation(models.Model): origin = models.ForeignKey( Origin, verbose_name=_('origin'), - null=True) + null=True, + on_delete=models.CASCADE) document_type = models.CharField(max_length=256, verbose_name=_('document type')) data = JSONField(null=True, verbose_name=_('data')) start = models.DateField(verbose_name=_('start date')) diff --git a/fargo/fargo/views.py b/fargo/fargo/views.py index 8b95bbb..76edc22 100644 --- a/fargo/fargo/views.py +++ b/fargo/fargo/views.py @@ -21,7 +21,7 @@ from copy import deepcopy from django.core.exceptions import PermissionDenied from django.views.decorators.clickjacking import xframe_options_exempt from django.views.generic import CreateView, DeleteView, UpdateView, View, TemplateView -from django.core.urlresolvers import reverse, reverse_lazy +from django.urls import reverse, reverse_lazy from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, resolve_url from django.http import (HttpResponse, HttpResponseRedirect, @@ -35,6 +35,8 @@ from django.utils.http import quote from django.utils.translation import ugettext as _ from django.utils.decorators import method_decorator from django.utils.functional import cached_property +from django.utils.decorators import method_decorator +from django.views.decorators.cache import never_cache from django.conf import settings from django_tables2 import SingleTableMixin @@ -290,24 +292,29 @@ class ChooseDocumentKind(TemplateView): return ctx -def login(request, *args, **kwargs): - if any(get_idps()): - if 'next' not in request.GET: - return HttpResponseRedirect(resolve_url('mellon_login')) - return HttpResponseRedirect(resolve_url('mellon_login') + '?next=' - + quote(request.GET.get('next'))) - return auth_views.login(request, *args, **kwargs) +class LoginView(auth_views.LoginView): + def get(self, request, *args, **kwargs): + if any(get_idps()): + if not 'next' in request.GET: + return HttpResponseRedirect(resolve_url('mellon_login')) + return HttpResponseRedirect( + resolve_url('mellon_login') + '?next=' + quote(request.GET.get('next')) + ) + return super(LoginView, self).get(request, *args, **kwargs) -def logout(request, next_page=None): - if any(get_idps()): - return HttpResponseRedirect(resolve_url('mellon_logout')) - auth_logout(request) - if next_page is not None: - next_page = resolve_url(next_page) - else: - next_page = '/' - return HttpResponseRedirect(next_page) +login = LoginView.as_view() + + +class LogoutView(auth_views.LogoutView): + @method_decorator(never_cache) + def dispatch(self, request, *args, **kwargs): + if any(get_idps()): + return HttpResponseRedirect(resolve_url('mellon_logout')) + return super(LogoutView, self).dispatch(request, *args, **kwargs) + + +logout = LogoutView.as_view() class DocumentTypes(View): diff --git a/fargo/oauth2/authentication.py b/fargo/oauth2/authentication.py index 4b6513a..ea5ff47 100644 --- a/fargo/oauth2/authentication.py +++ b/fargo/oauth2/authentication.py @@ -90,7 +90,7 @@ class FargoOAUTH2Authentication(BasicAuthentication): return True, None - def authenticate_credentials(self, client_id, client_secret): + def authenticate_credentials(self, client_id, client_secret, request=None): try: client = OAuth2Client.objects.get( client_id=client_id, client_secret=client_secret) diff --git a/fargo/oauth2/management/commands/oauth2-put-document.py b/fargo/oauth2/management/commands/oauth2-put-document.py index b0df95e..22fefc6 100644 --- a/fargo/oauth2/management/commands/oauth2-put-document.py +++ b/fargo/oauth2/management/commands/oauth2-put-document.py @@ -18,7 +18,7 @@ import os from django.core.management.base import BaseCommand from django.core.files.base import ContentFile -from django.core.urlresolvers import reverse +from django.urls import reverse from fargo.utils import make_url from fargo.fargo.models import Document diff --git a/fargo/oauth2/migrations/0001_initial.py b/fargo/oauth2/migrations/0001_initial.py index 2179119..9d16860 100644 --- a/fargo/oauth2/migrations/0001_initial.py +++ b/fargo/oauth2/migrations/0001_initial.py @@ -19,7 +19,7 @@ class Migration(migrations.Migration): ('access_token', models.CharField(default=fargo.oauth2.models.generate_uuid, max_length=255)), ('code', models.CharField(default=fargo.oauth2.models.generate_uuid, max_length=255)), ('creation_date', models.DateTimeField(auto_now=True)), - ('user_document', models.ForeignKey(to='fargo.UserDocument')), + ('user_document', models.ForeignKey(to='fargo.UserDocument', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -37,7 +37,7 @@ class Migration(migrations.Migration): fields=[ ('hash_key', models.CharField(max_length=128, serialize=False, primary_key=True)), ('filename', models.CharField(max_length=512)), - ('document', models.ForeignKey(to='fargo.Document', related_name='oauth2_tempfiles')), + ('document', models.ForeignKey(to='fargo.Document', related_name='oauth2_tempfiles', on_delete=models.CASCADE)), ], ), ] diff --git a/fargo/oauth2/migrations/0001_squashed_0005_auto_20180331_1532.py b/fargo/oauth2/migrations/0001_squashed_0005_auto_20180331_1532.py index 0d87a5a..a3ea952 100644 --- a/fargo/oauth2/migrations/0001_squashed_0005_auto_20180331_1532.py +++ b/fargo/oauth2/migrations/0001_squashed_0005_auto_20180331_1532.py @@ -53,8 +53,8 @@ class Migration(migrations.Migration): ('uuid', models.CharField(default=fargo.oauth2.models.generate_uuid, max_length=32, serialize=False, primary_key=True)), ('filename', models.CharField(max_length=512)), ('creation_date', models.DateTimeField(auto_now_add=True)), - ('client', models.ForeignKey(to='oauth2.OAuth2Client')), - ('document', models.ForeignKey(related_name='oauth2_tempfiles', to='fargo.Document')), + ('client', models.ForeignKey(to='oauth2.OAuth2Client', on_delete=models.CASCADE)), + ('document', models.ForeignKey(related_name='oauth2_tempfiles', to='fargo.Document', on_delete=models.CASCADE)), ], options={ 'ordering': ('creation_date',), @@ -65,11 +65,11 @@ class Migration(migrations.Migration): migrations.AddField( model_name='oauth2authorize', name='client', - field=models.ForeignKey(to='oauth2.OAuth2Client'), + field=models.ForeignKey(to='oauth2.OAuth2Client', on_delete=models.CASCADE), ), migrations.AddField( model_name='oauth2authorize', name='user_document', - field=models.ForeignKey(to='fargo.UserDocument'), + field=models.ForeignKey(to='fargo.UserDocument', on_delete=models.CASCADE), ), ] diff --git a/fargo/oauth2/models.py b/fargo/oauth2/models.py index afd4498..80f50a1 100644 --- a/fargo/oauth2/models.py +++ b/fargo/oauth2/models.py @@ -82,8 +82,8 @@ class CleanupQuerySet(QuerySet): class OAuth2Authorize(models.Model): - client = models.ForeignKey(OAuth2Client) - user_document = models.ForeignKey(UserDocument) + client = models.ForeignKey(OAuth2Client, on_delete=models.CASCADE) + user_document = models.ForeignKey(UserDocument, on_delete=models.CASCADE) access_token = models.CharField(max_length=255, default=generate_uuid) code = models.CharField(max_length=255, default=generate_uuid) creation_date = models.DateTimeField(auto_now_add=True) @@ -107,8 +107,8 @@ class OAuth2Authorize(models.Model): class OAuth2TempFile(models.Model): uuid = models.CharField(max_length=32, default=generate_uuid, primary_key=True) - client = models.ForeignKey(OAuth2Client) - document = models.ForeignKey(Document, related_name='oauth2_tempfiles') + client = models.ForeignKey(OAuth2Client, on_delete=models.CASCADE) + document = models.ForeignKey(Document, related_name='oauth2_tempfiles', on_delete=models.CASCADE) filename = models.CharField(max_length=512) creation_date = models.DateTimeField(auto_now_add=True) diff --git a/fargo/oauth2/views.py b/fargo/oauth2/views.py index 1f99172..63176bc 100644 --- a/fargo/oauth2/views.py +++ b/fargo/oauth2/views.py @@ -21,7 +21,7 @@ from django.utils.http import quote from django.utils.translation import ugettext as _ from django.utils.timezone import now from django.core.files.base import ContentFile -from django.core.urlresolvers import reverse +from django.urls import reverse from django.http import (HttpResponse, HttpResponseBadRequest, HttpResponseRedirect) from django.views.decorators.csrf import csrf_exempt diff --git a/fargo/settings.py b/fargo/settings.py index a49a7a1..6d7afa7 100644 --- a/fargo/settings.py +++ b/fargo/settings.py @@ -60,12 +60,11 @@ INSTALLED_APPS = ( 'sorl.thumbnail', ) -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) @@ -217,7 +216,7 @@ REST_FRAMEWORK = { 'rest_framework.permissions.IsAdminUser', ), 'DEFAULT_FILTER_BACKENDS': ( - 'rest_framework.filters.DjangoFilterBackend', + 'django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.OrderingFilter', ), 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', diff --git a/fargo/urls.py b/fargo/urls.py index bcb819f..46b9f56 100644 --- a/fargo/urls.py +++ b/fargo/urls.py @@ -37,7 +37,7 @@ urlpatterns = [ url(r'^upload/$', upload, name='upload'), url(r'^remote-download/(?P[^/]*)$', remote_download, name='remote_download'), - url(r'^admin/', include(admin.site.urls)), + url(r'^admin/', admin.site.urls), url(r'^login/$', login, name='auth_login'), url(r'^logout/$', logout, name='auth_logout'), url(r'^document-types/$', document_types, name='document_types'), diff --git a/setup.py b/setup.py index 9cfc1e0..b954622 100755 --- a/setup.py +++ b/setup.py @@ -107,12 +107,12 @@ setup( 'Programming Language :: Python :: 2', ], install_requires=[ - 'django>=1.11,<1.12', + 'django>=1.11,<2.3', 'gadjo', 'django-tables2>=1.5,<2.0', 'django-jsonfield >= 0.9.3', - 'django-filter>1,<2', - 'djangorestframework>=3.4,<3.7', + 'django-filter>1,<2.2', + 'djangorestframework>=3.4,<3.8', 'file-magic', 'requests', 'sorl-thumbnail', diff --git a/tests/test_oauth2.py b/tests/test_oauth2.py index 17cf7ec..455389c 100644 --- a/tests/test_oauth2.py +++ b/tests/test_oauth2.py @@ -20,7 +20,7 @@ import json import mock import pytest -from django.core.urlresolvers import reverse +from django.urls import reverse from django.core.management import call_command from django.utils.http import quote, urlencode from django.utils.six.moves.urllib import parse as urlparse diff --git a/tests/test_public.py b/tests/test_public.py index 700a6f7..ca505dc 100644 --- a/tests/test_public.py +++ b/tests/test_public.py @@ -19,7 +19,7 @@ from webtest import Upload import pytest -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.six.moves.urllib import parse as urlparse try: diff --git a/tox.ini b/tox.ini index 9d0c782..55f5eab 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] toxworkdir = {env:TMPDIR:/tmp}/tox-{env:USER}/fargo/{env:BRANCH_NAME:} -envlist = {py2,py3}-dj111-{sqlite,pg}-coverage-pylint +envlist = py3-dj111-{sqlite,pg}-coverage-pylint,py3-dj22-pg [testenv] usedevelop = True @@ -15,18 +15,19 @@ setenv = deps = pytest pg: psycopg2 - pylint<1.8 - pylint-django<0.8.1 + pylint + pylint-django attrs<19.2 + dj111: django>=1.11,<1.12 + dj22: django>=2.2,<2.3 pytest-cov pytest-random pytest-mock pytest-django pytest-freezegun - django-webtest<1.9.3 + django-webtest WebTest mock - py2: django-jsonfield<1.3 commands = py.test {env:COVERAGE:} {posargs:tests/} pylint: ./pylint.sh fargo/