Botão deletar para apenas alguns registros

18 views
Skip to first unread message

Leandro Paz

unread,
Jul 26, 2017, 10:36:25 AM7/26/17
to web2py-users-brazil
Bom dia pessoal, gostaria de saber se tem um jeito simples de fazer com que o botão de deletar só apareça mediante alguma condições. Por exemplo tenho uma tabela de evento e gostaria que os usuário com perfil de 'Administrador' ou 'Diretor' conseguissem excluir o registro, os demais não teria este privilégio, de forma semelhante para edição e inserção. Entretanto, deletable não aceita lambda row: resposta.

A ideia era aproveitar a mesma tela para vários perfis. 

    query=(dbevento.diretor==u)|(dbevento.coordenador==u)|(dbevento.credenciador==u)|(dbevento.tesoureiro==u)

    grid = SQLFORM.grid(query=query,
        fields=[dbevento.id,dbevento.titulo, dbevento.coordenador, 
        dbevento.data_inicio, dbevento.data_fim],
        user_signature=False,csv=False,
        maxtextlength=100,
        editable=False,
        create=True,
        deletable=True,
        showbuttontext=False,
        )

Carlos Costa

unread,
Jul 26, 2017, 11:09:07 AM7/26/17
to web2py-us...@googlegroups.com
Se é uma condição que não vaira por registro, é mais fácil.

Se o usuário logado pertence ao grupo Administrador o botão Delete estará presente, caso contrário, não.

 grid = SQLFORM.grid(query=query,
        fields=[dbevento.id,dbevento.titulo, dbevento.coordenador, 
        dbevento.data_inicio, dbevento.data_fim],
        user_signature=False,csv=False,
        maxtextlength=100,
        editable=False,
        create=True,
        deletable=auth.has_membership('Administrador'),
        showbuttontext=False,
        )

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--


Carlos J. Costa
Cientista da Computação  | BS Computer Science
Esp. Gestão em Telecom   |
PgC Telecom Mangement
<º))><

Leandro Paz

unread,
Jul 26, 2017, 12:25:14 PM7/26/17
to web2py-users-brazil
O problema Carlos é que a condição muda com o registro. A solução mais simples seria criar tela para cada nível de acesso, mas isso seria terrível para manutenção futura do código. Pensei em usar o onpudate, ondelete, ... mas a questão é como passar o id do registro para estas funções?

Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jul 26, 2017, 1:12:54 PM7/26/17
to web2py-users-brazil
Tentei assim

    extra_links=A(lambda row: DIV( 
        A( 
        SPAN(_class="icon magnifier icon-zoom-in glyphicon glyphicon-zoom-in"), #SPAN(" inserir"),
        #TAG.button('Inserir'),
        _class="button btn btn-default",_title="teste",_href=URL(r=request,c='default',f='cadastrar_evento/view/evento', args=[row.id]),
        ),

        A( 
        SPAN(_class="icon pen icon-pencil glyphicon glyphicon-pencil"), #SPAN(" inserir"),
        #TAG.button('Inserir'),
        _class="button btn btn-default",_title="teste",_href=URL(r=request,c='default',f='cadastrar_evento/edit/evento', args=[row.id]),
        ),

        A( 
        SPAN(_class="icon trash icon-trash glyphicon glyphicon-trash"), #SPAN(" inserir"),
        #TAG.button('Inserir'),
        _class="button btn btn-default",_title="teste",_href=URL(r=request,c='default',f='cadastrar_evento/delete/evento', args=[row.id]),
        ),

    _class="web2py_console  "
    )
    )
    

    query=dbevento

    grid = SQLFORM.grid(query=query,
        links=extra_links,
        buttons_placement = 'left',
        fields=[dbevento.id,dbevento.titulo, dbevento.coordenador, 
        dbevento.data_inicio, dbevento.data_fim],
        user_signature=False,csv=False,
        maxtextlength=100,
        #editable=False, deletable=False, details=False,
        showbuttontext=False,
        )


