From ecf34d9039af4f1538dcc706be61bc302c1befd0 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 18:33:59 +0300 Subject: [PATCH 01/11] Fix deprecations in project --- infoscreen/models.py | 2 +- kaehmy/models.py | 2 +- webapp/models.py | 2 +- webapp/views.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/infoscreen/models.py b/infoscreen/models.py index 54c6271..18d2b0a 100644 --- a/infoscreen/models.py +++ b/infoscreen/models.py @@ -321,7 +321,7 @@ class ExternalImageInfoItem(InfoItem): class InfoInstance(models.Model): """Class for Info instance in Infoscreen.""" - rotation = models.ForeignKey('Rotation', related_name='instances') + rotation = models.ForeignKey('Rotation', related_name='instances', on_delete=models.CASCADE) duration = models.FloatField(default=15.0) # seconds # generic relation to some kind of InfoItem item_id = models.PositiveIntegerField() diff --git a/kaehmy/models.py b/kaehmy/models.py index dcafbf5..237c349 100644 --- a/kaehmy/models.py +++ b/kaehmy/models.py @@ -56,7 +56,7 @@ class Comment(CommentParent): verbose_name_plural = _('Kaehmykommentit') message = models.TextField(_('Message')) - parent = models.ForeignKey('CommentParent', related_name='messages') + parent = models.ForeignKey('CommentParent', related_name='messages', on_delete=models.CASCADE) class Application(CommentParent): diff --git a/webapp/models.py b/webapp/models.py index 169e5a6..7549942 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -138,7 +138,7 @@ class Role(PresetRole): start_date = models.DateField(_('Start date')) end_date = models.DateField(_('End date')) - official = models.ForeignKey('Official', related_name='roles') + official = models.ForeignKey('Official', related_name='roles', on_delete=models.CASCADE) class Official(User): diff --git a/webapp/views.py b/webapp/views.py index fa6d43d..e663a58 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -40,7 +40,7 @@ def login_view(request, *args, **kwargs): # user got here by a get request user = request.user - if user.is_authenticated(): + if user.is_authenticated: # user shoud not be here authenticated with get but get rid if is return redirect("/") return render(request, "login.html", {}) From 0f8a7d76dae96418d717691444a2fb35afad3642 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 18:46:35 +0300 Subject: [PATCH 02/11] Update auditlog --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index dcacff6..ba5ca0e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,7 +23,7 @@ django-tables2==1.6.1 pycodestyle==2.3.1 dealer==2.0.5 django-modeltranslation==0.12.1 -django-auditlog==0.4.3 +django-auditlog==0.4.5 django-phonenumber-field==1.3.0 django-autocomplete-light==3.2.10 six==1.10.0 From 7bc77ef2326e982ed3d1f720b32ec23bd744a713 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 18:49:01 +0300 Subject: [PATCH 03/11] Update django-suit --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ba5ca0e..690cf3d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,7 +27,7 @@ django-auditlog==0.4.5 django-phonenumber-field==1.3.0 django-autocomplete-light==3.2.10 six==1.10.0 -django-suit==0.2.25 +django-suit==0.2.26 telepot==12.3 django-password-reset==1.0 pyexcel==0.5.7 From e25041d38db457c3bfb4a84d2bc2d6f2617eb9ef Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 18:57:29 +0300 Subject: [PATCH 04/11] Update django-nose --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 690cf3d..abd8dff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ django-nocaptcha-recaptcha==0.0.19 django-cors-headers==2.0.1 djangorestframework==3.5.3 coverage==4.3.4 -django-nose==1.4.4 +django-nose==1.4.5 nose-exclude==0.5.0 psycopg2==2.7.1 django-bootstrap3==8.2.3 From 48b6ed5b69093e2ed43b69b91868af9e1fb02bf1 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Wed, 9 May 2018 20:03:30 +0300 Subject: [PATCH 05/11] Update Django 2.0 --- requirements.txt | 8 ++++---- sikweb/base.py | 6 ++++-- sikweb/middleware.py | 7 +++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/requirements.txt b/requirements.txt index abd8dff..b2152fa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ backports.shutil-get-terminal-size==1.0.0 decorator==4.0.9 -Django==1.11 +Django==2.0 ipython==4.2.0 ipython-genutils==0.1.0 pexpect==4.1.0 @@ -13,7 +13,7 @@ Pillow==4.3.0 requests==2.11.1 django-nocaptcha-recaptcha==0.0.19 django-cors-headers==2.0.1 -djangorestframework==3.5.3 +djangorestframework==3.8.2 coverage==4.3.4 django-nose==1.4.5 nose-exclude==0.5.0 @@ -22,14 +22,14 @@ django-bootstrap3==8.2.3 django-tables2==1.6.1 pycodestyle==2.3.1 dealer==2.0.5 -django-modeltranslation==0.12.1 +django-modeltranslation==0.13b1 django-auditlog==0.4.5 django-phonenumber-field==1.3.0 django-autocomplete-light==3.2.10 six==1.10.0 django-suit==0.2.26 telepot==12.3 -django-password-reset==1.0 +django-password-reset==1.0.1 pyexcel==0.5.7 pyexcel-xlsx==0.5.5 django-import-export==0.7.0 diff --git a/sikweb/base.py b/sikweb/base.py index 94ef3eb..b5422a7 100644 --- a/sikweb/base.py +++ b/sikweb/base.py @@ -118,7 +118,7 @@ NOSE_ARGS = [ '--exclude-dir={}'.format(os.path.join(BASE_DIR, 'webapp', 'migrations')), ] -MIDDLEWARE_CLASSES = [ +MIDDLEWARE = [ 'sikweb.middleware.ForceDefaultLanguageMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -127,11 +127,13 @@ 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', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'auditlog.middleware.AuditlogMiddleware' ] +MIDDLEWARE_CLASSES = [ + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', +] CORS_ORIGIN_ALLOW_ALL = True ROOT_URLCONF = 'sikweb.urls' diff --git a/sikweb/middleware.py b/sikweb/middleware.py index 8ad8c13..11e924d 100644 --- a/sikweb/middleware.py +++ b/sikweb/middleware.py @@ -1,4 +1,4 @@ -class ForceDefaultLanguageMiddleware(object): +def ForceDefaultLanguageMiddleware(get_response): """ Ignore Accept-Language HTTP headers @@ -8,6 +8,9 @@ class ForceDefaultLanguageMiddleware(object): Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'], namely django.middleware.locale.LocaleMiddleware """ - def process_request(self, request): + def process_request(request): if 'HTTP_ACCEPT_LANGUAGE' in request.META: del request.META['HTTP_ACCEPT_LANGUAGE'] + return get_response(request) + + return process_request From 11b6e68fe141179c123d875172e17d22dc7bd909 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 17 Jul 2018 20:58:13 +0300 Subject: [PATCH 06/11] Remove password_reset and own login, redirect to admin/login Django admin login to be used. Thus we should be able to upgrade to Django2.0 --- infoscreen/templates/infoscreen_admin.html | 2 +- infoscreen/views/admin_views.py | 16 +++++------ members/templates/base.html | 2 +- members/urls.py | 2 +- members/views/applications.py | 12 ++++----- members/views/members.py | 18 ++++++------- members/views/payments.py | 14 +++++----- members/views/utils.py | 4 +-- requirements.txt | 6 +---- sikweb/base.py | 1 - sikweb/urls.py | 2 -- templates/login.html | 30 --------------------- templates/password_reset/base.html | 1 - templates/password_reset/recovery_done.html | 8 ------ templates/password_reset/recovery_form.html | 12 --------- templates/password_reset/reset.html | 14 ---------- templates/password_reset/reset_mail.html | 15 ----------- templates/password_reset/reset_sent.html | 8 ------ webapp/urls.py | 8 +++--- webapp/views.py | 30 --------------------- 20 files changed, 40 insertions(+), 165 deletions(-) delete mode 100644 templates/login.html delete mode 100644 templates/password_reset/base.html delete mode 100644 templates/password_reset/recovery_done.html delete mode 100644 templates/password_reset/recovery_form.html delete mode 100644 templates/password_reset/reset.html delete mode 100644 templates/password_reset/reset_mail.html delete mode 100644 templates/password_reset/reset_sent.html diff --git a/infoscreen/templates/infoscreen_admin.html b/infoscreen/templates/infoscreen_admin.html index c7fb503..47d3258 100644 --- a/infoscreen/templates/infoscreen_admin.html +++ b/infoscreen/templates/infoscreen_admin.html @@ -22,7 +22,7 @@ {% block body %} -{% endblock content %} diff --git a/templates/password_reset/base.html b/templates/password_reset/base.html deleted file mode 100644 index d6c32ad..0000000 --- a/templates/password_reset/base.html +++ /dev/null @@ -1 +0,0 @@ -{% extends "login.html" %} \ No newline at end of file diff --git a/templates/password_reset/recovery_done.html b/templates/password_reset/recovery_done.html deleted file mode 100644 index 164b8ff..0000000 --- a/templates/password_reset/recovery_done.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "password_reset/base.html" %}{% load i18n %} - -{% block title %}{% trans "New password set" %}{% endblock %} - -{% block content %} -

