feat: use templates to generate com

This commit is contained in:
Alice 2021-11-28 03:09:29 +01:00
parent a47c5df213
commit d29173d14b
9 changed files with 212 additions and 152 deletions

View file

@ -1,7 +1,9 @@
PRICE_ONE_COF = 4 prices = {
PRICE_ONE_EXTE = 5 'one_cof': 4,
PRICE_CARD_COF = 30 'one_exte': 5,
PRICE_CARD_EXTE = 35 'card_cof': 30,
'card_exte': 35
}
db_path = '../db/baseFilms.db' db_path = '../db/baseFilms.db'
dump_path = '../db/dumpFile' dump_path = '../db/dumpFile'

View file

@ -11,6 +11,7 @@ Created on Sun Mar 25 18:20:49 2018
# * mettre en place une file d'instruction pour anticiper # * mettre en place une file d'instruction pour anticiper
# * vérifier les eval et les types donnés # * vérifier les eval et les types donnés
from genCom import GenerateurComm
from cineclubBlogSQ import filmSQ as f from cineclubBlogSQ import filmSQ as f
from config import dump_path, db_path from config import dump_path, db_path
import sqlite3 import sqlite3
@ -22,6 +23,7 @@ class FilmInterface():
def __init__(self): def __init__(self):
self.filmCharge = None self.filmCharge = None
self.generateur_com = GenerateurComm()
def menu(self): def menu(self):
self.filmEnCours() self.filmEnCours()
@ -161,22 +163,22 @@ class FilmInterface():
rep = input( rep = input(
"Voulez-vous afficher \n 1: l'article du bocal du film courant \n 2: l'article de blog du film courant \n 3: le calendrier du film courant \n 4: la communication Facebook du film courant \n 5: l'email du film courant \n 6: le calendrier des films à partir du film courant \n 7: changer le film sélectionné \n 0: revenir au menu principal \n") "Voulez-vous afficher \n 1: l'article du bocal du film courant \n 2: l'article de blog du film courant \n 3: le calendrier du film courant \n 4: la communication Facebook du film courant \n 5: l'email du film courant \n 6: le calendrier des films à partir du film courant \n 7: changer le film sélectionné \n 0: revenir au menu principal \n")
if rep == "1": if rep == "1":
print(self.filmCharge.bocal()) print(self.generateur_com.bocal(self.filmCharge))
self.finAction() self.finAction()
elif rep == "2": elif rep == "2":
print(self.filmCharge.blog()) print(self.generateur_com.blog(self.filmCharge))
self.finAction() self.finAction()
elif rep == "3": elif rep == "3":
print(self.filmCharge.calendrier()) print(self.generateur_com.calendrier(self.filmCharge))
self.finAction() self.finAction()
elif rep == "4": elif rep == "4":
print(self.filmCharge.facebook()) print(self.generateur_com.facebook(self.filmCharge))
self.finAction() self.finAction()
elif rep == "5": elif rep == "5":
print(self.filmCharge.mail()) print(self.generateur_com.mail(self.filmCharge))
self.finAction() self.finAction()
elif rep == "6": elif rep == "6":
print(self.filmCharge.allCalendars()) print(self.generateur_com.allCalendars(self.filmCharge))
self.finAction() self.finAction()
elif rep == "7": elif rep == "7":
self.selectFilm() self.selectFilm()

View file