Mas quando tiro o comentário de "editable=False, deletable=False, details=False," os botões não funcionam. 
Acho que vou ter que implementar minhas próprias funções de visualização, edição e de apagar.

Como faço para aparecer uma mensagem de confirmação antes de apagar?

Carlos Costa

unread,
Jul 26, 2017, 1:33:41 PM7/26/17
to web2py-us...@googlegroups.com
Eu implementei isso tirando o deletable (deletable=False) e adicionando um botão extra para deletar, como você fez aí em cima.
Mas ao invés de usar _href usei callback para criar uma chamada ajax.

A('Excluir', callback=URL(f='excluir', args=[row.id]), target='')

def excluir():
     if pode excluir:
         exclui
         redirect(f='pagina do grid', client=True) # para recarregar o grid sem o registro excluído
     else:
         não pode excluir
         session.flash = 'você não tem permissão para excluir esse registro'

Também dá pra usar o delete do A() mas nesse caso acho que não funciona, pois caso não tenha permissão para excluir, mesmo assim ele iria excluir no browser (somente).

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com

Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Leandro Paz

unread,
Jul 26, 2017, 2:24:51 PM7/26/17
to web2py-users-brazil
Deu certo! Obrigado Carlos, só não funcionou com o callback e o Client=True.

Segue Código:
@auth.requires(auth.has_membership('Tesoureiro') or auth.has_membership('Diretor') or auth.has_membership('Administrador') )
def cadastrar_evento():

    u=auth.user_id
  

    extra_links = lambda row: B( 
       # A( 
       # SPAN(_class="icon magnifier icon-zoom-in glyphicon glyphicon-zoom-in"), #SPAN(" inserir"),
       # #TAG.button('Inserir'),
       # _class="botao_detalhes btn btn-default",_title="teste",_href=URL(r=request,c='default',f='cadastrar_evento/view/evento', args=[row.id]),
       # ),

        A( 
        SPAN(_class="icon pen icon-pencil glyphicon glyphicon-pencil"), #SPAN(" inserir"),
        #TAG.button('Inserir'),
        _class="botao_editar btn btn-default",_title="teste",_href=URL(r=request,c='default',f='cadastrar_evento/edit/evento', args=[row.id]),
        ),

        A( 
        SPAN(_class="icon trash icon-trash glyphicon glyphicon-trash"), #SPAN(" inserir"),
        #TAG.button('Inserir'),
        _class="botao_apagar btn btn-default",_title="teste",_href=URL(r=request,c='default',f='excluir_evento', args=[row.id]), target='',
        ),

    _class="web2py_console  "
    )


    query=dbevento

    grid = SQLFORM.grid(query=query,
        links=extra_links,
        buttons_placement = 'left',
        fields=[dbevento.id,dbevento.titulo, dbevento.coordenador, 
        dbevento.data_inicio, dbevento.data_fim],
        user_signature=False,csv=False,
        maxtextlength=100,
        editable=False, deletable=False,
        #details=False,
        showbuttontext=False,

        )
    

    return dict(grid = grid)


def excluir_evento():
    idevento=request.args(0) 
    if ver_permissao('ad',None,idevento)==True:
        db(db.evento.id==idevento).delete()
        redirect(URL(c='default',f='cadastrar_evento'))#,client=True)
        #redirect(f='cadastrar_evento', client=True) # para recarregar o grid sem o registro excluído
    else:
        #não pode excluir
        session.flash = 'você não tem permissão para excluir esse registro'

####################
#Na view
<script>
    $(document).ready(function(){
        $('.botao_apagar').click(function(e){
            if (!confirm('Você está certo que deseja apagar este objeto?'))
                e.preventDefault();
        });
    });
</script>

Carlos Costa

unread,
Jul 26, 2017, 4:40:04 PM7/26/17
to web2py-us...@googlegroups.com
Estranho.
Usando callback, ate a mensagem de confirmação ele faria.
O redirect via client não deve ter funcionado por que seu grid não está dentro de um componente.
Seria um redirect mais suave para o usuário.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-users-brazil@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages