Merge branch 'django-3.2' into 'master'

Upgrade to django 3.2

* Upgrade dependencies
* Fix ugettext
* Fix bad urls

See merge request ae-utbm/Sith!316
This commit is contained in:
Théo | Ailé 2022-08-05 18:46:24 +00:00
commit 0c2494cb34
57 changed files with 1475 additions and 212 deletions

1
.gitignore vendored
View File

@ -5,7 +5,6 @@ db.sqlite3
*__pycache__* *__pycache__*
.DS_Store .DS_Store
pyrightconfig.json pyrightconfig.json
poetry.lock
dist/ dist/
.vscode/ .vscode/
env/ env/

View File

@ -27,7 +27,7 @@ from django.core.exceptions import ValidationError
from django.core import validators from django.core import validators
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.template import defaultfilters from django.template import defaultfilters
from phonenumber_field.modelfields import PhoneNumberField from phonenumber_field.modelfields import PhoneNumberField

View File

@ -25,7 +25,7 @@
from django.views.generic import ListView, DetailView from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView
from django.urls import reverse_lazy, reverse from django.urls import reverse_lazy, reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.forms.models import modelform_factory from django.forms.models import modelform_factory
from django.core.exceptions import PermissionDenied, ValidationError from django.core.exceptions import PermissionDenied, ValidationError
from django.forms import HiddenInput from django.forms import HiddenInput

View File

@ -25,7 +25,7 @@
from django.conf import settings from django.conf import settings
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultipleField from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultipleField

View File

@ -26,7 +26,7 @@
from django.db import models from django.db import models
from django.core import validators from django.core import validators
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError, ObjectDoesNotExist from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.db import transaction from django.db import transaction
from django.urls import reverse from django.urls import reverse

View File

@ -45,7 +45,7 @@
</thead> </thead>
<tbody> <tbody>
{% for widget in form_mailing_removal.subwidgets %} {% for widget in form_mailing_removal.subwidgets %}
{% set user = ms[widget.data.value][0] %} {% set user = ms[widget.data.value.value][0] %}
<tr> <tr>
<td>{{ user.get_username }}</td> <td>{{ user.get_username }}</td>
<td>{{ user.get_email }}</td> <td>{{ user.get_email }}</td>

View File

@ -25,7 +25,7 @@
from django.conf import settings from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.utils import timezone, html from django.utils import timezone, html
from django.utils.translation import ugettext as _ from django.utils.translation import gettext as _
from django.urls import reverse from django.urls import reverse
from django.core.management import call_command from django.core.management import call_command
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
@ -180,7 +180,7 @@ class ClubTest(TestCase):
) )
self.assertTrue(response.status_code == 200) self.assertTrue(response.status_code == 200)
self.assertTrue( self.assertTrue(
"<li>Vous n&#39;avez pas la permission de faire cela</li>" "<li>Vous n&#x27;avez pas la permission de faire cela</li>"
in str(response.content) in str(response.content)
) )

View File

@ -39,8 +39,8 @@ from django.http import (
) )
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.translation import ugettext as _t from django.utils.translation import gettext as _t
from django.core.exceptions import PermissionDenied, ValidationError, NON_FIELD_ERRORS from django.core.exceptions import PermissionDenied, ValidationError, NON_FIELD_ERRORS
from django.core.paginator import Paginator, InvalidPage from django.core.paginator import Paginator, InvalidPage
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect

View File

@ -26,11 +26,11 @@
from django.shortcuts import render from django.shortcuts import render
from django.db import models, transaction from django.db import models, transaction
from django.db.models import Q from django.db.models import Q
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.urls import reverse from django.urls import reverse
from django.conf import settings from django.conf import settings
from django.contrib.staticfiles.templatetags.staticfiles import static from django.templatetags.static import static
from django.core.mail import EmailMultiAlternatives from django.core.mail import EmailMultiAlternatives
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError

View File

@ -27,7 +27,7 @@ from django.conf import settings
from django.urls import reverse from django.urls import reverse
from django.core.management import call_command from django.core.management import call_command
from django.utils import html from django.utils import html
from django.utils.translation import ugettext as _ from django.utils.translation import gettext as _
from core.models import User, RealGroup from core.models import User, RealGroup
@ -40,8 +40,8 @@ class ComAlertTest(TestCase):
def test_page_is_working(self): def test_page_is_working(self):
self.client.login(username="comunity", password="plop") self.client.login(username="comunity", password="plop")
response = self.client.get(reverse("com:alert_edit")) response = self.client.get(reverse("com:alert_edit"))
self.assertNotEquals(response.status_code, 500) self.assertNotEqual(response.status_code, 500)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
class ComInfoTest(TestCase): class ComInfoTest(TestCase):
@ -51,8 +51,8 @@ class ComInfoTest(TestCase):
def test_page_is_working(self): def test_page_is_working(self):
self.client.login(username="comunity", password="plop") self.client.login(username="comunity", password="plop")
response = self.client.get(reverse("com:info_edit")) response = self.client.get(reverse("com:info_edit"))
self.assertNotEquals(response.status_code, 500) self.assertNotEqual(response.status_code, 500)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
class ComTest(TestCase): class ComTest(TestCase):

View File

@ -28,7 +28,7 @@ from django.http import HttpResponseRedirect
from django.views.generic import ListView, DetailView, View from django.views.generic import ListView, DetailView, View
from django.views.generic.edit import UpdateView, CreateView, DeleteView from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.urls import reverse, reverse_lazy from django.urls import reverse, reverse_lazy
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils import timezone from django.utils import timezone

View File

@ -21,5 +21,3 @@
# Place - Suite 330, Boston, MA 02111-1307, USA. # Place - Suite 330, Boston, MA 02111-1307, USA.
# #
# #
default_app_config = "core.apps.SithConfig"

View File

@ -34,7 +34,7 @@ from django.contrib.auth.models import (
GroupManager as AuthGroupManager, GroupManager as AuthGroupManager,
AnonymousUser as AuthAnonymousUser, AnonymousUser as AuthAnonymousUser,
) )
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.core import validators from django.core import validators
from django.core.exceptions import ValidationError, PermissionDenied from django.core.exceptions import ValidationError, PermissionDenied

View File

@ -25,9 +25,9 @@
import os import os
import sass import sass
from urllib.parse import urljoin
from django.utils.encoding import force_bytes, iri_to_uri from django.utils.encoding import force_bytes, iri_to_uri
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.utils.six.moves.urllib.parse import urljoin
from django.templatetags.static import static from django.templatetags.static import static
from django.conf import settings from django.conf import settings
from core.scss.storage import ScssFileStorage, find_file from core.scss.storage import ScssFileStorage, find_file

View File

@ -402,32 +402,32 @@ class UserToolsTest(TestCase):
def test_anonymous_user_unauthorized(self): def test_anonymous_user_unauthorized(self):
response = self.client.get(reverse("core:user_tools")) response = self.client.get(reverse("core:user_tools"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_page_is_working(self): def test_page_is_working(self):
# Test for simple user # Test for simple user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
response = self.client.get(reverse("core:user_tools")) response = self.client.get(reverse("core:user_tools"))
self.assertNotEquals(response.status_code, 500) self.assertNotEqual(response.status_code, 500)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test for root # Test for root
self.client.login(username="root", password="plop") self.client.login(username="root", password="plop")
response = self.client.get(reverse("core:user_tools")) response = self.client.get(reverse("core:user_tools"))
self.assertNotEquals(response.status_code, 500) self.assertNotEqual(response.status_code, 500)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test for skia # Test for skia
self.client.login(username="skia", password="plop") self.client.login(username="skia", password="plop")
response = self.client.get(reverse("core:user_tools")) response = self.client.get(reverse("core:user_tools"))
self.assertNotEquals(response.status_code, 500) self.assertNotEqual(response.status_code, 500)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test for comunity # Test for comunity
self.client.login(username="comunity", password="plop") self.client.login(username="comunity", password="plop")
response = self.client.get(reverse("core:user_tools")) response = self.client.get(reverse("core:user_tools"))
self.assertNotEquals(response.status_code, 500) self.assertNotEqual(response.status_code, 500)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# TODO: many tests on the pages: # TODO: many tests on the pages:

View File

@ -23,7 +23,7 @@
# #
# #
from django.urls import re_path from django.urls import re_path, path
from core.views import * from core.views import *
@ -60,8 +60,8 @@ urlpatterns = [
SithPasswordResetDoneView.as_view(), SithPasswordResetDoneView.as_view(),
name="password_reset_done", name="password_reset_done",
), ),
re_path( path(
r"^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$", r"reset/<str:uidb64>/<str:token>/",
SithPasswordResetConfirmView.as_view(), SithPasswordResetConfirmView.as_view(),
name="password_reset_confirm", name="password_reset_confirm",
), ),

View File

@ -29,7 +29,7 @@ from django.views.generic.edit import UpdateView, FormMixin, DeleteView
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.forms.models import modelform_factory from django.forms.models import modelform_factory
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.http import HttpResponse from django.http import HttpResponse
from wsgiref.util import FileWrapper from wsgiref.util import FileWrapper
from django.urls import reverse from django.urls import reverse
@ -147,7 +147,7 @@ class FileListView(ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super(FileListView, self).get_context_data(**kwargs) kwargs = super(FileListView, self).get_context_data(**kwargs)
kwargs["popup"] = "" kwargs["popup"] = ""
if self.kwargs["popup"]: if self.kwargs.get("popup") is not None:
kwargs["popup"] = "popup" kwargs["popup"] = "popup"
return kwargs return kwargs
@ -165,7 +165,7 @@ class FileEditView(CanEditMixin, UpdateView):
return modelform_factory(SithFile, fields=fields) return modelform_factory(SithFile, fields=fields)
def get_success_url(self): def get_success_url(self):
if self.kwargs["popup"]: if self.kwargs.get("popup") is not None:
return reverse( return reverse(
"core:file_detail", kwargs={"file_id": self.object.id, "popup": "popup"} "core:file_detail", kwargs={"file_id": self.object.id, "popup": "popup"}
) )
@ -176,7 +176,7 @@ class FileEditView(CanEditMixin, UpdateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super(FileEditView, self).get_context_data(**kwargs) kwargs = super(FileEditView, self).get_context_data(**kwargs)
kwargs["popup"] = "" kwargs["popup"] = ""
if self.kwargs["popup"]: if self.kwargs.get("popup") is not None:
kwargs["popup"] = "popup" kwargs["popup"] = "popup"
return kwargs return kwargs
@ -217,13 +217,13 @@ class FileEditPropView(CanEditPropMixin, UpdateView):
def get_success_url(self): def get_success_url(self):
return reverse( return reverse(
"core:file_detail", "core:file_detail",
kwargs={"file_id": self.object.id, "popup": self.kwargs["popup"] or ""}, kwargs={"file_id": self.object.id, "popup": self.kwargs.get("popup", "")},
) )
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super(FileEditPropView, self).get_context_data(**kwargs) kwargs = super(FileEditPropView, self).get_context_data(**kwargs)
kwargs["popup"] = "" kwargs["popup"] = ""
if self.kwargs["popup"]: if self.kwargs.get("popup") is not None:
kwargs["popup"] = "popup" kwargs["popup"] = "popup"
return kwargs return kwargs
@ -301,14 +301,14 @@ class FileView(CanViewMixin, DetailView, FormMixin):
def get_success_url(self): def get_success_url(self):
return reverse( return reverse(
"core:file_detail", "core:file_detail",
kwargs={"file_id": self.object.id, "popup": self.kwargs["popup"] or ""}, kwargs={"file_id": self.object.id, "popup": self.kwargs.get("popup", "")},
) )
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super(FileView, self).get_context_data(**kwargs) kwargs = super(FileView, self).get_context_data(**kwargs)
kwargs["popup"] = "" kwargs["popup"] = ""
kwargs["form"] = self.form kwargs["form"] = self.form
if self.kwargs["popup"]: if self.kwargs.get("popup") is not None:
kwargs["popup"] = "popup" kwargs["popup"] = "popup"
kwargs["clipboard"] = SithFile.objects.filter( kwargs["clipboard"] = SithFile.objects.filter(
id__in=self.request.session["clipboard"] id__in=self.request.session["clipboard"]
@ -328,20 +328,20 @@ class FileDeleteView(CanEditPropMixin, DeleteView):
return self.request.GET["next"] return self.request.GET["next"]
if self.object.parent is None: if self.object.parent is None:
return reverse( return reverse(
"core:file_list", kwargs={"popup": self.kwargs["popup"] or ""} "core:file_list", kwargs={"popup": self.kwargs.get("popup", "")}
) )
return reverse( return reverse(
"core:file_detail", "core:file_detail",
kwargs={ kwargs={
"file_id": self.object.parent.id, "file_id": self.object.parent.id,
"popup": self.kwargs["popup"] or "", "popup": self.kwargs.get("popup", ""),
}, },
) )
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
kwargs = super(FileDeleteView, self).get_context_data(**kwargs) kwargs = super(FileDeleteView, self).get_context_data(**kwargs)
kwargs["popup"] = "" kwargs["popup"] = ""
if self.kwargs["popup"]: if self.kwargs.get("popup") is not None:
kwargs["popup"] = "popup" kwargs["popup"] = "popup"
return kwargs return kwargs

View File

@ -37,8 +37,8 @@ from django.forms import (
DateTimeInput, DateTimeInput,
Textarea, Textarea,
) )
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.translation import ugettext from django.utils.translation import gettext
from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget
from ajax_select.fields import AutoCompleteSelectField from ajax_select.fields import AutoCompleteSelectField
from ajax_select import make_ajax_field from ajax_select import make_ajax_field
@ -130,7 +130,7 @@ class SelectFile(TextInput):
'<span name="' '<span name="'
+ name + name
+ '" class="choose_file_button">' + '" class="choose_file_button">'
+ ugettext("Choose file") + gettext("Choose file")
+ "</span>" + "</span>"
) )
return output return output
@ -154,7 +154,7 @@ class SelectUser(TextInput):
'<span name="' '<span name="'
+ name + name
+ '" class="choose_user_button">' + '" class="choose_user_button">'
+ ugettext("Choose user") + gettext("Choose user")
+ "</span>" + "</span>"
) )
return output return output

