2018-02-02 00:22:57 +01:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Feb 1 22 : 49 : 56 2018
@author : alice
2018-02-09 01:48:22 +01:00
TODO :
* simplifier l ' input autant que possible
* remplir
* débug
* documenter
2018-03-26 00:49:47 +02:00
* publication FB
2018-02-02 00:22:57 +01:00
"""
import sqlite3
2019-03-09 03:43:35 +01:00
import datetime
2018-02-02 21:04:51 +01:00
from datetime import date
2018-02-08 00:25:44 +01:00
import locale
locale . setlocale ( locale . LC_ALL , ' fr_FR.utf8 ' )
2018-02-02 00:22:57 +01:00
2019-03-09 03:43:35 +01:00
#def adapt_datetime(ts):
# return time.mktime(ts.timetuple())
#sqlite3.register_adapter(datetime.date, adapt_datetime)
2018-02-02 00:22:57 +01:00
class filmSQ ( ) :
def __init__ ( self , dic ) :
""" ceci est une aide """
2018-02-08 00:25:44 +01:00
if type ( dic ) == type ( " " ) :
self . idN = dic
2019-03-09 03:43:35 +01:00
conn = sqlite3 . connect ( " baseFilms.db " )
conn . row_factory = sqlite3 . Row
c = conn . cursor ( )
try :
c . execute ( """ SELECT i FROM films WHERE idN = ? """ , ( dic , ) )
r = c . fetchone ( )
self . i = r [ 0 ]
conn . commit ( )
except Exception as e :
conn . rollback ( )
raise e
finally :
conn . close ( )
2018-03-26 00:49:47 +02:00
elif type ( dic ) == type ( 1 ) :
2019-03-09 03:43:35 +01:00
self . i = dic
2018-03-26 00:49:47 +02:00
conn = sqlite3 . connect ( " baseFilms.db " )
conn . row_factory = sqlite3 . Row
c = conn . cursor ( )
try :
c . execute ( """ SELECT idN FROM films WHERE i = ? """ , ( dic , ) )
r = c . fetchone ( )
self . idN = r [ 0 ]
conn . commit ( )
except Exception as e :
conn . rollback ( )
raise e
finally :
conn . close ( )
2018-02-08 00:25:44 +01:00
else :
conn = sqlite3 . connect ( " baseFilms.db " )
conn . row_factory = sqlite3 . Row
c = conn . cursor ( )
2018-02-07 20:36:13 +01:00
2018-02-08 00:25:44 +01:00
try :
c . execute ( ' INSERT INTO films VALUES (:i, :idN, :date, :nom, :realisateur, :duree, :synopsis, :pays, :annee, :youtube, :couleur, :image, :formatCopie, :langST) ' , dic )
acteursToSq = [ { ' idFilm ' : dic [ ' i ' ] , ' acteur ' : a } for a in dic [ ' acteurs ' ] ]
c . executemany ( ' INSERT INTO acteurs VALUES (NULL, :idFilm, :acteur) ' , acteursToSq )
conn . commit ( )
except Exception as e :
conn . rollback ( )
raise e
finally :
conn . close ( )
2018-02-02 00:22:57 +01:00
#id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT [PRIMARY KEY]
2018-02-08 00:25:44 +01:00
self . __setattr__ ( ' idN ' , dic [ ' idN ' ] )
2018-02-02 21:04:51 +01:00
2018-02-02 00:22:57 +01:00
def __setattr__ ( self , nom_attr , val_attr ) :
2018-02-02 21:04:51 +01:00
if nom_attr == ' idN ' :
2018-02-08 00:25:44 +01:00
object . __setattr__ ( self , ' idN ' , val_attr )
2018-02-02 00:22:57 +01:00
else :
2018-02-08 00:25:44 +01:00
try :
conn = sqlite3 . connect ( " baseFilms.db " )
conn . row_factory = sqlite3 . Row
c = conn . cursor ( )
if nom_attr == ' acteurs ' :
2018-03-05 10:18:48 +01:00
c . execute ( """ DELETE FROM acteurs WHERE iFilm =? """ , ( self . i , ) )
acteursToSq = [ { ' iFilm ' : self . i , ' acteur ' : a } for a in val_attr ]
c . executemany ( ' INSERT INTO acteurs VALUES (NULL, :iFilm, :acteur) ' , acteursToSq )
2018-02-08 00:25:44 +01:00
else :
c . execute ( ' UPDATE films SET %s = ? WHERE idN = ? ' % nom_attr , ( val_attr , self . idN ) )
conn . commit ( )
except Exception as e :
conn . rollback ( )
raise e
finally :
conn . close ( )
2019-03-09 03:43:35 +01:00
2018-02-02 00:22:57 +01:00
def __getattr__ ( self , nom ) :
2018-02-08 00:25:44 +01:00
conn = sqlite3 . connect ( " baseFilms.db " , detect_types = sqlite3 . PARSE_DECLTYPES )
2018-02-09 01:48:22 +01:00
conn . row_factory = sqlite3 . Row
2018-02-08 00:25:44 +01:00
c = conn . cursor ( )
2018-02-07 13:05:47 +01:00
try :
2018-02-02 21:04:51 +01:00
if nom == ' acteurs ' :
2018-02-08 00:25:44 +01:00
c . execute ( """ SELECT name FROM acteurs WHERE iFilm=? """ , ( self . i , ) )
2018-02-02 21:04:51 +01:00
r = c . fetchall ( )
res = [ a [ 0 ] for a in r ]
else :
2018-02-08 00:25:44 +01:00
c . execute ( """ SELECT %s FROM films WHERE idN=:idN """ % nom , { " idN " : self . idN } )
2018-02-02 21:04:51 +01:00
r = c . fetchone ( )
res = r [ 0 ]
2018-02-08 00:25:44 +01:00
conn . commit ( )
2018-02-07 20:46:38 +01:00
2018-02-08 00:25:44 +01:00
except Exception as e :
conn . rollback ( )
raise e
2018-02-07 13:05:47 +01:00
finally :
2018-02-02 21:04:51 +01:00
conn . close ( )
2018-02-02 00:22:57 +01:00
return res
def __str__ ( self ) :
2018-02-07 13:05:47 +01:00
try :
conn = sqlite3 . connect ( " baseFilms.db " )
2018-02-08 00:25:44 +01:00
#conn.row_factory = sqlite3.Row
2018-02-07 13:05:47 +01:00
c = conn . cursor ( )
2018-02-08 00:25:44 +01:00
c . execute ( ' SELECT idN, nom, date FROM films WHERE idN = ? ' , ( self . idN ) )
2018-02-07 13:05:47 +01:00
r = c . fetchone ( )
s = r [ 0 ] + ' : ' + r [ 1 ] + ' le ' + r [ 2 ]
2018-02-08 00:25:44 +01:00
conn . commit ( )
except Exception as e :
conn . rollback ( )
raise e
2018-02-07 13:05:47 +01:00
finally :
conn . close ( )
2018-02-02 00:22:57 +01:00
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 " > \
2018-02-08 00:25:44 +01:00
< div class = " entry-separator " > < img class = " alignnone wp-image-1873 size-medium " src = " ' +self.image+ ' " alt = " " width = " 300 " height = " 300 " / > < / a > < / div > \
2018-02-02 00:22:57 +01:00
< div class = " entry-text-info " > < b > Durée < / b > : '
2018-04-25 21:43:00 +02:00
res + = str ( self . duree ) + " minutes "
2018-02-02 00:22:57 +01:00
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
2018-02-13 22:28:06 +01:00
res + = u ' <br /><b> ' + self . formatCopie + ' . ' + self . langST + ' </b> '
2018-02-02 00:22:57 +01:00
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 + = u " Comme d ' habitude, l ' entrée coûte 4 euros, 3 pour les membres du COF et vous avez la possibilité d ' acheter des cartes de 10 places pour respectivement 30 et 20 euros. L ' entrée est gratuite pour les étudiant.e.s invité.e.s. "
2018-02-08 00:25:44 +01:00
res + = u ' <div class= " entry-resume " > Et pour résumer : <div class= " resume-bloc " ><span class= " resume-date " >Rendez-vous le ' + self . date . strftime ( " mardi %d % B % Y " )
2018-02-02 00:22:57 +01:00
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 " > '
2018-03-07 13:03:38 +01:00
res + = ' <img class= " alignnone size-full wp-image-1963 " src= " ' + self . image + ' " alt= " " width= " 150 " height= " 150 " /></div> '
2018-02-08 00:25:44 +01:00
res + = ' <div class= " entry-text-info " ><br /><br /><b> ' + self . date . strftime ( " mardi %d % B % Y " ) + ' , 20h30 <br /><i> '
2018-02-02 00:22:57 +01:00
res + = self . nom + ' </i> de ' + self . realisateur + ' ( ' + str ( self . annee ) + ' )</b><br /><br /> '
2018-04-25 21:43:00 +02:00
res + = str ( self . duree ) + ' minutes . '
2018-02-02 00:22:57 +01:00
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> '
2018-04-29 22:03:49 +02:00
res + = ' <div class= " entry-break " ></div> '
2018-02-02 00:22:57 +01:00
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
2019-03-09 03:43:35 +01:00
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
2018-02-02 00:22:57 +01:00
def bocal ( self ) :
2018-02-08 00:25:44 +01:00
res = " \ centerline { \ date { " + self . date . strftime ( " mardi %d % B % Y " ) + " , 20h30}} \n "
2018-02-02 00:22:57 +01:00
res + = " \ centerline { Salle Dussane} \n "
res + = " \ centerline { \ emph { \ Large " + self . nom + " }} \n "
res + = " \ centerline { " + self . realisateur + " ( " + str ( self . annee ) + " ) } \n "
res + = " \ medskip \n "
if len ( self . acteurs ) == 1 :
res + = " \ centerline { " + self . acteurs [ 0 ] + " } \n "
if len ( self . acteurs ) > = 2 :
res + = " \ centerline { " + self . acteurs [ 0 ] + ' , ' + self . acteurs [ 1 ] + " } \n "
if len ( self . acteurs ) > 2 :
2018-02-13 22:28:06 +01:00
res + = " \ centerline { " + self . acteurs [ 2 ] + " } \n "
2018-02-02 00:22:57 +01:00
res + = " \ medskip \n "
2018-02-13 22:28:06 +01:00
res + = " \ centerline { " + self . langST + ' . ' + self . formatCopie + " } \n "
res + = " \ medskip \n "
2018-04-25 21:43:00 +02:00
res + = " \ centerline { \\ textit { " + str ( self . duree ) + " minutes}} \n \n "
2018-02-02 00:22:57 +01:00
res + = " \ medskip \n "
res + = " \ medskip \n \ centerline { 4~€~/~3~€ COF} \n \ medskip \n \n "
res + = " \ centerline { \ includegraphics[width=5cm] {cine} } \n \n "
res + = " \ medskip \n "
res + = self . synopsis
return res
2019-03-09 03:43:35 +01:00
2019-04-01 19:37:55 +02:00
def mail ( self ) :
2018-02-02 00:22:57 +01:00
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 '
2018-02-08 00:25:44 +01:00
res + = ' <title>[cine-info] ' + self . nom + ' de ' + self . realisateur + ' ( ' + self . date . strftime ( " mardi %d % B % Y " ) + ' , 20h30)</title> \n \t '
2018-02-02 00:22:57 +01:00
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> '
2018-02-08 00:25:44 +01:00
res + = ' \n <p style= " text-align:justify " >Retrouvez-nous en salle Dussane <b> ' + self . date . strftime ( " mardi %d % B % Y " ) + " , 20h30</b> ! Comme d ' habitude, l ' entrée coûte <b>4€, 3€</b> pour les membres du COF et vous avez la possibilité d ' acheter des cartes de 10 places pour respectivement 30€ et 20€. L ' entrée est gratuite pour les étudiants invités.<br> "
2018-02-02 00:22:57 +01:00
res + = ' </p> <div style= " border:grey 1px solid; padding:5px; text-align:justify; " > '
res + = ' <center><b><i> ' + self . nom + ' </i></b> \n de <b> ' + self . realisateur + ' <br> \n </b></center> \n <br> '
2018-04-25 21:43:00 +02:00
res + = ' <b>Durée </b>: ' + str ( self . duree ) + ' minutes.<br> \n '
2018-02-02 00:22:57 +01:00
if self . couleur :
res + ' <b>Couleur</b>. <br> \n '
else :
res + = ' <b>Noir et blanc</b> <br> \n '
res + = ' <b>Pays :</b> ' + self . pays + ' <br> \n '
2018-04-25 21:43:00 +02:00
res + = ' <b> ' + self . formatCopie + ' . ' + self . langST + ' </b> <br> \n '
2018-02-02 00:22:57 +01:00
res + = ' <b>Année :</b> ' + str ( self . annee ) + ' <br> \n '
res + = ' <b>Avec :</b> ' + strListe ( self . acteurs ) + ' ...<br> \n '
res + = ' <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= " http://www.cineclub.ens.fr/newsletter-desinscription/ " target= " _blank " > Désinscrivez-vous</a></small></p> '
res + = ' </div> </div> </body> </html> '
2019-03-09 03:43:35 +01:00
return res
2018-04-25 21:43:00 +02:00
def facebook ( self ) :
res = self . nom + " - " + self . realisateur
res + = " \n \n "
res + = self . synopsis
res + = " \n \n "
res + = " Durée : " + str ( self . duree ) + " minutes \n "
if self . couleur :
res + = ' Couleur \n '
else :
res + = ' Noir et blanc \n '
res + = " Pays : " + self . pays + " \n "
res + = self . formatCopie + " . " + self . langST + " \n "
2018-04-27 20:30:37 +02:00
res + = " Année : " + str ( self . annee ) + " \n "
2018-04-25 21:43:00 +02:00
res + = ' Avec : ' + strListe ( self . acteurs ) + ' ... \n '
res + = " Plus d ' informations sur notre site Internet http://www.cineclub.ens.fr/category/seances/ \n "
res + = " \n Comme d’ habitude, l’ entrée coûte 4€, 3€ pour les membres du COF (association d ' élèves de l ' ENS). L’ entrée est gratuite pour les membres du Programme Étudiant⋅e⋅s Invité⋅e⋅s. "
res + = " \n L ' accès est ouvert à tous ; pas besoin d ' être à l ' ENS ! "
return res
2019-03-09 03:43:35 +01:00
2018-02-09 01:48:22 +01:00
def maxId ( ) :
try :
conn = sqlite3 . connect ( " baseFilms.db " )
2018-02-08 00:25:44 +01:00
2018-02-09 01:48:22 +01:00
conn . row_factory = sqlite3 . Row
c = conn . cursor ( )
c . execute ( ' SELECT MAX(i) FROM films ' )
r = c . fetchone ( )
except Exception as e :
conn . rollback ( )
raise e
finally :
conn . close ( )
return r [ 0 ]
def printAll ( ) :
try :
conn = sqlite3 . connect ( " baseFilms.db " )
conn . row_factory = sqlite3 . Row
c = conn . cursor ( )
2019-03-09 03:43:35 +01:00
c . execute ( ' SELECT idN, nom, date, i FROM films ORDER BY i ASC ' )
2018-02-09 01:48:22 +01:00
r = c . fetchall ( )
for movie in r :
2019-03-09 03:43:35 +01:00
print ( movie [ 3 ] , ' - ' , movie [ 0 ] , ' : ' , movie [ 1 ] , ' le ' , movie [ 2 ] )
2018-02-09 01:48:22 +01:00
except Exception as e :
conn . rollback ( )
raise e
finally :
conn . close ( )
pass
2018-02-02 00:22:57 +01:00
2019-03-09 03:43:35 +01:00
def makeListActors ( ) :
l = [ ]
new = input ( " Entrez le nom des acteurs en appuyant sur Entrée entre chaque.gccPour terminer, appuyer sur Entrée avec une ligne vide. \n " )
if ( new == - 1 ) :
return - 1
while ( new != " " ) :
l + = [ new ]
new = input ( )
pass
return l
2018-03-26 00:49:47 +02:00
def newFilm ( ) :
""" Interface d ' ajout d ' un nouveau film """
dic = { }
i = filmSQ . maxId ( )
dic [ ' i ' ] = i + 1
dic [ ' idN ' ] = input ( " identifiant du film ? " )
d = input ( " date de la séance (format JJ/MM/AAAA ) " )
d = d . split ( " / " )
dic [ ' date ' ] = date ( int ( d [ 2 ] ) , int ( d [ 1 ] ) , int ( d [ 0 ] ) )
dic [ ' nom ' ] = input ( " titre ? " )
2019-03-09 03:43:35 +01:00
dic [ ' acteurs ' ] = filmSQ . makeListActors ( )
#eval(input("acteurs (format [acteur1, acteur2, ..]) ? "))
2018-03-26 00:49:47 +02:00
dic [ ' realisateur ' ] = input ( " realisateur ? " )
dic [ ' duree ' ] = eval ( input ( " durée du film (en minutes)? " ) )
dic [ ' synopsis ' ] = input ( " Donnez ici un synopsis rapide du film " )
dic [ ' pays ' ] = input ( " pays de diffusion du film ? " )
dic [ ' annee ' ] = input ( " année de sortie du film (format AAAA) ? " )
dic [ ' youtube ' ] = input ( " adresse youtube de la bande-annonce ? " )
dic [ ' image ' ] = input ( " url d ' une affiche du film ? " )
dic [ ' couleur ' ] = eval ( input ( " le film est-il en couleur (format True/False) ? " ) )
dic [ ' formatCopie ' ] = input ( " format de la copie ? " )
dic [ ' langST ' ] = input ( " langue et sous-titre : VF/VOSTFR ? " )
seance = filmSQ ( dic )
return seance
2018-02-02 00:22:57 +01:00
def strListe ( liste ) :
res = " "
for l in liste [ : - 1 ] :
res + = l + ' , '
if liste != [ ] :
res + = liste [ - 1 ]
return res