From d7388f6e3b6f0e8e79c95edd8e95403c3a0bb465 Mon Sep 17 00:00:00 2001 From: FrancoisT97 <56149458+FrancoisT97@users.noreply.github.com> Date: Tue, 31 Mar 2020 22:27:52 +0200 Subject: [PATCH 1/2] =?UTF-8?q?ajout=20affichage=20=C3=A9v=C3=A9nements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ephetienn/.idea/dataSources.xml | 6 + ephetienn/menu/db_param.py | 83 +++++++-- ephetienn/menu/envoiemail.py | 16 +- ephetienn/menu/forms.py | 23 ++- ephetienn/menu/urls.py | 12 +- ephetienn/menu/views.py | 175 +++++++++++++++++-- ephetienn/templates/menu/acceuil.html | 13 +- ephetienn/templates/menu/admin.html | 20 +++ ephetienn/templates/menu/affEvent.html | 12 ++ ephetienn/templates/menu/inscription.html | 2 +- ephetienn/templates/menu/insertEvent.html | 21 ++- ephetienn/templates/menu/membre.html | 16 ++ ephetienn/templates/menu/modifierMembre.html | 24 +++ ephetienn/templates/menu/supEvent.html | 23 +++ ephetienn/templates/menu/supMembre.html | 22 +++ 15 files changed, 426 insertions(+), 42 deletions(-) create mode 100644 ephetienn/templates/menu/admin.html create mode 100644 ephetienn/templates/menu/affEvent.html create mode 100644 ephetienn/templates/menu/membre.html create mode 100644 ephetienn/templates/menu/modifierMembre.html create mode 100644 ephetienn/templates/menu/supEvent.html create mode 100644 ephetienn/templates/menu/supMembre.html diff --git a/ephetienn/.idea/dataSources.xml b/ephetienn/.idea/dataSources.xml index 0ef0a93..0563c94 100644 --- a/ephetienn/.idea/dataSources.xml +++ b/ephetienn/.idea/dataSources.xml @@ -7,5 +7,11 @@ org.sqlite.JDBC jdbc:sqlite:C:\Users\Simon\Documents\GitHub\devWeb\ephetienn\db.sqlite3 + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:C:\Users\François\Documents\GitHub\devWeb\ephetienn\db.sqlite3 + \ No newline at end of file diff --git a/ephetienn/menu/db_param.py b/ephetienn/menu/db_param.py index 447aec9..b92a143 100644 --- a/ephetienn/menu/db_param.py +++ b/ephetienn/menu/db_param.py @@ -4,13 +4,14 @@ host="localhost", user="root", passwd="root", - database="db_ephetienn" + database="ephetienne" ) mycursor = mydb.cursor() def afficherInfoDb(nomDb): + element = [] sql = ("Select * from {0}").format(nomDb) mycursor.execute(sql) @@ -18,11 +19,14 @@ def afficherInfoDb(nomDb): myresult = mycursor.fetchall() for x in myresult: - print(x) + element = myresult + + + return element def insertUser(nom, mdp): - sql = "INSERT INTO user (name, pswd) VALUES (%s, %s)" + sql = "INSERT INTO user (userName, userPswd) VALUES (%s, %s)" val = (nom, mdp) mycursor.execute(sql, val) @@ -31,8 +35,8 @@ def insertUser(nom, mdp): print(mycursor.rowcount, "record inserted.") -def insertEvent(date, event, description): - sql = ("INSERT INTO event (dateEvent, nameEvent, descEvent) VALUES ('{0}', '{1}', '{2}')").format(date, event, description) +def insertEvent(event, date, description): + sql = ("INSERT INTO event (eventName, eventDate, eventDesc) VALUES ('{0}', '{1}', '{2}')").format(date, event, description) # date au format '2020-03-11' @@ -44,7 +48,7 @@ def insertEvent(date, event, description): print(mycursor.rowcount, "record inserted.") def insertInscription(nom, prenom, dateNaiss, numTel, emailParent, remarques): - sql = ("INSERT INTO inscrits (nom, prenom, dateNaiss, numTel, emailParent, remarques) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')").format(nom, prenom,dateNaiss, numTel, emailParent, remarques) + sql = ("INSERT INTO membre (membreNom, membrePrenom, dateNaiss, telParent, emailParent, remarques) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')").format(nom, prenom, dateNaiss, numTel, emailParent, remarques) # date au format '2020-03-11' print(sql) @@ -55,8 +59,6 @@ def insertInscription(nom, prenom, dateNaiss, numTel, emailParent, remarques): - - def updateUser(id): sql = ("UPDATE user SET name = 'Canyon' WHERE id = {0}").format(id) @@ -67,8 +69,8 @@ def updateUser(id): print(mycursor.rowcount, "record(s) affected") -def deleteData(nomDb, id): - sql = ("DELETE FROM {0} WHERE id = {1}").format(nomDb, id) +def deleteMembre(id): + sql = ("DELETE FROM membre WHERE idmembre = {0}").format(id) mycursor.execute(sql) @@ -76,5 +78,66 @@ def deleteData(nomDb, id): print(mycursor.rowcount, "record(s) deleted") +def selectUser(user, mdp): + sql = ("Select * from user") + + mycursor.execute(sql) + + myresult = mycursor.fetchall() + + for x in myresult: + print(x[1], x[2]) + if user == x[1] and mdp == x[2]: + return True + +def modifMembreDb(id): + sql = ("Select * from membre where idmembre = {0}").format(id) + mycursor.execute(sql) + + myresult = mycursor.fetchall() + + #debug + print(myresult) + + #debug + print(sql) + + return myresult + +def supEventDb(nom, date): + + sql = ("Delete from event Where eventName = '{0}' and eventDate = '{1}' ").format(nom, date) + mycursor.execute(sql) + print(sql) + + mydb.commit() + + print("effacement réussi") + + +def selectMembre(id): + sql = ("Select * from membre where idmembre = {0}").format(id) + mycursor.execute(sql) + + myresult = mycursor.fetchall() + + # debug + print(myresult) + + # debug + print(sql) + + return myresult + +def updateMembre(id, nom, prenom, dateNaiss, numTel, email, rem): + sql = ("UPDATE membre set membreNom = '{1}', membrePrenom = '{2}', dateNaiss= '{3}', telParent = '{4}', emailParent = '{5}', remarques = '{6}' where idmembre = {0}").format(id, nom, prenom, dateNaiss, numTel, email, rem) + + print(sql) + mycursor.execute(sql) + + mydb.commit() + + + diff --git a/ephetienn/menu/envoiemail.py b/ephetienn/menu/envoiemail.py index 94c7eca..65bec92 100644 --- a/ephetienn/menu/envoiemail.py +++ b/ephetienn/menu/envoiemail.py @@ -23,7 +23,7 @@ def envoiCopie(to, subject, message): msg['From'] = 'ephetiennetest@gmail.com' msg['To'] = to msg['Subject'] = 'copie de votre message - ' + subject - msg.attach(MIMEText(message)) + msg.attach(MIMEText("Voici la copie du message que vous nous avez envoyé: \n" + message)) mailserver = smtplib.SMTP('smtp.gmail.com', 587) mailserver.ehlo() mailserver.starttls() @@ -33,4 +33,16 @@ def envoiCopie(to, subject, message): mailserver.quit() - +def confirmInscription(to, nom, prenom): + msg = MIMEMultipart() + msg['From'] = 'ephetiennetest@gmail.com' + msg['To'] = to + msg['Subject'] = 'confirmation inscritpion - ' + nom + ' ' + prenom + msg.attach(MIMEText("nous avons bien reçu l'inscription de votre enfant")) + mailserver = smtplib.SMTP('smtp.gmail.com', 587) + mailserver.ehlo() + mailserver.starttls() + mailserver.ehlo() + mailserver.login('ephetiennetest@gmail.com', 'Ephet_RP003') + mailserver.sendmail('ephetiennetest@gmail.com', to, msg.as_string()) + mailserver.quit() \ No newline at end of file diff --git a/ephetienn/menu/forms.py b/ephetienn/menu/forms.py index 890fc74..77279a2 100644 --- a/ephetienn/menu/forms.py +++ b/ephetienn/menu/forms.py @@ -4,14 +4,14 @@ class formInscription(forms.Form): nom = forms.CharField(max_length=100) prenom = forms.CharField(max_length=100) - dateNaiss = forms.DateField(label="format 2020-03-21") - numeroTel = forms.CharField(label="numer telephone") + dateNaiss = forms.DateField(label="Date de Naissance (format 2020-03-21)") + numeroTel = forms.CharField(label="numero telephone") emailParents = forms.EmailField(label="Votre adresse e-mail") remarques = forms.CharField(max_length=1000) class formEvent(forms.Form): - date = forms.DateField(label="date de l'évenement") + date = forms.DateField(label="Date") nom = forms.CharField(max_length=45) description = forms.CharField(widget=forms.Textarea) @@ -21,3 +21,20 @@ class ContactForm(forms.Form): subject = forms.CharField(required=True) message = forms.CharField(widget=forms.Textarea, required=True) renvoi = forms.BooleanField(help_text="Cochez si vous souhaitez obtenir une copie du mail envoyé.", required=False) + +class connexion(forms.Form): + user = forms.CharField(required=True) + mdp = forms.CharField(max_length=32, widget=forms.PasswordInput) + +class formSupEvent(forms.Form): + nom = forms.CharField(required=True) + date = forms.DateField(label="format 2020-03-21") + +class modifierMembre(forms.Form): + id = forms.IntegerField(required=True) + nom = forms.CharField(max_length=100) + prenom = forms.CharField(max_length=100) + dateNaiss = forms.DateField(label="Date de Naissance: (format 2020-03-21)") + numeroTel = forms.CharField(label="numero telephone") + emailParents = forms.EmailField(label="Votre adresse e-mail") + remarques = forms.CharField(max_length=1000) \ No newline at end of file diff --git a/ephetienn/menu/urls.py b/ephetienn/menu/urls.py index f84ead5..5abf391 100644 --- a/ephetienn/menu/urls.py +++ b/ephetienn/menu/urls.py @@ -1,13 +1,19 @@ from . import views from django.urls import path -from .views import emailView, successView urlpatterns = [ path('inscription/', views.inscription, name='inscription'), path('insertEvent/', views.event, name='insertEvent'), + path('supEvent/', views.supEvent, name='supEvent'), path('acceuil/', views.home, name='acceuil'), - path('contact/', emailView, name='contact'), - path('success/', successView, name='success'), + path('contact/', views.emailView, name='contact'), + path('success/', views.successView, name='success'), + path('admin/', views.admin, name='admin'), + path('membre/', views.affMembre, name='membre'), + path('modifierMembre/', views.modifMembre, name="modifierMembre"), + path('supMembre/', views.supMembre, name='supMembre'), + path('affEvent/', views.affEvent, name='affEvent'), + ] diff --git a/ephetienn/menu/views.py b/ephetienn/menu/views.py index db41a95..c8aa3c3 100644 --- a/ephetienn/menu/views.py +++ b/ephetienn/menu/views.py @@ -1,12 +1,11 @@ -from .db_param import insertEvent -from .forms import formInscription -from .db_param import insertInscription -from .forms import formEvent +from .db_param import insertEvent, supEventDb +from .db_param import insertInscription, deleteMembre, updateMembre +from.db_param import afficherInfoDb, selectUser, modifMembreDb, updateUser, selectMembre from django.shortcuts import render, redirect -from .forms import ContactForm from django.core.mail import send_mail, BadHeaderError from django.http import HttpResponse -from .envoiemail import envoi, envoiCopie +from .envoiemail import envoi, envoiCopie, confirmInscription +from . import forms @@ -14,11 +13,13 @@ def home(request): return render(request, 'menu/acceuil.html') + def inscription(request): + # Construire le formulaire, soit avec les données postées, # soit vide si l'utilisateur accède pour la première fois # à la page. - form = formInscription(request.POST or None) + form = forms.formInscription(request.POST or None) # Nous vérifions que les données envoyées sont valides # Cette méthode renvoie False s'il n'y a pas de données # dans le formulaire ou qu'il contient des erreurs. @@ -33,19 +34,19 @@ def inscription(request): #envoie des donnees du formulaire vers la base de données insertInscription(nom, prenom, dateNaiss, numeroTel, emailParents, remarques) + confirmInscription(emailParents, nom, prenom) - # Nous pourrions ici envoyer l'e-mail grâce aux données - # que nous venons de récupérer envoi = True # Quoiqu'il arrive, on affiche la page du formulaire. + return render(request, 'menu/inscription.html', locals()) def event(request): # Construire le formulaire, soit avec les données postées, # soit vide si l'utilisateur accède pour la première fois # à la page. - form = formEvent(request.POST or None) + form = forms.formEvent(request.POST or None) # Nous vérifions que les données envoyées sont valides # Cette méthode renvoie False s'il n'y a pas de données # dans le formulaire ou qu'il contient des erreurs. @@ -58,8 +59,7 @@ def event(request): # envoie des donnees du formulaire vers la base de données insertEvent(date, nom, description) - # Nous pourrions ici envoyer l'e-mail grâce aux données - # que nous venons de récupérer + envoi = True # Quoiqu'il arrive, on affiche la page du formulaire. @@ -68,9 +68,9 @@ def event(request): def emailView(request): if request.method == 'GET': - form = ContactForm() + form = forms.ContactForm() else: - form = ContactForm(request.POST) + form = forms.ContactForm(request.POST) if form.is_valid(): subject = form.cleaned_data['subject'] from_email = form.cleaned_data['from_email'] @@ -90,3 +90,150 @@ def successView(request): return HttpResponse('Success! Thank you for your message.') +def admin(request): + + form = forms.connexion(request.POST or None) + # Nous vérifions que les données envoyées sont valides + # Cette méthode renvoie False s'il n'y a pas de données + # dans le formulaire ou qu'il contient des erreurs. + if form.is_valid(): + user = form.cleaned_data['user'] + mdp = form.cleaned_data['mdp'] + redirect = selectUser(user, mdp) + print(redirect) + + envoi = True + + if redirect == True: + return render(request, 'menu/admin.html', locals()) + + else : + return render(request, 'menu/acceuil.html', locals()) + + return render(request, 'menu/acceuil.html', locals()) + +def supEvent(request): + form = forms.formSupEvent(request.POST or None) + # Nous vérifions que les données envoyées sont valides + # Cette méthode renvoie False s'il n'y a pas de données + # dans le formulaire ou qu'il contient des erreurs. + if form.is_valid(): + nom = form.cleaned_data['nom'] + date = form.cleaned_data['date'] + + supEventDb(nom, date) + + envoi = True + + return render(request, "menu/supEvent.html", locals()) + +def supMembre(request): + form = forms.modifierMembre(request.POST or None) + # Nous vérifions que les données envoyées sont valides + # Cette méthode renvoie False s'il n'y a pas de données + # dans le formulaire ou qu'il contient des erreurs. + if form.is_valid(): + id = form.cleaned_data['id'] + + + deleteMembre(id) + + envoi = True + + return render(request, "menu/supMembre.html", locals()) + +def affMembre(request): + + afficher = affichageMembres() + + + return render(request, "menu/membre.html", locals()) + +def modifMembre(request): + + answer=[] + form = forms.modifierMembre(request.POST or None) + # Nous vérifions que les données envoyées sont valides + # Cette méthode renvoie False s'il n'y a pas de données + # dans le formulaire ou qu'il contient des erreurs. + if form.is_valid(): + id = form.cleaned_data['id'] + nom = form.cleaned_data['nom'] + prenom = form.cleaned_data['prenom'] + dateNaiss = form.cleaned_data['dateNaiss'] + numeroTel = form.cleaned_data['numeroTel'] + emailParents = form.cleaned_data['emailParents'] + remarques = form.cleaned_data['remarques'] + + answer = selectMembre(id) + print("answer: ", answer) + updateMembre(id, nom, prenom, dateNaiss, numeroTel, emailParents, remarques) + envoi = True + + afficher = answer + + + return render(request, "menu/modifierMembre.html", locals()) + +def affichageMembres(): + liste = [] + afficher= " " + + + + membres = afficherInfoDb('membre') + print(type(membres)) + print(membres) + + i = 0 + while i < len(membres): + print(membres[i][0]) + liste += [[membres[i][0], membres[i][1], membres[i][2]]] + i += 1 + + print(liste) + print(type(liste)) + + print("résultat désirer: ") + for id, nom, prenom in liste: + print("id: {} nom: {} prenom : {}".format(id, nom, prenom)) + afficher += ("id: {} nom: {} prenom : {} \n ".format(id, nom, prenom)) + print("test: ", afficher) + + + + return liste + +def affichageEvent(): + + #Print utiliser pour debug + eventAvenir = [] + afficher = " " + + events = afficherInfoDb('event') + print(type(events)) + print(events) + + i = 0 + while i < len(events): + print(events[i][0]) + eventAvenir += [[events[i][0], events[i][1], events[i][2]]] + i += 1 + + print("eventAvenir:", eventAvenir) + print(type(eventAvenir)) + + + print("résultat désirer: ") + for nom, date, description in eventAvenir: + afficher += ("nom: {} date: {} description : {} \n".format(nom, date, description)) + print("test: ", afficher) + + return eventAvenir + +def affEvent(request): + + eventAvenir = affichageEvent() + + return render(request, "menu/affEvent.html", locals()) + diff --git a/ephetienn/templates/menu/acceuil.html b/ephetienn/templates/menu/acceuil.html index 34ec423..0950e55 100644 --- a/ephetienn/templates/menu/acceuil.html +++ b/ephetienn/templates/menu/acceuil.html @@ -9,14 +9,23 @@