{% trans "Your password has successfully been reset. You can use it right now on the login page." %}

-

Log in

-{% endblock %} \ No newline at end of file diff --git a/templates/password_reset/recovery_form.html b/templates/password_reset/recovery_form.html deleted file mode 100644 index ae8f7c2..0000000 --- a/templates/password_reset/recovery_form.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "password_reset/base.html" %} -{% load i18n %} -{% load bootstrap3 %} - -{% block content %} -

{% trans "Password recovery" %}

-
- {% csrf_token %} - {% bootstrap_form form %} -

-
-{% endblock %} \ No newline at end of file diff --git a/templates/password_reset/reset.html b/templates/password_reset/reset.html deleted file mode 100644 index ab1cd5c..0000000 --- a/templates/password_reset/reset.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "password_reset/base.html" %}{% load i18n %} - -{% block content %} - {% if invalid %}{% url "password_reset_recover" as recovery_url %} -

{% blocktrans %}Sorry, this password reset link is invalid. You can still request a new one.{% endblocktrans %}

- {% else %} -

{% blocktrans %}Hi, {{ username }}. Please choose your new password.{% endblocktrans %}

-
- {% csrf_token %} - {{ form.as_p }} -

-
- {% endif %} -{% endblock %} \ No newline at end of file diff --git a/templates/password_reset/reset_mail.html b/templates/password_reset/reset_mail.html deleted file mode 100644 index c1ef31f..0000000 --- a/templates/password_reset/reset_mail.html +++ /dev/null @@ -1,15 +0,0 @@ -{% autoescape off %} -You're receiving this e-mail because you requested a password reset for your user account at {{ site_name }}. - -Please go to the following page and choose a new password: -{% block reset_link %} -{{ protocol }}://{{ domain }}{% url django.contrib.auth.views.password_reset_confirm uidb36=uid, token=token %} -{% endblock %} - -Your username, in case you've forgotten: {{ user.username }} - -Thanks for using our site! - -The {{ site_name }} team. - -{% endautoescape %} \ No newline at end of file diff --git a/templates/password_reset/reset_sent.html b/templates/password_reset/reset_sent.html deleted file mode 100644 index 15d12d7..0000000 --- a/templates/password_reset/reset_sent.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "password_reset/base.html" %} -{% load i18n %} - -{% block title %}{% trans "Password recovery sent" %}{% endblock %} - -{% block content %} -

