From 05d20ec6952fc271030c7c2ba31ec8faf33b34b0 Mon Sep 17 00:00:00 2001 From: cartoonnerie Date: Sat, 9 Mar 2019 03:43:35 +0100 Subject: [PATCH] better one-by-one adding actors new functionality : calendar from current film clear exit with Ctrl-D easier input mode thanks to readline stay into program after adding a film and selecting it BUGFIX : modify actors or idN init BDD OK TODO: add auto-completion --- README | 1 + ccInterface.py | 55 ++++++++++++++++++++++++----- cineclubBlogSQ.py | 88 +++++++++++++++++++++++++++++++++++++++-------- dumpFile | 21 +++++++++++ 4 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 README create mode 100644 dumpFile diff --git a/README b/README new file mode 100644 index 0000000..5a88132 --- /dev/null +++ b/README @@ -0,0 +1 @@ +Ctrl-D : Ferme le programme diff --git a/ccInterface.py b/ccInterface.py index 554eb7b..6a31c88 100644 --- a/ccInterface.py +++ b/ccInterface.py @@ -13,8 +13,11 @@ Created on Sun Mar 25 18:20:49 2018 from cineclubBlogSQ import filmSQ as f import sqlite3 +import os +import readline DEBUG = True +OPSYS = (os.uname()).sysname class FilmInterface(): @@ -23,31 +26,52 @@ class FilmInterface(): def menu(self): self.filmEnCours() - champ = eval(input("""Voulez-vous \n 1: consulter la liste des films de la base de données \n 2: ajouter un film à la base de données \n 3: afficher une communication\n 4: modifier une séance\n""")) + champ = eval(input("""Voulez-vous \n 1: consulter la liste des films de la base de données \n 2: ajouter un film à la base de données \n 3: afficher une communication\n 4: modifier une séance\n 5: créer une base de données vierges\n""")) if champ == 1: self.selectFilm() elif champ == 2: self.newFilm() + print("\nFilm enregistré.\n") + self.menu() elif champ == 3: self.communication() pass elif champ == 4: self.corrigerFilm() + elif champ == 5: + self.initBDD() + else: + print("\n Champ inconnu. Pour quitter, appuyer sur Ctrl-D\n") + self.menu() pass def filmEnCours(self): if self.filmCharge: print("\nLe film couramment chargé est", self.filmCharge.nom, "\n") + + def initBDD(self): + fichier = open("dumpFile","r") + instruction = fichier.read() + fichier.close() + + conn = sqlite3.connect('baseFilms.db') + c = conn.cursor() + c.executescript(instruction) + conn.commit() + conn.close() def selectFilm(self): f.printAll() rep = input("Entrez le code identifiant du film\n") - self.filmCharge = f(rep) - #TODO fix when wrong idN - self.menu() + try: + self.filmCharge = f(rep) + except TypeError: + print("L'identifiant n'est pas correct") + finally: + self.menu() def newFilm(self): - f.newFilm() + self.filmCharge = f.newFilm() def afficherFilm(self): if self.filmCharge: @@ -85,13 +109,22 @@ class FilmInterface(): #faire la modification if keys: + keys += ['acteurs'] print("Les champs possibles sont : ") for k in keys: print(k) nomAttr = input("Choisissez l'attribut que vous souhaitez modifier chez %s \n" % self.filmCharge.nom ) - newValue = input("La valeur actuelle du champ %s est %s.\nVeuillez entrer la nouvelle valeur pour ce champ (et -1 si vous ne souhaitez finalement pas modifier le champ)\n" % (nomAttr, self.filmCharge.__getattr__(nomAttr))) + if nomAttr == "acteurs": + print("La valeur actuelle du champ %s est %s.\nVeuillez entrer la nouvelle valeur pour ce champ (et -1 si vous ne souhaitez finalement pas modifier le champ)\n" % (nomAttr, self.filmCharge.__getattr__(nomAttr))) + newValue = f.makeListActors() + else: + newValue = input("La valeur actuelle du champ %s est %s.\nVeuillez entrer la nouvelle valeur pour ce champ (et -1 si vous ne souhaitez finalement pas modifier le champ)\n" % (nomAttr, self.filmCharge.__getattr__(nomAttr))) + if newValue != "-1": + iStill = self.filmCharge.__getattr__(nomAttr) self.filmCharge.__setattr__(nomAttr, newValue) + if nomAttr == "idN": + self.filmCharge = f(iStill) else: print("\nVous n'avez finalement pas modifié cet attribut.") else: @@ -108,7 +141,7 @@ class FilmInterface(): else: print("\nVous n'avez pas de film chargé à corriger. Veuillez en sélectionner un") self.menu() - + def communication(self): self.filmEnCours() 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") @@ -128,7 +161,7 @@ class FilmInterface(): print(self.filmCharge.mail()) self.finAction() elif rep == "6": - print("Fonction non implémentée pour le moment") + print(self.filmCharge.allCalendars()) self.finAction() elif rep == "7": self.selectFilm() @@ -144,4 +177,8 @@ class FilmInterface(): pass fi = FilmInterface() -fi.main() +try: + fi.main() +except EOFError: + print("\nCtrl-D : Sortie du programme") + pass diff --git a/cineclubBlogSQ.py b/cineclubBlogSQ.py index d612984..2b08741 100644 --- a/cineclubBlogSQ.py +++ b/cineclubBlogSQ.py @@ -14,17 +14,44 @@ TODO : """ import sqlite3 +import datetime 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() @@ -85,13 +112,7 @@ class filmSQ(): raise e finally: conn.close() - - - - - - - + def __getattr__(self, nom): conn = sqlite3.connect("baseFilms.db", detect_types=sqlite3.PARSE_DECLTYPES) conn.row_factory = sqlite3.Row @@ -176,7 +197,30 @@ class filmSQ(): 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 = "\centerline{\date{" + self.date.strftime("mardi %d %B %Y") + ", 20h30}} \n" res += "\centerline{Salle Dussane} \n" @@ -199,8 +243,9 @@ class filmSQ(): res += "\medskip\n" res += self.synopsis return res - - def mail(self): + + + def mail(self): res = ' \n \t \n \n \n \t \t' res += ' \n \t \t' res += '[cine-info] ' + self.nom + ' de ' + self.realisateur + ' (' + self.date.strftime("mardi %d %B %Y") + ', 20h30) \n \t' @@ -229,7 +274,7 @@ class filmSQ(): 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 + return res def facebook(self): res = self.nom + " - " + self.realisateur @@ -250,7 +295,7 @@ class filmSQ(): 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 - + def maxId(): try: conn = sqlite3.connect("baseFilms.db") @@ -273,10 +318,10 @@ class filmSQ(): conn.row_factory = sqlite3.Row c = conn.cursor() - c.execute('SELECT idN, nom, date FROM films ORDER BY i ASC') + c.execute('SELECT idN, nom, date, i FROM films ORDER BY i ASC') r = c.fetchall() for movie in r: - print(movie[0], ' : ', movie[1], ' le ', movie[2]) + print(movie[3], ' - ', movie[0], ' : ', movie[1], ' le ', movie[2]) except Exception as e: conn.rollback() raise e @@ -284,6 +329,18 @@ class filmSQ(): conn.close() pass + 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 + + def newFilm(): """Interface d'ajout d'un nouveau film""" dic = {} @@ -295,7 +352,8 @@ class filmSQ(): d = d.split("/") dic['date'] = date(int(d[2]), int(d[1]), int(d[0])) dic['nom'] = input("titre ? ") - dic['acteurs'] = eval(input("acteurs (format [acteur1, acteur2, ..]) ? ")) + dic['acteurs'] = filmSQ.makeListActors() + #eval(input("acteurs (format [acteur1, acteur2, ..]) ? ")) dic['realisateur'] = input("realisateur ? ") dic['duree'] = eval(input("durée du film (en minutes)? ")) dic['synopsis'] = input("Donnez ici un synopsis rapide du film ") diff --git a/dumpFile b/dumpFile new file mode 100644 index 0000000..57257dc --- /dev/null +++ b/dumpFile @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS "acteurs" ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, + `iFilm` SMALLINTUNSIGNED NOT NULL, + `name` TEXT +); +CREATE TABLE films ( + i INTEGER AUTO_INCREMENT PRIMARY KEY, + idN TEXT NOT NULL, + date DATE, + nom TEXT, + realisateur TEXT, + duree INTEGER, + synopsis TEXT, + pays TEXT, + annee INTEGER, + youtube TEXT, + couleur INTEGER, + image TEXT, + formatCopie TEXT, + langST TEXT); +INSERT INTO films VALUES(0,'modele','1-1-1','Titre','Réalisateur',0,'synopsis','Pays',0,'lienYT',1,'lienImg','35mm','VOSTFR');