Bienvenue sur le site Ephetienne Rhode-Saint-Genè

paragraphe test

- -



+
+
+ + +

espace admin

+ +
+ {% csrf_token %} + {{ form.as_p }} + +
diff --git a/ephetienn/templates/menu/admin.html b/ephetienn/templates/menu/admin.html new file mode 100644 index 0000000..691e5b3 --- /dev/null +++ b/ephetienn/templates/menu/admin.html @@ -0,0 +1,20 @@ + + + + + admin + + + + +
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/ephetienn/templates/menu/affEvent.html b/ephetienn/templates/menu/affEvent.html new file mode 100644 index 0000000..6b7b57e --- /dev/null +++ b/ephetienn/templates/menu/affEvent.html @@ -0,0 +1,12 @@ + + + + + Evénements à venir + + +

Evénements à venir :
{%for i in eventAvenir%} {{ i }}
{% endfor %}

+
+ + + \ No newline at end of file diff --git a/ephetienn/templates/menu/inscription.html b/ephetienn/templates/menu/inscription.html index 507bd88..0fda95e 100644 --- a/ephetienn/templates/menu/inscription.html +++ b/ephetienn/templates/menu/inscription.html @@ -6,7 +6,7 @@ {% if envoi %} - Votre inscription a bien été enregistrer! + Votre inscription a bien été enregistrer! Vous receverez un mail de confirmation d'ici peu. {% endif %} diff --git a/ephetienn/templates/menu/insertEvent.html b/ephetienn/templates/menu/insertEvent.html index 1bb461d..01bd75c 100644 --- a/ephetienn/templates/menu/insertEvent.html +++ b/ephetienn/templates/menu/insertEvent.html @@ -2,19 +2,26 @@ - Ajout Evénement + Evénement +