@ -152,148 +152,6 @@ class filmSQ():
return s return s
def blog(self):
res = u'<div class="entry-trailer"><iframe src="'
res += self.youtube
res += u'" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div><br />'
res += u'<!-- Commentaire pertinent quelconque vis-à-vis du film --> <div class="entry-mainblock"> \
<div class="entry-separator"><img class="alignnone wp-image-1873 size-medium" src="'+self.image+'" alt="" width="300" height="300" /></a></div> \
<div class="entry-text-info"><b> Durée </b>:'
res += str(self.duree) + " minutes"
if self.couleur:
res += u'<br /><b>Couleur</b>'
else:
res += u'<br /><b>Noir et blanc</b>'
res += u'<br /><b>Pays :</b>' + self.pays
res += u'<br /><b>' + self.formatCopie + ' . ' + self.langST +'</b>'
res += u'<br /><b>Année :</b>' + str(self.annee)
res += u'<br /><b>Avec :</b>' + strListe(self.acteurs)
res += u'<br /><div class="entry-text-info"><strong>Synopsis</strong> : ' + self.synopsis + '</div>'
res += u"<br /></div>"
res += f"Comme d'habitude, l'entrée coûte {config.PRICE_ONE_EXTE} euros, {config.PRICE_ONE_COF} pour les membres du COF et vous avez la possibilité d'acheter des cartes de 10 places pour respectivement {config.PRICE_CARD_EXTE} et {config.PRICE_CARD_COF} euros. L'entrée est gratuite pour les étudiant.e.s invité.e.s."
res += u'<div class="entry-resume"> Et pour résumer : <div class="resume-bloc"><span class="resume-date">Rendez-vous le ' + self.date.strftime("%A %d %B %Y")
res += u', 20h30</span><br /><span class="resume-place">en salle Dussane, au 45 rue ' + "d'Ulm</span><br />" + '<span class="resume-see">pour voir et revoir</span> <br /><span class="resume-title">'
res += self.nom + u'</span><br /><span class="resume-director"> de ' + self.realisateur
res += u"</span><br /></div></div><!-- Balise de commentaire à retirer lors de l'insertion de l'analyse" + u'<div class="entry-analyse">'
res += u"<h2>Proposition d'analyse</h2>Bientôt…</div>-->"
return res
def calendrier(self):
res = '<!-- Film #' + str(self.i) + ' --> \n \n <div class="entry-mainblock"> <div class="entry-separator">'
res += '<img class="alignnone size-full wp-image-1963" src="'+self.image+'" alt="" width="150" height="150"/></div>'
res += '<div class="entry-text-info"><br /><br /><b>' + self.date.strftime("%A %d %B %Y") +', 20h30 <br /><i>'
res += self.nom + '</i> de ' + self.realisateur +' (' +str(self.annee) + ')</b><br /><br />'
res += str(self.duree) + ' minutes . '
if self.couleur:
res += "Couleurs"
else:
res += "Noir & Blanc"
res += " . " + self.pays + ". <br /> Avec : " + strListe(self.acteurs) + ".<br/>"
res += self.langST + ' . ' + self.formatCopie + ".<br/><br/>"
res += '<span class="entry-synopsis">' + self.synopsis + '</span><br/><br/></div>'
res += '<div class="entry-break"></div>'
res += '</div><br/><a style="float: right;" href="#haut">Retour en haut de page</a>'
res += "<br/>\n \n<!-- END OF POST --><br/>"
return res
def allCalendars(self):
conn = sqlite3.connect("baseFilms.db", detect_types=sqlite3.PARSE_DECLTYPES)
conn.row_factory = sqlite3.Row
c = conn.cursor()
res = ""
try:
conn = sqlite3.connect("baseFilms.db")
#conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('SELECT idN FROM films WHERE date>=? ', (self.date,))
#c.executemany('INSERT INTO acteurs VALUES (NULL, :iFilm, :acteur)', acteursToSq)
r = c.fetchall()
listFilms = [filmSQ(a[0]) for a in r]
conn.commit()
for film in listFilms:
res += film.calendrier() + "\n\n"
except Exception as e:
conn.rollback()
raise e
finally:
conn.close()
return res
def bocal(self):
res = f"\\centerline{{\\date{{{self.date.strftime('%A %d %B %Y')}, 20h30}} \n"
res += "\\centerline{Salle Dussane} \n"
res += f"\\centerline{{\\emph{{\\Large {self.nom}}}}} \n"
res += f"\\centerline{{{self.realisateur} ({str(self.annee)}) }} \n"
res += "\\medskip \n"
if len(self.acteurs) == 1 :
res += f"\\centerline{{{self.acteurs[0]}}}\n"
if len(self.acteurs) >= 2 :
res += f"\\centerline{{{self.acteurs[0]}, {self.acteurs[1]}}}\n"
if len(self.acteurs) > 2 :
res += f"\\centerline{{{self.acteurs[2]}}}\n"
res += "\\medskip \n"
res += f"\\centerline{{" + self.langST + ' . ' + self.formatCopie + "}}\n"
res += "\\medskip \n"
res += f"\\centerline{{\\textit{{{str(self.duree)} minutes}}}}\n \n"
res += "\\medskip\n"
res += f"\\medskip \n \\centerline{{~{config.PRICE_ONE_EXTE}€~/~{config.PRICE_ONE_COF}~€ COF}} \n \\medskip \n \n "
res += "\\centerline{\\includegraphics[width=5cm]{cine}}\n \n"
res += "\\medskip\n"
res += self.synopsis
return res
def mail(self):
res = '<html> \n \t <head> \n \n <meta http-equiv="content-type" content="text/html; charset=utf-8"> \n \t \t'
res += '<style type="text/css">p { margin: 0; }</style> \n \t \t'
res += f'<title>[cine-info] {self.nom} de {self.realisateur} ({self.date.strftime("%A %d %B %Y")}, 20h30)</title> \n \t'
res += '</head> \n \t <body text="#000000" bgcolor="#FFFFFF"> \n \t \t <div style="font-family: arial,helvetica,sans-serif; font-size: 12pt; color: #000000">'
res += '\n \t \t \t<style>p { margin: 0; }</style> \n \t\t\t'
res += '<div style="font-family: arial,helvetica,sans-serif; font-size: 12pt; color: #000000"> \n <style>p { margin: 0; }</style> \n <div style="font-family: arial,helvetica,sans-serif; font-size: 12pt; color: #000000">'
res += '\n \t\t\t\t\t <style>p { margin: 0; }</style> \n\t\t\t\t <div style="font-family: arial,helvetica,sans-serif;font-size: 12pt; color: #000000"> \n'
res += '<p>Bonjour à toutes et à tous,</p> \n <p><i>Ce mail contient du HTML. Si vous ne pouvez pas le lire, allez sur notre site : <a class="moz-txt-link-freetext" href="http://www.cineclub.ens.fr" target="_blank">http://www.cineclub.ens.fr</a></i></p>'
res += '\n <p style="text-align:justify">Retrouvez-nous en salle Dussane <b>' + self.date.strftime("%A %d %B %Y") + f", 20h30</b> ! Comme d'habitude, l'entrée coûte <b>{config.PRICE_ONE_EXTE}€, {config.PRICE_ONE_COF}€</b> pour les membres du COF et vous avez la possibilité d'acheter des cartes de 10 places pour respectivement {config.PRICE_CARD_EXTE}€ et {config.PRICE_CARD_COF}€. L'entrée est gratuite pour les étudiants invités.<br>"
res += '</p> <div style="border:grey 1px solid; padding:5px; text-align:justify;">'
res += f'<center><b><i>{self.nom}</i></b> \n de <b>{self.realisateur}<br>\n </b></center>\n <br>'
res += f'<b>Durée </b>: {str(self.duree)} minutes.<br> \n'
if self.couleur:
res +'<b>Couleur</b>. <br> \n'
else:
res += '<b>Noir et blanc</b> <br> \n'
res += f'<b>Pays :</b> {self.pays}<br> \n'
res += f'<b> {self.formatCopie} . {self.langST}</b> <br> \n'
res += f'<b>Année :</b> {str(self.annee)}<br> \n'
res += f'<b>Avec :</b> {strListe(self.acteurs)}...<br> \n'
res += f'<b>Rapide synopsis :</b> {self.synopsis}<br> <br>'
res += '<span class="entry-synopsis"> </span> <br> <center><a href="http://cineclub.ens.fr" title="Plus d\'informations (bande-annonce, synopsis, etc.) sur notre blog !" target="_blank">Plus d\'informations (bande-annonce, etc.) sur notre blog !</a></center>'
res += '</div> <p style="text-align:justify">Vous ne pouvez pas venir à cette séance mais vous aimeriez aller au ciné-club une prochaine fois ?<br>'
res += '<a href="http://cineclub.ens.fr/calendrier" title="Découvrez le calendrier de nos prochaines séances." target="_blank">Découvrez le calendrier de nos prochaines séances.</a></p>'
res += '<p>À très bientôt en salle Dussane !<br> L\'équipe du ciné-club<br> <a href="http://cineclub.ens.fr" title="http://cineclub.ens.fr" target="_blank">http://cineclub.ens.fr</a></p>'
res += '<p>Toutes les séances du ciné-club se déroulent en salle Dussane, au 45 rue d\'Ulm, Paris. <br> Métro : Luxembourg, Place Monge. Bus: Feuillantine.</p>'
res += '<p style="text-align:center"><small>Vous ne souhaitez plus recevoir notre newsletter ? <a href="mailto:sympa@lists.ens.psl.eu?subject=UNSUBSCRIBE%20cineclub-informations&body=Envoyez%20ce%20mail%20pour%20terminer%20de%20vous%20d%C3%A9sinscrire" target="_blank"> Désinscrivez-vous</a></small></p>'
res += '</div> </div> </body> </html>'
return res
def facebook(self):
res = self.nom + " - " + self.realisateur
res += " \n \n"
res += self.synopsis
res += " \n \n"
res += f"Durée : {str(self.duree)} minutes \n"
if self.couleur:
res += 'Couleur \n'
else:
res += 'Noir et blanc\n'
res += f"Pays : {self.pays}\n"
res += f"{self.formatCopie} . {self.langST}\n"
res += f"Année : {str(self.annee)}\n"
res += f'Avec : {strListe(self.acteurs)}...\n'
res += "Plus d'informations sur notre site Internet http://www.cineclub.ens.fr/category/seances/ \n"
res += f"\nComme dhabitude, lentrée coûte {config.PRICE_ONE_EXTE}€, {config.PRICE_ONE_COF}€ pour les membres du COF (association d'élèves de l'ENS). Lentrée est gratuite pour les membres du Programme Étudiant⋅e⋅s Invité⋅e⋅s."
res += " \nL'accès est ouvert à tous ; pas besoin d'être à l'ENS !"
return res
def maxId(): def maxId():
try: try:
conn = sqlite3.connect(db_path) conn = sqlite3.connect(db_path)

