Merge branch 'Aufinal/django2-urls' into 'master'

Passage à Django2

See merge request klub-dev-ens/gestioCOF!358
This commit is contained in:
Ludovic Stephan 2019-05-29 17:13:25 +02:00
commit 018865967d
19 changed files with 265 additions and 234 deletions

View file

@ -1,3 +1,4 @@
- Passage à Django2
- Dev : on peut désactiver la barre de debug avec une variable shell
- Remplace les CSS de Google par des polices de proximité
- Passage du site du COF et de la K-Fêt en Wagtail 2.3 et Wagtail-modeltranslation 0.9

View file

@ -69,7 +69,7 @@ class SpectacleReventeTests(TestCase):
revente = self.rev
wanted_by = [self.p1, self.p2, self.p3]
revente.confirmed_entry = wanted_by
revente.confirmed_entry.set(wanted_by)
with mock.patch("bda.models.random.choice") as mc:
# Set winner to self.p1.

View file

@ -112,7 +112,6 @@ MIDDLEWARE = [
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.auth.middleware.SessionAuthenticationMiddleware",
"kfet.auth.middleware.TemporaryAuthMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",

View file

@ -44,8 +44,8 @@ def show_toolbar(request):
if not TESTING:
INSTALLED_APPS += ["debug_toolbar", "debug_panel"]
INSTALLED_APPS += ["debug_toolbar"]
MIDDLEWARE = ["debug_panel.middleware.DebugPanelMiddleware"] + MIDDLEWARE
MIDDLEWARE = ["debug_toolbar.middleware.DebugToolbarMiddleware"] + MIDDLEWARE
DEBUG_TOOLBAR_CONFIG = {"SHOW_TOOLBAR_CALLBACK": show_toolbar}

View file

@ -3,11 +3,11 @@ Fichier principal de configuration des urls du projet GestioCOF
"""
from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.auth import views as django_views
from django.contrib.auth import views as django_auth_views
from django.urls import include, path
from django.views.generic.base import TemplateView
from django_cas_ng import views as django_cas_views
from wagtail.admin import urls as wagtailadmin_urls
@ -28,107 +28,105 @@ admin.autodiscover()
urlpatterns = [
# Page d'accueil
url(r"^$", gestioncof_views.home, name="home"),
path("", gestioncof_views.home, name="home"),
# Le BdA
url(r"^bda/", include("bda.urls")),
path("bda/", include("bda.urls")),
# Les exports
url(r"^export/", include(export_patterns)),
path("export/", include(export_patterns)),
# Les petits cours
url(r"^petitcours/", include("petitscours.urls")),
path("petitcours/", include("petitscours.urls")),
# Les sondages
url(r"^survey/", include(surveys_patterns)),
path("survey/", include(surveys_patterns)),
# Evenements
url(r"^event/", include(events_patterns)),
path("event/", include(events_patterns)),
# Calendrier
url(r"^calendar/", include(calendar_patterns)),
path("calendar/", include(calendar_patterns)),
# Clubs
url(r"^clubs/", include(clubs_patterns)),
path("clubs/", include(clubs_patterns)),
# Authentification
url(
r"^cof/denied$",
path(
"cof/denied",
TemplateView.as_view(template_name="cof-denied.html"),
name="cof-denied",
),
url(r"^cas/login$", django_cas_views.LoginView.as_view(), name="cas_login_view"),
url(r"^cas/logout$", django_cas_views.LogoutView.as_view()),
url(
r"^outsider/login$",
gestioncof_views.LoginExtView.as_view(),
name="ext_login_view",
path("cas/login", django_cas_views.LoginView.as_view(), name="cas_login_view"),
path("cas/logout", django_cas_views.LogoutView.as_view()),
path(
"outsider/login", gestioncof_views.LoginExtView.as_view(), name="ext_login_view"
),
url(r"^outsider/logout$", django_views.LogoutView.as_view(), {"next_page": "home"}),
url(r"^login$", gestioncof_views.login, name="cof-login"),
url(r"^logout$", gestioncof_views.logout, name="cof-logout"),
path(
"outsider/logout", django_auth_views.LogoutView.as_view(), {"next_page": "home"}
),
path("login", gestioncof_views.login, name="cof-login"),
path("logout", gestioncof_views.logout, name="cof-logout"),
# Infos persos
url(r"^profile$", gestioncof_views.profile, name="profile"),
url(
r"^outsider/password-change$",
django_views.password_change,
path("profile", gestioncof_views.profile, name="profile"),
path(
"outsider/password-change",
django_auth_views.PasswordChangeView.as_view(),
name="password_change",
),
url(
r"^outsider/password-change-done$",
django_views.password_change_done,
path(
"outsider/password-change-done",
django_auth_views.PasswordChangeDoneView.as_view(),
name="password_change_done",
),
# Inscription d'un nouveau membre
url(r"^registration$", gestioncof_views.registration, name="registration"),
url(
r"^registration/clipper/(?P<login_clipper>[\w-]+)/" r"(?P<fullname>.*)$",
path("registration", gestioncof_views.registration, name="registration"),
path(
"registration/clipper/<slug:login_clipper>/<fullname>",
gestioncof_views.registration_form2,
name="clipper-registration",
),
url(
r"^registration/user/(?P<username>.+)$",
path(
"registration/user/<username>",
gestioncof_views.registration_form2,
name="user-registration",
),
url(
r"^registration/empty$",
path(
"registration/empty",
gestioncof_views.registration_form2,
name="empty-registration",
),
# Autocompletion
url(
r"^autocomplete/registration$",
autocomplete,
name="cof.registration.autocomplete",
path(
"autocomplete/registration", autocomplete, name="cof.registration.autocomplete"
),
url(
r"^user/autocomplete$",
path(
"user/autocomplete",
gestioncof_views.user_autocomplete,
name="cof-user-autocomplete",
),
# Interface admin
url(r"^admin/logout/", gestioncof_views.logout),
url(r"^admin/doc/", include("django.contrib.admindocs.urls")),
url(
r"^admin/(?P<app_label>[\d\w]+)/(?P<model_name>[\d\w]+)/csv/",
path("admin/logout/", gestioncof_views.logout),
path("admin/doc/", include("django.contrib.admindocs.urls")),
path(
"admin/<slug:app_label>/<slug:model_name>/csv/",
csv_views.admin_list_export,
{"fields": ["username"]},
),
url(r"^admin/", include(admin.site.urls)),
path("admin/", admin.site.urls),
# Liens utiles du COF et du BdA
url(r"^utile_cof$", gestioncof_views.utile_cof, name="utile_cof"),
url(r"^utile_bda$", gestioncof_views.utile_bda, name="utile_bda"),
url(r"^utile_bda/bda_diff$", gestioncof_views.liste_bdadiff, name="ml_diffbda"),
url(r"^utile_cof/diff_cof$", gestioncof_views.liste_diffcof, name="ml_diffcof"),
url(
r"^utile_bda/bda_revente$",
path("utile_cof", gestioncof_views.utile_cof, name="utile_cof"),
path("utile_bda", gestioncof_views.utile_bda, name="utile_bda"),
path("utile_bda/bda_diff", gestioncof_views.liste_bdadiff, name="ml_diffbda"),
path("utile_cof/diff_cof", gestioncof_views.liste_diffcof, name="ml_diffcof"),
path(
"utile_bda/bda_revente",
gestioncof_views.liste_bdarevente,
name="ml_bda_revente",
),
url(r"^k-fet/", include("kfet.urls")),
url(r"^cms/", include(wagtailadmin_urls)),
url(r"^documents/", include(wagtaildocs_urls)),
path("k-fet/", include("kfet.urls")),
path("cms/", include(wagtailadmin_urls)),
path("documents/", include(wagtaildocs_urls)),
# djconfig
url(r"^config", gestioncof_views.ConfigUpdate.as_view(), name="config.edit"),
path("config", gestioncof_views.ConfigUpdate.as_view(), name="config.edit"),
]
if "debug_toolbar" in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [url(r"^__debug__/", include(debug_toolbar.urls))]
urlpatterns += [path("__debug__/", include(debug_toolbar.urls))]
if settings.DEBUG:
# Si on est en production, MEDIA_ROOT est servi par Apache.
@ -137,5 +135,5 @@ if settings.DEBUG:
# Wagtail for uncatched
urlpatterns += i18n_patterns(
url(r"", include(wagtail_urls)), prefix_default_language=False
path("", include(wagtail_urls)), prefix_default_language=False
)

View file

@ -0,0 +1,32 @@
# Generated by Django 2.2 on 2019-05-23 13:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [("cofcms", "0001_initial")]
operations = [
migrations.AlterField(
model_name="cofactupage",
name="all_day",
field=models.BooleanField(
blank=True, default=False, verbose_name="Toute la journée"
),
),
migrations.AlterField(
model_name="cofactupage",
name="is_event",
field=models.BooleanField(
blank=True, default=True, verbose_name="Évènement"
),
),
migrations.AlterField(
model_name="cofdirectorypage",
name="alphabetique",
field=models.BooleanField(
blank=True, default=True, verbose_name="Tri par ordre alphabétique ?"
),
),
]

View file

@ -38,9 +38,13 @@ def admin_list_export(
request, model_name, app_label, queryset=None, fields=None, list_display=True
):
"""
Put the following line in your urls.py BEFORE your admin include
(r'^admin/(?P<app_label>[\d\w]+)/(?P<model_name>[\d\w]+)/csv/',
'util.csv_view.admin_list_export'),
Put the following line in your urls.py BEFORE your admin include:
path(
"admin/<slug:app_label>/<slug:model_name>/csv/",
csv_views.admin_list_export,
{"fields": ["username"]},
),
"""
if not request.user.is_staff:
return HttpResponseForbidden()

View file

@ -1,51 +1,43 @@
from django.conf.urls import url
from django.urls import path
from gestioncof import views
from gestioncof.decorators import buro_required
export_patterns = [
url(r"^members$", views.export_members, name="cof.membres_export"),
url(
r"^mega/avecremarques$",
path("members", views.export_members, name="cof.membres_export"),
path(
"mega/avecremarques",
views.export_mega_remarksonly,
name="cof.mega_export_remarks",
),
url(
r"^mega/participants$",
path(
"mega/participants",
views.export_mega_participants,
name="cof.mega_export_participants",
),
url(r"^mega/orgas$", views.export_mega_orgas, name="cof.mega_export_orgas"),
# url(r'^mega/(?P<type>.+)$', views.export_mega_bytype),
url(r"^mega$", views.export_mega, name="cof.mega_export"),
path("mega/orgas", views.export_mega_orgas, name="cof.mega_export_orgas"),
path("mega", views.export_mega, name="cof.mega_export"),
]
surveys_patterns = [
url(
r"^(?P<survey_id>\d+)/status$",
views.survey_status,
name="survey.details.status",
),
url(r"^(?P<survey_id>\d+)$", views.survey, name="survey.details"),
path("<int:survey_id>/status", views.survey_status, name="survey.details.status"),
path("<int:survey_id>", views.survey, name="survey.details"),
]
events_patterns = [
url(r"^(?P<event_id>\d+)$", views.event, name="event.details"),
url(r"^(?P<event_id>\d+)/status$", views.event_status, name="event.details.status"),
path("<int:event_id>", views.event, name="event.details"),
path("<int:event_id>/status", views.event_status, name="event.details.status"),
]
calendar_patterns = [
url(r"^subscription$", views.calendar, name="calendar"),
url(
r"^(?P<token>[a-z0-9-]+)/calendar.ics$", views.calendar_ics, name="calendar.ics"
),
path("subscription", views.calendar, name="calendar"),
path("<slug:token>/calendar.ics", views.calendar_ics, name="calendar.ics"),
]
clubs_patterns = [
url(r"^membres/(?P<name>\w+)", views.membres_club, name="membres-club"),
url(r"^liste", views.liste_clubs, name="liste-clubs"),
url(
r"^change_respo/(?P<club_name>\w+)/(?P<user_id>\d+)",
path("membres/<slug:name>", views.membres_club, name="membres-club"),
path("liste", views.liste_clubs, name="liste-clubs"),
path(
"change_respo/<slug:club_name>/<int:user_id>",
views.change_respo,
name="change-respo",
),

View file

@ -164,7 +164,7 @@ def survey(request, survey_id):
except SurveyAnswer.DoesNotExist:
current_answer = SurveyAnswer(user=request.user, survey=survey)
current_answer.save()
current_answer.answers = all_answers
current_answer.answers.set(all_answers)
current_answer.save()
success = True
else:
@ -234,7 +234,7 @@ def event(request, event_id):
(current_registration, _) = EventRegistration.objects.get_or_create(
user=request.user, event=event
)
current_registration.options = all_choices
current_registration.options.set(all_choices)
current_registration.save()
success = True
else:
@ -521,7 +521,7 @@ def registration(request):
user=member, event=form.event
)
update_event_form_comments(form.event, form, current_registration)
current_registration.options = all_choices
current_registration.options.set(all_choices)
current_registration.paid = form.cleaned_data["status"] == "paid"
current_registration.save()
# if form.event.title == "Mega 15" and created_reg:
@ -754,7 +754,7 @@ def export_mega_participants(request):
@buro_required
def export_mega(request):
event = Event.objects.filter(title=MEGA_EVENT_NAME)
event = Event.objects.get(title=MEGA_EVENT_NAME)
qs = EventRegistration.objects.filter(event=event).order_by("user__username")
return csv_export_mega("all_mega_{}.csv".format(MEGA_YEAR), qs)

View file

@ -11,7 +11,7 @@ class TriStateCheckbox(Widget):
# more than once.
self.choices = list(choices)
def render(self, name, value, attrs=None, choices=()):
def render(self, name, value, attrs=None, choices=(), renderer=None):
if value is None:
value = "none"
attrs["value"] = value

View file

@ -202,7 +202,7 @@ class GenericLoginViewTests(TestCase):
cookie = client.cookies[key]
# It also can be emptied.
self.assertEqual(cookie.value, "")
self.assertEqual(cookie["expires"], "Thu, 01-Jan-1970 00:00:00 GMT")
self.assertEqual(cookie["expires"], "Thu, 01 Jan 1970 00:00:00 GMT")
self.assertEqual(cookie["max-age"], 0)
except AssertionError:
raise AssertionError("The cookie '%s' still exists." % key)

15
kfet/converters.py Normal file
View file

@ -0,0 +1,15 @@
"""
Les converters sont la méthode "clean" de faire les regex custom dans des URLs django.
Plus d'info dans la doc :
https://docs.djangoproject.com/en/2.2/topics/http/urls/#registering-custom-path-converters
"""
class TrigrammeConverter:
regex = ".{3}"
def to_python(self, value):
return str(value)
def to_url(self, value):
return str(value)

View file

@ -57,8 +57,8 @@ class Migration(migrations.Migration):
dependencies = [
("kfet", "0054_delete_settings"),
("contenttypes", "__latest__"),
("auth", "__latest__"),
("contenttypes", "0001_initial"),
("auth", "0001_initial"),
]
operations = [

View file

@ -1,8 +1,8 @@
from django.conf.urls import url
from django.urls import path
from . import views
urlpatterns = [
url(r"^raw_open$", views.raw_open, name="kfet.open.edit_raw_open"),
url(r"^force_close$", views.force_close, name="kfet.open.edit_force_close"),
path("raw_open", views.raw_open, name="kfet.open.edit_raw_open"),
path("force_close", views.force_close, name="kfet.open.edit_force_close"),
]

View file

@ -107,8 +107,6 @@ class OperationHelpersTest(TestCase):
self.assertDictEqual(
operation_group.__dict__,
{
"_checkout_cache": checkout,
"_on_acc_cache": on_acc,
"_state": mock.ANY,
"amount": 0,
"at": mock.ANY,

View file

@ -1,95 +1,97 @@
from django.conf.urls import include, url
from django.contrib.auth.decorators import permission_required
from django.urls import include, path, register_converter
from kfet import autocomplete, views
from kfet import autocomplete, converters, views
from kfet.decorators import teamkfet_required
register_converter(converters.TrigrammeConverter, "trigramme")
urlpatterns = [
url(r"^login/generic$", views.login_generic, name="kfet.login.generic"),
url(r"^history$", views.history, name="kfet.history"),
path("login/generic", views.login_generic, name="kfet.login.generic"),
path("history", views.history, name="kfet.history"),
# -----
# Account urls
# -----
# Account - General
url(r"^accounts/$", views.account, name="kfet.account"),
url(
r"^accounts/is_validandfree$",
path("accounts/", views.account, name="kfet.account"),
path(
"accounts/is_validandfree",
views.account_is_validandfree_ajax,
name="kfet.account.is_validandfree.ajax",
),
# Account - Create
url(r"^accounts/new$", views.account_create, name="kfet.account.create"),
url(
r"^accounts/new/user/(?P<username>.+)$",
path("accounts/new", views.account_create, name="kfet.account.create"),
path(
"accounts/new/user/<username>",
views.account_create_ajax,
name="kfet.account.create.fromuser",
),
url(
r"^accounts/new/clipper/(?P<login_clipper>[\w-]+)/(?P<fullname>.*)$",
path(
"accounts/new/clipper/<slug:login_clipper>/<fullname>",
views.account_create_ajax,
name="kfet.account.create.fromclipper",
),
url(
r"^accounts/new/empty$",
path(
"accounts/new/empty",
views.account_create_ajax,
name="kfet.account.create.empty",
),
url(
r"^autocomplete/account_new$",
path(
"autocomplete/account_new",
autocomplete.account_create,
name="kfet.account.create.autocomplete",
),
# Account - Search
url(
r"^autocomplete/account_search$",
path(
"autocomplete/account_search",
autocomplete.account_search,
name="kfet.account.search.autocomplete",
),
# Account - Read
url(
r"^accounts/(?P<trigramme>.{3})$", views.account_read, name="kfet.account.read"
path(
"accounts/<trigramme:trigramme>", views.account_read, name="kfet.account.read"
),
# Account - Update
url(
r"^accounts/(?P<trigramme>.{3})/edit$",
path(
"accounts/<trigramme:trigramme>/edit",
views.account_update,
name="kfet.account.update",
),
# Account - Groups
url(r"^accounts/groups$", views.account_group, name="kfet.account.group"),
url(
r"^accounts/groups/new$",
path("accounts/groups", views.account_group, name="kfet.account.group"),
path(
"accounts/groups/new",
permission_required("kfet.manage_perms")(views.AccountGroupCreate.as_view()),
name="kfet.account.group.create",
),
url(
r"^accounts/groups/(?P<pk>\d+)/edit$",
path(
"accounts/groups/<int:pk>/edit",
permission_required("kfet.manage_perms")(views.AccountGroupUpdate.as_view()),
name="kfet.account.group.update",
),
url(
r"^accounts/negatives$",
path(
"accounts/negatives",
permission_required("kfet.view_negs")(views.AccountNegativeList.as_view()),
name="kfet.account.negative",
),
# Account - Statistics
url(
r"^accounts/(?P<trigramme>.{3})/stat/operations/list$",
path(
"accounts/<trigramme:trigramme>/stat/operations/list",
views.AccountStatOperationList.as_view(),
name="kfet.account.stat.operation.list",
),
url(
r"^accounts/(?P<trigramme>.{3})/stat/operations$",
path(
"accounts/<trigramme:trigramme>/stat/operations",
views.AccountStatOperation.as_view(),
name="kfet.account.stat.operation",
),
url(
r"^accounts/(?P<trigramme>.{3})/stat/balance/list$",
path(
"accounts/<trigramme:trigramme>/stat/balance/list",
views.AccountStatBalanceList.as_view(),
name="kfet.account.stat.balance.list",
),
url(
r"^accounts/(?P<trigramme>.{3})/stat/balance$",
path(
"accounts/<trigramme:trigramme>/stat/balance",
views.AccountStatBalance.as_view(),
name="kfet.account.stat.balance",
),
@ -97,26 +99,26 @@ urlpatterns = [
# Checkout urls
# -----
# Checkout - General
url(
"^checkouts/$",
path(
"checkouts/",
teamkfet_required(views.CheckoutList.as_view()),
name="kfet.checkout",
),
# Checkout - Create
url(
"^checkouts/new$",
path(
"checkouts/new",
teamkfet_required(views.CheckoutCreate.as_view()),
name="kfet.checkout.create",
),
# Checkout - Read
url(
"^checkouts/(?P<pk>\d+)$",
path(
"checkouts/<int:pk>",
teamkfet_required(views.CheckoutRead.as_view()),
name="kfet.checkout.read",
),
# Checkout - Update
url(
"^checkouts/(?P<pk>\d+)/edit$",
path(
"checkouts/<int:pk>/edit",
teamkfet_required(views.CheckoutUpdate.as_view()),
name="kfet.checkout.update",
),
@ -124,20 +126,20 @@ urlpatterns = [
# Checkout Statement urls
# -----
# Checkout Statement - General
url(
"^checkouts/statements/$",
path(
"checkouts/statements/",
teamkfet_required(views.CheckoutStatementList.as_view()),
name="kfet.checkoutstatement",
),
# Checkout Statement - Create
url(
"^checkouts/(?P<pk_checkout>\d+)/statements/add",
path(
"checkouts/<int:pk_checkout>/statements/add",
teamkfet_required(views.CheckoutStatementCreate.as_view()),
name="kfet.checkoutstatement.create",
),
# Checkout Statement - Update
url(
"^checkouts/(?P<pk_checkout>\d+)/statements/(?P<pk>\d+)/edit",
path(
"checkouts/<int:pk_checkout>/statements/<int:pk>/edit",
teamkfet_required(views.CheckoutStatementUpdate.as_view()),
name="kfet.checkoutstatement.update",
),
@ -145,140 +147,132 @@ urlpatterns = [
# Article urls
# -----
# Category - General
url(
"^categories/$",
path(
"categories/",
teamkfet_required(views.CategoryList.as_view()),
name="kfet.category",
),
# Category - Update
url(
"^categories/(?P<pk>\d+)/edit$",
path(
"categories/<int:pk>/edit",
teamkfet_required(views.CategoryUpdate.as_view()),
name="kfet.category.update",
),
# Article - General
url(
"^articles/$",
teamkfet_required(views.ArticleList.as_view()),
name="kfet.article",
path(
"articles/", teamkfet_required(views.ArticleList.as_view()), name="kfet.article"
),
# Article - Create
url(
"^articles/new$",
path(
"articles/new",
teamkfet_required(views.ArticleCreate.as_view()),
name="kfet.article.create",
),
# Article - Read
url(
"^articles/(?P<pk>\d+)$",
path(
"articles/<int:pk>",
teamkfet_required(views.ArticleRead.as_view()),
name="kfet.article.read",
),
# Article - Update
url(
"^articles/(?P<pk>\d+)/edit$",
path(
"articles/<int:pk>/edit",
teamkfet_required(views.ArticleUpdate.as_view()),
name="kfet.article.update",
),
# Article - Statistics
url(
r"^articles/(?P<pk>\d+)/stat/sales/list$",
path(
"articles/<int:pk>/stat/sales/list",
views.ArticleStatSalesList.as_view(),
name="kfet.article.stat.sales.list",
),
url(
r"^articles/(?P<pk>\d+)/stat/sales$",
path(
"articles/<int:pk>/stat/sales",
views.ArticleStatSales.as_view(),
name="kfet.article.stat.sales",
),
# -----
# K-Psul urls
# -----
url("^k-psul/$", views.kpsul, name="kfet.kpsul"),
url(
"^k-psul/checkout_data$",
path("k-psul/", views.kpsul, name="kfet.kpsul"),
path(
"k-psul/checkout_data",
views.kpsul_checkout_data,
name="kfet.kpsul.checkout_data",
),
url(
"^k-psul/perform_operations$",
path(
"k-psul/perform_operations",
views.kpsul_perform_operations,
name="kfet.kpsul.perform_operations",
),
url(
"^k-psul/cancel_operations$",
path(
"k-psul/cancel_operations",
views.kpsul_cancel_operations,
name="kfet.kpsul.cancel_operations",
),
url(
"^k-psul/articles_data",
path(
"k-psul/articles_data",
views.kpsul_articles_data,
name="kfet.kpsul.articles_data",
),
url(
"^k-psul/update_addcost$",
path(
"k-psul/update_addcost",
views.kpsul_update_addcost,
name="kfet.kpsul.update_addcost",
),
url(
"^k-psul/get_settings$",
views.kpsul_get_settings,
name="kfet.kpsul.get_settings",
path(
"k-psul/get_settings", views.kpsul_get_settings, name="kfet.kpsul.get_settings"
),
# -----
# JSON urls
# -----
url(r"^history.json$", views.history_json, name="kfet.history.json"),
url(
r"^accounts/read.json$", views.account_read_json, name="kfet.account.read.json"
),
path("history.json", views.history_json, name="kfet.history.json"),
path("accounts/read.json", views.account_read_json, name="kfet.account.read.json"),
# -----
# Settings urls
# -----
url(r"^settings/$", views.config_list, name="kfet.settings"),
url(r"^settings/edit$", views.config_update, name="kfet.settings.update"),
path("settings/", views.config_list, name="kfet.settings"),
path("settings/edit", views.config_update, name="kfet.settings.update"),
# -----
# Transfers urls
# -----
url(r"^transfers/$", views.transfers, name="kfet.transfers"),
url(r"^transfers/new$", views.transfers_create, name="kfet.transfers.create"),
url(r"^transfers/perform$", views.perform_transfers, name="kfet.transfers.perform"),
url(r"^transfers/cancel$", views.cancel_transfers, name="kfet.transfers.cancel"),
path("transfers/", views.transfers, name="kfet.transfers"),
path("transfers/new", views.transfers_create, name="kfet.transfers.create"),
path("transfers/perform", views.perform_transfers, name="kfet.transfers.perform"),
path("transfers/cancel", views.cancel_transfers, name="kfet.transfers.cancel"),
# -----
# Inventories urls
# -----
url(
r"^inventaires/$",
path(
"inventaires/",
teamkfet_required(views.InventoryList.as_view()),
name="kfet.inventory",
),
url(r"^inventaires/new$", views.inventory_create, name="kfet.inventory.create"),
url(
r"^inventaires/(?P<pk>\d+)$",
path("inventaires/new", views.inventory_create, name="kfet.inventory.create"),
path(
"inventaires/<int:pk>",
teamkfet_required(views.InventoryRead.as_view()),
name="kfet.inventory.read",
),
# -----
# Order urls
# -----
url(r"^orders/$", teamkfet_required(views.OrderList.as_view()), name="kfet.order"),
url(
r"^orders/(?P<pk>\d+)$",
path("orders/", teamkfet_required(views.OrderList.as_view()), name="kfet.order"),
path(
"orders/<int:pk>",
teamkfet_required(views.OrderRead.as_view()),
name="kfet.order.read",
),
url(
r"^orders/suppliers/(?P<pk>\d+)/edit$",
path(
"orders/suppliers/<int:pk>/edit",
teamkfet_required(views.SupplierUpdate.as_view()),
name="kfet.order.supplier.update",
),
url(
r"^orders/suppliers/(?P<pk>\d+)/new-order$",
views.order_create,
name="kfet.order.new",
path(
"orders/suppliers/<int:pk>/new-order", views.order_create, name="kfet.order.new"
),
url(
r"^orders/(?P<pk>\d+)/to_inventory$",
path(
"orders/<int:pk>/to_inventory",
views.order_to_inventory,
name="kfet.order.to_inventory",
),
@ -286,5 +280,5 @@ urlpatterns = [
urlpatterns += [
# K-Fêt Open urls
url("^open/", include("kfet.open.urls"))
path("open/", include("kfet.open.urls"))
]

View file

@ -1,35 +1,35 @@
from django.conf.urls import url
from django.urls import path
from gestioncof.decorators import buro_required
from petitscours import views
from petitscours.views import DemandeDetailView, DemandeListView
urlpatterns = [
url(r"^inscription$", views.inscription, name="petits-cours-inscription"),
url(r"^demande$", views.demande, name="petits-cours-demande"),
url(
r"^demande-raw$",
path("inscription", views.inscription, name="petits-cours-inscription"),
path("demande", views.demande, name="petits-cours-demande"),
path(
"demande-raw",
views.demande,
kwargs={"raw": True},
name="petits-cours-demande-raw",
),
url(
r"^demandes$",
path(
"demandes",
buro_required(DemandeListView.as_view()),
name="petits-cours-demandes-list",
),
url(
r"^demandes/(?P<pk>\d+)$",
path(
"demandes/<int:pk>",
buro_required(DemandeDetailView.as_view()),
name="petits-cours-demande-details",
),
url(
r"^demandes/(?P<demande_id>\d+)/traitement$",
path(
"demandes/<int:demande_id>/traitement",
views.traitement,
name="petits-cours-demande-traitement",
),
url(
r"^demandes/(?P<demande_id>\d+)/retraitement$",
path(
"demandes/<int:demande_id>/retraitement",
views.traitement,
kwargs={"redo": True},
name="petits-cours-demande-retraitement",

View file

@ -1,6 +1,5 @@
configparser==3.5.0
# TODO: change to 2.2 when out
Django==1.11.*
Django==2.2.*
django-autocomplete-light==3.3.*
django-autoslug==1.9.3
django-cas-ng==3.6.*
@ -8,7 +7,7 @@ django-djconfig==0.8.0
django-recaptcha==1.4.0
django-redis-cache==1.8.1
icalendar
psycopg2
psycopg2<2.8
Pillow
unicodecsv
django-bootstrap-form==3.3
@ -21,8 +20,7 @@ git+https://git.eleves.ens.fr/cof-geek/django_custommail.git#egg=django_customma
ldap3
channels==1.1.5
python-dateutil
# TODO: change to 2.5 when out (2.4 is not explicitly compatible with Django 2.2)
wagtail==2.3.*
wagtail==2.4.*
wagtailmenus==2.12.*
wagtail-modeltranslation==0.10.*
django-cors-headers==2.2.0

View file

@ -4,9 +4,9 @@ from urllib.parse import parse_qs, urlparse
import icalendar
from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse
from django.http import QueryDict
from django.test import Client
from django.urls import reverse
from django.utils import timezone
from django.utils.functional import cached_property