Page gestion des événements

{% if envoi %} Evénement bien enregistrer! {% endif %} -

Page d'insertion d'évenement

+
+

Ajout d'un nouvel évenement

Introduire l'événement:

-
- {% csrf_token %} - {{ form.as_p }} - -
+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ + + + \ No newline at end of file diff --git a/ephetienn/templates/menu/membre.html b/ephetienn/templates/menu/membre.html new file mode 100644 index 0000000..afbad3f --- /dev/null +++ b/ephetienn/templates/menu/membre.html @@ -0,0 +1,16 @@ + + + + + membres + + +

Liste des membres :
{%for i in afficher%} {{ i }}
{% endfor %}

+

quel choix voulez vou faire:

+ +

modifier:

+ +

Supprimer:

+ + + \ No newline at end of file diff --git a/ephetienn/templates/menu/modifierMembre.html b/ephetienn/templates/menu/modifierMembre.html new file mode 100644 index 0000000..995568b --- /dev/null +++ b/ephetienn/templates/menu/modifierMembre.html @@ -0,0 +1,24 @@ + + + + + Modifier un membre + + + +

Membre à modifier

+ {% if envoi %} +

ancienne données: {{ afficher }}

+ {% endif %} +
+

modification Membre

+

Introduire membre

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ + + \ No newline at end of file diff --git a/ephetienn/templates/menu/supEvent.html b/ephetienn/templates/menu/supEvent.html new file mode 100644 index 0000000..33dc284 --- /dev/null +++ b/ephetienn/templates/menu/supEvent.html @@ -0,0 +1,23 @@ + + + + + Supprimer un événement + + +

