From 8be913cbf9d0549dd7a0703032b7c88ed3d400d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 27 Oct 2018 13:35:38 +0200 Subject: [PATCH 01/15] style -- black --- gestioncof/tests/test_views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index 43ea148c..e945a87a 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -76,7 +76,7 @@ class RegistrationViewTests(ViewTestCaseMixin, TestCase): "last_name": "last", "email": "username@mail.net", "is_cof": "1", - } + }, ), ) @@ -111,7 +111,7 @@ class RegistrationViewTests(ViewTestCaseMixin, TestCase): "email": "user@mail.net", "is_cof": "1", "user_exists": "1", - } + }, ), ) @@ -137,7 +137,7 @@ class RegistrationViewTests(ViewTestCaseMixin, TestCase): data = dict( self._minimal_data, - **{"username": u.username, "email": "user@mail.net", "user_exists": "1"} + **{"username": u.username, "email": "user@mail.net", "user_exists": "1"}, ) if is_cof: data["is_cof"] = "1" @@ -197,7 +197,7 @@ class RegistrationViewTests(ViewTestCaseMixin, TestCase): "events-0-option_{}".format(o2.pk): [str(oc3.pk)], "events-0-comment_{}".format(cf1.pk): "comment 1", "events-0-comment_{}".format(cf2.pk): "", - } + }, ), ) From 25dfe2f4962afb4cb8feb3ee00387c2b61764a35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 21 Oct 2018 20:19:31 +0200 Subject: [PATCH 02/15] petitcours.tests -- Add PCAbility, PCDemande and PCSubject factories --- gestioncof/tests/utils.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/gestioncof/tests/utils.py b/gestioncof/tests/utils.py index 7325e350..f2d95c16 100644 --- a/gestioncof/tests/utils.py +++ b/gestioncof/tests/utils.py @@ -1,5 +1,12 @@ from django.contrib.auth import get_user_model +from gestioncof.petits_cours_models import ( + PetitCoursAbility, + PetitCoursAttributionCounter, + PetitCoursDemande, + PetitCoursSubject, +) + User = get_user_model() @@ -66,3 +73,23 @@ def create_root(username, attrs=None): attrs.setdefault("is_staff", True) attrs.setdefault("is_superuser", True) return _create_user(username, attrs=attrs) + + +def create_petitcours_ability(**kwargs): + if "user" not in kwargs: + kwargs["user"] = create_user() + if "matiere" not in kwargs: + kwargs["matiere"] = create_petitcours_subject() + if "niveau" not in kwargs: + kwargs["niveau"] = "college" + ability = PetitCoursAbility.objects.create(**kwargs) + PetitCoursAttributionCounter.get_uptodate(ability.user, ability.matiere) + return ability + + +def create_petitcours_demande(**kwargs): + return PetitCoursDemande.objects.create(**kwargs) + + +def create_petitcours_subject(**kwargs): + return PetitCoursSubject.objects.create(**kwargs) From 1a5bbf32a499e0df23dc2f4bd765ac380bc57710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 21 Oct 2018 20:22:00 +0200 Subject: [PATCH 03/15] petitcours.tests -- Add tests for demandes list and details views --- gestioncof/tests/test_views.py | 57 +++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index e945a87a..5fdac4e1 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -19,7 +19,7 @@ from gestioncof.autocomplete import Clipper from gestioncof.models import CalendarSubscription, Club, Event, Survey, SurveyAnswer from gestioncof.tests.testcases import ViewTestCaseMixin -from .utils import create_member, create_root, create_user +from .utils import create_member, create_petitcours_demande, create_root, create_user User = get_user_model() @@ -1240,3 +1240,58 @@ class SurveyStatusViewTests(ViewTestCaseMixin, TestCase): def test_filter_no(self): self._test_filters([(self.qa1, "no")], [self.a2]) + + +class PetitCoursDemandeListViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demandes-list" + url_expected = "/petitcours/demandes" + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + def setUp(self): + super().setUp() + self.demande1 = create_petitcours_demande() + self.demande2 = create_petitcours_demande() + self.demande3 = create_petitcours_demande() + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + self.assertEqual(len(resp.context["object_list"]), 3) + + def test_pagination(self): + for _ in range(21): + create_petitcours_demande() + + # Page 1 + resp = self.client.get(self.url) + self.assertEqual(resp.context["page_obj"].paginator.num_pages, 2) + self.assertEqual(len(resp.context["object_list"]), 20) + + # Page 2 + resp = self.client.get(self.url, {"page": 2}) + self.assertEqual(len(resp.context["object_list"]), 3 + 1) + + +class PetitCoursDemandeDetailListViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demande-details" + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + @property + def url_kwargs(self): + return {"pk": self.demande.pk} + + @property + def url_expected(self): + return "/petitcours/demandes/{}".format(self.demande.pk) + + def setUp(self): + super().setUp() + self.demande = create_petitcours_demande() + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) From 3d27dc9a417654c3766b9fac1a0a578da4aa9ea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 27 Oct 2018 18:48:09 +0200 Subject: [PATCH 04/15] petitcours.tests -- Add tests for inscription and (re)traitement views --- gestioncof/petits_cours_views.py | 1 + gestioncof/tests/test_views.py | 212 ++++++++++++++++++++++++++++++- gestioncof/tests/utils.py | 12 ++ 3 files changed, 224 insertions(+), 1 deletion(-) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index d640981a..737365ac 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -316,6 +316,7 @@ def _traitement_post(request, demande): with transaction.atomic(): for matiere in proposals: for rank, user in enumerate(proposals[matiere]): + # TODO(AD): Prefer PetitCoursAttributionCounter.get_uptodate() counter = PetitCoursAttributionCounter.objects.get( user=user, matiere=matiere ) diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index 5fdac4e1..fae54fb3 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -1,4 +1,5 @@ import csv +import json import os import uuid from datetime import timedelta @@ -19,7 +20,15 @@ from gestioncof.autocomplete import Clipper from gestioncof.models import CalendarSubscription, Club, Event, Survey, SurveyAnswer from gestioncof.tests.testcases import ViewTestCaseMixin -from .utils import create_member, create_petitcours_demande, create_root, create_user +from .utils import ( + PetitCoursTestHelpers, + create_member, + create_petitcours_ability, + create_petitcours_demande, + create_petitcours_subject, + create_root, + create_user, +) User = get_user_model() @@ -1295,3 +1304,204 @@ class PetitCoursDemandeDetailListViewTestCase(ViewTestCaseMixin, TestCase): def test_get(self): resp = self.client.get(self.url) self.assertEqual(resp.status_code, 200) + + +class PetitCoursInscriptionViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-inscription" + url_expected = "/petitcours/inscription" + + http_methods = ["GET", "POST"] + + auth_user = "member" + # Also forbidden for "user". Test below. + auth_forbidden = [None] + + def setUp(self): + super().setUp() + self.user = self.users["member"] + self.cofprofile = self.user.profile + + self.subject1 = create_petitcours_subject(name="Matière 1") + self.subject2 = create_petitcours_subject(name="Matière 2") + + def test_get_forbidden_user_not_cof(self): + self.client.force_login(self.users["user"]) + resp = self.client.get(self.url) + self.assertRedirects(resp, reverse("cof-denied")) + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def get_base_post_data(self): + return { + "petitcoursability_set-TOTAL_FORMS": "3", + "petitcoursability_set-INITIAL_FORMS": "0", + "petitcoursability_set-MIN_NUM_FORMS": "0", + "petitcoursability_set-MAX_NUM_FORMS": "1000", + "remarques": "", + } + + base_post_data = property(get_base_post_data) + + def test_post(self): + data = dict( + self.base_post_data, + **{ + "petitcoursability_set-TOTAL_FORMS": "2", + "petitcoursability_set-0-id": "", + "petitcoursability_set-0-user": "", + "petitcoursability_set-0-matiere": str(self.subject1.pk), + "petitcoursability_set-0-niveau": "college", + "petitcoursability_set-0-agrege": "1", + # "petitcoursability_set-0-DELETE": "1", + "petitcoursability_set-1-id": "", + "petitcoursability_set-1-user": "", + "petitcoursability_set-1-matiere": str(self.subject2.pk), + "petitcoursability_set-1-niveau": "lycee", + # "petitcoursability_set-1-agrege": "1", + # "petitcoursability_set-1-DELETE": "1", + # "receive_proposals": "1", + "remarques": "Une remarque", + }, + ) + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.cofprofile.refresh_from_db() + self.assertEqual(self.cofprofile.petits_cours_accept, False) + self.assertEqual(self.cofprofile.petits_cours_remarques, "Une remarque") + self.assertEqual(self.user.petitcoursability_set.count(), 2) + ability1 = self.user.petitcoursability_set.get(matiere=self.subject1) + self.assertEqual(ability1.niveau, "college") + self.assertTrue(ability1.agrege) + ability2 = self.user.petitcoursability_set.get(matiere=self.subject2) + self.assertEqual(ability2.niveau, "lycee") + self.assertFalse(ability2.agrege) + + def test_post_delete(self): + ability1 = create_petitcours_ability(user=self.user) + ability2 = create_petitcours_ability(user=self.user) + + data = dict( + self.base_post_data, + **{ + "petitcoursability_set-INITIAL_FORMS": "2", + "petitcoursability_set-TOTAL_FORMS": "2", + "petitcoursability_set-0-id": str(ability1.pk), + "petitcoursability_set-0-user": "", + "petitcoursability_set-0-matiere": str(self.subject1.pk), + "petitcoursability_set-0-niveau": "college", + "petitcoursability_set-0-agrege": "1", + "petitcoursability_set-0-DELETE": "1", + "petitcoursability_set-1-id": str(ability2.pk), + "petitcoursability_set-1-user": str(self.user.pk), + "petitcoursability_set-1-matiere": str(self.subject2.pk), + "petitcoursability_set-1-niveau": "lycee", + # "petitcoursability_set-1-agrege": "1", + "petitcoursability_set-1-DELETE": "1", + }, + ) + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.assertFalse(self.user.petitcoursability_set.all()) + + +class PetitCoursTraitementViewTestCase( + ViewTestCaseMixin, PetitCoursTestHelpers, TestCase +): + url_name = "petits-cours-demande-traitement" + + http_methods = ["GET", "POST"] + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + @property + def url_kwargs(self): + return {"demande_id": self.demande.pk} + + @property + def url_expected(self): + return "/petitcours/demandes/{}/traitement".format(self.demande.pk) + + def setUp(self): + super().setUp() + self.user = self.users["member"] + self.user.profile.petits_cours_accept = True + self.user.profile.save() + self.subject = create_petitcours_subject() + self.demande = create_petitcours_demande(niveau="college") + self.demande.matieres.add(self.subject) + + def test_get(self): + self.require_custommails() + + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def test_get_with_match(self): + self.require_custommails() + + create_petitcours_ability( + user=self.user, matiere=self.subject, niveau="college" + ) + + resp = self.client.get(self.url) + + self.assertEqual(resp.status_code, 200) + self.assertListEqual( + list(resp.context["proposals"]), [(self.subject, [self.user])] + ) + self.assertEqual( + resp.context["attribdata"], json.dumps([(self.subject.id, [self.user.id])]) + ) + + def test_post_with_match(self): + self.require_custommails() + + create_petitcours_ability( + user=self.user, matiere=self.subject, niveau="college" + ) + + data = { + "attribdata": json.dumps([(self.subject.pk, [self.user.pk])]), + "extra": "", + } + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.demande.refresh_from_db() + self.assertTrue(self.demande.traitee) + self.assertEqual(self.demande.traitee_par, self.users["staff"]) + self.assertIsNotNone(self.demande.processed) + + +class PetitCoursRetraitementViewTestCase( + ViewTestCaseMixin, PetitCoursTestHelpers, TestCase +): + url_name = "petits-cours-demande-retraitement" + + http_methods = ["GET", "POST"] + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + @property + def url_kwargs(self): + return {"demande_id": self.demande.pk} + + @property + def url_expected(self): + return "/petitcours/demandes/{}/retraitement".format(self.demande.pk) + + def setUp(self): + super().setUp() + self.demande = create_petitcours_demande() + + def test_get(self): + self.require_custommails() + + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) diff --git a/gestioncof/tests/utils.py b/gestioncof/tests/utils.py index f2d95c16..d35cb87f 100644 --- a/gestioncof/tests/utils.py +++ b/gestioncof/tests/utils.py @@ -1,4 +1,8 @@ +import os + +from django.conf import settings from django.contrib.auth import get_user_model +from django.core.management import call_command from gestioncof.petits_cours_models import ( PetitCoursAbility, @@ -93,3 +97,11 @@ def create_petitcours_demande(**kwargs): def create_petitcours_subject(**kwargs): return PetitCoursSubject.objects.create(**kwargs) + + +class PetitCoursTestHelpers: + def require_custommails(self): + data_file = os.path.join( + settings.BASE_DIR, "gestioncof", "management", "data", "custommail.json" + ) + call_command("syncmails", data_file, verbosity=0) From 0fe63d3eae226f643d0935a9ebb7b2105feb21b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 27 Oct 2018 22:02:55 +0200 Subject: [PATCH 05/15] petitcours.tests -- Add tests for demande (raw) views --- gestioncof/tests/test_views.py | 84 ++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index fae54fb3..7a600a17 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -1505,3 +1505,87 @@ class PetitCoursRetraitementViewTestCase( resp = self.client.get(self.url) self.assertEqual(resp.status_code, 200) + + +class PetitCoursDemandeViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demande" + url_expected = "/petitcours/demande" + + http_methods = ["GET", "POST"] + + auth_user = None + auth_forbidden = [] + + def setUp(self): + super().setUp() + os.environ["RECAPTCHA_TESTING"] = "True" + self.subject1 = create_petitcours_subject() + self.subject2 = create_petitcours_subject() + + def tearDown(self): + os.environ["RECAPTCHA_TESTING"] = "False" + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def test_post(self): + data = { + "name": "Le nom", + "email": "lemail@mail.net", + "phone": "0123456789", + "quand": "matin, midi et soir", + "freq": "tous les jours", + "lieu": "partout", + "matieres": [str(self.subject1.pk), str(self.subject2.pk)], + "agrege_requis": "1", + "niveau": "lycee", + "remarques": "no comment", + "g-recaptcha-response": "PASSED", + } + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) + + +class PetitCoursDemandeRawViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demande-raw" + url_expected = "/petitcours/demande-raw" + + http_methods = ["GET", "POST"] + + auth_user = None + auth_forbidden = [] + + def setUp(self): + super().setUp() + os.environ["RECAPTCHA_TESTING"] = "True" + self.subject1 = create_petitcours_subject() + self.subject2 = create_petitcours_subject() + + def tearDown(self): + os.environ["RECAPTCHA_TESTING"] = "False" + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def test_post(self): + data = { + "name": "Le nom", + "email": "lemail@mail.net", + "phone": "0123456789", + "quand": "matin, midi et soir", + "freq": "tous les jours", + "lieu": "partout", + "matieres": [str(self.subject1.pk), str(self.subject2.pk)], + "agrege_requis": "1", + "niveau": "lycee", + "remarques": "no comment", + "g-recaptcha-response": "PASSED", + } + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) From 7124821f7c44882d038eb86a01e854957122b3d3 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 21:54:08 +0100 Subject: [PATCH 06/15] =?UTF-8?q?Permet=20la=20suppression=20d'un=20voeu?= =?UTF-8?q?=20ajout=C3=A9=20mais=20non=20enregistr=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Voir #203. Cette solution est horrible, tout comme le code dans lequel elle se trouve. Déso pas déso. --- bda/templates/bda/inscription-tirage.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bda/templates/bda/inscription-tirage.html b/bda/templates/bda/inscription-tirage.html index 3fd81378..9a39df6f 100644 --- a/bda/templates/bda/inscription-tirage.html +++ b/bda/templates/bda/inscription-tirage.html @@ -52,6 +52,11 @@ var django = { } else { deleteInput.attr("checked", true); } + } else { + // Reset the default values + var selects = $(form).find("select"); + $(selects[0]).val(""); + $(selects[1]).val("1"); } // callback }); From e09fa2b84742a6a3b113eac667ef93c0e703dfaa Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 22:16:43 +0100 Subject: [PATCH 07/15] Affiche un message d'erreur lors de l'enregistrement des voeux BDA Voir #203 --- bda/views.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bda/views.py b/bda/views.py index 050d6851..b67737bc 100644 --- a/bda/views.py +++ b/bda/views.py @@ -192,6 +192,7 @@ def inscription(request, tirage_id): success = False stateerror = False + form_invalid = False if request.method == "POST": # use *this* queryset dbstate = _hash_queryset(participant.choixspectacle_set.all()) @@ -204,6 +205,8 @@ def inscription(request, tirage_id): formset.save() success = True formset = BdaFormSet(instance=participant) + else: + form_invalid = True else: formset = BdaFormSet(instance=participant) # use *this* queryset @@ -217,15 +220,21 @@ def inscription(request, tirage_id): # Messages if success: messages.success( - request, "Votre inscription a été mise à jour avec " "succès !" + request, "Votre inscription a été mise à jour avec succès !" ) - if stateerror: + elif stateerror: messages.error( request, "Impossible d'enregistrer vos modifications " ": vous avez apporté d'autres modifications " "entre temps.", ) + elif form_invalid: + messages.error( + request, + "Une erreur s'est produite lors de l'enregistrement de vos vœux. " + "Avez-vous demandé plusieurs fois le même spectacle ?", + ) return render( request, "bda/inscription-tirage.html", From 511981e762acc8fba60f232b3f043685698ffd9d Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 22:22:49 +0100 Subject: [PATCH 08/15] Simplifie la Logique --- bda/views.py | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/bda/views.py b/bda/views.py index b67737bc..49d509eb 100644 --- a/bda/views.py +++ b/bda/views.py @@ -190,23 +190,31 @@ def inscription(request, tirage_id): formset=InscriptionInlineFormSet, ) - success = False - stateerror = False - form_invalid = False if request.method == "POST": # use *this* queryset dbstate = _hash_queryset(participant.choixspectacle_set.all()) if "dbstate" in request.POST and dbstate != request.POST["dbstate"]: - stateerror = True formset = BdaFormSet(instance=participant) + messages.error( + request, + "Impossible d'enregistrer vos modifications " + ": vous avez apporté d'autres modifications " + "entre temps.", + ) else: formset = BdaFormSet(request.POST, instance=participant) if formset.is_valid(): formset.save() - success = True formset = BdaFormSet(instance=participant) + messages.success( + request, "Votre inscription a été mise à jour avec succès !" + ) else: - form_invalid = True + messages.error( + request, + "Une erreur s'est produite lors de l'enregistrement de vos vœux. " + "Avez-vous demandé plusieurs fois le même spectacle ?", + ) else: formset = BdaFormSet(instance=participant) # use *this* queryset @@ -217,24 +225,6 @@ def inscription(request, tirage_id): total_price += choice.spectacle.price if choice.double: total_price += choice.spectacle.price - # Messages - if success: - messages.success( - request, "Votre inscription a été mise à jour avec succès !" - ) - elif stateerror: - messages.error( - request, - "Impossible d'enregistrer vos modifications " - ": vous avez apporté d'autres modifications " - "entre temps.", - ) - elif form_invalid: - messages.error( - request, - "Une erreur s'est produite lors de l'enregistrement de vos vœux. " - "Avez-vous demandé plusieurs fois le même spectacle ?", - ) return render( request, "bda/inscription-tirage.html", From b80927efa3c154dbcddeb7a2002081e8abdca595 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 22:44:09 +0100 Subject: [PATCH 09/15] Message d'erreur qui ne parle pas de object Voeu --- bda/views.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bda/views.py b/bda/views.py index 49d509eb..7f14ee37 100644 --- a/bda/views.py +++ b/bda/views.py @@ -11,6 +11,7 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.core import serializers from django.core.urlresolvers import reverse +from django.core.exceptions import NON_FIELD_ERRORS from django.db import transaction from django.db.models import Count, Prefetch from django.forms.models import inlineformset_factory @@ -188,6 +189,12 @@ def inscription(request, tirage_id): ChoixSpectacle, fields=("spectacle", "double_choice", "priority"), formset=InscriptionInlineFormSet, + can_order=True, + error_messages={ + NON_FIELD_ERRORS: { + 'unique_together': "Vous avez déjà demandé ce voeu plus haut !", + }, + } ) if request.method == "POST": From d7f4d32c9229dc924cafb209de2de8a5fd695759 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 22:46:02 +0100 Subject: [PATCH 10/15] Oh mon dieu! --- bda/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bda/views.py b/bda/views.py index 7f14ee37..81669492 100644 --- a/bda/views.py +++ b/bda/views.py @@ -189,7 +189,6 @@ def inscription(request, tirage_id): ChoixSpectacle, fields=("spectacle", "double_choice", "priority"), formset=InscriptionInlineFormSet, - can_order=True, error_messages={ NON_FIELD_ERRORS: { 'unique_together': "Vous avez déjà demandé ce voeu plus haut !", From 042ce80b7863987ae3101112d4115a64ffe2c3cc Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 22:52:20 +0100 Subject: [PATCH 11/15] Run black --- bda/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bda/views.py b/bda/views.py index 81669492..93f37583 100644 --- a/bda/views.py +++ b/bda/views.py @@ -191,9 +191,9 @@ def inscription(request, tirage_id): formset=InscriptionInlineFormSet, error_messages={ NON_FIELD_ERRORS: { - 'unique_together': "Vous avez déjà demandé ce voeu plus haut !", - }, - } + "unique_together": "Vous avez déjà demandé ce voeu plus haut !" + } + }, ) if request.method == "POST": From 7f2f25cb710d1cbc5c0b417651a4ca02df172c62 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Mon, 12 Nov 2018 23:04:37 +0100 Subject: [PATCH 12/15] Isort --- bda/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bda/views.py b/bda/views.py index 93f37583..9c4c54f7 100644 --- a/bda/views.py +++ b/bda/views.py @@ -10,8 +10,8 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required from django.core import serializers -from django.core.urlresolvers import reverse from django.core.exceptions import NON_FIELD_ERRORS +from django.core.urlresolvers import reverse from django.db import transaction from django.db.models import Count, Prefetch from django.forms.models import inlineformset_factory From d48cb3aaedb4f8bba1d2004782739946d8ba82e6 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sun, 25 Nov 2018 00:22:12 +0100 Subject: [PATCH 13/15] petitcours.tests -- Deplace les tests dans leur propre fichier --- gestioncof/tests/test_petitscours_views.py | 345 +++++++++++++++++++++ gestioncof/tests/test_views.py | 344 -------------------- 2 files changed, 345 insertions(+), 344 deletions(-) create mode 100644 gestioncof/tests/test_petitscours_views.py diff --git a/gestioncof/tests/test_petitscours_views.py b/gestioncof/tests/test_petitscours_views.py new file mode 100644 index 00000000..88760a29 --- /dev/null +++ b/gestioncof/tests/test_petitscours_views.py @@ -0,0 +1,345 @@ +import json +import os + +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.test import Client, TestCase +from django.urls import reverse + +from gestioncof.tests.testcases import ViewTestCaseMixin + +from .utils import ( + PetitCoursTestHelpers, + create_petitcours_ability, + create_petitcours_demande, + create_petitcours_subject, +) + +User = get_user_model() + + +class PetitCoursDemandeListViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demandes-list" + url_expected = "/petitcours/demandes" + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + def setUp(self): + super().setUp() + self.demande1 = create_petitcours_demande() + self.demande2 = create_petitcours_demande() + self.demande3 = create_petitcours_demande() + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + self.assertEqual(len(resp.context["object_list"]), 3) + + +class PetitCoursDemandeDetailListViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demande-details" + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + @property + def url_kwargs(self): + return {"pk": self.demande.pk} + + @property + def url_expected(self): + return "/petitcours/demandes/{}".format(self.demande.pk) + + def setUp(self): + super().setUp() + self.demande = create_petitcours_demande() + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + +class PetitCoursInscriptionViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-inscription" + url_expected = "/petitcours/inscription" + + http_methods = ["GET", "POST"] + + auth_user = "member" + # Also forbidden for "user". Test below. + auth_forbidden = [None] + + def setUp(self): + super().setUp() + self.user = self.users["member"] + self.cofprofile = self.user.profile + + self.subject1 = create_petitcours_subject(name="Matière 1") + self.subject2 = create_petitcours_subject(name="Matière 2") + + def test_get_forbidden_user_not_cof(self): + self.client.force_login(self.users["user"]) + resp = self.client.get(self.url) + self.assertRedirects(resp, reverse("cof-denied")) + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + @property + def base_post_data(self): + return { + "petitcoursability_set-TOTAL_FORMS": "3", + "petitcoursability_set-INITIAL_FORMS": "0", + "petitcoursability_set-MIN_NUM_FORMS": "0", + "petitcoursability_set-MAX_NUM_FORMS": "1000", + "remarques": "", + } + + def test_post(self): + data = dict( + self.base_post_data, + **{ + "petitcoursability_set-TOTAL_FORMS": "2", + "petitcoursability_set-0-id": "", + "petitcoursability_set-0-user": "", + "petitcoursability_set-0-matiere": str(self.subject1.pk), + "petitcoursability_set-0-niveau": "college", + "petitcoursability_set-0-agrege": "1", + # "petitcoursability_set-0-DELETE": "1", + "petitcoursability_set-1-id": "", + "petitcoursability_set-1-user": "", + "petitcoursability_set-1-matiere": str(self.subject2.pk), + "petitcoursability_set-1-niveau": "lycee", + # "petitcoursability_set-1-agrege": "1", + # "petitcoursability_set-1-DELETE": "1", + # "receive_proposals": "1", + "remarques": "Une remarque", + }, + ) + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.cofprofile.refresh_from_db() + self.assertEqual(self.cofprofile.petits_cours_accept, False) + self.assertEqual(self.cofprofile.petits_cours_remarques, "Une remarque") + self.assertEqual(self.user.petitcoursability_set.count(), 2) + ability1 = self.user.petitcoursability_set.get(matiere=self.subject1) + self.assertEqual(ability1.niveau, "college") + self.assertTrue(ability1.agrege) + ability2 = self.user.petitcoursability_set.get(matiere=self.subject2) + self.assertEqual(ability2.niveau, "lycee") + self.assertFalse(ability2.agrege) + + def test_post_delete(self): + ability1 = create_petitcours_ability(user=self.user) + ability2 = create_petitcours_ability(user=self.user) + + data = dict( + self.base_post_data, + **{ + "petitcoursability_set-INITIAL_FORMS": "2", + "petitcoursability_set-TOTAL_FORMS": "2", + "petitcoursability_set-0-id": str(ability1.pk), + "petitcoursability_set-0-user": "", + "petitcoursability_set-0-matiere": str(self.subject1.pk), + "petitcoursability_set-0-niveau": "college", + "petitcoursability_set-0-agrege": "1", + "petitcoursability_set-0-DELETE": "1", + "petitcoursability_set-1-id": str(ability2.pk), + "petitcoursability_set-1-user": str(self.user.pk), + "petitcoursability_set-1-matiere": str(self.subject2.pk), + "petitcoursability_set-1-niveau": "lycee", + # "petitcoursability_set-1-agrege": "1", + "petitcoursability_set-1-DELETE": "1", + }, + ) + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.assertFalse(self.user.petitcoursability_set.all()) + + +class PetitCoursTraitementViewTestCase( + ViewTestCaseMixin, PetitCoursTestHelpers, TestCase +): + url_name = "petits-cours-demande-traitement" + + http_methods = ["GET", "POST"] + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + @property + def url_kwargs(self): + return {"demande_id": self.demande.pk} + + @property + def url_expected(self): + return "/petitcours/demandes/{}/traitement".format(self.demande.pk) + + def setUp(self): + super().setUp() + self.user = self.users["member"] + self.user.profile.petits_cours_accept = True + self.user.profile.save() + self.subject = create_petitcours_subject() + self.demande = create_petitcours_demande(niveau="college") + self.demande.matieres.add(self.subject) + + def test_get(self): + self.require_custommails() + + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def test_get_with_match(self): + self.require_custommails() + + create_petitcours_ability( + user=self.user, matiere=self.subject, niveau="college" + ) + + resp = self.client.get(self.url) + + self.assertEqual(resp.status_code, 200) + self.assertListEqual( + list(resp.context["proposals"]), [(self.subject, [self.user])] + ) + self.assertEqual( + resp.context["attribdata"], json.dumps([(self.subject.id, [self.user.id])]) + ) + + def test_post_with_match(self): + self.require_custommails() + + create_petitcours_ability( + user=self.user, matiere=self.subject, niveau="college" + ) + + data = { + "attribdata": json.dumps([(self.subject.pk, [self.user.pk])]), + "extra": "", + } + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.demande.refresh_from_db() + self.assertTrue(self.demande.traitee) + self.assertEqual(self.demande.traitee_par, self.users["staff"]) + self.assertIsNotNone(self.demande.processed) + + +class PetitCoursRetraitementViewTestCase( + ViewTestCaseMixin, PetitCoursTestHelpers, TestCase +): + url_name = "petits-cours-demande-retraitement" + + http_methods = ["GET", "POST"] + + auth_user = "staff" + auth_forbidden = [None, "user", "member"] + + @property + def url_kwargs(self): + return {"demande_id": self.demande.pk} + + @property + def url_expected(self): + return "/petitcours/demandes/{}/retraitement".format(self.demande.pk) + + def setUp(self): + super().setUp() + self.demande = create_petitcours_demande() + + def test_get(self): + self.require_custommails() + + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + +class PetitCoursDemandeViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demande" + url_expected = "/petitcours/demande" + + http_methods = ["GET", "POST"] + + auth_user = None + auth_forbidden = [] + + def setUp(self): + super().setUp() + os.environ["RECAPTCHA_TESTING"] = "True" + self.subject1 = create_petitcours_subject() + self.subject2 = create_petitcours_subject() + + def tearDown(self): + os.environ["RECAPTCHA_TESTING"] = "False" + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def test_post(self): + data = { + "name": "Le nom", + "email": "lemail@mail.net", + "phone": "0123456789", + "quand": "matin, midi et soir", + "freq": "tous les jours", + "lieu": "partout", + "matieres": [str(self.subject1.pk), str(self.subject2.pk)], + "agrege_requis": "1", + "niveau": "lycee", + "remarques": "no comment", + "g-recaptcha-response": "PASSED", + } + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) + + +class PetitCoursDemandeRawViewTestCase(ViewTestCaseMixin, TestCase): + url_name = "petits-cours-demande-raw" + url_expected = "/petitcours/demande-raw" + + http_methods = ["GET", "POST"] + + auth_user = None + auth_forbidden = [] + + def setUp(self): + super().setUp() + os.environ["RECAPTCHA_TESTING"] = "True" + self.subject1 = create_petitcours_subject() + self.subject2 = create_petitcours_subject() + + def tearDown(self): + os.environ["RECAPTCHA_TESTING"] = "False" + + def test_get(self): + resp = self.client.get(self.url) + self.assertEqual(resp.status_code, 200) + + def test_post(self): + data = { + "name": "Le nom", + "email": "lemail@mail.net", + "phone": "0123456789", + "quand": "matin, midi et soir", + "freq": "tous les jours", + "lieu": "partout", + "matieres": [str(self.subject1.pk), str(self.subject2.pk)], + "agrege_requis": "1", + "niveau": "lycee", + "remarques": "no comment", + "g-recaptcha-response": "PASSED", + } + resp = self.client.post(self.url, data) + + self.assertEqual(resp.status_code, 200) + self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) + diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index 7a600a17..929eedc9 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -21,11 +21,7 @@ from gestioncof.models import CalendarSubscription, Club, Event, Survey, SurveyA from gestioncof.tests.testcases import ViewTestCaseMixin from .utils import ( - PetitCoursTestHelpers, create_member, - create_petitcours_ability, - create_petitcours_demande, - create_petitcours_subject, create_root, create_user, ) @@ -1249,343 +1245,3 @@ class SurveyStatusViewTests(ViewTestCaseMixin, TestCase): def test_filter_no(self): self._test_filters([(self.qa1, "no")], [self.a2]) - - -class PetitCoursDemandeListViewTestCase(ViewTestCaseMixin, TestCase): - url_name = "petits-cours-demandes-list" - url_expected = "/petitcours/demandes" - - auth_user = "staff" - auth_forbidden = [None, "user", "member"] - - def setUp(self): - super().setUp() - self.demande1 = create_petitcours_demande() - self.demande2 = create_petitcours_demande() - self.demande3 = create_petitcours_demande() - - def test_get(self): - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - self.assertEqual(len(resp.context["object_list"]), 3) - - def test_pagination(self): - for _ in range(21): - create_petitcours_demande() - - # Page 1 - resp = self.client.get(self.url) - self.assertEqual(resp.context["page_obj"].paginator.num_pages, 2) - self.assertEqual(len(resp.context["object_list"]), 20) - - # Page 2 - resp = self.client.get(self.url, {"page": 2}) - self.assertEqual(len(resp.context["object_list"]), 3 + 1) - - -class PetitCoursDemandeDetailListViewTestCase(ViewTestCaseMixin, TestCase): - url_name = "petits-cours-demande-details" - - auth_user = "staff" - auth_forbidden = [None, "user", "member"] - - @property - def url_kwargs(self): - return {"pk": self.demande.pk} - - @property - def url_expected(self): - return "/petitcours/demandes/{}".format(self.demande.pk) - - def setUp(self): - super().setUp() - self.demande = create_petitcours_demande() - - def test_get(self): - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - - -class PetitCoursInscriptionViewTestCase(ViewTestCaseMixin, TestCase): - url_name = "petits-cours-inscription" - url_expected = "/petitcours/inscription" - - http_methods = ["GET", "POST"] - - auth_user = "member" - # Also forbidden for "user". Test below. - auth_forbidden = [None] - - def setUp(self): - super().setUp() - self.user = self.users["member"] - self.cofprofile = self.user.profile - - self.subject1 = create_petitcours_subject(name="Matière 1") - self.subject2 = create_petitcours_subject(name="Matière 2") - - def test_get_forbidden_user_not_cof(self): - self.client.force_login(self.users["user"]) - resp = self.client.get(self.url) - self.assertRedirects(resp, reverse("cof-denied")) - - def test_get(self): - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - - def get_base_post_data(self): - return { - "petitcoursability_set-TOTAL_FORMS": "3", - "petitcoursability_set-INITIAL_FORMS": "0", - "petitcoursability_set-MIN_NUM_FORMS": "0", - "petitcoursability_set-MAX_NUM_FORMS": "1000", - "remarques": "", - } - - base_post_data = property(get_base_post_data) - - def test_post(self): - data = dict( - self.base_post_data, - **{ - "petitcoursability_set-TOTAL_FORMS": "2", - "petitcoursability_set-0-id": "", - "petitcoursability_set-0-user": "", - "petitcoursability_set-0-matiere": str(self.subject1.pk), - "petitcoursability_set-0-niveau": "college", - "petitcoursability_set-0-agrege": "1", - # "petitcoursability_set-0-DELETE": "1", - "petitcoursability_set-1-id": "", - "petitcoursability_set-1-user": "", - "petitcoursability_set-1-matiere": str(self.subject2.pk), - "petitcoursability_set-1-niveau": "lycee", - # "petitcoursability_set-1-agrege": "1", - # "petitcoursability_set-1-DELETE": "1", - # "receive_proposals": "1", - "remarques": "Une remarque", - }, - ) - resp = self.client.post(self.url, data) - - self.assertEqual(resp.status_code, 200) - self.cofprofile.refresh_from_db() - self.assertEqual(self.cofprofile.petits_cours_accept, False) - self.assertEqual(self.cofprofile.petits_cours_remarques, "Une remarque") - self.assertEqual(self.user.petitcoursability_set.count(), 2) - ability1 = self.user.petitcoursability_set.get(matiere=self.subject1) - self.assertEqual(ability1.niveau, "college") - self.assertTrue(ability1.agrege) - ability2 = self.user.petitcoursability_set.get(matiere=self.subject2) - self.assertEqual(ability2.niveau, "lycee") - self.assertFalse(ability2.agrege) - - def test_post_delete(self): - ability1 = create_petitcours_ability(user=self.user) - ability2 = create_petitcours_ability(user=self.user) - - data = dict( - self.base_post_data, - **{ - "petitcoursability_set-INITIAL_FORMS": "2", - "petitcoursability_set-TOTAL_FORMS": "2", - "petitcoursability_set-0-id": str(ability1.pk), - "petitcoursability_set-0-user": "", - "petitcoursability_set-0-matiere": str(self.subject1.pk), - "petitcoursability_set-0-niveau": "college", - "petitcoursability_set-0-agrege": "1", - "petitcoursability_set-0-DELETE": "1", - "petitcoursability_set-1-id": str(ability2.pk), - "petitcoursability_set-1-user": str(self.user.pk), - "petitcoursability_set-1-matiere": str(self.subject2.pk), - "petitcoursability_set-1-niveau": "lycee", - # "petitcoursability_set-1-agrege": "1", - "petitcoursability_set-1-DELETE": "1", - }, - ) - resp = self.client.post(self.url, data) - - self.assertEqual(resp.status_code, 200) - self.assertFalse(self.user.petitcoursability_set.all()) - - -class PetitCoursTraitementViewTestCase( - ViewTestCaseMixin, PetitCoursTestHelpers, TestCase -): - url_name = "petits-cours-demande-traitement" - - http_methods = ["GET", "POST"] - - auth_user = "staff" - auth_forbidden = [None, "user", "member"] - - @property - def url_kwargs(self): - return {"demande_id": self.demande.pk} - - @property - def url_expected(self): - return "/petitcours/demandes/{}/traitement".format(self.demande.pk) - - def setUp(self): - super().setUp() - self.user = self.users["member"] - self.user.profile.petits_cours_accept = True - self.user.profile.save() - self.subject = create_petitcours_subject() - self.demande = create_petitcours_demande(niveau="college") - self.demande.matieres.add(self.subject) - - def test_get(self): - self.require_custommails() - - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - - def test_get_with_match(self): - self.require_custommails() - - create_petitcours_ability( - user=self.user, matiere=self.subject, niveau="college" - ) - - resp = self.client.get(self.url) - - self.assertEqual(resp.status_code, 200) - self.assertListEqual( - list(resp.context["proposals"]), [(self.subject, [self.user])] - ) - self.assertEqual( - resp.context["attribdata"], json.dumps([(self.subject.id, [self.user.id])]) - ) - - def test_post_with_match(self): - self.require_custommails() - - create_petitcours_ability( - user=self.user, matiere=self.subject, niveau="college" - ) - - data = { - "attribdata": json.dumps([(self.subject.pk, [self.user.pk])]), - "extra": "", - } - resp = self.client.post(self.url, data) - - self.assertEqual(resp.status_code, 200) - self.demande.refresh_from_db() - self.assertTrue(self.demande.traitee) - self.assertEqual(self.demande.traitee_par, self.users["staff"]) - self.assertIsNotNone(self.demande.processed) - - -class PetitCoursRetraitementViewTestCase( - ViewTestCaseMixin, PetitCoursTestHelpers, TestCase -): - url_name = "petits-cours-demande-retraitement" - - http_methods = ["GET", "POST"] - - auth_user = "staff" - auth_forbidden = [None, "user", "member"] - - @property - def url_kwargs(self): - return {"demande_id": self.demande.pk} - - @property - def url_expected(self): - return "/petitcours/demandes/{}/retraitement".format(self.demande.pk) - - def setUp(self): - super().setUp() - self.demande = create_petitcours_demande() - - def test_get(self): - self.require_custommails() - - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - - -class PetitCoursDemandeViewTestCase(ViewTestCaseMixin, TestCase): - url_name = "petits-cours-demande" - url_expected = "/petitcours/demande" - - http_methods = ["GET", "POST"] - - auth_user = None - auth_forbidden = [] - - def setUp(self): - super().setUp() - os.environ["RECAPTCHA_TESTING"] = "True" - self.subject1 = create_petitcours_subject() - self.subject2 = create_petitcours_subject() - - def tearDown(self): - os.environ["RECAPTCHA_TESTING"] = "False" - - def test_get(self): - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - - def test_post(self): - data = { - "name": "Le nom", - "email": "lemail@mail.net", - "phone": "0123456789", - "quand": "matin, midi et soir", - "freq": "tous les jours", - "lieu": "partout", - "matieres": [str(self.subject1.pk), str(self.subject2.pk)], - "agrege_requis": "1", - "niveau": "lycee", - "remarques": "no comment", - "g-recaptcha-response": "PASSED", - } - resp = self.client.post(self.url, data) - - self.assertEqual(resp.status_code, 200) - self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) - - -class PetitCoursDemandeRawViewTestCase(ViewTestCaseMixin, TestCase): - url_name = "petits-cours-demande-raw" - url_expected = "/petitcours/demande-raw" - - http_methods = ["GET", "POST"] - - auth_user = None - auth_forbidden = [] - - def setUp(self): - super().setUp() - os.environ["RECAPTCHA_TESTING"] = "True" - self.subject1 = create_petitcours_subject() - self.subject2 = create_petitcours_subject() - - def tearDown(self): - os.environ["RECAPTCHA_TESTING"] = "False" - - def test_get(self): - resp = self.client.get(self.url) - self.assertEqual(resp.status_code, 200) - - def test_post(self): - data = { - "name": "Le nom", - "email": "lemail@mail.net", - "phone": "0123456789", - "quand": "matin, midi et soir", - "freq": "tous les jours", - "lieu": "partout", - "matieres": [str(self.subject1.pk), str(self.subject2.pk)], - "agrege_requis": "1", - "niveau": "lycee", - "remarques": "no comment", - "g-recaptcha-response": "PASSED", - } - resp = self.client.post(self.url, data) - - self.assertEqual(resp.status_code, 200) - self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) From 4e34583e3f288458741b931e3bd9c1db2b2ac8f3 Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Sun, 25 Nov 2018 00:23:43 +0100 Subject: [PATCH 14/15] black --- gestioncof/tests/test_petitscours_views.py | 1 - gestioncof/tests/test_views.py | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/gestioncof/tests/test_petitscours_views.py b/gestioncof/tests/test_petitscours_views.py index 88760a29..9a3cc3dc 100644 --- a/gestioncof/tests/test_petitscours_views.py +++ b/gestioncof/tests/test_petitscours_views.py @@ -342,4 +342,3 @@ class PetitCoursDemandeRawViewTestCase(ViewTestCaseMixin, TestCase): self.assertEqual(resp.status_code, 200) self.assertTrue(resp.context["success"], msg=str(resp.context["form"].errors)) - diff --git a/gestioncof/tests/test_views.py b/gestioncof/tests/test_views.py index 929eedc9..e945a87a 100644 --- a/gestioncof/tests/test_views.py +++ b/gestioncof/tests/test_views.py @@ -1,5 +1,4 @@ import csv -import json import os import uuid from datetime import timedelta @@ -20,11 +19,7 @@ from gestioncof.autocomplete import Clipper from gestioncof.models import CalendarSubscription, Club, Event, Survey, SurveyAnswer from gestioncof.tests.testcases import ViewTestCaseMixin -from .utils import ( - create_member, - create_root, - create_user, -) +from .utils import create_member, create_root, create_user User = get_user_model() From d82c9baf2031ccafce397c72846258d69ac7767b Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sun, 25 Nov 2018 00:48:57 +0100 Subject: [PATCH 15/15] Bump `django-redis-cache` version to 1.8.1 The `django-redis` package does not work with redis 3.0, and previous versions of this package did not hardcode the version number. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 19b185c7..dbc1d888 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ django-autoslug==1.9.3 django-cas-ng==3.5.7 django-djconfig==0.5.3 django-recaptcha==1.4.0 -django-redis-cache==1.7.1 +django-redis-cache==1.8.1 icalendar psycopg2 Pillow