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
This commit is contained in:
Alice 2019-03-09 03:43:35 +01:00
parent 5bbb9e58ad
commit 05d20ec695
4 changed files with 141 additions and 24 deletions

1
README Normal file
View file

@ -0,0 +1 @@
Ctrl-D : Ferme le programme

View file

@ -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

View file

@ -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 += '</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 = "\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 = '<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 += '<title>[cine-info] ' + self.nom + ' de ' + self.realisateur + ' (' + self.date.strftime("mardi %d %B %Y") + ', 20h30)</title> \n \t'
@ -229,7 +274,7 @@ class filmSQ():
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>'
return res
return res
def facebook(self):
res = self.nom + " - " + self.realisateur
@ -250,7 +295,7 @@ class filmSQ():
res += "\n Comme dhabitude, lentrée coûte 4€, 3€ 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 += " \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 ")

21
dumpFile Normal file
View file

@ -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');