diff --git a/accounting/migrations/0001_initial.py b/accounting/migrations/0001_initial.py
index 9bd829a6..0196d3f2 100644
--- a/accounting/migrations/0001_initial.py
+++ b/accounting/migrations/0001_initial.py
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
import django.core.validators
import accounting.models
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -243,6 +244,7 @@ class Migration(migrations.Migration):
verbose_name="accounting type",
to="accounting.AccountingType",
blank=True,
+ on_delete=django.db.models.deletion.CASCADE,
),
),
],
@@ -267,6 +269,7 @@ class Migration(migrations.Migration):
verbose_name="simplified accounting types",
to="accounting.AccountingType",
related_name="simplified_types",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
],
diff --git a/accounting/migrations/0002_auto_20160824_2152.py b/accounting/migrations/0002_auto_20160824_2152.py
index e0322f08..d3b1c9a2 100644
--- a/accounting/migrations/0002_auto_20160824_2152.py
+++ b/accounting/migrations/0002_auto_20160824_2152.py
@@ -2,6 +2,7 @@
from __future__ import unicode_literals
from django.db import migrations, models
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -22,6 +23,7 @@ class Migration(migrations.Migration):
verbose_name="invoice",
to="core.SithFile",
blank=True,
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AddField(
@@ -31,12 +33,14 @@ class Migration(migrations.Migration):
verbose_name="journal",
to="accounting.GeneralJournal",
related_name="operations",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AddField(
model_name="operation",
name="linked_operation",
field=models.OneToOneField(
+ on_delete=django.db.models.deletion.CASCADE,
blank=True,
to="accounting.Operation",
null=True,
@@ -54,6 +58,7 @@ class Migration(migrations.Migration):
verbose_name="simple type",
to="accounting.SimplifiedAccountingType",
blank=True,
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AddField(
@@ -63,6 +68,7 @@ class Migration(migrations.Migration):
verbose_name="club account",
to="accounting.ClubAccount",
related_name="journals",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AddField(
@@ -72,20 +78,27 @@ class Migration(migrations.Migration):
verbose_name="bank account",
to="accounting.BankAccount",
related_name="club_accounts",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AddField(
model_name="clubaccount",
name="club",
field=models.ForeignKey(
- verbose_name="club", to="club.Club", related_name="club_account"
+ verbose_name="club",
+ to="club.Club",
+ related_name="club_account",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AddField(
model_name="bankaccount",
name="club",
field=models.ForeignKey(
- verbose_name="club", to="club.Club", related_name="bank_accounts"
+ verbose_name="club",
+ to="club.Club",
+ related_name="bank_accounts",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
migrations.AlterUniqueTogether(
diff --git a/accounting/migrations/0004_auto_20161005_1505.py b/accounting/migrations/0004_auto_20161005_1505.py
index c363cddb..8fe3a472 100644
--- a/accounting/migrations/0004_auto_20161005_1505.py
+++ b/accounting/migrations/0004_auto_20161005_1505.py
@@ -29,6 +29,7 @@ class Migration(migrations.Migration):
related_name="labels",
verbose_name="club account",
to="accounting.ClubAccount",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
],
diff --git a/accounting/models.py b/accounting/models.py
index efcbdf2c..54fcb437 100644
--- a/accounting/models.py
+++ b/accounting/models.py
@@ -22,7 +22,7 @@
#
#
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.core.exceptions import ValidationError
from django.core import validators
from django.db import models
@@ -110,7 +110,12 @@ class BankAccount(models.Model):
name = models.CharField(_("name"), max_length=30)
iban = models.CharField(_("iban"), max_length=255, blank=True)
number = models.CharField(_("account number"), max_length=255, blank=True)
- club = models.ForeignKey(Club, related_name="bank_accounts", verbose_name=_("club"))
+ club = models.ForeignKey(
+ Club,
+ related_name="bank_accounts",
+ verbose_name=_("club"),
+ on_delete=models.CASCADE,
+ )
class Meta:
verbose_name = _("Bank account")
@@ -136,9 +141,17 @@ class BankAccount(models.Model):
class ClubAccount(models.Model):
name = models.CharField(_("name"), max_length=30)
- club = models.ForeignKey(Club, related_name="club_account", verbose_name=_("club"))
+ club = models.ForeignKey(
+ Club,
+ related_name="club_account",
+ verbose_name=_("club"),
+ on_delete=models.CASCADE,
+ )
bank_account = models.ForeignKey(
- BankAccount, related_name="club_accounts", verbose_name=_("bank account")
+ BankAccount,
+ related_name="club_accounts",
+ verbose_name=_("bank account"),
+ on_delete=models.CASCADE,
)
class Meta:
@@ -203,7 +216,11 @@ class GeneralJournal(models.Model):
name = models.CharField(_("name"), max_length=40)
closed = models.BooleanField(_("is closed"), default=False)
club_account = models.ForeignKey(
- ClubAccount, related_name="journals", null=False, verbose_name=_("club account")
+ ClubAccount,
+ related_name="journals",
+ null=False,
+ verbose_name=_("club account"),
+ on_delete=models.CASCADE,
)
amount = CurrencyField(_("amount"), default=0)
effective_amount = CurrencyField(_("effective_amount"), default=0)
@@ -263,7 +280,11 @@ class Operation(models.Model):
number = models.IntegerField(_("number"))
journal = models.ForeignKey(
- GeneralJournal, related_name="operations", null=False, verbose_name=_("journal")
+ GeneralJournal,
+ related_name="operations",
+ null=False,
+ verbose_name=_("journal"),
+ on_delete=models.CASCADE,
)
amount = CurrencyField(_("amount"))
date = models.DateField(_("date"))
@@ -282,6 +303,7 @@ class Operation(models.Model):
verbose_name=_("invoice"),
null=True,
blank=True,
+ on_delete=models.CASCADE,
)
done = models.BooleanField(_("is done"), default=False)
simpleaccounting_type = models.ForeignKey(
@@ -290,6 +312,7 @@ class Operation(models.Model):
verbose_name=_("simple type"),
null=True,
blank=True,
+ on_delete=models.CASCADE,
)
accounting_type = models.ForeignKey(
"AccountingType",
@@ -297,6 +320,7 @@ class Operation(models.Model):
verbose_name=_("accounting type"),
null=True,
blank=True,
+ on_delete=models.CASCADE,
)
label = models.ForeignKey(
"Label",
@@ -328,6 +352,7 @@ class Operation(models.Model):
null=True,
blank=True,
default=None,
+ on_delete=models.CASCADE,
)
class Meta:
@@ -487,6 +512,7 @@ class SimplifiedAccountingType(models.Model):
AccountingType,
related_name="simplified_types",
verbose_name=_("simplified accounting types"),
+ on_delete=models.CASCADE,
)
class Meta:
@@ -518,7 +544,10 @@ class Label(models.Model):
name = models.CharField(_("label"), max_length=64)
club_account = models.ForeignKey(
- ClubAccount, related_name="labels", verbose_name=_("club account")
+ ClubAccount,
+ related_name="labels",
+ verbose_name=_("club account"),
+ on_delete=models.CASCADE,
)
class Meta:
diff --git a/accounting/templates/accounting/journal_statement_accounting.jinja b/accounting/templates/accounting/journal_statement_accounting.jinja
index 98564095..0661bbcf 100644
--- a/accounting/templates/accounting/journal_statement_accounting.jinja
+++ b/accounting/templates/accounting/journal_statement_accounting.jinja
@@ -20,14 +20,14 @@
{% for k,v in statement.items() %}
{{ k }} |
- {{ v }} |
+ {{ "%.2f" % v }} |
{% endfor %}
- {% trans %}Amount: {% endtrans %}{{ object.amount }} €
- {% trans %}Effective amount: {% endtrans %}{{ object.effective_amount }} €
+ {% trans %}Amount: {% endtrans %}{{ "%.2f" % object.amount }} €
+ {% trans %}Effective amount: {% endtrans %}{{ "%.2f" %object.effective_amount }} €
{% endblock %}
diff --git a/accounting/templates/accounting/journal_statement_nature.jinja b/accounting/templates/accounting/journal_statement_nature.jinja
index 0bfca0d0..a3aa1567 100644
--- a/accounting/templates/accounting/journal_statement_nature.jinja
+++ b/accounting/templates/accounting/journal_statement_nature.jinja
@@ -18,12 +18,12 @@
{% for k,v in dict['CREDIT'].items() %}
{{ k }} |
- {{ v }} |
+ {{ "%.2f" % v }} |
{% endfor %}
- {% trans %}Total: {% endtrans %}{{ dict['CREDIT_sum'] }}
+ {% trans %}Total: {% endtrans %}{{ "%.2f" % dict['CREDIT_sum'] }}
{% trans %}Debit{% endtrans %}
@@ -37,19 +37,19 @@
{% for k,v in dict['DEBIT'].items() %}
{{ k }} |
- {{ v }} |
+ {{ "%.2f" % v }} |
{% endfor %}
- {% trans %}Total: {% endtrans %}{{ dict['DEBIT_sum'] }}
+ {% trans %}Total: {% endtrans %}{{ "%.2f" % dict['DEBIT_sum'] }}
{% endmacro %}
{% block content %}
{% trans %}Statement by nature: {% endtrans %} {{ object.name }}
{% for k,v in statement.items() %}
- {{ k }} : {{ v['CREDIT_sum'] - v['DEBIT_sum'] }}
+ {{ k }} : {{ "%.2f" % (v['CREDIT_sum'] - v['DEBIT_sum']) }}
{{ display_tables(v) }}
{% endfor %}
diff --git a/accounting/templates/accounting/journal_statement_person.jinja b/accounting/templates/accounting/journal_statement_person.jinja
index 0fd0dd5d..9a88e73f 100644
--- a/accounting/templates/accounting/journal_statement_person.jinja
+++ b/accounting/templates/accounting/journal_statement_person.jinja
@@ -28,14 +28,14 @@
{% else %}
|
{% endif %}
- {{ credit_statement[key] }} |
+ {{ "%.2f" % credit_statement[key] }} |
{% endfor %}
- Total : {{ total_credit }}
+ Total : {{ "%.2f" % total_credit }}
{% trans %}Debit{% endtrans %}
@@ -56,13 +56,13 @@
{% else %}
|
{% endif %}
- {{ debit_statement[key] }} |
+ {{ "%.2f" % debit_statement[key] }} |
{% endfor %}
- Total : {{ total_debit }}
+ Total : {{ "%.2f" % total_debit }}
{% endblock %}
diff --git a/accounting/tests.py b/accounting/tests.py
index df4fd8d7..f424d8e8 100644
--- a/accounting/tests.py
+++ b/accounting/tests.py
@@ -23,7 +23,7 @@
#
from django.test import TestCase
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.core.management import call_command
from datetime import date
@@ -272,30 +272,50 @@ class OperationTest(TestCase):
def test_nature_statement(self):
self.client.login(username="comptable", password="plop")
- response_get = self.client.get(
+ response = self.client.get(
reverse("accounting:journal_nature_statement", args=[self.journal.id])
)
- self.assertTrue(
- "bob (Troll Pench\\xc3\\xa9) : 3.00" in str(response_get.content)
- )
+ self.assertContains(response, "bob (Troll Penché) : 3.00", status_code=200)
def test_person_statement(self):
self.client.login(username="comptable", password="plop")
- response_get = self.client.get(
+ response = self.client.get(
reverse("accounting:journal_person_statement", args=[self.journal.id])
)
- self.assertTrue(
- "3.00 | " in str(response_get.content)
- and 'S' Kia | '
- in str(response_get.content)
+ self.assertContains(response, "Total : 5575.72", status_code=200)
+ self.assertContains(response, "Total : 71.42")
+ self.assertContains(
+ response,
+ """
+ S' Kia |
+
+ 3.00 | """,
+ )
+ self.assertContains(
+ response,
+ """
+ S' Kia |
+
+ 823.00 | """,
)
def test_accounting_statement(self):
self.client.login(username="comptable", password="plop")
- response_get = self.client.get(
+ response = self.client.get(
reverse("accounting:journal_accounting_statement", args=[self.journal.id])
)
- self.assertTrue(
- "443 - Cr\\xc3\\xa9dit - Ce code n'existe pas | "
- in str(response_get.content)
+ self.assertContains(
+ response,
+ """
+
+ 443 - Crédit - Ce code n'existe pas |
+ 3.00 |
+
""",
+ status_code=200,
+ )
+ self.assertContains(
+ response,
+ """
+ Montant : -5504.30 €
+ Montant effectif: -5504.30 €
""",
)
diff --git a/accounting/urls.py b/accounting/urls.py
index 63882d45..70eeb158 100644
--- a/accounting/urls.py
+++ b/accounting/urls.py
@@ -22,131 +22,133 @@
#
#
-from django.conf.urls import url
+from django.urls import re_path
from accounting.views import *
urlpatterns = [
# Accounting types
- url(
+ re_path(
r"^simple_type$",
SimplifiedAccountingTypeListView.as_view(),
name="simple_type_list",
),
- url(
+ re_path(
r"^simple_type/create$",
SimplifiedAccountingTypeCreateView.as_view(),
name="simple_type_new",
),
- url(
+ re_path(
r"^simple_type/(?P[0-9]+)/edit$",
SimplifiedAccountingTypeEditView.as_view(),
name="simple_type_edit",
),
# Accounting types
- url(r"^type$", AccountingTypeListView.as_view(), name="type_list"),
- url(r"^type/create$", AccountingTypeCreateView.as_view(), name="type_new"),
- url(
+ re_path(r"^type$", AccountingTypeListView.as_view(), name="type_list"),
+ re_path(r"^type/create$", AccountingTypeCreateView.as_view(), name="type_new"),
+ re_path(
r"^type/(?P[0-9]+)/edit$",
AccountingTypeEditView.as_view(),
name="type_edit",
),
# Bank accounts
- url(r"^$", BankAccountListView.as_view(), name="bank_list"),
- url(r"^bank/create$", BankAccountCreateView.as_view(), name="bank_new"),
- url(
+ re_path(r"^$", BankAccountListView.as_view(), name="bank_list"),
+ re_path(r"^bank/create$", BankAccountCreateView.as_view(), name="bank_new"),
+ re_path(
r"^bank/(?P[0-9]+)$",
BankAccountDetailView.as_view(),
name="bank_details",
),
- url(
+ re_path(
r"^bank/(?P[0-9]+)/edit$",
BankAccountEditView.as_view(),
name="bank_edit",
),
- url(
+ re_path(
r"^bank/(?P[0-9]+)/delete$",
BankAccountDeleteView.as_view(),
name="bank_delete",
),
# Club accounts
- url(r"^club/create$", ClubAccountCreateView.as_view(), name="club_new"),
- url(
+ re_path(r"^club/create$", ClubAccountCreateView.as_view(), name="club_new"),
+ re_path(
r"^club/(?P[0-9]+)$",
ClubAccountDetailView.as_view(),
name="club_details",
),
- url(
+ re_path(
r"^club/(?P[0-9]+)/edit$",
ClubAccountEditView.as_view(),
name="club_edit",
),
- url(
+ re_path(
r"^club/(?P[0-9]+)/delete$",
ClubAccountDeleteView.as_view(),
name="club_delete",
),
# Journals
- url(r"^journal/create$", JournalCreateView.as_view(), name="journal_new"),
- url(
+ re_path(r"^journal/create$", JournalCreateView.as_view(), name="journal_new"),
+ re_path(
r"^journal/(?P[0-9]+)$",
JournalDetailView.as_view(),
name="journal_details",
),
- url(
+ re_path(
r"^journal/(?P[0-9]+)/edit$",
JournalEditView.as_view(),
name="journal_edit",
),
- url(
+ re_path(
r"^journal/(?P[0-9]+)/delete$",
JournalDeleteView.as_view(),
name="journal_delete",
),
- url(
+ re_path(
r"^journal/(?P[0-9]+)/statement/nature$",
JournalNatureStatementView.as_view(),
name="journal_nature_statement",
),
- url(
+ re_path(
r"^journal/(?P[0-9]+)/statement/person$",
JournalPersonStatementView.as_view(),
name="journal_person_statement",
),
- url(
+ re_path(
r"^journal/(?P[0-9]+)/statement/accounting$",
JournalAccountingStatementView.as_view(),
name="journal_accounting_statement",
),
# Operations
- url(
+ re_path(
r"^operation/create/(?P[0-9]+)$",
OperationCreateView.as_view(),
name="op_new",
),
- url(r"^operation/(?P[0-9]+)$", OperationEditView.as_view(), name="op_edit"),
- url(
+ re_path(
+ r"^operation/(?P[0-9]+)$", OperationEditView.as_view(), name="op_edit"
+ ),
+ re_path(
r"^operation/(?P[0-9]+)/pdf$", OperationPDFView.as_view(), name="op_pdf"
),
# Companies
- url(r"^company/list$", CompanyListView.as_view(), name="co_list"),
- url(r"^company/create$", CompanyCreateView.as_view(), name="co_new"),
- url(r"^company/(?P[0-9]+)$", CompanyEditView.as_view(), name="co_edit"),
+ re_path(r"^company/list$", CompanyListView.as_view(), name="co_list"),
+ re_path(r"^company/create$", CompanyCreateView.as_view(), name="co_new"),
+ re_path(r"^company/(?P[0-9]+)$", CompanyEditView.as_view(), name="co_edit"),
# Labels
- url(r"^label/new$", LabelCreateView.as_view(), name="label_new"),
- url(
+ re_path(r"^label/new$", LabelCreateView.as_view(), name="label_new"),
+ re_path(
r"^label/(?P[0-9]+)$",
LabelListView.as_view(),
name="label_list",
),
- url(
+ re_path(
r"^label/(?P[0-9]+)/edit$", LabelEditView.as_view(), name="label_edit"
),
- url(
+ re_path(
r"^label/(?P[0-9]+)/delete$",
LabelDeleteView.as_view(),
name="label_delete",
),
# User account
- url(r"^refound/account$", RefoundAccountView.as_view(), name="refound_account"),
+ re_path(r"^refound/account$", RefoundAccountView.as_view(), name="refound_account"),
]
diff --git a/accounting/views.py b/accounting/views.py
index 35c2c4ea..693884cf 100644
--- a/accounting/views.py
+++ b/accounting/views.py
@@ -24,7 +24,7 @@
from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView
-from django.core.urlresolvers import reverse_lazy, reverse
+from django.urls import reverse_lazy, reverse
from django.utils.translation import ugettext_lazy as _
from django.forms.models import modelform_factory
from django.core.exceptions import PermissionDenied, ValidationError
diff --git a/api/urls.py b/api/urls.py
index 60a4922c..9f8884bd 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -22,35 +22,35 @@
#
#
-from django.conf.urls import url, include
+from django.urls import re_path, include
from api.views import *
from rest_framework import routers
# Router config
router = routers.DefaultRouter()
-router.register(r"counter", CounterViewSet, base_name="api_counter")
-router.register(r"user", UserViewSet, base_name="api_user")
-router.register(r"club", ClubViewSet, base_name="api_club")
-router.register(r"group", GroupViewSet, base_name="api_group")
+router.register(r"counter", CounterViewSet, basename="api_counter")
+router.register(r"user", UserViewSet, basename="api_user")
+router.register(r"club", ClubViewSet, basename="api_club")
+router.register(r"group", GroupViewSet, basename="api_group")
# Launderette
router.register(
- r"launderette/place", LaunderettePlaceViewSet, base_name="api_launderette_place"
+ r"launderette/place", LaunderettePlaceViewSet, basename="api_launderette_place"
)
router.register(
r"launderette/machine",
LaunderetteMachineViewSet,
- base_name="api_launderette_machine",
+ basename="api_launderette_machine",
)
router.register(
- r"launderette/token", LaunderetteTokenViewSet, base_name="api_launderette_token"
+ r"launderette/token", LaunderetteTokenViewSet, basename="api_launderette_token"
)
urlpatterns = [
# API
- url(r"^", include(router.urls)),
- url(r"^login/", include("rest_framework.urls", namespace="rest_framework")),
- url(r"^markdown$", RenderMarkdown, name="api_markdown"),
- url(r"^mailings$", FetchMailingLists, name="mailings_fetch"),
+ re_path(r"^", include(router.urls)),
+ re_path(r"^login/", include("rest_framework.urls", namespace="rest_framework")),
+ re_path(r"^markdown$", RenderMarkdown, name="api_markdown"),
+ re_path(r"^mailings$", FetchMailingLists, name="mailings_fetch"),
]
diff --git a/api/views/__init__.py b/api/views/__init__.py
index 90f3fc0e..3d731738 100644
--- a/api/views/__init__.py
+++ b/api/views/__init__.py
@@ -25,7 +25,7 @@
from rest_framework.response import Response
from rest_framework import viewsets
from django.core.exceptions import PermissionDenied
-from rest_framework.decorators import detail_route
+from rest_framework.decorators import action
from django.db.models.query import QuerySet
from core.views import can_view, can_edit
@@ -46,7 +46,7 @@ def check_if(obj, user, test):
class ManageModelMixin:
- @detail_route()
+ @action(detail=True)
def id(self, request, pk=None):
"""
Get by id (api/v1/router/{pk}/id/)
diff --git a/api/views/counter.py b/api/views/counter.py
index 43ac1885..5b241031 100644
--- a/api/views/counter.py
+++ b/api/views/counter.py
@@ -24,7 +24,7 @@
from rest_framework import serializers
from rest_framework.response import Response
-from rest_framework.decorators import list_route
+from rest_framework.decorators import action
from counter.models import Counter
@@ -51,7 +51,7 @@ class CounterViewSet(RightModelViewSet):
serializer_class = CounterSerializer
queryset = Counter.objects.all()
- @list_route()
+ @action(detail=False)
def bar(self, request):
"""
Return all bars (api/v1/counter/bar/)
diff --git a/api/views/launderette.py b/api/views/launderette.py
index 940f8ebd..cdcacd0a 100644
--- a/api/views/launderette.py
+++ b/api/views/launderette.py
@@ -24,7 +24,7 @@
from rest_framework import serializers
from rest_framework.response import Response
-from rest_framework.decorators import list_route
+from rest_framework.decorators import action
from launderette.models import Launderette, Machine, Token
@@ -96,7 +96,7 @@ class LaunderetteTokenViewSet(RightModelViewSet):
serializer_class = LaunderetteTokenSerializer
queryset = Token.objects.all()
- @list_route()
+ @action(detail=False)
def washing(self, request):
"""
Return all washing tokens (api/v1/launderette/token/washing)
@@ -105,7 +105,7 @@ class LaunderetteTokenViewSet(RightModelViewSet):
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
- @list_route()
+ @action(detail=False)
def drying(self, request):
"""
Return all drying tokens (api/v1/launderette/token/drying)
@@ -114,7 +114,7 @@ class LaunderetteTokenViewSet(RightModelViewSet):
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
- @list_route()
+ @action(detail=False)
def avaliable(self, request):
"""
Return all avaliable tokens (api/v1/launderette/token/avaliable)
@@ -125,7 +125,7 @@ class LaunderetteTokenViewSet(RightModelViewSet):
serializer = self.get_serializer(self.queryset, many=True)
return Response(serializer.data)
- @list_route()
+ @action(detail=False)
def unavaliable(self, request):
"""
Return all unavaliable tokens (api/v1/launderette/token/unavaliable)
diff --git a/api/views/user.py b/api/views/user.py
index 4724c292..bb45a8a2 100644
--- a/api/views/user.py
+++ b/api/views/user.py
@@ -26,7 +26,7 @@ import datetime
from rest_framework import serializers
from rest_framework.response import Response
-from rest_framework.decorators import list_route
+from rest_framework.decorators import action
from core.models import User
@@ -57,7 +57,7 @@ class UserViewSet(RightModelViewSet):
serializer_class = UserSerializer
queryset = User.objects.filter(is_active=True)
- @list_route()
+ @action(detail=False)
def birthday(self, request):
"""
Return all users born today (api/v1/user/birstdays)
diff --git a/club/forms.py b/club/forms.py
index dca2b05c..4f5d9b85 100644
--- a/club/forms.py
+++ b/club/forms.py
@@ -66,7 +66,7 @@ class MailingForm(forms.Form):
super(MailingForm, self).__init__(*args, **kwargs)
self.fields["action"] = forms.TypedChoiceField(
- (
+ choices=(
(self.ACTION_NEW_MAILING, _("New Mailing")),
(self.ACTION_NEW_SUBSCRIPTION, _("Subscribe")),
(self.ACTION_REMOVE_SUBSCRIPTION, _("Remove")),
@@ -159,13 +159,13 @@ class MailingForm(forms.Form):
class SellingsFormBase(forms.Form):
begin_date = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"],
+ input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("Begin date"),
required=False,
widget=SelectDateTime,
)
end_date = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"],
+ input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
required=False,
widget=SelectDateTime,
diff --git a/club/migrations/0001_initial.py b/club/migrations/0001_initial.py
index 0bc1ec7e..17d3f309 100644
--- a/club/migrations/0001_initial.py
+++ b/club/migrations/0001_initial.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
import django.core.validators
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -90,7 +91,10 @@ class Migration(migrations.Migration):
(
"club",
models.ForeignKey(
- verbose_name="club", to="club.Club", related_name="members"
+ verbose_name="club",
+ to="club.Club",
+ related_name="members",
+ on_delete=django.db.models.deletion.CASCADE,
),
),
],
diff --git a/club/migrations/0002_auto_20160824_2152.py b/club/migrations/0002_auto_20160824_2152.py
index b6de6b01..444a96a6 100644
--- a/club/migrations/0002_auto_20160824_2152.py
+++ b/club/migrations/0002_auto_20160824_2152.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -18,6 +19,7 @@ class Migration(migrations.Migration):
model_name="membership",
name="user",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="user",
to=settings.AUTH_USER_MODEL,
related_name="membership",
@@ -34,6 +36,7 @@ class Migration(migrations.Migration):
model_name="club",
name="home",
field=models.OneToOneField(
+ on_delete=django.db.models.deletion.CASCADE,
blank=True,
null=True,
related_name="home_of_club",
@@ -45,14 +48,21 @@ class Migration(migrations.Migration):
model_name="club",
name="owner_group",
field=models.ForeignKey(
- default=1, to="core.Group", related_name="owned_club"
+ on_delete=django.db.models.deletion.CASCADE,
+ default=1,
+ to="core.Group",
+ related_name="owned_club",
),
),
migrations.AddField(
model_name="club",
name="parent",
field=models.ForeignKey(
- null=True, to="club.Club", related_name="children", blank=True
+ on_delete=django.db.models.deletion.CASCADE,
+ null=True,
+ to="club.Club",
+ related_name="children",
+ blank=True,
),
),
migrations.AddField(
diff --git a/club/migrations/0004_auto_20160915_1057.py b/club/migrations/0004_auto_20160915_1057.py
index 6cdde0a6..15fc00de 100644
--- a/club/migrations/0004_auto_20160915_1057.py
+++ b/club/migrations/0004_auto_20160915_1057.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -14,6 +15,7 @@ class Migration(migrations.Migration):
model_name="membership",
name="user",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="user",
related_name="memberships",
to=settings.AUTH_USER_MODEL,
diff --git a/club/migrations/0009_auto_20170822_2232.py b/club/migrations/0009_auto_20170822_2232.py
index a7d84c3a..18fcd3c6 100644
--- a/club/migrations/0009_auto_20170822_2232.py
+++ b/club/migrations/0009_auto_20170822_2232.py
@@ -5,6 +5,7 @@ from django.db import migrations, models
from django.conf import settings
import re
import django.core.validators
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -51,12 +52,16 @@ class Migration(migrations.Migration):
(
"club",
models.ForeignKey(
- verbose_name="Club", related_name="mailings", to="club.Club"
+ on_delete=django.db.models.deletion.CASCADE,
+ verbose_name="Club",
+ related_name="mailings",
+ to="club.Club",
),
),
(
"moderator",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
null=True,
verbose_name="moderator",
related_name="moderated_mailings",
@@ -84,6 +89,7 @@ class Migration(migrations.Migration):
(
"mailing",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="Mailing",
related_name="subscriptions",
to="club.Mailing",
@@ -92,6 +98,7 @@ class Migration(migrations.Migration):
(
"user",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
null=True,
verbose_name="User",
related_name="mailing_subscriptions",
diff --git a/club/migrations/0010_auto_20170912_2028.py b/club/migrations/0010_auto_20170912_2028.py
index ff6f76ec..84aaf09a 100644
--- a/club/migrations/0010_auto_20170912_2028.py
+++ b/club/migrations/0010_auto_20170912_2028.py
@@ -5,6 +5,7 @@ from django.db import migrations, models
from club.models import Club
from core.operations import PsqlRunOnly
+import django.db.models.deletion
def generate_club_pages(apps, schema_editor):
@@ -31,7 +32,11 @@ class Migration(migrations.Migration):
model_name="club",
name="page",
field=models.OneToOneField(
- related_name="club", blank=True, null=True, to="core.Page"
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="club",
+ blank=True,
+ null=True,
+ to="core.Page",
),
),
migrations.AddField(
diff --git a/club/migrations/0011_auto_20180426_2013.py b/club/migrations/0011_auto_20180426_2013.py
index 8d63136e..74ca6fd0 100644
--- a/club/migrations/0011_auto_20180426_2013.py
+++ b/club/migrations/0011_auto_20180426_2013.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
import club.models
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -14,6 +15,7 @@ class Migration(migrations.Migration):
model_name="club",
name="owner_group",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
default=club.models.Club.get_default_owner_group,
related_name="owned_club",
to="core.Group",
diff --git a/club/models.py b/club/models.py
index 5f0b58dd..c4cc75c6 100644
--- a/club/models.py
+++ b/club/models.py
@@ -29,7 +29,7 @@ from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.db import transaction
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.utils import timezone
from django.core.validators import RegexValidator, validate_email
from django.utils.functional import cached_property
@@ -46,7 +46,9 @@ class Club(models.Model):
id = models.AutoField(primary_key=True, db_index=True)
name = models.CharField(_("name"), max_length=64)
- parent = models.ForeignKey("Club", related_name="children", null=True, blank=True)
+ parent = models.ForeignKey(
+ "Club", related_name="children", null=True, blank=True, on_delete=models.CASCADE
+ )
unix_name = models.CharField(
_("unix name"),
max_length=30,
@@ -75,7 +77,10 @@ class Club(models.Model):
return settings.SITH_GROUP_ROOT_ID
owner_group = models.ForeignKey(
- Group, related_name="owned_club", default=get_default_owner_group
+ Group,
+ related_name="owned_club",
+ default=get_default_owner_group,
+ on_delete=models.CASCADE,
)
edit_groups = models.ManyToManyField(
Group, related_name="editable_club", blank=True
@@ -91,7 +96,9 @@ class Club(models.Model):
blank=True,
on_delete=models.SET_NULL,
)
- page = models.OneToOneField(Page, related_name="club", blank=True, null=True)
+ page = models.OneToOneField(
+ Page, related_name="club", blank=True, null=True, on_delete=models.CASCADE
+ )
class Meta:
ordering = ["name", "unix_name"]
@@ -183,8 +190,8 @@ class Club(models.Model):
name=settings.SITH_MAIN_MEMBERS_GROUP
).first()
self.make_home()
- self.home.edit_groups = [board]
- self.home.view_groups = [member, subscribers]
+ self.home.edit_groups.set([board])
+ self.home.view_groups.set([member, subscribers])
self.home.save()
self.make_page()
@@ -261,9 +268,15 @@ class Membership(models.Model):
related_name="memberships",
null=False,
blank=False,
+ on_delete=models.CASCADE,
)
club = models.ForeignKey(
- Club, verbose_name=_("club"), related_name="members", null=False, blank=False
+ Club,
+ verbose_name=_("club"),
+ related_name="members",
+ null=False,
+ blank=False,
+ on_delete=models.CASCADE,
)
start_date = models.DateField(_("start date"), default=timezone.now)
end_date = models.DateField(_("end date"), null=True, blank=True)
@@ -317,7 +330,12 @@ class Mailing(models.Model):
"""
club = models.ForeignKey(
- Club, verbose_name=_("Club"), related_name="mailings", null=False, blank=False
+ Club,
+ verbose_name=_("Club"),
+ related_name="mailings",
+ null=False,
+ blank=False,
+ on_delete=models.CASCADE,
)
email = models.CharField(
_("Email address"),
@@ -334,7 +352,11 @@ class Mailing(models.Model):
)
is_moderated = models.BooleanField(_("is moderated"), default=False)
moderator = models.ForeignKey(
- User, related_name="moderated_mailings", verbose_name=_("moderator"), null=True
+ User,
+ related_name="moderated_mailings",
+ verbose_name=_("moderator"),
+ null=True,
+ on_delete=models.CASCADE,
)
def clean(self):
@@ -409,6 +431,7 @@ class MailingSubscription(models.Model):
related_name="subscriptions",
null=False,
blank=False,
+ on_delete=models.CASCADE,
)
user = models.ForeignKey(
User,
@@ -416,6 +439,7 @@ class MailingSubscription(models.Model):
related_name="mailing_subscriptions",
null=True,
blank=True,
+ on_delete=models.CASCADE,
)
email = models.EmailField(_("Email address"), blank=False, null=False)
diff --git a/club/tests.py b/club/tests.py
index 6bce1166..2536390e 100644
--- a/club/tests.py
+++ b/club/tests.py
@@ -26,7 +26,7 @@ from django.conf import settings
from django.test import TestCase
from django.utils import timezone, html
from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.core.management import call_command
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
diff --git a/club/urls.py b/club/urls.py
index c5a01e02..ca7bdf96 100644
--- a/club/urls.py
+++ b/club/urls.py
@@ -23,80 +23,88 @@
#
#
-from django.conf.urls import url
+from django.urls import re_path
from club.views import *
urlpatterns = [
- url(r"^$", ClubListView.as_view(), name="club_list"),
- url(r"^new$", ClubCreateView.as_view(), name="club_new"),
- url(r"^stats$", ClubStatView.as_view(), name="club_stats"),
- url(r"^(?P[0-9]+)/$", ClubView.as_view(), name="club_view"),
- url(
+ re_path(r"^$", ClubListView.as_view(), name="club_list"),
+ re_path(r"^new$", ClubCreateView.as_view(), name="club_new"),
+ re_path(r"^stats$", ClubStatView.as_view(), name="club_stats"),
+ re_path(r"^(?P[0-9]+)/$", ClubView.as_view(), name="club_view"),
+ re_path(
r"^(?P[0-9]+)/rev/(?P[0-9]+)/$",
ClubRevView.as_view(),
name="club_view_rev",
),
- url(r"^(?P[0-9]+)/hist$", ClubPageHistView.as_view(), name="club_hist"),
- url(r"^(?P[0-9]+)/edit$", ClubEditView.as_view(), name="club_edit"),
- url(
+ re_path(
+ r"^(?P[0-9]+)/hist$", ClubPageHistView.as_view(), name="club_hist"
+ ),
+ re_path(r"^(?P[0-9]+)/edit$", ClubEditView.as_view(), name="club_edit"),
+ re_path(
r"^(?P[0-9]+)/edit/page$",
ClubPageEditView.as_view(),
name="club_edit_page",
),
- url(
+ re_path(
r"^(?P[0-9]+)/members$", ClubMembersView.as_view(), name="club_members"
),
- url(
+ re_path(
r"^(?P[0-9]+)/elderlies$",
ClubOldMembersView.as_view(),
name="club_old_members",
),
- url(
+ re_path(
r"^(?P[0-9]+)/sellings$",
ClubSellingView.as_view(),
name="club_sellings",
),
- url(
+ re_path(
r"^(?P[0-9]+)/sellings/csv$",
ClubSellingCSVView.as_view(),
name="sellings_csv",
),
- url(r"^(?P[0-9]+)/prop$", ClubEditPropView.as_view(), name="club_prop"),
- url(r"^(?P[0-9]+)/tools$", ClubToolsView.as_view(), name="tools"),
- url(r"^(?P[0-9]+)/mailing$", ClubMailingView.as_view(), name="mailing"),
- url(
+ re_path(
+ r"^(?P[0-9]+)/prop$", ClubEditPropView.as_view(), name="club_prop"
+ ),
+ re_path(r"^(?P[0-9]+)/tools$", ClubToolsView.as_view(), name="tools"),
+ re_path(
+ r"^(?P[0-9]+)/mailing$", ClubMailingView.as_view(), name="mailing"
+ ),
+ re_path(
r"^(?P[0-9]+)/mailing/generate$",
MailingAutoGenerationView.as_view(),
name="mailing_generate",
),
- url(
+ re_path(
r"^(?P[0-9]+)/mailing/delete$",
MailingDeleteView.as_view(),
name="mailing_delete",
),
- url(
+ re_path(
r"^(?P[0-9]+)/mailing/delete/subscription$",
MailingSubscriptionDeleteView.as_view(),
name="mailing_subscription_delete",
),
- url(
+ re_path(
r"^membership/(?P[0-9]+)/set_old$",
MembershipSetOldView.as_view(),
name="membership_set_old",
),
- url(r"^(?P[0-9]+)/poster$", PosterListView.as_view(), name="poster_list"),
- url(
+ re_path(
+ r"^(?P[0-9]+)/poster$", PosterListView.as_view(), name="poster_list"
+ ),
+ re_path(
r"^(?P[0-9]+)/poster/create$",
PosterCreateView.as_view(),
name="poster_create",
),
- url(
+ re_path(
r"^(?P[0-9]+)/poster/(?P[0-9]+)/edit$",
PosterEditView.as_view(),
name="poster_edit",
),
- url(
+ re_path(
r"^(?P[0-9]+)/poster/(?P[0-9]+)/delete$",
PosterDeleteView.as_view(),
name="poster_delete",
diff --git a/club/views.py b/club/views.py
index a654ed65..da9824e2 100644
--- a/club/views.py
+++ b/club/views.py
@@ -31,7 +31,7 @@ from django.views.generic.edit import DeleteView
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import UpdateView, CreateView
from django.http import HttpResponseRedirect, HttpResponse, Http404
-from django.core.urlresolvers import reverse, reverse_lazy
+from django.urls import reverse, reverse_lazy
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext as _t
diff --git a/com/migrations/0002_news_newsdate.py b/com/migrations/0002_news_newsdate.py
index 27241539..026d949c 100644
--- a/com/migrations/0002_news_newsdate.py
+++ b/com/migrations/0002_news_newsdate.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -50,6 +51,7 @@ class Migration(migrations.Migration):
(
"author",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
related_name="owned_news",
to=settings.AUTH_USER_MODEL,
verbose_name="author",
@@ -58,12 +60,16 @@ class Migration(migrations.Migration):
(
"club",
models.ForeignKey(
- related_name="news", to="club.Club", verbose_name="club"
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="news",
+ to="club.Club",
+ verbose_name="club",
),
),
(
"moderator",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
related_name="moderated_news",
null=True,
to=settings.AUTH_USER_MODEL,
@@ -99,7 +105,10 @@ class Migration(migrations.Migration):
(
"news",
models.ForeignKey(
- related_name="dates", to="com.News", verbose_name="news_date"
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="dates",
+ to="com.News",
+ verbose_name="news_date",
),
),
],
diff --git a/com/migrations/0003_auto_20170115_2300.py b/com/migrations/0003_auto_20170115_2300.py
index d8fd9771..6ca595e5 100644
--- a/com/migrations/0003_auto_20170115_2300.py
+++ b/com/migrations/0003_auto_20170115_2300.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -56,6 +57,7 @@ class Migration(migrations.Migration):
(
"author",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name="author",
related_name="owned_weekmail_articles",
@@ -64,6 +66,7 @@ class Migration(migrations.Migration):
(
"club",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
to="club.Club",
verbose_name="club",
related_name="weekmail_articles",
@@ -72,6 +75,7 @@ class Migration(migrations.Migration):
(
"weekmail",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
to="com.Weekmail",
verbose_name="weekmail",
related_name="articles",
diff --git a/com/migrations/0004_auto_20171221_1614.py b/com/migrations/0004_auto_20171221_1614.py
index 1ebd9b86..853f810a 100644
--- a/com/migrations/0004_auto_20171221_1614.py
+++ b/com/migrations/0004_auto_20171221_1614.py
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -48,12 +49,16 @@ class Migration(migrations.Migration):
(
"club",
models.ForeignKey(
- verbose_name="club", related_name="posters", to="club.Club"
+ on_delete=django.db.models.deletion.CASCADE,
+ verbose_name="club",
+ related_name="posters",
+ to="club.Club",
),
),
(
"moderator",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="moderator",
blank=True,
null=True,
diff --git a/com/models.py b/com/models.py
index a0a490c3..b2effd47 100644
--- a/com/models.py
+++ b/com/models.py
@@ -28,7 +28,7 @@ from django.db import models, transaction
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.conf import settings
from django.contrib.staticfiles.templatetags.staticfiles import static
from django.core.mail import EmailMultiAlternatives
@@ -71,13 +71,22 @@ class News(models.Model):
type = models.CharField(
_("type"), max_length=16, choices=NEWS_TYPES, default="EVENT"
)
- club = models.ForeignKey(Club, related_name="news", verbose_name=_("club"))
+ club = models.ForeignKey(
+ Club, related_name="news", verbose_name=_("club"), on_delete=models.CASCADE
+ )
author = models.ForeignKey(
- User, related_name="owned_news", verbose_name=_("author")
+ User,
+ related_name="owned_news",
+ verbose_name=_("author"),
+ on_delete=models.CASCADE,
)
is_moderated = models.BooleanField(_("is moderated"), default=False)
moderator = models.ForeignKey(
- User, related_name="moderated_news", verbose_name=_("moderator"), null=True
+ User,
+ related_name="moderated_news",
+ verbose_name=_("moderator"),
+ null=True,
+ on_delete=models.CASCADE,
)
def is_owned_by(self, user):
@@ -138,7 +147,12 @@ class NewsDate(models.Model):
we don't have to make copies
"""
- news = models.ForeignKey(News, related_name="dates", verbose_name=_("news_date"))
+ news = models.ForeignKey(
+ News,
+ related_name="dates",
+ verbose_name=_("news_date"),
+ on_delete=models.CASCADE,
+ )
start_date = models.DateTimeField(_("start_date"), null=True, blank=True)
end_date = models.DateTimeField(_("end_date"), null=True, blank=True)
@@ -230,15 +244,25 @@ class Weekmail(models.Model):
class WeekmailArticle(models.Model):
weekmail = models.ForeignKey(
- Weekmail, related_name="articles", verbose_name=_("weekmail"), null=True
+ Weekmail,
+ related_name="articles",
+ verbose_name=_("weekmail"),
+ null=True,
+ on_delete=models.CASCADE,
)
title = models.CharField(_("title"), max_length=64)
content = models.TextField(_("content"))
author = models.ForeignKey(
- User, related_name="owned_weekmail_articles", verbose_name=_("author")
+ User,
+ related_name="owned_weekmail_articles",
+ verbose_name=_("author"),
+ on_delete=models.CASCADE,
)
club = models.ForeignKey(
- Club, related_name="weekmail_articles", verbose_name=_("club")
+ Club,
+ related_name="weekmail_articles",
+ verbose_name=_("club"),
+ on_delete=models.CASCADE,
)
rank = models.IntegerField(_("rank"), default=-1)
@@ -271,7 +295,11 @@ class Poster(models.Model):
)
file = models.ImageField(_("file"), null=False, upload_to="com/posters")
club = models.ForeignKey(
- Club, related_name="posters", verbose_name=_("club"), null=False
+ Club,
+ related_name="posters",
+ verbose_name=_("club"),
+ null=False,
+ on_delete=models.CASCADE,
)
screens = models.ManyToManyField(Screen, related_name="posters")
date_begin = models.DateTimeField(blank=False, null=False, default=timezone.now)
@@ -286,6 +314,7 @@ class Poster(models.Model):
verbose_name=_("moderator"),
null=True,
blank=True,
+ on_delete=models.CASCADE,
)
def save(self, *args, **kwargs):
diff --git a/com/tests.py b/com/tests.py
index 2e8f148a..398b22fe 100644
--- a/com/tests.py
+++ b/com/tests.py
@@ -24,7 +24,7 @@
from django.test import TestCase
from django.conf import settings
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.core.management import call_command
from django.utils import html
from django.utils.translation import ugettext as _
@@ -62,7 +62,7 @@ class ComTest(TestCase):
self.com_group = RealGroup.objects.filter(
id=settings.SITH_GROUP_COM_ADMIN_ID
).first()
- self.skia.groups = [self.com_group]
+ self.skia.groups.set([self.com_group])
self.skia.save()
self.client.login(username=self.skia.username, password="plop")
diff --git a/com/urls.py b/com/urls.py
index 1caff5fc..6128d1d4 100644
--- a/com/urls.py
+++ b/com/urls.py
@@ -22,97 +22,103 @@
#
#
-from django.conf.urls import url
+from django.urls import re_path
from com.views import *
from club.views import MailingDeleteView
urlpatterns = [
- url(r"^sith/edit/alert$", AlertMsgEditView.as_view(), name="alert_edit"),
- url(r"^sith/edit/info$", InfoMsgEditView.as_view(), name="info_edit"),
- url(
+ re_path(r"^sith/edit/alert$", AlertMsgEditView.as_view(), name="alert_edit"),
+ re_path(r"^sith/edit/info$", InfoMsgEditView.as_view(), name="info_edit"),
+ re_path(
r"^sith/edit/weekmail_destinations$",
WeekmailDestinationEditView.as_view(),
name="weekmail_destinations",
),
- url(r"^weekmail$", WeekmailEditView.as_view(), name="weekmail"),
- url(r"^weekmail/preview$", WeekmailPreviewView.as_view(), name="weekmail_preview"),
- url(
+ re_path(r"^weekmail$", WeekmailEditView.as_view(), name="weekmail"),
+ re_path(
+ r"^weekmail/preview$", WeekmailPreviewView.as_view(), name="weekmail_preview"
+ ),
+ re_path(
r"^weekmail/new_article$",
WeekmailArticleCreateView.as_view(),
name="weekmail_article",
),
- url(
+ re_path(
r"^weekmail/article/(?P[0-9]+)/delete$",
WeekmailArticleDeleteView.as_view(),
name="weekmail_article_delete",
),
- url(
+ re_path(
r"^weekmail/article/(?P[0-9]+)/edit$",
WeekmailArticleEditView.as_view(),
name="weekmail_article_edit",
),
- url(r"^news$", NewsListView.as_view(), name="news_list"),
- url(r"^news/admin$", NewsAdminListView.as_view(), name="news_admin_list"),
- url(r"^news/create$", NewsCreateView.as_view(), name="news_new"),
- url(
+ re_path(r"^news$", NewsListView.as_view(), name="news_list"),
+ re_path(r"^news/admin$", NewsAdminListView.as_view(), name="news_admin_list"),
+ re_path(r"^news/create$", NewsCreateView.as_view(), name="news_new"),
+ re_path(
r"^news/(?P[0-9]+)/delete$",
NewsDeleteView.as_view(),
name="news_delete",
),
- url(
+ re_path(
r"^news/(?P[0-9]+)/moderate$",
NewsModerateView.as_view(),
name="news_moderate",
),
- url(r"^news/(?P[0-9]+)/edit$", NewsEditView.as_view(), name="news_edit"),
- url(r"^news/(?P[0-9]+)$", NewsDetailView.as_view(), name="news_detail"),
- url(r"^mailings$", MailingListAdminView.as_view(), name="mailing_admin"),
- url(
+ re_path(
+ r"^news/(?P[0-9]+)/edit$", NewsEditView.as_view(), name="news_edit"
+ ),
+ re_path(
+ r"^news/(?P[0-9]+)$", NewsDetailView.as_view(), name="news_detail"
+ ),
+ re_path(r"^mailings$", MailingListAdminView.as_view(), name="mailing_admin"),
+ re_path(
r"^mailings/(?P[0-9]+)/moderate$",
MailingModerateView.as_view(),
name="mailing_moderate",
),
- url(
+ re_path(
r"^mailings/(?P[0-9]+)/delete$",
MailingDeleteView.as_view(redirect_page="com:mailing_admin"),
name="mailing_delete",
),
- url(r"^poster$", PosterListView.as_view(), name="poster_list"),
- url(r"^poster/create$", PosterCreateView.as_view(), name="poster_create"),
- url(
+ re_path(r"^poster$", PosterListView.as_view(), name="poster_list"),
+ re_path(r"^poster/create$", PosterCreateView.as_view(), name="poster_create"),
+ re_path(
r"^poster/(?P[0-9]+)/edit$",
PosterEditView.as_view(),
name="poster_edit",
),
- url(
+ re_path(
r"^poster/(?P[0-9]+)/delete$",
PosterDeleteView.as_view(),
name="poster_delete",
),
- url(
+ re_path(
r"^poster/moderate$",
PosterModerateListView.as_view(),
name="poster_moderate_list",
),
- url(
+ re_path(
r"^poster/(?P[0-9]+)/moderate$",
PosterModerateView.as_view(),
name="poster_moderate",
),
- url(r"^screen$", ScreenListView.as_view(), name="screen_list"),
- url(r"^screen/create$", ScreenCreateView.as_view(), name="screen_create"),
- url(
+ re_path(r"^screen$", ScreenListView.as_view(), name="screen_list"),
+ re_path(r"^screen/create$", ScreenCreateView.as_view(), name="screen_create"),
+ re_path(
r"^screen/(?P[0-9]+)/slideshow$",
ScreenSlideshowView.as_view(),
name="screen_slideshow",
),
- url(
+ re_path(
r"^screen/(?P[0-9]+)/edit$",
ScreenEditView.as_view(),
name="screen_edit",
),
- url(
+ re_path(
r"^screen/(?P[0-9]+)/delete$",
ScreenDeleteView.as_view(),
name="screen_delete",
diff --git a/com/views.py b/com/views.py
index ae2987c2..d7f2ca25 100644
--- a/com/views.py
+++ b/com/views.py
@@ -29,7 +29,7 @@ from django.views.generic import ListView, DetailView, View
from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext_lazy as _
-from django.core.urlresolvers import reverse, reverse_lazy
+from django.urls import reverse, reverse_lazy
from django.core.exceptions import ValidationError
from django.utils import timezone
from django.conf import settings
@@ -74,14 +74,14 @@ class PosterForm(forms.ModelForm):
widgets = {"screens": forms.CheckboxSelectMultiple}
date_begin = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"],
+ input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("Start date"),
widget=SelectDateTime,
required=True,
initial=timezone.now().strftime("%Y-%m-%d %H:%M:%S"),
)
date_end = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"],
+ input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
widget=SelectDateTime,
required=False,
@@ -200,19 +200,22 @@ class NewsForm(forms.ModelForm):
}
start_date = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"],
+ input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("Start date"),
widget=SelectDateTime,
required=False,
)
end_date = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"],
+ input_formats=["%Y-%m-%d %H:%M:%S"],
label=_("End date"),
widget=SelectDateTime,
required=False,
)
until = forms.DateTimeField(
- ["%Y-%m-%d %H:%M:%S"], label=_("Until"), widget=SelectDateTime, required=False
+ input_formats=["%Y-%m-%d %H:%M:%S"],
+ label=_("Until"),
+ widget=SelectDateTime,
+ required=False,
)
automoderation = forms.BooleanField(label=_("Automoderation"), required=False)
diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py
index fcd13908..06c5d3f3 100644
--- a/core/management/commands/populate.py
+++ b/core/management/commands/populate.py
@@ -142,18 +142,18 @@ class Command(BaseCommand):
g.save()
c = Counter(id=b[0], name=b[1], club=bar_club, type="BAR")
c.save()
- c.edit_groups = [g]
- c.save()
+ g.editable_counters.add(c)
+ g.save()
self.reset_index("counter")
Counter(name="Eboutic", club=main_club, type="EBOUTIC").save()
Counter(name="AE", club=main_club, type="OFFICE").save()
- home_root.view_groups = [
- Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first()
- ]
- club_root.view_groups = [
- Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first()
- ]
+ home_root.view_groups.set(
+ [Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first()]
+ )
+ club_root.view_groups.set(
+ [Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first()]
+ )
home_root.save()
club_root.save()
@@ -163,7 +163,7 @@ class Command(BaseCommand):
p = Page(name="Index")
p.set_lock(root)
p.save()
- p.view_groups = [settings.SITH_GROUP_PUBLIC_ID]
+ p.view_groups.set([settings.SITH_GROUP_PUBLIC_ID])
p.set_lock(root)
p.save()
PageRev(
@@ -178,7 +178,7 @@ Welcome to the wiki page!
p = Page(name="services")
p.set_lock(root)
p.save()
- p.view_groups = [settings.SITH_GROUP_PUBLIC_ID]
+ p.view_groups.set([settings.SITH_GROUP_PUBLIC_ID])
p.set_lock(root)
PageRev(
page=p,
@@ -297,9 +297,13 @@ Welcome to the wiki page!
counter.view_groups = [
Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first().id
]
- counter.groups = [
- Group.objects.filter(id=settings.SITH_GROUP_COUNTER_ADMIN_ID).first().id
- ]
+ counter.groups.set(
+ [
+ Group.objects.filter(id=settings.SITH_GROUP_COUNTER_ADMIN_ID)
+ .first()
+ .id
+ ]
+ )
counter.save()
# Adding user Comptable
comptable = User(
@@ -316,11 +320,13 @@ Welcome to the wiki page!
comptable.view_groups = [
Group.objects.filter(name=settings.SITH_MAIN_MEMBERS_GROUP).first().id
]
- comptable.groups = [
- Group.objects.filter(id=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID)
- .first()
- .id
- ]
+ comptable.groups.set(
+ [
+ Group.objects.filter(id=settings.SITH_GROUP_ACCOUNTING_ADMIN_ID)
+ .first()
+ .id
+ ]
+ )
comptable.save()
# Adding user Guy
u = User(
@@ -359,11 +365,11 @@ Welcome to the wiki page!
PageRev(
page=p, title="Aide sur la syntaxe", author=skia, content=rm.read()
).save()
- p.view_groups = [settings.SITH_GROUP_PUBLIC_ID]
+ p.view_groups.set([settings.SITH_GROUP_PUBLIC_ID])
p.save(force_lock=True)
p = Page(name="Services")
p.save(force_lock=True)
- p.view_groups = [settings.SITH_GROUP_PUBLIC_ID]
+ p.view_groups.set([settings.SITH_GROUP_PUBLIC_ID])
p.save(force_lock=True)
PageRev(
page=p,
@@ -842,9 +848,9 @@ Welcome to the wiki page!
)
comunity.set_password("plop")
comunity.save()
- comunity.groups = [
- Group.objects.filter(name="Communication admin").first().id
- ]
+ comunity.groups.set(
+ [Group.objects.filter(name="Communication admin").first().id]
+ )
comunity.save()
Membership(
user=comunity,
@@ -862,7 +868,7 @@ Welcome to the wiki page!
)
tutu.set_password("plop")
tutu.save()
- tutu.groups = [settings.SITH_GROUP_PEDAGOGY_ADMIN_ID]
+ tutu.groups.set([settings.SITH_GROUP_PEDAGOGY_ADMIN_ID])
tutu.save()
# Adding subscription for sli
diff --git a/core/markdown.py b/core/markdown.py
index c5d69a6c..8ce70265 100644
--- a/core/markdown.py
+++ b/core/markdown.py
@@ -25,7 +25,7 @@
import os
import re
from mistune import Renderer, InlineGrammar, InlineLexer, Markdown, escape, escape_link
-from django.core.urlresolvers import reverse
+from django.urls import reverse
class SithRenderer(Renderer):
diff --git a/core/middleware.py b/core/middleware.py
index 37c01ff9..54d7dd2e 100644
--- a/core/middleware.py
+++ b/core/middleware.py
@@ -37,7 +37,7 @@ AnonymousUser = getattr(importlib.import_module(module), klass)
def get_cached_user(request):
if not hasattr(request, "_cached_user"):
user = get_user(request)
- if user.is_anonymous():
+ if user.is_anonymous:
user = AnonymousUser(request)
request._cached_user = user
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
index 190ace89..51b8bc2e 100644
--- a/core/migrations/0001_initial.py
+++ b/core/migrations/0001_initial.py
@@ -8,6 +8,7 @@ import django.core.validators
import core.models
import phonenumber_field.modelfields
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -276,6 +277,7 @@ class Migration(migrations.Migration):
(
"group_ptr",
models.OneToOneField(
+ on_delete=django.db.models.deletion.CASCADE,
primary_key=True,
parent_link=True,
serialize=False,
@@ -329,6 +331,7 @@ class Migration(migrations.Migration):
(
"owner_group",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
default=1,
related_name="owned_page",
verbose_name="owner group",
@@ -390,10 +393,19 @@ class Migration(migrations.Migration):
(
"author",
models.ForeignKey(
- to=settings.AUTH_USER_MODEL, related_name="page_rev"
+ on_delete=django.db.models.deletion.CASCADE,
+ to=settings.AUTH_USER_MODEL,
+ related_name="page_rev",
+ ),
+ ),
+ (
+ "page",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ to="core.Page",
+ related_name="revisions",
),
),
- ("page", models.ForeignKey(to="core.Page", related_name="revisions")),
],
options={"ordering": ["date"]},
),
@@ -420,7 +432,9 @@ class Migration(migrations.Migration):
(
"user",
models.OneToOneField(
- to=settings.AUTH_USER_MODEL, related_name="preferences"
+ on_delete=django.db.models.deletion.CASCADE,
+ to=settings.AUTH_USER_MODEL,
+ related_name="preferences",
),
),
],
@@ -469,6 +483,7 @@ class Migration(migrations.Migration):
(
"owner",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="owner",
to=settings.AUTH_USER_MODEL,
related_name="owned_files",
@@ -477,6 +492,7 @@ class Migration(migrations.Migration):
(
"parent",
models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
null=True,
related_name="children",
verbose_name="parent",
@@ -512,6 +528,7 @@ class Migration(migrations.Migration):
model_name="user",
name="home",
field=models.OneToOneField(
+ on_delete=django.db.models.deletion.CASCADE,
blank=True,
null=True,
related_name="home_of",
diff --git a/core/migrations/0005_auto_20161105_1035.py b/core/migrations/0005_auto_20161105_1035.py
index 803b373a..5225f184 100644
--- a/core/migrations/0005_auto_20161105_1035.py
+++ b/core/migrations/0005_auto_20161105_1035.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -21,6 +22,7 @@ class Migration(migrations.Migration):
model_name="page",
name="lock_user",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="lock user",
default=None,
blank=True,
diff --git a/core/migrations/0012_notification.py b/core/migrations/0012_notification.py
index f48e4063..a7a68209 100644
--- a/core/migrations/0012_notification.py
+++ b/core/migrations/0012_notification.py
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
import django.utils.timezone
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -48,7 +49,9 @@ class Migration(migrations.Migration):
(
"user",
models.ForeignKey(
- related_name="notifications", to=settings.AUTH_USER_MODEL
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="notifications",
+ to=settings.AUTH_USER_MODEL,
),
),
],
diff --git a/core/migrations/0015_sithfile_moderator.py b/core/migrations/0015_sithfile_moderator.py
index 00e2f1f9..13e6a3f2 100644
--- a/core/migrations/0015_sithfile_moderator.py
+++ b/core/migrations/0015_sithfile_moderator.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -14,6 +15,7 @@ class Migration(migrations.Migration):
model_name="sithfile",
name="moderator",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
related_name="moderated_files",
verbose_name="owner",
default=0,
diff --git a/core/migrations/0016_auto_20161212_1922.py b/core/migrations/0016_auto_20161212_1922.py
index e98f06d6..f23b0dd5 100644
--- a/core/migrations/0016_auto_20161212_1922.py
+++ b/core/migrations/0016_auto_20161212_1922.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -14,6 +15,7 @@ class Migration(migrations.Migration):
model_name="sithfile",
name="moderator",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
related_name="moderated_files",
blank=True,
null=True,
diff --git a/core/migrations/0023_auto_20170902_1226.py b/core/migrations/0023_auto_20170902_1226.py
index f932cba9..67798aa5 100644
--- a/core/migrations/0023_auto_20170902_1226.py
+++ b/core/migrations/0023_auto_20170902_1226.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -35,7 +36,9 @@ class Migration(migrations.Migration):
model_name="preferences",
name="user",
field=models.OneToOneField(
- related_name="_preferences", to=settings.AUTH_USER_MODEL
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="_preferences",
+ to=settings.AUTH_USER_MODEL,
),
),
]
diff --git a/core/migrations/0027_gift.py b/core/migrations/0027_gift.py
index bfac2175..ab342e26 100644
--- a/core/migrations/0027_gift.py
+++ b/core/migrations/0027_gift.py
@@ -4,6 +4,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
import django.utils.timezone
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -33,7 +34,9 @@ class Migration(migrations.Migration):
(
"user",
models.ForeignKey(
- related_name="gifts", to=settings.AUTH_USER_MODEL
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="gifts",
+ to=settings.AUTH_USER_MODEL,
),
),
],
diff --git a/core/migrations/0029_auto_20180426_2013.py b/core/migrations/0029_auto_20180426_2013.py
index 4f80245d..ac0a06be 100644
--- a/core/migrations/0029_auto_20180426_2013.py
+++ b/core/migrations/0029_auto_20180426_2013.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
from django.db import migrations, models
import core.models
+import django.db.models.deletion
class Migration(migrations.Migration):
@@ -14,6 +15,7 @@ class Migration(migrations.Migration):
model_name="page",
name="owner_group",
field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
verbose_name="owner group",
default=core.models.Page.get_default_owner_group,
related_name="owned_page",
diff --git a/core/migrations/0033_auto_20191006_0049.py b/core/migrations/0033_auto_20191006_0049.py
new file mode 100644
index 00000000..3f2628c8
--- /dev/null
+++ b/core/migrations/0033_auto_20191006_0049.py
@@ -0,0 +1,27 @@
+# Generated by Django 2.2.6 on 2019-10-05 22:49
+
+import django.contrib.auth.models
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [("core", "0032_auto_20190909_0043")]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="page",
+ options={
+ "permissions": (
+ (
+ "change_prop_page",
+ "Can change the page's properties (groups, ...)",
+ ),
+ )
+ },
+ ),
+ migrations.AlterModelManagers(
+ name="group",
+ managers=[("objects", django.contrib.auth.models.GroupManager())],
+ ),
+ ]
diff --git a/core/models.py b/core/models.py
index d27a2f79..17bc5003 100644
--- a/core/models.py
+++ b/core/models.py
@@ -38,7 +38,7 @@ from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django.core import validators
from django.core.exceptions import ValidationError, PermissionDenied
-from django.core.urlresolvers import reverse
+from django.urls import reverse
from django.conf import settings
from django.db import transaction
from django.contrib.staticfiles.storage import staticfiles_storage
@@ -743,7 +743,9 @@ class AnonymousUser(AuthAnonymousUser):
class Preferences(models.Model):
- user = models.OneToOneField(User, related_name="_preferences")
+ user = models.OneToOneField(
+ User, related_name="_preferences", on_delete=models.CASCADE
+ )
receive_weekmail = models.BooleanField(
_("do you want to receive the weekmail"), default=False
)
@@ -777,7 +779,12 @@ def get_thumbnail_directory(instance, filename):
class SithFile(models.Model):
name = models.CharField(_("file name"), max_length=256, blank=False)
parent = models.ForeignKey(
- "self", related_name="children", verbose_name=_("parent"), null=True, blank=True
+ "self",
+ related_name="children",
+ verbose_name=_("parent"),
+ null=True,
+ blank=True,
+ on_delete=models.CASCADE,
)
file = models.FileField(
upload_to=get_directory,
@@ -800,7 +807,12 @@ class SithFile(models.Model):
null=True,
blank=True,
)
- owner = models.ForeignKey(User, related_name="owned_files", verbose_name=_("owner"))
+ owner = models.ForeignKey(
+ User,
+ related_name="owned_files",
+ verbose_name=_("owner"),
+ on_delete=models.CASCADE,
+ )
edit_groups = models.ManyToManyField(
Group, related_name="editable_files", verbose_name=_("edit group"), blank=True
)
@@ -818,6 +830,7 @@ class SithFile(models.Model):
verbose_name=_("owner"),
null=True,
blank=True,
+ on_delete=models.CASCADE,
)
asked_for_removal = models.BooleanField(_("asked for removal"), default=False)
is_in_sas = models.BooleanField(
@@ -935,8 +948,8 @@ class SithFile(models.Model):
def copy_rights(self):
"""Copy, if possible, the rights of the parent folder"""
if self.parent is not None:
- self.edit_groups = self.parent.edit_groups.all()
- self.view_groups = self.parent.view_groups.all()
+ self.edit_groups.set(self.parent.edit_groups.all())
+ self.view_groups.set(self.parent.view_groups.all())
self.save()
def move_to(self, parent):
@@ -1133,6 +1146,7 @@ class Page(models.Model):
related_name="owned_page",
verbose_name=_("owner group"),
default=get_default_owner_group,
+ on_delete=models.CASCADE,
)
edit_groups = models.ManyToManyField(
Group, related_name="editable_page", verbose_name=_("edit group"), blank=True
@@ -1147,6 +1161,7 @@ class Page(models.Model):
blank=True,
null=True,
default=None,
+ on_delete=models.CASCADE,
)
lock_timeout = models.DateTimeField(
_("lock_timeout"), null=True, blank=True, default=None
@@ -1156,7 +1171,6 @@ class Page(models.Model):
unique_together = ("name", "parent")
permissions = (
("change_prop_page", "Can change the page's properties (groups, ...)"),
- ("view_page", "Can view the page"),
)
@staticmethod
@@ -1347,8 +1361,8 @@ class PageRev(models.Model):
title = models.CharField(_("page title"), max_length=255, blank=True)
content = models.TextField(_("page content"), blank=True)
date = models.DateTimeField(_("date"), auto_now=True)
- author = models.ForeignKey(User, related_name="page_rev")
- page = models.ForeignKey(Page, related_name="revisions")
+ author = models.ForeignKey(User, related_name="page_rev", on_delete=models.CASCADE)
+ page = models.ForeignKey(Page, related_name="revisions", on_delete=models.CASCADE)
class Meta:
ordering = ["date"]
@@ -1386,7 +1400,9 @@ class PageRev(models.Model):
class Notification(models.Model):
- user = models.ForeignKey(User, related_name="notifications")
+ user = models.ForeignKey(
+ User, related_name="notifications", on_delete=models.CASCADE
+ )
url = models.CharField(_("url"), max_length=255)
param = models.CharField(_("param"), max_length=128, default="")
type = models.CharField(
@@ -1422,7 +1438,7 @@ class Notification(models.Model):
class Gift(models.Model):
label = models.CharField(_("label"), max_length=255)
date = models.DateTimeField(_("date"), default=timezone.now)
- user = models.ForeignKey(User, related_name="gifts")
+ user = models.ForeignKey(User, related_name="gifts", on_delete=models.CASCADE)
def __str__(self):
return "%s - %s" % (self.translated_label, self.date.strftime("%d %b %Y"))
diff --git a/core/templates/core/base.jinja b/core/templates/core/base.jinja
index 43d2a058..0f07b50e 100644
--- a/core/templates/core/base.jinja
+++ b/core/templates/core/base.jinja
@@ -39,7 +39,7 @@