View File

@ -31,7 +31,7 @@ from django.views.generic import ListView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django import forms from django import forms
from ajax_select.fields import AutoCompleteSelectMultipleField from ajax_select.fields import AutoCompleteSelectMultipleField

View File

@ -27,7 +27,7 @@
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import views from django.contrib.auth import views
from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.forms import PasswordChangeForm
from django.utils.translation import ugettext as _ from django.utils.translation import gettext as _
from django.urls import reverse from django.urls import reverse
from django.core.exceptions import PermissionDenied, ValidationError from django.core.exceptions import PermissionDenied, ValidationError
from django.http import Http404, HttpResponse from django.http import Http404, HttpResponse

View File

@ -22,5 +22,3 @@
# Place - Suite 330, Boston, MA 02111-1307, USA. # Place - Suite 330, Boston, MA 02111-1307, USA.
# #
# #
default_app_config = "counter.app.CounterConfig"

View File

@ -23,7 +23,7 @@
# #
from django.apps import AppConfig from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
class CounterConfig(AppConfig): class CounterConfig(AppConfig):

View File

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.db import migrations, models from django.db import migrations, models
from django.conf import settings from django.conf import settings

View File

@ -24,7 +24,7 @@
from sith.settings import SITH_COUNTER_OFFICES, SITH_MAIN_CLUB from sith.settings import SITH_COUNTER_OFFICES, SITH_MAIN_CLUB
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.conf import settings from django.conf import settings
from django.urls import reverse from django.urls import reverse

View File

@ -110,6 +110,7 @@ class CounterTest(TestCase):
"bank": "OTHER", "bank": "OTHER",
}, },
) )
self.assertTrue(response.status_code == 200)
response = self.client.post( response = self.client.post(
reverse("counter:login", kwargs={"counter_id": self.foyer.id}), reverse("counter:login", kwargs={"counter_id": self.foyer.id}),
@ -139,7 +140,7 @@ class CounterTest(TestCase):
"bank": "OTHER", "bank": "OTHER",
}, },
) )
self.assertTrue(response.status_code == 403) self.assertTrue(response.status_code == 200)
class CounterStatsTest(TestCase): class CounterStatsTest(TestCase):

View File

@ -41,7 +41,7 @@ from django.urls import reverse_lazy, reverse
from django.http import HttpResponseRedirect, HttpResponse, JsonResponse from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
from django.utils import timezone from django.utils import timezone
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django.db import DataError, transaction, models from django.db import DataError, transaction, models

View File