63
scripts/genCom.py Normal file
View file

@ -0,0 +1,63 @@
from jinja2 import Environment, FileSystemLoader
from config import prices
def str_list(liste):
return f'{", ".join(liste)}...'
def str_couleur(est_en_couleur):
return 'Couleur' if est_en_couleur else 'Noir et blanc'
latex_jinja_env_params = {
'block_start_string': '\\BLOCK{',
'block_end_string': '}',
'variable_start_string': '\\VAR{',
'variable_end_string': '}',
'comment_start_string': '\\#{',
'comment_end_string': '}',
'line_statement_prefix': '%%',
'line_comment_prefix': '%#',
'trim_blocks': True,
'autoescape': False
}
filtres_jinja = {
'strListe': str_list,
'couleurStr': str_couleur
}
class GenerateurComm:
def __init__(self):
self.env_jinja = Environment(loader=FileSystemLoader('../templates'))
self.env_jinja.filters.update(filtres_jinja)
self.latex_env_jinja = Environment(loader=FileSystemLoader('../templates'), **latex_jinja_env_params)
self.latex_env_jinja.filters.update(filtres_jinja)
def build_com(self, film, nom_template, latex=False):
env = self.latex_env_jinja if latex else self.env_jinja
template = env.get_template(nom_template)
out = template.render({'prices': prices, 'film': film})
return out
def bocal(self, film):
return self.build_com(film, 'bocal.tex', latex=True)
def blog(self, film):
return self.build_com(film, 'blog.html.jinja2')
def calendrier(self, film):
return self.build_com(film, 'calendrier.html.jinja2')
def facebook(self, film):
return self.build_com(film, 'facebook.txt.jinja2')
def mail(self, film):
return self.build_com(film, 'mail.html.jinja2')
def allCalendars(self, film):
pass

