Merge branch 'Django2.0' into 'develop'

:Django2.0

See merge request vtmk/web2.0!115
This commit is contained in:
Aarni Halinen
2018-07-24 18:29:00 +03:00
25 changed files with 61 additions and 179 deletions
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -22,7 +22,7 @@
{% block body %}
<div id="header" class="row">
<div class="logout-button">
<form action="/logout" method="post"> {% csrf_token %}
<form action="/admin/logout/" method="post"> {% csrf_token %}
<input type="Submit" value="{% trans "Log out" %}" name="Logout" class="btn btn-danger"/>
</form>
</div>
+8 -8
View File
@@ -24,7 +24,7 @@ from infoscreen.models import ApyInfoItem
from infoscreen.models import VideoInfoItem
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.change_infoinstance', raise_exception=True)
def admin(request, *args, **kwargs):
"""Render infoscreen admin page."""
@@ -36,7 +36,7 @@ def create_item_generator(model):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
def create_item(request, *args, **kwargs):
try:
@@ -58,7 +58,7 @@ def delete_item_generator(model):
@ensure_csrf_cookie
@require_http_methods(["DELETE"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.delete_infoinstance', raise_exception=True)
def delete_item(request, *args, **kwargs):
idx = kwargs.pop("idx", 0)
@@ -80,7 +80,7 @@ def delete_item_generator(model):
# due to model structure this is little complicated
@ensure_csrf_cookie
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.delete_infoinstance', raise_exception=True)
@require_http_methods(["DELETE"])
def delete_info_item(request, *args, **kwargs):
@@ -105,7 +105,7 @@ def delete_info_item(request, *args, **kwargs):
@require_http_methods(["POST"])
@ensure_csrf_cookie
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
def create_image_item(request, *args, **kwargs):
"""Create image Infoscreen item."""
@@ -122,7 +122,7 @@ def create_image_item(request, *args, **kwargs):
@require_http_methods(["POST"])
@ensure_csrf_cookie
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.add_infoinstance', raise_exception=True)
def create_video_item(request, *args, **kwargs):
"""Create video Infoscreen item."""
@@ -139,7 +139,7 @@ def create_video_item(request, *args, **kwargs):
@require_http_methods(["POST"])
@ensure_csrf_cookie
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.add_rotation', raise_exception=True)
def create_rotation(request, *args, **kwargs):
"""Create rotation."""
@@ -161,7 +161,7 @@ def create_rotation(request, *args, **kwargs):
@require_http_methods(["DELETE"])
@ensure_csrf_cookie
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('infoscreen.delete_rotation', raise_exception=True)
def delete_rotation(request, *args, **kwargs):
"""Delete rotation."""
+1 -1
View File
@@ -55,7 +55,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):
+1 -1
View File
@@ -75,7 +75,7 @@
<li><a href="/members/settings">{% trans "Settings" %}</a></li>
</ul>
<form action="/logout" method="post"> {% csrf_token %}
<form action="/admin/logout/" method="post"> {% csrf_token %}
<input type="Submit" value="{% trans "Log out" %}" name="Logout" class="btn btn-danger"/>
</form>
</li>
+2
View File
@@ -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
+1 -5
View File
@@ -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='/login')(MemberAutoComplete.as_view())
)
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',
),
+1 -1
View File
@@ -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)
+6 -6
View File
@@ -19,7 +19,7 @@ from members.views import error_view
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.read_application', raise_exception=True)
def application_list(request, *args, **kwargs):
"""List member applications not yet processed."""
@@ -42,7 +42,7 @@ def application_list(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.change_request', raise_exception=True)
def application_edit(request, *args, **kwargs):
"""Edit member request information."""
@@ -60,7 +60,7 @@ def application_edit(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_member', raise_exception=True)
def application_accept(request, *args, **kwargs):
"""Accept application."""
@@ -102,7 +102,7 @@ def application_accept(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_request', raise_exception=True)
def application_delete(request, *args, **kwargs):
"""Delete member application."""
@@ -128,7 +128,7 @@ def application_delete(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_request', raise_exception=True)
def application_delete_confirm(request, *args, **kwargs):
"""Confirm application deletion."""
@@ -152,7 +152,7 @@ def application_form(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_request', raise_exception=True)
def application_submit(request, *args, **kwargs):
"""Submit member application"""
+11 -10
View File
@@ -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
@@ -30,7 +29,7 @@ from members.views.utils import *
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.read_member', raise_exception=True)
def member_list(request, *args, **kwargs):
"""Render members list."""
@@ -68,7 +67,7 @@ def member_list(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_member', raise_exception=True)
def member_add(request, *args, **kwargs):
"""Render add member page."""
@@ -78,7 +77,7 @@ def member_add(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_member', raise_exception=True)
def member_delete_confirm(request, *args, **kwargs):
"""Render member deletion confirmation page."""
@@ -94,7 +93,7 @@ def member_delete_confirm(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_member', raise_exception=True)
def member_add_many(request, *args, **kwargs):
"""Render add multiple members page."""
@@ -103,7 +102,7 @@ def member_add_many(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_member', raise_exception=True)
def add_many_confirm(request, *args, **kwargs):
models = request.session['models']
@@ -130,7 +129,7 @@ def add_many_confirm(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_member', raise_exception=True)
def member_submit(request, *args, **kwargs):
"""Add member based on data gained from member form."""
@@ -151,7 +150,7 @@ def member_submit(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.change_member', raise_exception=True)
def member_update(request, *args, **kwargs):
"""Update member information."""
@@ -179,7 +178,7 @@ def member_update(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_member', raise_exception=True)
def member_delete(request, *args, **kwargs):
"""Delete member."""
@@ -204,7 +203,7 @@ def member_delete(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.change_member', raise_exception=True)
def member_edit(request, *args, **kwargs):
"""Edit member information."""
@@ -218,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):
+7 -7
View File
@@ -19,7 +19,7 @@ from members.views import error_view
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.read_payment', raise_exception=True)
def payment_list(request, *args, **kwargs):
"""Render list of payments."""
@@ -47,7 +47,7 @@ def payment_list(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_payment', raise_exception=True)
def payment_add(request, *args, **kwargs):
"""Render add payment form."""
@@ -57,7 +57,7 @@ def payment_add(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.add_payment', raise_exception=True)
def payment_submit(request, *args, **kwargs):
"""Submit payment."""
@@ -79,7 +79,7 @@ def payment_submit(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.change_payment', raise_exception=True)
def payment_edit(request, *args, **kwargs):
"""Edit payment."""
@@ -96,7 +96,7 @@ def payment_edit(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_payment', raise_exception=True)
def payment_delete_confirm(request, *args, **kwargs):
"""Render payment delete confirmation page."""
@@ -113,7 +113,7 @@ def payment_delete_confirm(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.delete_payment', raise_exception=True)
def payment_delete(request, *args, **kwargs):
"""Delete payment."""
@@ -138,7 +138,7 @@ def payment_delete(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.change_payment', raise_exception=True)
def payment_update(request, *args, **kwargs):
"""Update payment information."""
+2 -2
View File
@@ -95,7 +95,7 @@ def convert_table_to_html(table, request):
@ensure_csrf_cookie
@require_http_methods(["GET"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required('members.change_member', raise_exception=True)
def settings_page(request, *args, **kwargs):
"""Render member app settings page."""
@@ -104,7 +104,7 @@ def settings_page(request, *args, **kwargs):
@ensure_csrf_cookie
@require_http_methods(["POST"])
@login_required(login_url='/login')
@login_required(login_url='/admin/login')
@permission_required(['members.change_member', 'members.change_payment'], raise_exception=True)
def import_csv(request, *args, **kwargs):
"""Get csv data imported to page and create members based on that."""
+6 -7
View File
@@ -1,6 +1,6 @@
backports.shutil-get-terminal-size==1.0.0
decorator==4.0.9
Django==1.11
Django==2.0.7
ipython==4.2.0
ipython-genutils==0.1.0
pexpect==4.1.0
@@ -13,23 +13,22 @@ 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.4
django-nose==1.4.5
nose-exclude==0.5.0
psycopg2==2.7.3.1
django-bootstrap3==8.2.3
django-tables2==1.6.1
pycodestyle==2.3.1
dealer==2.0.5
django-modeltranslation==0.12.1
django-auditlog==0.4.3
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.25
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
+4 -3
View File
@@ -102,7 +102,6 @@ INSTALLED_APPS = [
'auditlog',
'phonenumber_field',
'import_export',
'password_reset',
]
IMPORT_EXPORT_USE_TRANSACTIONS = True
@@ -118,7 +117,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 +126,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'
+5 -2
View File
@@ -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
-2
View File
@@ -26,7 +26,6 @@ import webapp.urls
import infoscreen.urls
import members.urls
import coffee_scale.urls
import password_reset.urls
urlpatterns = [
url(r'', include('webapp.urls')),
@@ -38,7 +37,6 @@ urlpatterns = [
# admin
url(r'^admin/', admin.site.urls),
url(r'^reset/', include('password_reset.urls')),
# i18n default view for changing the active language
url(r'^i18n/', include('django.conf.urls.i18n')),
-30
View File
@@ -1,30 +0,0 @@
{% extends "webapp:base.html" %}
{% load i18n %}
{% load static %}
{% block navigation %}
{% endblock navigation %}
{% block content %}
<h1>SIK Admin</h1>
<form method="POST" class="form-horizontal" action=""> {% csrf_token %}
<div class="form-group">
<label for="input-username" class="col-form-label">{% trans "Username" %}</label>
<input type="text" name="username" id="input-username" class="form-control" placeholder="{% trans "Username" %}"></input>
</div>
<div class="form-group">
<label for="input-password" class="col-form-label">{% trans "Password" %}</label>
<input type="password" name="passwd" id="input-passwd" class="form-control" placeholder="{% trans "Password" %}"></input>
</div>
<div class="form-group">
<a href={% url "password_reset_recover" %}>{% trans "Forgot password?" %}</a>
</div>
<div class="form-group">
<div class="text-danger">{{ error }}</div>
</div>
<div class="form-group" id="login-button">
<button type="submit" class="btn btn-primary">{% trans "Log in" %}</button>
</div>
</form>
</div>
{% endblock content %}
-1
View File
@@ -1 +0,0 @@
{% extends "login.html" %}
@@ -1,8 +0,0 @@
{% extends "password_reset/base.html" %}{% load i18n %}
{% block title %}{% trans "New password set" %}{% endblock %}
{% block content %}
<p>{% trans "Your password has successfully been reset. You can use it right now on the login page." %}</p>
<p><a href="/login">Log in</a></p>
{% endblock %}
@@ -1,12 +0,0 @@
{% extends "password_reset/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block content %}
<h1>{% trans "Password recovery" %}</h1>
<form method="post" action="{{ url }}">
{% csrf_token %}
{% bootstrap_form form %}
<p><input class="btn btn-primary" type="submit" value="{% trans "Send" %}"></p>
</form>
{% endblock %}
-14
View File
@@ -1,14 +0,0 @@
{% extends "password_reset/base.html" %}{% load i18n %}
{% block content %}
{% if invalid %}{% url "password_reset_recover" as recovery_url %}
<p>{% blocktrans %}Sorry, this password reset link is invalid. You can still <a href="{{ recovery_url }}">request a new one</a>.{% endblocktrans %}</p>
{% else %}
<p>{% blocktrans %}Hi, <strong>{{ username }}</strong>. Please choose your new password.{% endblocktrans %}</p>
<form method="post" action="{% url "password_reset_reset" token %}">
{% csrf_token %}
{{ form.as_p }}
<p><input type="submit" value="{% trans "Set new password" %}"></p>
</form>
{% endif %}
{% endblock %}
-15
View File
@@ -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 %}
-8
View File
@@ -1,8 +0,0 @@
{% extends "password_reset/base.html" %}
{% load i18n %}
{% block title %}{% trans "Password recovery sent" %}{% endblock %}
{% block content %}
<p>{% blocktrans with ago=timestamp|timesince %}An email was sent to <strong>{{ email }}</strong> {{ ago }} ago. Use the link in it to set a new password.{% endblocktrans %}</p>
{% endblock %}
+4 -4
View File
@@ -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
@@ -32,8 +32,8 @@ router.register(r'questions', SavedQuestionsViewSet)
urlpatterns = [
url(r'^api/', 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),
# git revision
url(r'^about', about_view),
-30
View File
@@ -64,36 +64,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."""