@ -12,7 +12,7 @@ Pour modifier les cotisations disponnibles, tout se gère dans la configuration
.. code-block:: python .. code-block:: python
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
SITH_SUBSCRIPTIONS = { SITH_SUBSCRIPTIONS = {
# Voici un échantillon de la véritable configuration à l'heure de l'écriture. # Voici un échantillon de la véritable configuration à l'heure de l'écriture.

View File

@ -20,7 +20,7 @@ Nous allons présenter ici les deux techniques. Dans un premier temps nous allon
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from core.views import * from core.views import *
from core.models import User, Group from core.models import User, Group
@ -63,7 +63,7 @@ Voici maintenant comment faire en définissant des fonctions personnalisées. Ce
.. code-block:: python .. code-block:: python
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from core.views import * from core.views import *
from core.models import User, Group from core.models import User, Group

View File

@ -14,7 +14,7 @@ Si le mot est dans le code Python :
.. sourcecode:: python .. sourcecode:: python
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
# ... # ...

View File

@ -23,7 +23,7 @@
# #
from django.db import models, DataError from django.db import models, DataError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.conf import settings from django.conf import settings

View File

@ -59,7 +59,7 @@ class EbouticTest(TestCase):
with open("./eboutic/tests/public_key.pem") as f: with open("./eboutic/tests/public_key.pem") as f:
settings.SITH_EBOUTIC_PUB_KEY = f.read() settings.SITH_EBOUTIC_PUB_KEY = f.read()
privkey = crypto.load_privatekey(crypto.FILETYPE_PEM, PRIVKEY) privkey = crypto.load_privatekey(crypto.FILETYPE_PEM, PRIVKEY)
sig = crypto.sign(privkey, query, "sha1") sig = crypto.sign(privkey, query.encode("utf-8"), "sha1")
b64sig = base64.b64encode(sig).decode("ascii") b64sig = base64.b64encode(sig).decode("ascii")
url = reverse("eboutic:etransation_autoanswer") + "?%s&Sig=%s" % ( url = reverse("eboutic:etransation_autoanswer") + "?%s&Sig=%s" % (

View File

@ -14,11 +14,11 @@ with open("./private_key.pem") as f:
with open("./public_key.pem") as f: with open("./public_key.pem") as f:
PUBKEY = f.read() PUBKEY = f.read()
string = "Amount=400&BasketID=4000&Auto=42&Error=00000\n" data = "Amount=400&BasketID=4000&Auto=42&Error=00000\n".encode("utf-8")
# Sign # Sign
prvkey = crypto.load_privatekey(crypto.FILETYPE_PEM, PRVKEY) prvkey = crypto.load_privatekey(crypto.FILETYPE_PEM, PRVKEY)
sig = crypto.sign(prvkey, string, "sha1") sig = crypto.sign(prvkey, data, "sha1")
b64sig = base64.b64encode(sig) b64sig = base64.b64encode(sig)
print(b64sig) print(b64sig)
@ -28,7 +28,7 @@ cert = crypto.X509()
cert.set_pubkey(pubkey) cert.set_pubkey(pubkey)
sig = base64.b64decode(b64sig) sig = base64.b64decode(b64sig)
try: try:
crypto.verify(cert, sig, string, "sha1") crypto.verify(cert, sig, data, "sha1")
print("Verify OK") print("Verify OK")
except: except:
print("Verify failed") print("Verify failed")

View File

@ -33,7 +33,7 @@ from django.views.generic import TemplateView, View
from django.http import HttpResponse, HttpResponseRedirect from django.http import HttpResponse, HttpResponseRedirect
from django.core.exceptions import SuspiciousOperation from django.core.exceptions import SuspiciousOperation
from django.db import transaction, DataError from django.db import transaction, DataError
from django.utils.translation import ugettext as _ from django.utils.translation import gettext as _
from django.conf import settings from django.conf import settings
from counter.models import Customer, Counter, ProductType, Selling from counter.models import Customer, Counter, ProductType, Selling
@ -264,7 +264,7 @@ class EtransactionAutoAnswer(View):
crypto.verify( crypto.verify(
cert, cert,
sig, sig,
"&".join(request.META["QUERY_STRING"].split("&")[:-1]), "&".join(request.META["QUERY_STRING"].split("&")[:-1]).encode("utf-8"),
"sha1", "sha1",
) )
except: except:

View File

@ -1,6 +1,6 @@
from django.db import models from django.db import models
from ordered_model.models import OrderedModel from ordered_model.models import OrderedModel
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from core.models import User, Group from core.models import User, Group

View File

@ -3,7 +3,7 @@ from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView from django.views.generic.edit import UpdateView, CreateView
from django.views.generic.edit import DeleteView, FormView from django.views.generic.edit import DeleteView, FormView
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db import transaction from django.db import transaction
from django.forms import CheckboxSelectMultiple from django.forms import CheckboxSelectMultiple

View File

@ -24,7 +24,7 @@
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone

View File

@ -27,7 +27,7 @@ from django.shortcuts import get_object_or_404
from django.views.generic import ListView, DetailView, RedirectView from django.views.generic import ListView, DetailView, RedirectView
from django.views.generic.edit import UpdateView, CreateView, DeleteView from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils import timezone, html from django.utils import timezone, html
from django.conf import settings from django.conf import settings

View File

@ -23,7 +23,7 @@
# #
from django.db import models, DataError from django.db import models, DataError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django.urls import reverse from django.urls import reverse

View File

@ -28,7 +28,7 @@ import pytz
from django.views.generic import ListView, DetailView, TemplateView from django.views.generic import ListView, DetailView, TemplateView
from django.views.generic.edit import UpdateView, CreateView, DeleteView, BaseFormView from django.views.generic.edit import UpdateView, CreateView, DeleteView, BaseFormView
from django.utils.translation import ugettext as _ from django.utils.translation import gettext as _
from django.utils import dateparse, timezone from django.utils import dateparse, timezone
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.conf import settings from django.conf import settings

View File

@ -26,7 +26,7 @@ from enum import Enum
from django.views.generic import ListView, View from django.views.generic import ListView, View
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.http.response import HttpResponseRedirect from django.http.response import HttpResponseRedirect
from django.urls import reverse from django.urls import reverse

View File

@ -23,7 +23,7 @@
# #
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.forms.widgets import Widget from django.forms.widgets import Widget
from django.templatetags.static import static from django.templatetags.static import static

View File

@ -23,7 +23,7 @@
# #
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from django.core import validators from django.core import validators
from django.conf import settings from django.conf import settings

View File

@ -18,7 +18,7 @@
<tbody> <tbody>
{% set queryset = form.accepted_reports.field.queryset %} {% set queryset = form.accepted_reports.field.queryset %}
{% for widget in form.accepted_reports.subwidgets %} {% for widget in form.accepted_reports.subwidgets %}
{% set report = queryset.get(id=widget.data.value) %} {% set report = queryset.get(id=widget.data.value.value) %}
<form action="{{ url('pedagogy:moderation') }}" method="post" enctype="multipart/form-data"> <form action="{{ url('pedagogy:moderation') }}" method="post" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}
<tr> <tr>

View File

@ -25,7 +25,7 @@
from django.conf import settings from django.conf import settings
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.management import call_command from django.core.management import call_command
from core.models import User, Notification from core.models import User, Notification
@ -95,7 +95,7 @@ class UVCreation(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), create_uv_template(self.bibou.id) reverse("pedagogy:uv_create"), create_uv_template(self.bibou.id)
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertTrue(UV.objects.filter(code="IFC1").exists()) self.assertTrue(UV.objects.filter(code="IFC1").exists())
def test_create_uv_pedagogy_admin_success(self): def test_create_uv_pedagogy_admin_success(self):
@ -103,7 +103,7 @@ class UVCreation(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), create_uv_template(self.tutu.id) reverse("pedagogy:uv_create"), create_uv_template(self.tutu.id)
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertTrue(UV.objects.filter(code="IFC1").exists()) self.assertTrue(UV.objects.filter(code="IFC1").exists())
def test_create_uv_unauthorized_fail(self): def test_create_uv_unauthorized_fail(self):
@ -111,21 +111,21 @@ class UVCreation(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), create_uv_template(0) reverse("pedagogy:uv_create"), create_uv_template(0)
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Test with subscribed user # Test with subscribed user
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), create_uv_template(self.sli.id) reverse("pedagogy:uv_create"), create_uv_template(self.sli.id)
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Test with non subscribed user # Test with non subscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), create_uv_template(self.guy.id) reverse("pedagogy:uv_create"), create_uv_template(self.guy.id)
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Check that the UV has never been created # Check that the UV has never been created
self.assertFalse(UV.objects.filter(code="IFC1").exists()) self.assertFalse(UV.objects.filter(code="IFC1").exists())
@ -137,16 +137,16 @@ class UVCreation(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), create_uv_template(self.bibou.id) reverse("pedagogy:uv_create"), create_uv_template(self.bibou.id)
) )
self.assertNotEquals(response.status_code, 302) self.assertNotEqual(response.status_code, 302)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Remove a required field # Remove a required field
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_create"), reverse("pedagogy:uv_create"),
create_uv_template(self.tutu.id, exclude_list=["title"]), create_uv_template(self.tutu.id, exclude_list=["title"]),
) )
self.assertNotEquals(response.status_code, 302) self.assertNotEqual(response.status_code, 302)
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Check that the UV hase never been created # Check that the UV hase never been created
self.assertFalse(UV.objects.filter(code="IFC1").exists()) self.assertFalse(UV.objects.filter(code="IFC1").exists())
@ -179,12 +179,12 @@ class UVListTest(TestCase):
def test_uv_list_display_fail(self): def test_uv_list_display_fail(self):
# Don't display for anonymous user # Don't display for anonymous user
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Don't display for none subscribed users # Don't display for none subscribed users
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
class UVDeleteTest(TestCase): class UVDeleteTest(TestCase):
@ -220,7 +220,7 @@ class UVDeleteTest(TestCase):
"pedagogy:uv_delete", kwargs={"uv_id": UV.objects.get(code="PA00").id} "pedagogy:uv_delete", kwargs={"uv_id": UV.objects.get(code="PA00").id}
) )
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Not subscribed user # Not subscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
@ -229,7 +229,7 @@ class UVDeleteTest(TestCase):
"pedagogy:uv_delete", kwargs={"uv_id": UV.objects.get(code="PA00").id} "pedagogy:uv_delete", kwargs={"uv_id": UV.objects.get(code="PA00").id}
) )
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Simply subscribed user # Simply subscribed user
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
@ -238,7 +238,7 @@ class UVDeleteTest(TestCase):
"pedagogy:uv_delete", kwargs={"uv_id": UV.objects.get(code="PA00").id} "pedagogy:uv_delete", kwargs={"uv_id": UV.objects.get(code="PA00").id}
) )
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Check that the UV still exists # Check that the UV still exists
self.assertTrue(UV.objects.filter(code="PA00").exists()) self.assertTrue(UV.objects.filter(code="PA00").exists())
@ -262,7 +262,7 @@ class UVUpdateTest(TestCase):
create_uv_template(self.bibou.id, code="PA00"), create_uv_template(self.bibou.id, code="PA00"),
) )
self.uv.refresh_from_db() self.uv.refresh_from_db()
self.assertEquals(self.uv.credit_type, "TM") self.assertEqual(self.uv.credit_type, "TM")
def test_uv_update_pedagogy_admin_success(self): def test_uv_update_pedagogy_admin_success(self):
self.client.login(username="tutu", password="plop") self.client.login(username="tutu", password="plop")
@ -271,7 +271,7 @@ class UVUpdateTest(TestCase):
create_uv_template(self.bibou.id, code="PA00"), create_uv_template(self.bibou.id, code="PA00"),
) )
self.uv.refresh_from_db() self.uv.refresh_from_db()
self.assertEquals(self.uv.credit_type, "TM") self.assertEqual(self.uv.credit_type, "TM")
def test_uv_update_original_author_does_not_change(self): def test_uv_update_original_author_does_not_change(self):
self.client.login(username="tutu", password="plop") self.client.login(username="tutu", password="plop")
@ -281,8 +281,8 @@ class UVUpdateTest(TestCase):
) )
self.uv.refresh_from_db() self.uv.refresh_from_db()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(self.uv.author, self.bibou) self.assertEqual(self.uv.author, self.bibou)
def test_uv_update_pedagogy_unauthorized_fail(self): def test_uv_update_pedagogy_unauthorized_fail(self):
# Anonymous user # Anonymous user
@ -290,7 +290,7 @@ class UVUpdateTest(TestCase):
reverse("pedagogy:uv_update", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_update", kwargs={"uv_id": self.uv.id}),
create_uv_template(self.bibou.id, code="PA00"), create_uv_template(self.bibou.id, code="PA00"),
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Not subscribed user # Not subscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
@ -298,7 +298,7 @@ class UVUpdateTest(TestCase):
reverse("pedagogy:uv_update", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_update", kwargs={"uv_id": self.uv.id}),
create_uv_template(self.bibou.id, code="PA00"), create_uv_template(self.bibou.id, code="PA00"),
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Simply subscribed user # Simply subscribed user
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
@ -306,11 +306,11 @@ class UVUpdateTest(TestCase):
reverse("pedagogy:uv_update", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_update", kwargs={"uv_id": self.uv.id}),
create_uv_template(self.bibou.id, code="PA00"), create_uv_template(self.bibou.id, code="PA00"),
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Check that the UV has not changed # Check that the UV has not changed
self.uv.refresh_from_db() self.uv.refresh_from_db()
self.assertEquals(self.uv.credit_type, "OM") self.assertEqual(self.uv.credit_type, "OM")
# UVComment class tests # UVComment class tests
@ -355,7 +355,7 @@ class UVCommentCreationAndDisplay(TestCase):
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(self.bibou.id), create_uv_comment_template(self.bibou.id),
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
response = self.client.get( response = self.client.get(
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}) reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id})
) )
@ -367,7 +367,7 @@ class UVCommentCreationAndDisplay(TestCase):
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(self.tutu.id), create_uv_comment_template(self.tutu.id),
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
response = self.client.get( response = self.client.get(
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}) reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id})
) )
@ -379,7 +379,7 @@ class UVCommentCreationAndDisplay(TestCase):
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(self.sli.id), create_uv_comment_template(self.sli.id),
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
response = self.client.get( response = self.client.get(
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}) reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id})
) )
@ -391,7 +391,7 @@ class UVCommentCreationAndDisplay(TestCase):
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(0), create_uv_comment_template(0),
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Test with non subscribed user # Test with non subscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
@ -399,7 +399,7 @@ class UVCommentCreationAndDisplay(TestCase):
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(self.guy.id), create_uv_comment_template(self.guy.id),
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Check that the comment has never been created # Check that the comment has never been created
self.client.login(username="root", password="plop") self.client.login(username="root", password="plop")
@ -415,7 +415,7 @@ class UVCommentCreationAndDisplay(TestCase):
create_uv_comment_template(self.bibou.id, exclude_list=["grade_global"]), create_uv_comment_template(self.bibou.id, exclude_list=["grade_global"]),
) )
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.client.get( response = self.client.get(
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}) reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id})
@ -442,7 +442,7 @@ class UVCommentCreationAndDisplay(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), comment reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), comment
) )
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue( self.assertTrue(
UVComment.objects.filter(comment__contains="Superbe UV").exists() UVComment.objects.filter(comment__contains="Superbe UV").exists()
) )
@ -459,12 +459,12 @@ class UVCommentCreationAndDisplay(TestCase):
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(self.bibou.id, exclude_list=["uv"]), create_uv_comment_template(self.bibou.id, exclude_list=["uv"]),
) )
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.client.post( self.client.post(
reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}), reverse("pedagogy:uv_detail", kwargs={"uv_id": self.uv.id}),
create_uv_comment_template(self.bibou.id, exclude_list=["author"]), create_uv_comment_template(self.bibou.id, exclude_list=["author"]),
) )
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
class UVCommentDeleteTest(TestCase): class UVCommentDeleteTest(TestCase):
@ -508,21 +508,21 @@ class UVCommentDeleteTest(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:comment_delete", kwargs={"comment_id": self.comment.id}) reverse("pedagogy:comment_delete", kwargs={"comment_id": self.comment.id})
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Unsbscribed user # Unsbscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
response = self.client.post( response = self.client.post(
reverse("pedagogy:comment_delete", kwargs={"comment_id": self.comment.id}) reverse("pedagogy:comment_delete", kwargs={"comment_id": self.comment.id})
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Subscribed user (not author of the comment) # Subscribed user (not author of the comment)
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
response = self.client.post( response = self.client.post(
reverse("pedagogy:comment_delete", kwargs={"comment_id": self.comment.id}) reverse("pedagogy:comment_delete", kwargs={"comment_id": self.comment.id})
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Check that the comment still exists # Check that the comment still exists
self.assertTrue(UVComment.objects.filter(id=self.comment.id).exists()) self.assertTrue(UVComment.objects.filter(id=self.comment.id).exists())
@ -555,9 +555,9 @@ class UVCommentUpdateTest(TestCase):
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.comment.refresh_from_db() self.comment.refresh_from_db()
self.assertEquals(self.comment.comment, self.comment_edit["comment"]) self.assertEqual(self.comment.comment, self.comment_edit["comment"])
def test_uv_comment_update_pedagogy_admin_success(self): def test_uv_comment_update_pedagogy_admin_success(self):
self.client.login(username="tutu", password="plop") self.client.login(username="tutu", password="plop")
@ -565,9 +565,9 @@ class UVCommentUpdateTest(TestCase):
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.comment.refresh_from_db() self.comment.refresh_from_db()
self.assertEquals(self.comment.comment, self.comment_edit["comment"]) self.assertEqual(self.comment.comment, self.comment_edit["comment"])
def test_uv_comment_update_author_success(self): def test_uv_comment_update_author_success(self):
self.client.login(username="krophil", password="plop") self.client.login(username="krophil", password="plop")
@ -575,9 +575,9 @@ class UVCommentUpdateTest(TestCase):
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.comment.refresh_from_db() self.comment.refresh_from_db()
self.assertEquals(self.comment.comment, self.comment_edit["comment"]) self.assertEqual(self.comment.comment, self.comment_edit["comment"])
def test_uv_comment_update_unauthorized_fail(self): def test_uv_comment_update_unauthorized_fail(self):
# Anonymous user # Anonymous user
@ -585,25 +585,25 @@ class UVCommentUpdateTest(TestCase):
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Unsbscribed user # Unsbscribed user
response = self.client.post( response = self.client.post(
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Subscribed user (not author of the comment) # Subscribed user (not author of the comment)
response = self.client.post( response = self.client.post(
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Check that the comment hasn't change # Check that the comment hasn't change
self.comment.refresh_from_db() self.comment.refresh_from_db()
self.assertNotEquals(self.comment.comment, self.comment_edit["comment"]) self.assertNotEqual(self.comment.comment, self.comment_edit["comment"])
def test_uv_comment_update_original_author_does_not_change(self): def test_uv_comment_update_original_author_does_not_change(self):
self.client.login(username="root", password="plop") self.client.login(username="root", password="plop")
@ -613,8 +613,8 @@ class UVCommentUpdateTest(TestCase):
reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_update", kwargs={"comment_id": self.comment.id}),
self.comment_edit, self.comment_edit,
) )
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(self.comment.author, self.krophil) self.assertEqual(self.comment.author, self.krophil)
class UVSearchTest(TestCase): class UVSearchTest(TestCase):
@ -631,27 +631,27 @@ class UVSearchTest(TestCase):
# Test with root user # Test with root user
self.client.login(username="root", password="plop") self.client.login(username="root", password="plop")
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test with pedagogy admin # Test with pedagogy admin
self.client.login(username="tutu", password="plop") self.client.login(username="tutu", password="plop")
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test with subscribed user # Test with subscribed user
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_get_page_unauthorized_fail(self): def test_get_page_unauthorized_fail(self):
# Test with anonymous user # Test with anonymous user
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Test with not subscribed user # Test with not subscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
response = self.client.get(reverse("pedagogy:guide")) response = self.client.get(reverse("pedagogy:guide"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_search_pa00_success(self): def test_search_pa00_success(self):
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
@ -833,32 +833,32 @@ class UVModerationFormTest(TestCase):
# Test with root # Test with root
self.client.login(username="root", password="plop") self.client.login(username="root", password="plop")
response = self.client.get(reverse("pedagogy:moderation")) response = self.client.get(reverse("pedagogy:moderation"))
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
# Test with pedagogy admin # Test with pedagogy admin
self.client.login(username="tutu", password="plop") self.client.login(username="tutu", password="plop")
response = self.client.get(reverse("pedagogy:moderation")) response = self.client.get(reverse("pedagogy:moderation"))
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_access_unauthorized_fail(self): def test_access_unauthorized_fail(self):
# Test with anonymous user # Test with anonymous user
response = self.client.get(reverse("pedagogy:moderation")) response = self.client.get(reverse("pedagogy:moderation"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Test with unsubscribed user # Test with unsubscribed user
self.client.login(username="guy", password="plop") self.client.login(username="guy", password="plop")
response = self.client.get(reverse("pedagogy:moderation")) response = self.client.get(reverse("pedagogy:moderation"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
# Test with subscribed user # Test with subscribed user
self.client.login(username="sli", password="plop") self.client.login(username="sli", password="plop")
response = self.client.get(reverse("pedagogy:moderation")) response = self.client.get(reverse("pedagogy:moderation"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_do_nothing(self): def test_do_nothing(self):
self.client.login(username="root", password="plop") self.client.login(username="root", password="plop")
response = self.client.post(reverse("pedagogy:moderation")) response = self.client.post(reverse("pedagogy:moderation"))
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that nothing has changed # Test that nothing has changed
self.assertTrue(UVCommentReport.objects.filter(id=self.report_1.id).exists()) self.assertTrue(UVCommentReport.objects.filter(id=self.report_1.id).exists())
@ -874,7 +874,7 @@ class UVModerationFormTest(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:moderation"), {"accepted_reports": [self.report_1.id]} reverse("pedagogy:moderation"), {"accepted_reports": [self.report_1.id]}
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that the comment and it's associated report has been deleted # Test that the comment and it's associated report has been deleted
self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists()) self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists())
@ -894,7 +894,7 @@ class UVModerationFormTest(TestCase):
reverse("pedagogy:moderation"), reverse("pedagogy:moderation"),
{"accepted_reports": [self.report_1.id, self.report_2.id]}, {"accepted_reports": [self.report_1.id, self.report_2.id]},
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that comments and their associated reports has been deleted # Test that comments and their associated reports has been deleted
self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists()) self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists())
@ -913,7 +913,7 @@ class UVModerationFormTest(TestCase):
reverse("pedagogy:moderation"), reverse("pedagogy:moderation"),
{"accepted_reports": [self.report_1.id, self.report_1_bis.id]}, {"accepted_reports": [self.report_1.id, self.report_1_bis.id]},
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that the comment and it's associated report has been deleted # Test that the comment and it's associated report has been deleted
self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists()) self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists())
@ -928,7 +928,7 @@ class UVModerationFormTest(TestCase):
response = self.client.post( response = self.client.post(
reverse("pedagogy:moderation"), {"denied_reports": [self.report_1.id]} reverse("pedagogy:moderation"), {"denied_reports": [self.report_1.id]}
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that the report has been deleted and that the comment still exists # Test that the report has been deleted and that the comment still exists
self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists()) self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists())
@ -954,7 +954,7 @@ class UVModerationFormTest(TestCase):
] ]
}, },
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that every reports has been deleted # Test that every reports has been deleted
self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists()) self.assertFalse(UVCommentReport.objects.filter(id=self.report_1.id).exists())
@ -976,7 +976,7 @@ class UVModerationFormTest(TestCase):
"denied_reports": [self.report_1.id], "denied_reports": [self.report_1.id],
}, },
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that report 2 and his comment has been deleted # Test that report 2 and his comment has been deleted
self.assertFalse(UVCommentReport.objects.filter(id=self.report_2.id).exists()) self.assertFalse(UVCommentReport.objects.filter(id=self.report_2.id).exists())
@ -1000,7 +1000,7 @@ class UVModerationFormTest(TestCase):
"denied_reports": [self.report_1_bis.id], "denied_reports": [self.report_1_bis.id],
}, },
) )
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
# Test that report 1 and 1 bis has been deleted # Test that report 1 and 1 bis has been deleted
self.assertFalse( self.assertFalse(
@ -1047,10 +1047,10 @@ class UVCommentReportCreateTest(TestCase):
}, },
) )
if success: if success:
self.assertEquals(response.status_code, 302) self.assertEqual(response.status_code, 302)
else: else:
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
self.assertEquals(UVCommentReport.objects.all().exists(), success) self.assertEqual(UVCommentReport.objects.all().exists(), success)
def test_create_report_root_success(self): def test_create_report_root_success(self):
self.create_report_test("root", True) self.create_report_test("root", True)
@ -1069,7 +1069,7 @@ class UVCommentReportCreateTest(TestCase):
reverse("pedagogy:comment_report", kwargs={"comment_id": self.comment.id}), reverse("pedagogy:comment_report", kwargs={"comment_id": self.comment.id}),
{"comment": self.comment.id, "reporter": 0, "reason": "C'est moche"}, {"comment": self.comment.id, "reporter": 0, "reason": "C'est moche"},
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
self.assertFalse(UVCommentReport.objects.all().exists()) self.assertFalse(UVCommentReport.objects.all().exists())
def test_notifications(self): def test_notifications(self):
@ -1092,7 +1092,7 @@ class UVCommentReportCreateTest(TestCase):
# Check that notifications are not duplicated if not viewed # Check that notifications are not duplicated if not viewed
self.create_report_test("tutu", True) self.create_report_test("tutu", True)
self.assertEquals( self.assertEqual(
self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").count(), 1 self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").count(), 1
) )
@ -1103,6 +1103,6 @@ class UVCommentReportCreateTest(TestCase):
self.create_report_test("tutu", True) self.create_report_test("tutu", True)
self.assertEquals( self.assertEqual(
self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").count(), 2 self.tutu.notifications.filter(type="PEDAGOGY_MODERATION").count(), 2
) )

1271
poetry.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -20,29 +20,29 @@ license = "GPL-3.0-only"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.8" python = "^3.8"
Django = "^2.2" Django = "^3.2"
Pillow = "^8.3.2" Pillow = "^9.2"
mistune = "^0.8.4" mistune = "^0.8.4"
django-jinja = "^2.9.1" django-jinja = "^2.10"
cryptography = "36.0.2" cryptography = "^37.0"
pyOpenSSL = "^21.0.0" pyOpenSSL = "^21.0.0"
pytz = "^2021.1" pytz = "^2021.1"
djangorestframework = "^3.12.4" djangorestframework = "^3.13"
django-phonenumber-field = "^5.2.0" django-phonenumber-field = "^6.3"
phonenumbers = "^8.12.33" phonenumbers = "^8.12"
django-ajax-selects = "^2.1.0" django-ajax-selects = "^2.1.0"
reportlab = "^3.6.1" reportlab = "^3.6"
django-haystack = "^3.1.1" django-haystack = "^3.2.1"
xapian-haystack = "^2.1.1" xapian-haystack = "^3.0.1"
xapian-bindings = "^0.1.0" xapian-bindings = "^0.1.0"
libsass = "^0.21.0" libsass = "^0.21"
django-ordered-model = "^3.4.3" django-ordered-model = "^3.6"
django-simple-captcha = "^0.5.14" django-simple-captcha = "^0.5.17"
python-dateutil = "^2.8.2" python-dateutil = "^2.8.2"
psycopg2-binary = "2.8.6" psycopg2-binary = "2.9.3"
sentry-sdk = "^1.4.3" sentry-sdk = "^1.4.3"
pygraphviz = "^1.9" pygraphviz = "^1.9"
Jinja2 = "<=3.0.3" Jinja2 = "^3.1"
# Extra optional dependencies # Extra optional dependencies
mysqlclient = { version = "^2.0.3", optional = true } mysqlclient = { version = "^2.0.3", optional = true }
@ -61,7 +61,7 @@ docs = ["Sphinx", "sphinx-rtd-theme", "sphinx-copybutton"]
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
django-debug-toolbar = "^3.2.2" django-debug-toolbar = "^3.2.2"
ipython = "^7.28.0" ipython = "^7.28.0"
black = "^22.3.0" black = "^22.6.0"
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]