View file

@ -0,0 +1,43 @@
<div class="entry-trailer">
<iframe src="{{ film.youtube }}" width="560" height="315"
frameborder="0" allowfullscreen="allowfullscreen">
</iframe>
</div>
<!-- Commentaire pertinent quelconque vis-à-vis du film -->
<div class="entry-mainblock">
<div class="entry-separator">
<img class="alignnone wp-image-1873 size-medium"
src="{{ film.image }}"
alt="affiche du film" width="300"
height="300"/>
</div>
<div class="entry-text-info">
<b>Durée</b> : {{ film.duree }} minutes<br/>
<b>{{ film.couleur|couleurStr }}</b><br/>
<b>Pays</b> : {{ film.pays|capitalize }}<br/>
<b>{{ film.formatCopie }} . {{ film.langST }}</b><br/>
<b>Année :</b>{{ film.annee }}<br/>
<b>Avec :</b>{{ film.acteurs|strListe }}<br/>
<div class="entry-text-info">
<b>Synopsis</b> : {{ film.synopsis }}
</div>
<br/>
</div>
Comme d'habitude, l'entrée coûte {{ prices.one_exte }} euros, {{ prices.one_cof }} pour les membres du COF et vous avez la possibilité d'acheter des cartes de 10 places pour respectivement {{ prices.card_exte }} et {{ prices.card_cof }} euros. L'entrée est gratuite pour les étudiant⋅e⋅s invité⋅e⋅s.
<div class="entry-resume">
Et pour résumer :
<div class="resume-bloc">
<span class="resume-date">Rendez-vous le {{ film.date.strftime("%A %d %B %Y") }}, 20h30</span><br/>
<span class="resume-place">en salle Dussane, au 45 rue d'Ulm</span><br/>
<span class="resume-see">pour voir et revoir</span><br/>
<span class="resume-title">{{ film.nom }}</span><br/>
<span class="resume-director">de {{ film.realisateur }}</span><br/>
</div>
</div>
<!-- Balise de commentaire à retirer lors de l'insertion de l'analyse
<div class="entry-analyse">
<h2>Proposition d'analyse</h2>
Bientôt…
</div>
-->
</div>

