1
0
mirror of https://github.com/gryf/pygtktalog.git synced 2025-12-17 11:30:19 +01:00

* Change DB engine to sqlite.

* Removed login stuff.
 * Improvements.
This commit is contained in:
2006-11-25 08:13:51 +00:00
parent e3684f44ea
commit 6c9116b143

View File

@@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding: iso8859-2 -*- # -*- coding: iso8859-2 -*-
""" """
MovieDB 0.7 MovieDB 0.8
features: features:
- szukanie po tytule filmu/serii - szukanie po tytule filmu/serii
@@ -23,12 +23,42 @@ todo:
import sys import sys
import os import os
WRKDIR = sys.argv[0:][0].split('moviedb.py')[0] WRKDIR = sys.argv[0:][0].split('moviedb2.py')[0]
if WRKDIR[0] != '/': if WRKDIR[0] != '/':
"""<EFBFBD>cie<EFBFBD>ka nie jest absolutna""" """<EFBFBD>cie<EFBFBD>ka nie jest absolutna"""
WRKDIR = os.getcwd()+"/"+WRKDIR WRKDIR = os.getcwd()+"/"+WRKDIR
try:
path = os.environ['HOME']
except:
path = "/tmp"
try:
# przeczytaj plik, o ile istnieje
f = open("%s/.moviedb" % path,"rw")
zpliku = f.read()
f.close()
p = {}
zpliku = zpliku.split("\n")
for i in zpliku:
i = i.split("\t")
p[i[0]] = i[1]
if len(p) == 5:
DB=p['db']
CD=p['cdrom']
EPORTXLS=p['exportxls']
else:
DB="moviedb.db"
CD="/mnt/cdrom"
EPORTXLS=False
except:
# w przeciwnym przypadku przjmij warto<74>ci domy<6D>lne
DB="moviedb.db"
CD="/mnt/cdrom"
EPORTXLS=False
try: try:
import pygtk import pygtk
#tell pyGTK, if possible, that we want GTKv2 #tell pyGTK, if possible, that we want GTKv2
@@ -49,55 +79,20 @@ except:
#Also, we know we are running GTK v2 #Also, we know we are running GTK v2
try: try:
from pyPgSQL import PgSQL from pysqlite2 import dbapi2 as sqlite
except: except:
print "You need to install pyPgSQL to run this app\nhttp://pypgsql.sourceforge.net/" print "MovieDB uses SQLite DB.\nYou'll need to get it and the python bindings as well.\nhttp://www.sqlite.org\nhttp://initd.org/tracker/pysqlite"
sys.exit(1) sys.exit(1)
if EPORTXLS==True:
try: try:
import pyExcelerator import pyExcelerator
except: except:
print "You need pyExcelerator\nhttp://sourceforge.net/projects/pyexcelerator" print "You'll need pyExcelerator, if you want to export DB to XLS format.\nhttp://sourceforge.net/projects/pyexcelerator"
sys.exit(1) sys.exit(1)
#}}} #}}}
try:
path = os.environ['HOME']
except:
path = "/tmp"
try:
# przeczytaj plik, o ile istnieje
f = open("%s/.moviedb" % path,"rw")
zpliku = f.read()
f.close()
p = {}
zpliku = zpliku.split("\n")
for i in zpliku:
i = i.split("\t")
p[i[0]] = i[1]
if len(p) == 5:
USER=p['user']
PASS=p['pass']
HOST=p['host']
DB=p['db']
CD=p['cdrom']
else:
USER="movie"
PASS="teamsleep"
HOST="localhost"
DB="moviedb"
CD="/mnt/cdrom"
except:
# w przeciwnym przypadku przjmij warto<74>ci domy<6D>lne
USER="movie"
PASS="teamsleep"
HOST="localhost"
DB="moviedb"
CD="/mnt/cdrom"
class SaveAsMDB: class SaveAsMDB:
"""pokazuje dialog zapisu(exportu) do pliku""" #{{{ """pokazuje dialog zapisu(exportu) do pliku""" #{{{
@@ -214,27 +209,6 @@ class StdMSG:
return self.result return self.result
#}}} #}}}
class LoginMDB:
"""pokazuje dialog logowania""" #{{{
def __init__(self):
self.gladefile = WRKDIR + "/glade/moviedb.glade"
def run(self):
self.logingld = gtk.glade.XML(self.gladefile, "loginMDB")
self.login = self.logingld.get_widget("loginMDB")
try:
pixBuf = gtk.gdk.pixbuf_new_from_file(WRKDIR + "/pixmaps/login.png")
self.logingld.get_widget("loginImg").set_from_pixbuf(pixBuf)
except:
pass
self.login.set_title("MovieDB - Login")
self.result = self.login.run()
l = self.logingld.get_widget("flogin").get_text()
p = self.logingld.get_widget("fpass").get_text()
self.login.destroy()
return self.result,[l,p]
#}}}
class AboutMDB: class AboutMDB:
"""pokazuje prosty dialog "o programie" """ #{{{ """pokazuje prosty dialog "o programie" """ #{{{
def __init__(self): def __init__(self):
@@ -257,14 +231,13 @@ class AboutMDB:
class DetailsMDB: class DetailsMDB:
"""Pokazuje okno z informacjami wyci<63>gni<6E>tymi z DB na podstawie id tytu<74>u""" #{{{ """Pokazuje okno z informacjami wyci<63>gni<6E>tymi z DB na podstawie id tytu<74>u""" #{{{
def __init__(self, tid=0, perms=0): def __init__(self, tid=0):
"""innicjalizacja obiektu""" """innicjalizacja obiektu"""
gladefile=WRKDIR + "/glade/moviedb.glade" gladefile=WRKDIR + "/glade/moviedb.glade"
self.wDetails = gtk.glade.XML(gladefile,"winDetails") self.wDetails = gtk.glade.XML(gladefile,"winDetails")
self.wDetails.get_widget("image1").set_from_file(WRKDIR + "/img/notavail.gif") self.wDetails.get_widget("image1").set_from_file(WRKDIR + "/img/notavail.gif")
# pomocnicze zmienne # pomocnicze zmienne
self.perms = perms
self.typ = '0' self.typ = '0'
self.imgIndeks = 1 self.imgIndeks = 1
@@ -296,12 +269,10 @@ class DetailsMDB:
self.sbid = 0 self.sbid = 0
# g<><67>wna robota: # g<><67>wna robota:
cx = PgSQL.connect(user=USER, password=PASS, host=HOST, database=DB, client_encoding="iso8859-2") cx = sqlite.connect(WRKDIR+"/db/"+DB,isolation_level=None)
cx.isolation_level = "IMMEDIATE"
c = cx.cursor() c = cx.cursor()
if self.perms != 2:
typ = 4
else:
typ = 0 typ = 0
# {{{ SQL: DetailsMDB#1 wyci<63>gni<6E>cie podstawowych informacji o tytule # {{{ SQL: DetailsMDB#1 wyci<63>gni<6E>cie podstawowych informacji o tytule
@@ -496,35 +467,27 @@ class DetailsMDB:
class MovieDB: class MovieDB:
"""pokazuj<EFBFBD>ca g<><67>wne okno aplikacji, pozwalaj<61>ca na przeszukiwanie w<>r<EFBFBD>d plik<69>w i tytu<74><75>w i wy<77>wietlaj<61>ca wynik wyszukiwania""" #{{{ """pokazuj<EFBFBD>ca g<><67>wne okno aplikacji, pozwalaj<61>ca na przeszukiwanie w<>r<EFBFBD>d plik<69>w i tytu<74><75>w i wy<77>wietlaj<61>ca wynik wyszukiwania""" #{{{
def __init__(self, perms=0): def __init__(self,dbfile=None):
self.perms = perms
self.gladefile=WRKDIR + "/glade/moviedb.glade" self.gladefile=WRKDIR + "/glade/moviedb.glade"
self.wTree=gtk.glade.XML(self.gladefile,"mainWin") self.wTree=gtk.glade.XML(self.gladefile,"mainWin")
# sygna<6E>y: # sygna<6E>y:
dic = {"on_mainWin_destroy" :(gtk.main_quit),\ dic = {"on_mainWin_destroy" :(gtk.main_quit),\
"on_quit1_activate" :(gtk.main_quit),\ "on_quit1_activate" :(gtk.main_quit),\
"on_szukaj_clicked" :(self.searchdb,self.perms),\ "on_szukaj_clicked" :(self.searchdb),\
"on_szukPat_activate" :(self.searchdb,self.perms),\ "on_szukPat_activate" :(self.searchdb),\
"on_lista_row_activated" :(self.szczegoly,self.perms),\ "on_lista_row_activated" :(self.szczegoly),\
"on_about1_activate" :self.oprogramie,\ "on_about1_activate" :self.oprogramie,\
"on_cut1_activate" :self.showPrefs,\ "on_cut1_activate" :self.showPrefs,\
"on_save_as1_activate" :self.exportToXLS} "on_save_as1_activate" :self.exportToXLS}
# inicjalizacja dodatkowych pozycji w menu, je<6A>li uprawnienia pozwalaj<61>
if self.perms == 2:
pass
#self.wTree.get_widget("mainMenu").
# pod<6F><64>czenie sygna<6E><61>w # pod<6F><64>czenie sygna<6E><61>w
self.wTree.signal_autoconnect(dic) self.wTree.signal_autoconnect(dic)
# inicjalizacja combo box<6F>w # inicjalizacja combo box<6F>w
self.treeview=self.wTree.get_widget("pattMatch").set_active(0) self.treeview=self.wTree.get_widget("pattMatch").set_active(0)
self.treeview=self.wTree.get_widget("typ").set_active(0) self.treeview=self.wTree.get_widget("typ").set_active(0)
if self.perms ==2:
self.treeview=self.wTree.get_widget("typ").append_text('XXX')
# inicjalizacja listy z tytu<74>ami # inicjalizacja listy z tytu<74>ami
import gobject import gobject
self.treeview=self.wTree.get_widget("lista") self.treeview=self.wTree.get_widget("lista")
@@ -563,9 +526,9 @@ class MovieDB:
return myiter return myiter
#####CALLBACKS #####CALLBACKS
def szczegoly(self,treeview,path,view_column,perms=0): def szczegoly(self,treeview,path,view_column):
"""poka<EFBFBD> szczeg<65><67>y w nowym oknie.""" # {{{ """poka<EFBFBD> szczeg<65><67>y w nowym oknie.""" # {{{
win = DetailsMDB(treeview.get_model().get_value(treeview.get_model().get_iter(path),0),perms) win = DetailsMDB(treeview.get_model().get_value(treeview.get_model().get_iter(path),0))
#}}} #}}}
def oprogramie(self, widget): def oprogramie(self, widget):
@@ -579,7 +542,7 @@ class MovieDB:
prefs = PrefsMDB() prefs = PrefsMDB()
#}}} #}}}
def searchdb(self,widget,perms=0): def searchdb(self,widget):
"""u<EFBFBD><EFBFBD><EFBFBD> zapytanie i wypluj wyniki do treeview""" #{{{ """u<EFBFBD><EFBFBD><EFBFBD> zapytanie i wypluj wyniki do treeview""" #{{{
if self.wTree.get_widget("pattMatch").get_active() == 3: if self.wTree.get_widget("pattMatch").get_active() == 3:
pattern=self.wTree.get_widget("szukPat").get_text() pattern=self.wTree.get_widget("szukPat").get_text()
@@ -590,12 +553,13 @@ class MovieDB:
else: else:
pattern="%" + self.wTree.get_widget("szukPat").get_text() + "%" pattern="%" + self.wTree.get_widget("szukPat").get_text() + "%"
cx = PgSQL.connect(user=USER, password=PASS, host=HOST, database=DB, client_encoding="iso8859-2") cx = sqlite.connect(WRKDIR+"/db/"+DB,isolation_level=None)
cx.isolation_level = "IMMEDIATE"
c = cx.cursor() c = cx.cursor()
if self.wTree.get_widget("czalt").get_active(): if self.wTree.get_widget("czalt").get_active():
klon = False klon = 'f'
else: else:
klon = True klon = 't'
# szukaj wg typu: # szukaj wg typu:
# NOTE: daj tu to, co potrzeba # NOTE: daj tu to, co potrzeba
@@ -603,11 +567,12 @@ class MovieDB:
if self.wTree.get_widget("radn").get_active(): if self.wTree.get_widget("radn").get_active():
# SQL: zapytanie zbieraj<61>ce tytu<74>y film<6C>w po kluczu nazw plik<69>w # SQL: zapytanie zbieraj<61>ce tytu<74>y film<6C>w po kluczu nazw plik<69>w
# TODO: zrobi<62> tablic<69> przechowuj<75>c<EFBFBD> nr p<>yt (najlepiej triggerze) # TODO: zrobi<62> tablic<69> przechowuj<75>c<EFBFBD> nr p<>yt (najlepiej triggerze)
"""
c.execute("SELECT distinct\ c.execute("SELECT distinct\
a.id_tytulu,\ a.id_tytulu,\
n.tytul,\ n.tytul,\
alt,\ alt,\
to_char (data_wydania,'YYYY'),\ data_wydania,\
case\ case\
when\ when\
ilosc_w_serii is null then 0\ ilosc_w_serii is null then 0\
@@ -621,26 +586,25 @@ class MovieDB:
ilosc_posiadanych\ ilosc_posiadanych\
end,\ end,\
nazwa_typu,\ nazwa_typu,\
plyty_asstring(a.id_tytulu::text)\ 1\
from\ from\
nazwa_tytulu as n\ nazwa_tytulu as n\
left join tytul a using(id_tytulu)\ left join tytul a using(id_tytulu)\
left join typ as t using(id_typu)\ left join typ as t using(id_typu)\
left join plik p using(id_tytulu)\ left join plik p using(id_tytulu)\
where\ where\
(alt is false or alt is %s)\ (alt = 'f' or alt = %s)\
and nazwa_pliku ilike %s\ and nazwa_pliku ilike %s\
and id_typu in (%s, %s, %s, %s)\ and id_typu in (%s, %s, %s, %s)\
and id_typu != %s\ and id_typu != %s\
order by\ order by\
id_tytulu, alt",(klon,pattern.encode("iso8859-2"),anime,xxx,filmy,kreskowki,typ)) id_tytulu, alt",(klon,pattern,anime,xxx,filmy,kreskowki,typ))
else: """
# SQL: zapytanie zbieraj<61>ce tytu<74>y film<6C>w c.execute("SELECT distinct\
c.execute("SELECT \
a.id_tytulu,\ a.id_tytulu,\
n.tytul,\ n.tytul,\
alt,\ alt,\
to_char (data_wydania,'YYYY'),\ data_wydania,\
case\ case\
when\ when\
ilosc_w_serii is null then 0\ ilosc_w_serii is null then 0\
@@ -654,18 +618,62 @@ class MovieDB:
ilosc_posiadanych\ ilosc_posiadanych\
end,\ end,\
nazwa_typu,\ nazwa_typu,\
plyty_asstring(a.id_tytulu::text)\ 1\
from\
nazwa_tytulu as n\
left join tytul a using(id_tytulu)\
left join typ as t using(id_typu)\
left join plik p using(id_tytulu)")
else:
# SQL: zapytanie zbieraj<61>ce tytu<74>y film<6C>w
"""
c.execute("SELECT \
a.id_tytulu,\
n.tytul,\
alt,\
data_wydania,\
case\
when\
ilosc_w_serii is null then 0\
else\
ilosc_w_serii\
end,\
case\
when\
ilosc_posiadanych is null then 0\
else\
ilosc_posiadanych\
end,\
nazwa_typu,\
1\
from\ from\
nazwa_tytulu as n\ nazwa_tytulu as n\
left join tytul a using(id_tytulu)\ left join tytul a using(id_tytulu)\
left join typ as t using(id_typu)\ left join typ as t using(id_typu)\
where\ where\
(alt is false or alt is %s)\ (alt = 'f' or alt = %s)\
and tytul ilike %s\ and tytul ilike %s\
and id_typu in (%s, %s, %s, %s)\ and id_typu in (%s, %s, %s, %s)\
and id_typu != %s\ and id_typu != %s\
order by\ order by\
id_tytulu, alt",(klon,pattern.encode("iso8859-2"),anime,xxx,filmy,kreskowki,typ)) id_tytulu, alt",(klon,pattern,anime,xxx,filmy,kreskowki,typ))
"""
c.execute("SELECT distinct\
a.id_tytulu,\
n.tytul,\
alt,\
data_wydania,\
ilosc_w_serii,\
ilosc_posiadanych,\
nazwa_typu,\
1\
from\
nazwa_tytulu as n\
left join tytul as a on a.id_tytulu=n.id_tytulu\
left join typ as t using (id_typu)\
left join plik as p on p.id_tytulu=n.id_tytulu\
where\
tytul like '%s'" % pattern)
res = c.fetchall() res = c.fetchall()
cx.close() cx.close()
@@ -685,13 +693,13 @@ class MovieDB:
ido=0 ido=0
for i in res: for i in res:
if i[2] == True and ido == i[0]: if i[2] == True and ido == i[0]:
self.insert_row(model,iterobj,i[0],i[1].decode("iso8859-2"),i[4],i[5],i[3],i[6],i[7]) self.insert_row(model,iterobj,i[0],i[1],i[4],i[5],i[3],i[6],i[7])
else: else:
iterobj = self.insert_row(model,None,i[0],i[1].decode("iso8859-2"),i[4],i[5],i[3],i[6],i[7]) iterobj = self.insert_row(model,None,i[0],i[1],i[4],i[5],i[3],i[6],i[7])
ido = i[0] ido = i[0]
else: else:
for i in res: for i in res:
self.insert_row(model,None,i[0],i[1].decode("iso8859-2"),i[4],i[5],i[3],i[6],i[7]) self.insert_row(model,None,i[0],i[1],i[4],i[5],i[3],i[6],i[7])
#model.set_sort_column_id(1,gtk.SORT_ASCENDING) #model.set_sort_column_id(1,gtk.SORT_ASCENDING)
@@ -729,9 +737,7 @@ class MovieDB:
filmy = 2 filmy = 2
kreskowki = 3 kreskowki = 3
xxx = 4 xxx = 4
if self.perms !=2:
typ=4
else:
typ=0 typ=0
return anime,filmy,kreskowki,xxx,typ return anime,filmy,kreskowki,xxx,typ
@@ -766,7 +772,7 @@ class MovieDB:
anime,filmy,kreskowki,xxx,typ = self.getType() anime,filmy,kreskowki,xxx,typ = self.getType()
cx = PgSQL.connect(user=USER, password=PASS, host=HOST, database=DB, client_encoding="iso8859-2") cx = sqlite.connect(user=USER, password=PASS, host=HOST, database=DB, client_encoding="iso8859-2")
c = cx.cursor() c = cx.cursor()
sql = "select\ sql = "select\
p.id_pliku,\ p.id_pliku,\
@@ -871,55 +877,13 @@ class MovieDB:
#}}} #}}}
# NOTE: koniec deklaracji klas. g<><67>wny program: # NOTE: koniec deklaracji klas. g<><67>wny program:
petla = 0
perms = 0
while petla == 0:
# {{{ pokazanie dialogu logowania w p<>tli
login = LoginMDB()
result,loginPair = login.run()
#sprawdzenie co te<74> u<>ytkownik wpisa<73> i dokonanie odpowiedniego zachowania try:
if (result == gtk.RESPONSE_OK): app=MovieDB(sys.argv[1])
# w przypadku naci<63>ni<6E>cia OK, pobranie z DB uprawnienia, je<6A>li login/has<61>o si<73> zgadza except:
cx = PgSQL.connect(user=USER, password=PASS, host=HOST, database=DB, client_encoding="iso8859-2") app=MovieDB()
c = cx.cursor()
c.execute("SELECT\
uprawnienia\
from\
users\
where\
login = %s\
and password = md5(%s)\
", loginPair[0],loginPair[1])
perms = c.fetchone()
cx.close()
if perms==None:
# z<>y login lub has<61>o
m = StdMSG(u"MovieDB - B<><42>d logowania",u"Nieprawid<EFBFBD>owy login lub has<61>o.\n",1)
m.run()
else:
# zapytanie zwr<77>ci<63>o nie None; wychodzimy z p<>tli while.
petla = 1
perms = perms[0]
elif (result == gtk.RESPONSE_CANCEL):
# user nacisn<73><6E> cancel, wi<77>c nie chce, lub ne mo<6D>e si<73> zalogowa<77>. sprawdzamy jak jest.
# pokazanie dialogu z pytaniem
m = StdMSG("MovieDB - Pytanie",u"Jeste<EFBFBD> pewien, <20>e <b>nie chcesz</b> si<73> logowa<77>?\n")
res = m.run()
if(res == gtk.RESPONSE_OK):
# je<6A>li jest pewny, wychodzimy z p<>tli while. je<6A>li nie, nic nie robimy,
# okno logowanie pojawi si<73> przy powt<77>rnym obrocie p<>tli.
petla = 1
else:
# user ubi<62> okno logowania, lub poci<63>gn<67><6E> z krzy<7A>a, lub do dialogu zosta<74> wys<79>any inny sygna<6E>.
petla = 2
#}}}
if petla != 2:
# w przypadku poci<63>gni<6E>cia z krzy<7A>a wychodzimy z aplikacji, w pozosta<74>ych przypadkach uruchomione zostaje g<><67>wne okno.
app=MovieDB(perms)
try: try:
gtk.main() gtk.main()
except KeyboardInterrupt: except KeyboardInterrupt: