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:
parent
5bbb9e58ad
commit
05d20ec695
4 changed files with 141 additions and 24 deletions
1
README
Normal file
1
README
Normal file
|
@ -0,0 +1 @@
|
|||
Ctrl-D : Ferme le programme
|
|
@ -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
|
||||
|
|
|
@ -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 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 ")
|
||||
|
|
21
dumpFile
Normal file
21
dumpFile
Normal 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');
|
Loading…
Reference in a new issue