20
templates/bocal.tex Normal file
View file

@ -0,0 +1,20 @@
\centerline{\date{\VAR{film.date.strftime('%A %d %B %Y')}, 20h30}
\centerline{Salle Dussane}
\centerline{\emph{\Large \VAR{ film.nom } }}
\centerline{\VAR{ film.realisateur } (\VAR{ film.annee }) }
\medskip
\centerline{\VAR{ film.acteurs|strListe }}
\medskip
\centerline{\VAR{ film.formatCopie } . \VAR{ film.langST }}
\medskip
\centerline{\textit{\VAR{ film.duree } minutes}}
\medskip
\medskip
\centerline{~\VAR{ prices.one_exte }€~/~\VAR{ prices.one_cof }~€ COF}
\medskip
\centerline{\includegraphics[width=5cm]{cine}}
\medskip \medskip
\VAR{ film.synopsis }

View file

@ -0,0 +1,27 @@
<!-- Film #{{ film.i }} -->
<div class="entry-mainblock">
<div class="entry-separator">
<img class="alignnone size-full wp-image-1963"
src="{{ film.image }}"
alt="" width="150" height="150">
</div>
<div class="entry-text-info">
<b>
{{ film.date.strftime("%A %d %B %Y") }}, 20h30
<i>{{ film.nom }}</i> de {{ film.realisateur }} ({{ film.annee }})
</b>
{{ film.duree }} minutes . {{ film.couleur|couleurStr }} . {{ film.pays }} .
Avec : {{ film.acteurs|strListe }}.
{{ film.langST }} . {{ film.formatCopie }}.
<!-- Commentaire pertinent quelconque vis-à-vis du film -->
<span class="entry-synopsis">
{{ film.synopsis }}
</span>
</div>
<div class="entry-break"></div>
</div>
<a style="float: right;" href="#haut">Retour en haut de page</a>
<!-- END OF POST -->

View file

@ -0,0 +1,11 @@
{{ film.nom }} - {{ film.realisateur }}
{{ film.synopsis }}
Durée : {{ film.duree }} minutes
{{ film.couleur|couleurStr }}
Pays : {{ film.pays }}
{{ film.formatCopie }} . {{ film.langST }}
Année : {{ film.annee }}
Avec : {{ film.acteurs|strListe }}
Plus d'informations sur notre site Internet http://www.cineclub.ens.fr/category/seances/
Comme dhabitude, lentrée coûte {{ prices.one_exte }}€, {{ prices.one_cof }}€ pour les membres du COF (association d'élèves de l'ENS). Lentrée est gratuite pour les membres du Programme Étudiant⋅e⋅s Invité⋅e⋅s.
L'accès est ouvert à tous ; pas besoin d'être à l'ENS !

View file

@ -0,0 +1,34 @@
<html><body text="#000000" bgcolor="#FFFFFF"><div style="font-family: arial,helvetica,sans-serif;font-size: 12pt; color: #000000 ">
<small><i>Ce mail contient du HTML. Si vous ne pouvez pas le lire, allez sur notre site : <a
class="moz-txt-link-freetext" href="http://www.cineclub.ens.fr"
target="_blank">http://www.cineclub.ens.fr</a></i></small>
<p>Bonjour à toutes et à tous,</p>
<p style="text-align:justify">
Retrouvez-nous en salle Dussane <b>{{ film.date.strftime("%A %d %B %Y") }}, 20h30</b> ! Comme d'habitude, l'entrée coûte <b>{{ prices.one_exte }}€, {{ prices.one_cof }}€</b> pour les membres du COF et vous avez la possibilité d'acheter des cartes de 10 places pour respectivement {{ prices.card_exte }}€ et {{ prices.card_cof }}€. L'entrée est gratuite pour les étudiants invités.</p>
<div style="border:grey 1px solid; padding:5px; text-align:justify; margin-top:15px; margin-bottom:15px">
<center>
<b><i>{{ film.nom }}</i></b> de <b>{{ film.realisateur }}</b><br>
</center>
<!-- Commentaire pertinent quelconque vis-à-vis du film -->
<br><b>Durée </b>: {{ film.duree }} minutes.<br>
<b>{{ film.couleur|couleurStr }}</b> <br>
<b>Pays :</b> {{ film.pays }}<br>
<b>{{ film.formatCopie }} . {{ film.langST }}</b><br>
<b>Année :</b>{{ film.annee }}<br>
<b>Avec :</b>{{ film.acteurs|strListe }}<br>
<b>Rapide synopsis :</b>
<span class="entry-synopsis">{{ film.synopsis }}</span><br>
<!-- Commentaire pertinent quelconque vis-à-vis du film -->
</div>
<p style="text-align:justify">Vous ne pouvez pas venir à cette séance mais vous aimeriez aller au ciné-club une prochaine fois ?<br>
<a href="http://cineclub.ens.fr/calendrier" title="Découvrez le calendrier de nos prochaines séances." target="_blank">Découvrez le calendrier de nos prochaines séances.</a></p>
<p>À très bientôt en salle Dussane !<br>
L'équipe du ciné-club<br> <a href="http://cineclub.ens.fr" title="http://cineclub.ens.fr" target="_blank">http://cineclub.ens.fr</a></p>
<p>Toutes les séances du ciné-club se déroulent en salle Dussane, au 45 rue d'Ulm, Paris. <br>
Métro : Luxembourg, Place Monge. Bus: Feuillantine.</p>
<small style="text-align:center">Vous ne souhaitez plus recevoir notre newsletter ? <a
href="mailto:sympa@lists.ens.psl.eu?subject=UNSUBSCRIBE%20cineclub-informations&body=Envoyez%20ce%20mail%20pour%20terminer%20de%20vous%20d%C3%A9sinscrire"
target="_blank">Désinscrivez-vous</a></small>
</div></body></html>