Evénement à supprimer

+ {% if envoi %} + Evénement bien supprimer! + {% endif %} +
+

Supression événement

+

Introduire l'événement:

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ + + \ No newline at end of file diff --git a/ephetienn/templates/menu/supMembre.html b/ephetienn/templates/menu/supMembre.html new file mode 100644 index 0000000..e03bad6 --- /dev/null +++ b/ephetienn/templates/menu/supMembre.html @@ -0,0 +1,22 @@ + + + + + Supprimer un membre + +

Membre à supprimer

+ {% if envoi %} + Membre bbien supprimer! + {% endif %} +
+

Supression Membre

+

Introduire l'événement:

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ + + \ No newline at end of file From 6053aa1c1800f7f44c3b958800d570e6a6e6afbc Mon Sep 17 00:00:00 2001 From: FrancoisT97 <56149458+FrancoisT97@users.noreply.github.com> Date: Tue, 31 Mar 2020 22:29:14 +0200 Subject: [PATCH 2/2] =?UTF-8?q?affichage=20=C3=A9v=C3=A9nements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/__pycache__/db_param.cpython-38.pyc | Bin 2024 -> 3362 bytes .../__pycache__/envoiemail.cpython-38.pyc | Bin 1080 -> 1557 bytes .../menu/__pycache__/forms.cpython-38.pyc | Bin 1301 -> 2138 bytes .../menu/__pycache__/urls.cpython-38.pyc | Bin 520 -> 764 bytes .../menu/__pycache__/views.cpython-38.pyc | Bin 2094 -> 4975 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ephetienn/menu/__pycache__/db_param.cpython-38.pyc b/ephetienn/menu/__pycache__/db_param.cpython-38.pyc index d51da8626540e22e933d2489cca58296718ad2b2..2a1713efec4b98d965cdfe2d167aa87815611140 100644 GIT binary patch literal 3362 zcmb_e%Wm676y-}4Ez8e5ounw+CY2SqZXQlh6m5_oQW^t^;`-45g42THjA}WeC=V$o zb||1|vTXmL3u{&Q1NsI13vRp02Xs?((Q}6qExATkp`e-J6;01Q_uO-4V`3tw;QC|r z=kJ&Dit-oT3|}U0?&2H#gn=ncZ7NljtJ~VP&NQauW3bGxM%CcPL8hlvO=hy}8>O0M z78}ECu^b!6JjU{D0&|W{vMJ2tY?{qr&a+u|3iAXz&CXz+WM|nq%v0<S7qvf5-B~ktA*-;7HK_IRj|@~N>`8clJd;z8j;>r zcP>Y?DXp?Uv&Ng;4ehITUHG2;>RK1OFzdeXoG`Y$J+~tQU&LAdlDnOd$5x$(?v~SR z7BkgM%lAq({MO_iZ-ucQ>@?|b1P?mRFjik4DqB*+Sz2aAKH#^yv6ojJn7Wy4R?!+Gqx|l`8)hOP-49xVEXkEjC0i#HX)VkKyL*+n?v`Fu1KuaUEFdLz= zonhK*#FzrC^veFN<;q%lb=_XBtUs}-MD{$5702TX@_q&7D%#)Od$dtrv*)h_3-*OV3Q-IlD95_T z+Jdr;^=5G6|@x28*S*{3>w` zWV!`>56yQ&3+T@yW$2IGPdt|HCpKFhZ=E-*<3pQ?$I{K5i1|!{`En~Q4XIT?s4D7d zosbt-upUu2>Rn>2#C-vaRM}LiY^p?AKQLskW>f*X`geydoIJiHXH0eA5g~UJ+IXmoA@Fez0S`q~hwODJg6BEyM+Jqc+ z{BjDb>=8l2I)qof_gy|Xdt~FQkH!3 z#A8X>hxlzYi>ru?=q#y9sx0fcA)QV1RaQ(n&{8j2>KdUQ8BCi~FzRy(X)QEJMxJZp z0=i7bX$=)N)|8zKvZFGU{n=69A{~B9_V|{VvtBfYG-DhQsUyXVpuLGX8c0k9S%;XS z;aJ|eK-wbJ?pypk@R+{C%&O;A@fqSH6(qiIX&_^-~o3K0N?z~=iTzTxU#h-_rAZWlgEy_gBsEKhWsird)aOlj+K?{BZtqPU)Ijz_y{|?jYx5}I_2%*M7!wvIGeknFRB?Ch{w`Mob4~=!33u` zd0I{=NGz2{FL|nv7AI9-kZ4NvkS!*8C8&_{-wu&L(o>%Atgq0oohH9S3Kv|)U}>hR ZC7*xIEc$iI%2|1Qa@H8eNo(Ai{0|rz>Fxjk delta 824 zcmZuv-A)rh6yBNHU52t`)$zPN+uH;ob%$* z?kBTjkD{H<+>U`ZwfyDIhvB5jnaNZg2Q@6zC*%}OQQr%V2UY{qj)=8 zTv^?8Hp*;ewYY@NdJ(BByNY9_#+BMI&&Es6L#OPprH!>m?D)nh+g^4y9Ok*~4m(~reK90>tts5u zAkSQ0=OK56(k)L!5*{(7;3A diff --git a/ephetienn/menu/__pycache__/envoiemail.cpython-38.pyc b/ephetienn/menu/__pycache__/envoiemail.cpython-38.pyc index 0a53056fb4f678e932966cf551b0558b10ad74f9..e18567657c290b4f8166c3d4b45e86fcf4598406 100644 GIT binary patch delta 494 zcmZ9I&r2IY6oBXLCcBe0KQsstwfG961`&h`1uglf_O2uQeZgww^xjU%NLu;_Q zQQ@NWlYMgq?6IbIFTPmtBl}~mP75cs8te*204%nL1>p)lc=}iaQ5spm(!!7nNLe-o z4e+uRd%cx>rs@Y_&|2x5=DYt8Abl7#Ir#l$V!_0SMwdtK)iDCi2NJnoQI-VPyg&2!ufW~ODPoB@}IQc275)TKE%K=ou!^FW4 E0PF7*YXATM diff --git a/ephetienn/menu/__pycache__/forms.cpython-38.pyc b/ephetienn/menu/__pycache__/forms.cpython-38.pyc index aab182d8937bd60372446e7a2e6e6382b7ca2c95..cda431f07a96d89b43d69f85f909f117f575d88f 100644 GIT binary patch literal 2138 zcmah~+iu%N5G6&57hP<}O|L*(_KK*0Q`dbsXF1%RnKOrvy4{wA>!;^WfB)IDtiO43 z^>Q)U#;yK@5tgu1E3*f-ZQZj(LpXm~!Xf*x@zfbOKwQxT(wrkM5Ks6({5jGD5{M8; zI7d7nEzt(jo+Cbxj_3mE&XGW@JhXbN=Qx4YvvqU7keQnB?CRxUvW;8q!H_kug*9l9 zbLa|NG@jXm=9RIBu`e9q0uKz{G~*EC7S7Cg+u*+O?T7#;2=yv&eLq(dnas+h$j=4# zI=u{N*5=mc#^$#hTi^8H)J)?sr7zd= zDkE7$C8ac*7CF7V{%cW6iee#2DT-(#i<9*H9|YL%b#*Wr<#9%%k#3DfSs|*F$DPsW zsEX5iMK*9O9qvqHxtmZbw38Q^_GXg!KjZ_}cqlM5=hR_+j6F(q>n?9tKhYr`KZxO4 zDjiBpXnzj$6GYIvuZAT;<5?PFbX-&_Qbje5lM+ZV zE-6oBROJ*+idh2IR}s@CqWrjc^5X2~Zm*%kDW$VfiJX{M_IsU$seBtd>DIn1vXP;j zNvQT!H9n+CDL>|AKSM*r2c$cW9>E}sTvL8nV2mM=PS4{a}*PT!;y@<7K#IK8@Ku#W=SX)tuYUy!_Dxpnwfs6BRRds z*ek+iTIBx%GCg1#Lw{p4 zGwvEZG)liBS}0^&uRu+c{e!hDt zBG&06SWi##zgk?QzHLRI+n~GqKg&7z;DH~dMZVQ3utuf{w;1FZlqe8^jiAC}H9hAW z=8BTVnYY8dT?#6-P^2Jn3cXowl2o+xn;+E;jz|cPv4db6dDPfYJ8cRV{Wf)nhJxz^ zRB4UKQw+RYU^`_p$YvOiXE2Gdk$wn!&(|V?KM$OhoPTwhuoh+5rWQ&RR>I00vh2_h riD=I(|1QY3CBlGyIr6lWNzaBgisOJ4QxaJ>>gnFS{r&3f_t`Wua4DR8*?T z3w%9vs>6CLGbZgrr@Ct!?Qbf{S```#`)ab6I#<8GSHfh^ ztD==?!DO#Q^SWJSz_%axD&zHrH-amb;cS~(+sE}qA3eslZONb5(>6yKrgZAh>3^=P Ezw{yAZ2$lO delta 261 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 AlK=n! literal 2094 zcmZ`)OK%)S5bmDodF{))eg%^N8{R9yaz_ZEI8L04iDHM4(F$uk-Oi3ZkEOeJQOugl zBEgX}CyovAXW;E4bcUR9;fAw|E!)CKa;QH=|Z@>DpNyy*W zxp+Cy`3xTQ8yHSF%}GIHN)bD`Q@F8fu?yoYW)?FT_hJvQ$Nk(df;cF`IJ9#C%tdiz z=fb>J)Z=>5h#R&a<;|iMx2#_+Un<&hyXeFn=+}AUdlE16CT~Hz!k2g(+Ew1+%h0az z6}}4XI$zr*z4hl5LhVsg&q^hv-kOL~LwD)0lEuAJr7|1otSVusGxxYW7@?nC^c>zp zdXDj>D7la(l!9kcr1-Y_W>xAW)px)dTp|T7`$dxFrgbaf+aiGlTT)i?88wYh@MrI;faz!+@I695?V5gpYy znbA`^rN2185;>gGBbU<+a_U&*0CFvI0WpghAkQKXkZ+L>D9~)`Ox-D)dQ*QI%zThV za2je4xCymCBQqEHiFS-zR)z6LkTYl_o@lX?WJ;N+ggwh@PvoW{FjMyv@X;_Kp(~NM zy^}RdF34h`k~zVF#Do}j|MT5F6J~0ElH?gTjWicYDfm8oC6NqVY$A-GS80-~UL-qq z87fMy;q*G1YiM3Uvw`MSG%Ylkv$RGnEbGH2*!;oORH&f^0oVE*0E{@=WNe^O?*U{WS z^BNkIm8DL;4yfl_-sBrNdJ~Q1?oC85;>i5QDx@<&Z!%sJDp3)=k|m|`3ii`r!z6^q(s92JY&WgHcY9CSDMS8F+B*2J_lT4?7}4QzP5wj)-a6v`jQZp;*(F~RUE{%w?h;+M`fgm%_uZ{M z6R7dQ5mX{mJCs$iZ}n_~LMW9y5w>7Kg*jQfS6ZQVhqfMd536y>`?wgYhf-&yB%N2X zd48J4FN7XeT;h?wk|*PhWL9dqgi|&XbwpShB=Y%^6uyH~@1l7R&HHGsNIkMU_yP*f z7R)M4H35mE(8F`7hm_F&QGgzH%L9oiVEJ=*=!j3Hcw#bB^6cr!m;#1^KVJ&I^$#}OH4+~j%J=_Ra{{?Ic B*dG7@