View File

@ -23,7 +23,7 @@
# #
# #
from django.utils.translation import ugettext as _ from django.utils.translation import gettext as _
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django.views.generic import ListView from django.views.generic import ListView
from django.urls import reverse from django.urls import reverse

View File

@ -26,7 +26,7 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.core.cache import cache from django.core.cache import cache
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils import timezone from django.utils import timezone
from PIL import Image from PIL import Image

View File

@ -28,7 +28,7 @@ from django.urls import reverse_lazy, reverse
from core.views.forms import SelectDate from core.views.forms import SelectDate
from django.views.generic import DetailView, TemplateView from django.views.generic import DetailView, TemplateView
from django.views.generic.edit import UpdateView, FormMixin, FormView from django.views.generic.edit import UpdateView, FormMixin, FormView
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django import forms from django import forms
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied

View File

@ -41,7 +41,7 @@ import sys
import binascii import binascii
import sentry_sdk import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration from sentry_sdk.integrations.django import DjangoIntegration
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
@ -62,6 +62,8 @@ ALLOWED_HOSTS = ["*"]
# Application definition # Application definition
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
SITE_ID = 4000 SITE_ID = 4000
INSTALLED_APPS = ( INSTALLED_APPS = (
@ -132,9 +134,7 @@ TEMPLATES = [
"extensions": [ "extensions": [
"jinja2.ext.do", "jinja2.ext.do",
"jinja2.ext.loopcontrols", "jinja2.ext.loopcontrols",
"jinja2.ext.with_",
"jinja2.ext.i18n", "jinja2.ext.i18n",
"jinja2.ext.autoescape",
"django_jinja.builtins.extensions.CsrfExtension", "django_jinja.builtins.extensions.CsrfExtension",
"django_jinja.builtins.extensions.CacheExtension", "django_jinja.builtins.extensions.CacheExtension",
"django_jinja.builtins.extensions.TimezoneExtension", "django_jinja.builtins.extensions.TimezoneExtension",
@ -389,7 +389,7 @@ SITH_SUBSCRIPTION_LOCATIONS = [
SITH_COUNTER_BARS = [(1, "MDE"), (2, "Foyer"), (35, "La Gommette")] SITH_COUNTER_BARS = [(1, "MDE"), (2, "Foyer"), (35, "La Gommette")]
SITH_COUNTER_OFFICES = {17: "BdF", 19: "AE"} SITH_COUNTER_OFFICES = {2: "BdF", 1: "AE"}
SITH_COUNTER_PAYMENT_METHOD = [ SITH_COUNTER_PAYMENT_METHOD = [
("CHECK", _("Check")), ("CHECK", _("Check")),

View File

@ -37,13 +37,15 @@ Including another URLconf
1. Add an import: from blog import urls as blog_urls 1. Add an import: from blog import urls as blog_urls
2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls))
""" """
from django.urls import include, re_path from django.urls import include, path
from django.contrib import admin from django.contrib import admin
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.views.i18n import JavaScriptCatalog from django.views.i18n import JavaScriptCatalog
from ajax_select import urls as ajax_select_urls from ajax_select import urls as ajax_select_urls
import core.urls
js_info_dict = {"packages": ("sith",)} js_info_dict = {"packages": ("sith",)}
handler403 = "core.views.forbidden" handler403 = "core.views.forbidden"
@ -51,43 +53,37 @@ handler404 = "core.views.not_found"
handler500 = "core.views.internal_servor_error" handler500 = "core.views.internal_servor_error"
urlpatterns = [ urlpatterns = [
re_path(r"^", include(("core.urls", "core"), namespace="core")), path("", include(("core.urls", "core"), namespace="core")),
re_path( path("rootplace/", include(("rootplace.urls", "rootplace"), namespace="rootplace")),
r"^rootplace/", include(("rootplace.urls", "rootplace"), namespace="rootplace") path(
), "subscription/",
re_path(
r"^subscription/",
include(("subscription.urls", "subscription"), namespace="subscription"), include(("subscription.urls", "subscription"), namespace="subscription"),
), ),
re_path(r"^com/", include(("com.urls", "com"), namespace="com")), path("com/", include(("com.urls", "com"), namespace="com")),
re_path(r"^club/", include(("club.urls", "club"), namespace="club")), path("club/", include(("club.urls", "club"), namespace="club")),
re_path(r"^counter/", include(("counter.urls", "counter"), namespace="counter")), path("counter/", include(("counter.urls", "counter"), namespace="counter")),
re_path(r"^stock/", include(("stock.urls", "stock"), namespace="stock")), path("stock/", include(("stock.urls", "stock"), namespace="stock")),
re_path( path(
r"^accounting/", "accounting/",
include(("accounting.urls", "accounting"), namespace="accounting"), include(("accounting.urls", "accounting"), namespace="accounting"),
), ),
re_path(r"^eboutic/", include(("eboutic.urls", "eboutic"), namespace="eboutic")), path("eboutic/", include(("eboutic.urls", "eboutic"), namespace="eboutic")),
re_path( path(
r"^launderette/", "launderette/",
include(("launderette.urls", "launderette"), namespace="launderette"), include(("launderette.urls", "launderette"), namespace="launderette"),
), ),
re_path(r"^sas/", include(("sas.urls", "sas"), namespace="sas")), path("sas/", include(("sas.urls", "sas"), namespace="sas")),
re_path(r"^api/v1/", include(("api.urls", "api"), namespace="api")), path("api/v1/", include(("api.urls", "api"), namespace="api")),
re_path( path("election/", include(("election.urls", "election"), namespace="election")),
r"^election/", include(("election.urls", "election"), namespace="election") path("forum/", include(("forum.urls", "forum"), namespace="forum")),
), path("trombi/", include(("trombi.urls", "trombi"), namespace="trombi")),
re_path(r"^forum/", include(("forum.urls", "forum"), namespace="forum")), path("matmatronch/", include(("matmat.urls", "matmat"), namespace="matmat")),
re_path(r"^trombi/", include(("trombi.urls", "trombi"), namespace="trombi")), path("pedagogy/", include(("pedagogy.urls", "pedagogy"), namespace="pedagogy")),
re_path(r"^matmatronch/", include(("matmat.urls", "matmat"), namespace="matmat")), path("admin/", admin.site.urls),
re_path( path("ajax_select/", include(ajax_select_urls)),
r"^pedagogy/", include(("pedagogy.urls", "pedagogy"), namespace="pedagogy") path("i18n/", include("django.conf.urls.i18n")),
), path("jsi18n/", JavaScriptCatalog.as_view(), name="javascript-catalog"),
re_path(r"^admin/", admin.site.urls), path("captcha/", include("captcha.urls")),
re_path(r"^ajax_select/", include(ajax_select_urls)),
re_path(r"^i18n/", include("django.conf.urls.i18n")),
re_path(r"^jsi18n/$", JavaScriptCatalog.as_view(), name="javascript-catalog"),
re_path(r"^captcha/", include("captcha.urls")),
] ]
if settings.DEBUG: if settings.DEBUG:
@ -95,4 +91,4 @@ if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
import debug_toolbar import debug_toolbar
urlpatterns += [re_path(r"^__debug__/", include(debug_toolbar.urls))] urlpatterns += [path("__debug__/", include(debug_toolbar.urls))]

View File

@ -24,7 +24,7 @@
# #
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.urls import reverse from django.urls import reverse
from django.conf import settings from django.conf import settings

View File

@ -37,7 +37,7 @@ from django.views.generic.edit import (
FormMixin, FormMixin,
BaseFormView, BaseFormView,
) )
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django import forms from django import forms
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse
from django.forms.models import modelform_factory from django.forms.models import modelform_factory

View File

@ -25,7 +25,7 @@
from datetime import date, timedelta from datetime import date, timedelta
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.urls import reverse from django.urls import reverse

View File

@ -23,7 +23,7 @@
# #
from django.views.generic.edit import CreateView, FormView from django.views.generic.edit import CreateView, FormView
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.exceptions import PermissionDenied, ValidationError from django.core.exceptions import PermissionDenied, ValidationError
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django import forms from django import forms

View File

@ -23,7 +23,7 @@
# #
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.urls import reverse from django.urls import reverse
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError

View File

@ -28,7 +28,7 @@ from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse_lazy, reverse from django.urls import reverse_lazy, reverse
from django.views.generic import DetailView, RedirectView, TemplateView, View from django.views.generic import DetailView, RedirectView, TemplateView, View
from django.views.generic.edit import UpdateView, CreateView, DeleteView from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.forms.models import modelform_factory from django.forms.models import modelform_factory