Hi all!
Well, i need to migrate this pygtk program to web interface, basicaly there is
a table person and that
handles basic data about a person and another three:
one for adresses, one for phone numbers and another
for web adresses and a relationship one to many from
person to each one of them(i think i could not explain
very well, so i attached the pygtk program, it needs nothing more tham python
and gtk to run).
Well, my doubt is: there is a easy way to create the
forms for this program? I'm not very happy writting javascript but i can handle
that, i'd only preffer to
do the most i can on python.
--
Rodrigo <[email protected]>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
#
#-*-coding:utf-8-*-
#
from gtk import *
from sqlite3.dbapi2 import connect
import time
class AgendaTelefonica(Frame):
def __init__(self,parent):
self.db=parent.db
self.top=parent
Frame.__init__(self)
fr1= Frame()
bbox = VBox(False,0);fr1.add(bbox)
self.lista=TreeView()
frb = Frame("Localizar cliente:")
frb.set_shadow_type(SHADOW_NONE)
self.pad = Entry()
bt1= ToolButton("gtk-find");bt1.connect("clicked",self.busca)
tbx = HBox(False,0)
tbx.pack_start(self.pad,True,True)
tbx.pack_end(bt1,False,False)
frb.add(tbx)
bbox.pack_start(frb,False,True)
scw = ScrolledWindow()
scw.set_policy(POLICY_AUTOMATIC,POLICY_AUTOMATIC)
scw.add(self.lista)
bbox.pack_start(scw,True,True)
tb = Toolbar()
bt1 = ToolButton("gtk-save")
bt2 = ToolButton("gtk-new")
bt3 = ToolButton("gtk-delete")
bt1.connect("clicked",self.salvar_cliente)
bt2.connect("clicked",lambda evt:self.novo_cliente())
bt3.connect("clicked",lambda evt:self.apagar_cliente())
tb.add(bt1)
tb.add(bt2)
tb.add(SeparatorToolItem())
tb.add(bt3)
bbox.pack_end(tb,False,True)
for c in [TreeViewColumn("Código",CellRendererText(),text=0),TreeViewColumn("Nome"+20*" ",CellRendererText(),text=1)]:self.lista.append_column(c)
self.lista.set_model(ListStore(str,str))
self.lista.connect("row-activated",self.abre_cliente)
#
fr2 = Frame()
self.codigo=Entry()
self.nome=Entry()
plc = Table(3,3,0)
plc.attach(self.put_in_frame(self.codigo,"Código:"),0,1,0,1,FILL,SHRINK)
plc.attach(self.put_in_frame(self.nome,"Nome:"),1,4,0,1,EXPAND|FILL,SHRINK)
dsk = Notebook()
dsk.append_page(self.fr_enderecos(),Label("Endereços:"))
dsk.append_page(self.fr_telefones(),Label("Telefones:"))
dsk.append_page(self.fr_internet(),Label("Internet:"))
plc.attach(dsk,0,4,1,2,EXPAND|FILL)
fr2.add(plc)
#
hb = HBox(False,0)
fr1.set_shadow_type(SHADOW_NONE)
fr2.set_shadow_type(SHADOW_NONE)
hb.pack_start(fr1,False,True)
hb.pack_start(fr2,True,True)
self.add(hb)
self.codigo.set_property("editable",False)
self.codigo.set_size_request(12,-1)
def fr_enderecos(self):
self.enderecos = TreeView()
self.enderecos.connect("row-activated",self.abre_endereco)
for c in [TreeViewColumn("Desc.:",CellRendererText(),text=0),
TreeViewColumn("Valor:",CellRendererText(),text=1)]:self.enderecos.append_column(c)
self.enderecos.set_headers_visible(False)
tb = Toolbar()
vb = VBox(False,0)
bts = [ ToolButton("gtk-new"),ToolButton("gtk-delete")]
bts[0].connect("clicked",self.novo_endereco)
bts[1].connect("clicked",self.apaga_endereco)
for bt in bts:tb.add(bt)
scw = ScrolledWindow()
scw.set_policy(POLICY_AUTOMATIC,POLICY_AUTOMATIC)
scw.add(self.enderecos)
vb.pack_start(scw,True,True)
vb.pack_end(tb,False,True)
fr = Frame()
fr.set_shadow_type(SHADOW_NONE)
fr.add(vb)
return(fr)
def fr_telefones(self):
self.telefones = TreeView()
self.telefones.connect("row-activated",self.abre_telefone)
for c in [TreeViewColumn("Desc.:",CellRendererText(),text=0),
TreeViewColumn("Valor:",CellRendererText(),text=1)]:self.telefones.append_column(c)
self.telefones.set_headers_visible(False)
tb = Toolbar()
vb = VBox(False,0)
bts = [ ToolButton("gtk-new"),ToolButton("gtk-delete")]
bts[0].connect("clicked",self.add_telefone)
bts[1].connect("clicked",self.apaga_telefone)
for bt in bts:tb.add(bt)
scw = ScrolledWindow()
scw.set_policy(POLICY_AUTOMATIC,POLICY_AUTOMATIC)
scw.add(self.telefones)
vb.pack_start(scw,True,True)
vb.pack_end(tb,False,True)
fr = Frame()
fr.set_shadow_type(SHADOW_NONE)
fr.add(vb)
fr.set_shadow_type(SHADOW_NONE)
return(fr)
def fr_internet(self):
self.email = TreeView()
self.email.connect("row-activated",self.abre_email)
for c in [TreeViewColumn("Desc.:",CellRendererText(),text=0),
TreeViewColumn("Valor:",CellRendererText(),text=1)]:self.email.append_column(c)
self.email.set_headers_visible(False)
tb = Toolbar()
vb = VBox(False,0)
bts = [ ToolButton("gtk-new"),ToolButton("gtk-delete")]
bts[0].connect("clicked",self.add_email)
bts[1].connect("clicked",self.apaga_email)
for bt in bts:tb.add(bt)
scw = ScrolledWindow()
scw.set_policy(POLICY_AUTOMATIC,POLICY_AUTOMATIC)
scw.add(self.email)
vb.pack_start(scw,True,True)
vb.pack_end(tb,False,True)
fr = Frame()
fr.add(vb)
fr.set_shadow_type(SHADOW_NONE)
return(fr)
def put_in_frame(self,wdg,label):
fr=Frame(label)
fr.set_shadow_type(SHADOW_NONE)
fr.add(wdg)
return(fr)
def busca(self,EVT):
md = ListStore(str,str)
pad=self.pad.get_text()
for ret in self.db.execute("SELECT codigo,nome FROM clientes WHERE nome like ?",(self.pad.get_text()+"%",)).fetchall():
md.append(ret)
self.lista.set_model(md)
def novo_cliente(self):
self.codigo.set_text("")
self.nome.set_text("")
self.enderecos.set_model(ListStore(str,str))
self.telefones.set_model(ListStore(str,str))
self.email.set_model(ListStore(str,str))
def apagar_cliente(self):
md,it = self.lista.get_selection().get_selected()
if it==None:return
codigo = md.get_value(it,0)
nome = md.get_value(it,1)
dlg=MessageDialog(self.top,DIALOG_MODAL,MESSAGE_QUESTION,BUTTONS_YES_NO,"Apagar os dados de:%s"%nome)
if dlg.run()==RESPONSE_YES:
self.db.execute("DELETE FROM clientes WHERE codigo=?",(codigo,))
self.db.execute("DELETE FROM enderecos WHERE codigo=?",(codigo,))
self.db.execute("DELETE FROM telefones WHERE codigo=?",(codigo,))
self.db.commit()
if self.codigo.get_text()==codigo:self.novo_cliente()
dlg.destroy()
def abre_cliente(self,wdg,idx,col):
md,it = self.lista.get_selection().get_selected()
if it==None:return
self.codigo.set_text(md.get_value(it,0))
self.nome.set_text(md.get_value(it,1))
self.atualizar_enderecos()
self.atualizar_telefones()
def atualizar_enderecos(self):
codigo=self.codigo.get_text()
md = ListStore(str,str)
for endereco in self.db.execute("SELECT tipo,rua,bairro,cidade,estado,cep FROM enderecos WHERE codigo=?",(codigo,)).fetchall():
txt = "Rua:%s\nBairro:%s Cidade:%s\nEstado:%s CEP:%s"%(endereco[1],endereco[2],endereco[3],endereco[4],endereco[5])
valor = [endereco[0],txt]
md.append(valor)
self.enderecos.set_model(md)
def apaga_endereco(self,evt):
md,it = self.enderecos.get_selection().get_selected()
if it==None:return
descricao = md.get_value(it,0)
dlg = MessageDialog(self.top,DIALOG_MODAL,MESSAGE_QUESTION,BUTTONS_YES_NO,"Apagar o endereço:%s para o cliente?"%descricao)
if dlg.run()==RESPONSE_YES:
self.db.execute("DELETE FROM enderecos WHERE tipo=? AND codigo=?",(descricao,self.codigo.get_text()))
self.db.commit()
self.atualizar_enderecos()
dlg.destroy()
def novo_endereco(self,evt):
if self.codigo.get_text()=='':return
dlg=DLGEndereco(self)
if dlg.run():
ct =self.db.execute("SELECT COUNT(tipo) FROM enderecos WHERE codigo=? AND tipo=?",(self.codigo.get_text(),dlg.tipo.get_text())).fetchone()[0]
if ct<=0:
self.db.execute("INSERT INTO ENDERECOS(codigo,tipo,rua,bairro,cidade,cep,estado) VALUES(?,?,?,?,?,?,?)",
(self.codigo.get_text(),dlg.tipo.get_text(),dlg.rua.get_text(),dlg.bairro.get_text(),dlg.cidade.get_text(),dlg.cep.get_text(),dlg.estado.get_text()))
self.db.commit()
self.atualizar_enderecos()
dlg.destroy()
def abre_endereco(self,wdg,idx,col):
md,it = self.enderecos.get_selection().get_selected()
if it==None:return
descricao = md.get_value(it,0)
rua,bairro,cidade,cep,estado = self.db.execute('SELECT rua,bairro,cidade,cep,estado FROM enderecos WHERE codigo=? AND tipo=?',(self.codigo.get_text(),descricao)).fetchone()
dlg = DLGEndereco(self)
dlg.tipo.set_text(descricao)
dlg.rua.set_text(rua)
dlg.bairro.set_text(bairro)
dlg.cidade.set_text(cidade)
dlg.cep.set_text(cep)
dlg.estado.set_text(estado)
dlg.tipo.set_property("editable",False)
if dlg.run():
self.db.execute('UPDATE enderecos SET rua=?,bairro=?,cidade=?,cep=?,estado=? WHERE tipo=?',(
dlg.rua.get_text(),dlg.bairro.get_text(),dlg.cidade.get_text(),dlg.cep.get_text(),dlg.estado.get_text(),descricao))
self.db.commit()
self.atualizar_enderecos()
dlg.destroy()
def salvar_cliente(self,evt):
if self.codigo.get_text()=='':
self.codigo.set_text(str(int(time.time()*100))[-12:])
self.db.execute("INSERT INTO clientes VALUES(?,?)",(self.codigo.get_text(),self.nome.get_text()))
else:
self.db.execute("UPDATE clientes SET nome=? WHERE codigo=?",(self.nome.get_text(),self.codigo.get_text()))
self.db.commit()
def abre_telefone(self,wdg,idx,col):
md,it = self.telefones.get_selection().get_selected()
if it==None:return
descricao = md.get_value(it,0)
valor =md.get_value(it,1)
dlg = DLGTelefone(self)
dlg.descricao.set_text(descricao)
dlg.descricao.set_property("editable",False)
dlg.valor.set_text(valor)
if dlg.run():
self.db.execute("UPDATE telefones SET valor=? WHERE tipo='telefone' AND codigo=? AND descricao=?",
(dlg.valor.get_text(),self.codigo.get_text(),descricao))
self.db.commit()
self.atualizar_telefones()
dlg.destroy()
def abre_email(self,wdg,idx,col):
md,it = self.email.get_selection().get_selected()
if it==None:return
descricao = md.get_value(it,0)
valor =md.get_value(it,1)
dlg = DLGTelefone(self,'Email')
dlg.descricao.set_text(descricao)
dlg.descricao.set_property("editable",False)
dlg.valor.set_text(valor)
if dlg.run():
self.db.execute("UPDATE telefones SET valor=? WHERE tipo='email' AND codigo=? AND descricao=?",
(dlg.valor.get_text(),self.codigo.get_text(),descricao))
self.db.commit()
self.atualizar_telefones()
dlg.destroy()
def apaga_telefone(self,evt):
md,it = self.telefones.get_selection().get_selected()
if it==None:return
descricao = md.get_value(it,0)
valor =md.get_value(it,1)
dlg = MessageDialog(self.top,DIALOG_MODAL,MESSAGE_QUESTION,BUTTONS_YES_NO,"Apagar o telefone:\n%s\n%s"%(descricao,valor))
if dlg.run()==RESPONSE_YES:
self.db.execute("DELETE FROM telefones WHERE codigo=? AND tipo='telefone' AND descricao=?",(self.codigo.get_text(),descricao))
self.db.commit()
self.atualizar_telefones()
dlg.destroy()
def apaga_email(self,evt):
md,it = self.email.get_selection().get_selected()
if it==None:return
descricao = md.get_value(it,0)
valor =md.get_value(it,1)
dlg = MessageDialog(self.top,DIALOG_MODAL,MESSAGE_QUESTION,BUTTONS_YES_NO,"Apagar o email:\n%s\n%s"%(descricao,valor))
if dlg.run()==RESPONSE_YES:
self.db.execute("DELETE FROM telefones WHERE codigo=? AND tipo='email' AND descricao=?",(self.codigo.get_text(),descricao))
self.db.commit()
self.atualizar_telefones()
dlg.destroy()
def atualizar_telefones(self):
mdt = ListStore(str,str)
mdi = ListStore(str,str)
for dado in self.db.execute("SELECT descricao,valor,tipo FROM telefones WHERE codigo=? ORDER BY tipo",(self.codigo.get_text(),)).fetchall():
if dado[2]=='telefone':
mdt.append([dado[0],dado[1]])
else:mdi.append([dado[0],dado[1]])
self.telefones.set_model(mdt)
self.email.set_model(mdi)
def add_telefone(self,evt):
dlg = DLGTelefone(self)
if self.codigo.get_text()=='':return
if dlg.run() and self.db.execute("SELECT count(descricao) FROM telefones WHERE tipo=? AND codigo=? AND descricao=?",("telefone",self.codigo.get_text(),dlg.descricao.get_text())).fetchone()[0]<=0:
self.db.execute("INSERT INTO telefones(codigo,tipo,descricao,valor) VALUES(?,'telefone',?,?)",(
self.codigo.get_text(),dlg.descricao.get_text(),dlg.valor.get_text()))
self.db.commit()
self.atualizar_telefones()
dlg.destroy()
def add_email(self,evt):
dlg = DLGTelefone(self,'Email')
if self.codigo.get_text()=='':return
if dlg.run() and self.db.execute("SELECT count(descricao) FROM telefones WHERE tipo=? AND codigo=? AND descricao=?",("email",self.codigo.get_text(),dlg.descricao.get_text())).fetchone()[0]<=0:
self.db.execute("INSERT INTO telefones(codigo,tipo,descricao,valor) VALUES(?,'email',?,?)",(
self.codigo.get_text(),dlg.descricao.get_text(),dlg.valor.get_text()))
self.db.commit()
self.atualizar_telefones()
dlg.destroy()
class DLGEndereco(Dialog):
def __init__(self,parent):
Dialog.__init__(self)
self.set_title("Endereço")
tbl = Table(2,4)
self.tipo=Entry()
self.rua=Entry()
self.bairro=Entry()
self.cidade=Entry()
self.cep=Entry()
self.estado=Entry()
tbl.attach(parent.put_in_frame(self.tipo,"Tipo:"),0,2,0,1)
tbl.attach(parent.put_in_frame(self.rua,"Rua:"),0,2,1,2)
tbl.attach(parent.put_in_frame(self.bairro,"Bairro:"),0,1,2,3)
tbl.attach(parent.put_in_frame(self.cidade,"Cidade:"),1,2,2,3)
tbl.attach(parent.put_in_frame(self.cep,"CEP:"),0,1,3,4)
tbl.attach(parent.put_in_frame(self.estado,"Estado:"),1,2,3,4)
self.vbox.add(tbl)
self.add_button("gtk-ok",1)
self.add_button("gtk-cancel",0)
self.show_all()
class DLGTelefone(Dialog):
def __init__(self,parent,tipo="Telefone:"):
Dialog.__init__(self)
self.tipo=tipo.lower()
self.descricao = Entry()
self.valor = Entry()
self.vbox.pack_start(parent.put_in_frame(self.descricao,"Tipo:"))
self.vbox.pack_start(parent.put_in_frame(self.valor,tipo))
self.add_button("gtk-ok",1)
self.add_button("gtk-cancel",0)
self.show_all()
class MainWindow(Window):
def __init__(self,db):
Window.__init__(self)
self.db=db
self.set_title("Agenda telefonica")
self.connect("destroy",main_quit)
fr = AgendaTelefonica(self)
self.add(fr)
if __name__=="__main__":
sql = {"clientes":"CREATE TABLE clientes(codigo CHAR(12),nome CHAR(150))",
"enderecos":"CREATE TABLE enderecos(codigo CHAR(12),tipo CHAR(40),rua CHAR(150),bairro CHAR(50),cidade CHAR(50),estado CHAR(2),cep CHAR(13))",
"telefones":"CREATE TABLE telefones(codigo CHAR(12),tipo CHAR(2),descricao CHAR(40),valor CHAR(100))"}
#path = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])),"db","agenda.db")
#dirname =os.path.dirname(os.path.abspath(sys.argv[0]))
db = connect('agenda.db')
db.text_factory = str
for nome in db.execute("SELECT name FROM SQLITE_MASTER WHERE type='table'").fetchall():
try:
sql.pop(nome[0])
except KeyError,e:
print("Apagando tabela %s removida"%nome)
db.execute("DROP TABLE %s"%nome)
for nome in sql.keys():
print("Criando tabela %s"%nome)
db.execute(sql[nome])
jn=MainWindow(db)
jn.show_all()
main()