#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Feb 1 22:49:56 2018 @author: alice TODO : * simplifier l'input autant que possible * remplir * débug * documenter * publication FB """ import sqlite3 import config from datetime import date import locale locale.setlocale(locale.LC_ALL, 'fr_FR.utf8') #def adapt_datetime(ts): # return time.mktime(ts.timetuple()) #sqlite3.register_adapter(datetime.date, adapt_datetime) class filmSQ(): def __init__(self, dic): """ceci est une aide""" if type(dic) == type(""): self.idN = dic 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() elif type(dic) == type(1): self.i = dic 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() else: conn = sqlite3.connect("baseFilms.db") conn.row_factory = sqlite3.Row c = conn.cursor() 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() #id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT [PRIMARY KEY] self.__setattr__('idN', dic['idN']) def __setattr__(self, nom_attr, val_attr): if nom_attr == 'idN': object.__setattr__(self, 'idN', val_attr) else: try: conn = sqlite3.connect("baseFilms.db") conn.row_factory = sqlite3.Row c = conn.cursor() if nom_attr == 'acteurs': 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) 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() def __getattr__(self, nom): conn = sqlite3.connect("baseFilms.db", detect_types=sqlite3.PARSE_DECLTYPES) conn.row_factory = sqlite3.Row c = conn.cursor() try: if nom == 'acteurs': c.execute("""SELECT name FROM acteurs WHERE iFilm=?""", (self.i,)) r = c.fetchall() res = [a[0] for a in r] else: c.execute("""SELECT %s FROM films WHERE idN=:idN""" % nom, {"idN":self.idN}) r = c.fetchone() res = r[0] conn.commit() except Exception as e: conn.rollback() raise e finally: conn.close() return res def __str__(self): try: conn = sqlite3.connect("baseFilms.db") #conn.row_factory = sqlite3.Row c = conn.cursor() c.execute('SELECT idN, nom, date FROM films WHERE idN = ?', (self.idN)) r = c.fetchone() s = r[0] + ' : ' + r[1] + ' le ' + r[2] conn.commit() except Exception as e: conn.rollback() raise e finally: conn.close() return s def blog(self): res = u'

' res += u'
\
\
Durée :' res += str(self.duree) + " minutes" if self.couleur: res += u'
Couleur' else: res += u'
Noir et blanc' res += u'
Pays :' + self.pays res += u'
' + self.formatCopie + ' . ' + self.langST +'' res += u'
Année :' + str(self.annee) res += u'
Avec :' + strListe(self.acteurs) res += u'
' res += u"
" 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'
Et pour résumer :
Rendez-vous le ' + self.date.strftime("%A %d %B %Y") res += u', 20h30
en salle Dussane, au 45 rue ' + "d'Ulm
" + 'pour voir et revoir
' res += self.nom + u'
de ' + self.realisateur res += u"
" return res def calendrier(self): res = ' \n \n
' res += '
' res += '' res += '
' res += '

Retour en haut de page' res += "
\n \n
" 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 = ' \n \t \n \n \n \t \t' res += ' \n \t \t' res += f'[cine-info] {self.nom} de {self.realisateur} ({self.date.strftime("%A %d %B %Y")}, 20h30) \n \t' res += ' \n \t \n \t \t
' res += '\n \t \t \t \n \t\t\t' res += '
\n \n
' res += '\n \t\t\t\t\t \n\t\t\t\t
\n' res += '

Bonjour à toutes et à tous,

\n

Ce mail contient du HTML. Si vous ne pouvez pas le lire, allez sur notre site : http://www.cineclub.ens.fr

' res += '\n

Retrouvez-nous en salle Dussane ' + self.date.strftime("%A %d %B %Y") + f", 20h30 ! Comme d'habitude, l'entrée coûte {config.PRICE_ONE_EXTE}€, {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}€. L'entrée est gratuite pour les étudiants invités.
" res += '

' res += f'
{self.nom} \n de {self.realisateur}
\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 += f'Rapide synopsis : {self.synopsis}

' res += '
Plus d\'informations (bande-annonce, etc.) sur notre blog !
' res += '

Vous ne pouvez pas venir à cette séance mais vous aimeriez aller au ciné-club une prochaine fois ?
' res += 'Découvrez le calendrier de nos prochaines séances.

' res += '

À très bientôt en salle Dussane !
L\'équipe du ciné-club
http://cineclub.ens.fr

' res += '

Toutes les séances du ciné-club se déroulent en salle Dussane, au 45 rue d\'Ulm, Paris.
Métro : Luxembourg, Place Monge. Bus: Feuillantine.

' res += '

Vous ne souhaitez plus recevoir notre newsletter ? Désinscrivez-vous

' res += '
' 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 d’habitude, l’entrée coûte {config.PRICE_ONE_EXTE}€, {config.PRICE_ONE_COF}€ 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 += " \nL'accès est ouvert à tous ; pas besoin d'être à l'ENS !" return res def maxId(): try: conn = sqlite3.connect("baseFilms.db") 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() c.execute('SELECT idN, nom, date, i FROM films ORDER BY i ASC') r = c.fetchall() for movie in r: print(movie[3], ' - ', movie[0], ' : ', movie[1], ' le ', movie[2]) except Exception as e: conn.rollback() raise e finally: conn.close() pass def makeListActors(): l = [] new = input("Entrez le nom des acteurs en appuyant sur Entrée entre chaque. Pour terminer, appuyer sur Entrée avec une ligne vide.\n") if (new == -1): return -1 while(new != ""): l += [new] new = input() pass return l def input_date(): ok = False d = input("date de la séance (format JJ/MM/AAAA ) ") while not ok: try: d = d.split("/") res = date(int(d[2]), int(d[1]), int(d[0])) ok = True except IndexError: print("Veuillez entrer la date au format JJ/MM/AAA") return res def input_duree(): ok = False while not ok: try: res = eval(input("durée du film (en minutes) ")) ok = True except (NameError, SyntaxError): print("le format n'est pas correct. Ne rentrez que des chiffres svp") pass pass return res def input_color(): ok = False while not ok: d = input("le film est-il en couleur (oui/non) ? ") if d in ["True", "true", "oui", "Oui", "y", "o", "Y", "y", "O", "yes", "Yes"]: res = True ok = True elif d in ["False", "false", "non", "Non", "n", "N", "no", "No"]: res = False ok = True return res def newFilm(): """Interface d'ajout d'un nouveau film""" dic = {} i = filmSQ.maxId() ok = False dic['i'] = i+1 dic['idN'] = input("identifiant du film ? ") dic['date'] = filmSQ.input_date() dic['nom'] = input("titre ? ") dic['realisateur'] = input("realisateur ? ") dic['acteurs'] = filmSQ.makeListActors() 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['duree'] = filmSQ.input_duree(); dic['youtube'] = input("adresse youtube de la bande-annonce ? ") dic['image'] = input("url d'une affiche du film ? ") dic['couleur'] = filmSQ.input_color(); dic['formatCopie'] = input("format de la copie ? ") dic['langST'] = input("langue et sous-titre : VF/VOSTFR ? ") seance = filmSQ(dic) return seance def strListe(liste): res = "" for l in liste[:-1]: res += l +', ' if liste != []: res += liste[-1] return res