{% blocktrans with ago=timestamp|timesince %}An email was sent to {{ email }} {{ ago }} ago. Use the link in it to set a new password.{% endblocktrans %}

-{% endblock %} \ No newline at end of file diff --git a/webapp/urls.py b/webapp/urls.py index dfd12a9..4f5d6e1 100644 --- a/webapp/urls.py +++ b/webapp/urls.py @@ -7,8 +7,8 @@ from rest_framework import routers # from django.utils.translation import ugettext_lazy as _ # from webapp.views import main_index -from webapp.views import login_view -from webapp.views import logout_view +# from webapp.views import login_view +# from webapp.views import logout_view # from webapp.views import about_view # from webapp.views import guild_view # from webapp.views import freshmen_view @@ -28,8 +28,8 @@ router.register(r'signup', SignupViewSet) urlpatterns = [ url(r'^', include(router.urls)), # login stuff - url(r'^login$', login_view), - url(r'^logout$', logout_view), + # url(r'^login$', login_view), + # url(r'^logout$', logout_view), ] # urlpatterns = [ # # main diff --git a/webapp/views.py b/webapp/views.py index 74dfd78..e538647 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -54,36 +54,6 @@ def main_index(request, *args, **kwargs): return render(request, "index.html", {}) -@require_http_methods(["GET", "POST"]) -def login_view(request, *args, **kwargs): - """Render login view.""" - if request.method == "POST": - uname = request.POST.get("username", None) - pw = request.POST.get("passwd", None) - user = authenticate(username=uname, password=pw) - if user is not None: - login(request, user) - original_site = request.GET.get("next", None) or "/" - return redirect(original_site) - return render(request, - "login.html", - {"error": "☹ Kirjautuminen kosahti. Yritä uudelleen!"}) - - # user got here by a get request - user = request.user - if user.is_authenticated: - # user shoud not be here authenticated with get but get rid if is - return redirect("/") - return render(request, "login.html", {}) - - -@require_http_methods(["GET", "POST"]) -def logout_view(request, *args, **kwargs): - """Logout user and return to main page.""" - logout(request) - return redirect("/") - - @require_http_methods(["GET"]) def about_view(request, *args, **kwargs): """Render about page.""" From 6acbdbc7607dfcb918267c6d467742f4d32da8e8 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 17 Jul 2018 21:22:02 +0300 Subject: [PATCH 07/11] Update to Django 2.0.7 for sqlite bugfix --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 676d716..535dd48 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ backports.shutil-get-terminal-size==1.0.0 decorator==4.0.9 -Django==2.0 +Django==2.0.7 ipython==4.2.0 ipython-genutils==0.1.0 pexpect==4.1.0 @@ -29,7 +29,6 @@ django-autocomplete-light==3.2.10 six==1.10.0 django-suit==0.2.26 telepot==12.3 -# django-password-reset==1.0 pyexcel==0.5.8 pyexcel-xlsx==0.5.5 django-import-export==0.7.0 From 4e3f71ea433317b62c81fe055c777f89cd6ea4b7 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 17 Jul 2018 22:00:08 +0300 Subject: [PATCH 08/11] Remove duplicate imports --- members/views.py | 2 +- members/views/members.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/members/views.py b/members/views.py index 558bd5e..f233c7b 100644 --- a/members/views.py +++ b/members/views.py @@ -15,7 +15,6 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.utils.http import urlsafe_base64_encode from django.utils.encoding import force_bytes -from django.core.mail import send_mail import json import requests @@ -27,6 +26,7 @@ from smtplib import SMTPAuthenticationError from members.models import Member, Request, Payment from members.forms import MemberForm, PaymentForm, ApplicationForm, CSVValidationError +from members.views.utils import send_mail_wrapper @receiver(post_save, sender=Request) diff --git a/members/views/members.py b/members/views/members.py index d2ffcbd..a27e7fe 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -7,7 +7,6 @@ from django.http import HttpResponse, HttpResponseRedirect, JsonResponse, HttpRe from django.core.mail import send_mail from django.conf import settings from django.utils.translation import ugettext as _ -from django.utils import timezone from django.forms.models import model_to_dict from dal import autocomplete from django.utils import timezone From aea989856374f6ea3bbc152f93d039af3f8c3ff5 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 17 Jul 2018 22:00:39 +0300 Subject: [PATCH 09/11] Skip failing autocomplete test --- members/tests.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/members/tests.py b/members/tests.py index 645a1ee..c32407b 100644 --- a/members/tests.py +++ b/members/tests.py @@ -1,11 +1,13 @@ """File containing Member app tests.""" from django.test import TestCase, Client +from unittest import skip from django.contrib.auth.models import User from members.management.commands.createsahkopiikkiuser import Command as SahkopiikkiCommand from members.models import Member, Payment, Request from rest_framework.authtoken.models import Token + import logging import os import pyexcel @@ -62,6 +64,7 @@ class MemberRegisterTestCase(TestCase): self.assertEqual(response.status_code, 200) + @skip("TODO: Fix") def test_autocomplete_search_found(self): """Test member autocomplete search""" search_terms = 'Tidus' @@ -69,6 +72,7 @@ class MemberRegisterTestCase(TestCase): results = response.json()['results'] self.assertEqual(len(results), 1) + @skip("TODO: Fix") def test_autocomplete_search_not_found(self): """Test member autocomplete search""" search_terms = 'Notfound' From 7e821f277f16683bcaa0a140b69c304c49587661 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Mon, 23 Jul 2018 12:38:14 +0300 Subject: [PATCH 10/11] Fix pycodestyle --- webapp/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/urls.py b/webapp/urls.py index 3e970c6..ca733aa 100644 --- a/webapp/urls.py +++ b/webapp/urls.py @@ -34,7 +34,7 @@ urlpatterns = [ # login stuff # url(r'^login$', login_view), # url(r'^logout$', logout_view), - + # git revision url(r'^about', about_view), ] From 3676f23f65cfd632493eb9d0e8061563b4bf34a5 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Tue, 24 Jul 2018 18:19:57 +0300 Subject: [PATCH 11/11] Fix payment autocomplete permissions and remove test skips Fixed decorators in urls.py. Moved to method_decorators on view class --- members/tests.py | 2 -- members/urls.py | 6 +----- members/views/members.py | 2 ++ 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/members/tests.py b/members/tests.py index c32407b..7105332 100644 --- a/members/tests.py +++ b/members/tests.py @@ -64,7 +64,6 @@ class MemberRegisterTestCase(TestCase): self.assertEqual(response.status_code, 200) - @skip("TODO: Fix") def test_autocomplete_search_found(self): """Test member autocomplete search""" search_terms = 'Tidus' @@ -72,7 +71,6 @@ class MemberRegisterTestCase(TestCase): results = response.json()['results'] self.assertEqual(len(results), 1) - @skip("TODO: Fix") def test_autocomplete_search_not_found(self): """Test member autocomplete search""" search_terms = 'Notfound' diff --git a/members/urls.py b/members/urls.py index 7bdba7d..80e0466 100644 --- a/members/urls.py +++ b/members/urls.py @@ -45,10 +45,6 @@ from members.views import application_submit favicon_view = RedirectView.as_view( url='static/img/favicon.ico', permanent=True) -member_autocomplete_view = login_required( - permission_required('members.change_member', login_url='/admin/login') -) - urlpatterns = [ # landing page @@ -126,7 +122,7 @@ urlpatterns = [ # member select autocomplete view url( r'^member-autocomplete/$', - member_autocomplete_view, + MemberAutoComplete.as_view(), name='member-autocomplete', ), diff --git a/members/views/members.py b/members/views/members.py index a27e7fe..5a0db48 100644 --- a/members/views/members.py +++ b/members/views/members.py @@ -217,6 +217,8 @@ def member_edit(request, *args, **kwargs): request, 'member_edit.html', {'member_id': i, 'form': form}) +@method_decorator(login_required(login_url='/admin/login'), name='dispatch') +@method_decorator(permission_required('members.change_member'), name='dispatch') class MemberAutoComplete(autocomplete.Select2QuerySetView): def get_queryset(self):