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 <rcesar...@gmail.com>

-- 
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 web2py+unsubscr...@googlegroups.com.
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()

Reply via email to