Renomear - campo upload

36 views
Skip to first unread message

Leandro Paz

unread,
Jun 21, 2017, 2:24:26 PM6/21/17
to web2py-users-brazil
Boa tarde pessoal, em uma tabela "Trabalho" tenho o seguinte campo:

Field('primeiro_envio','upload',label='Trabalho',uploadseparate=True, requires=IS_LENGTH(tamanho_upload*1048576,error_message='O arquivo deve ser menor que '+str(tamanho_upload)+' mb!')),

Entretanto gostaria para minha organização que além no nome de arquivo padrão, no inicio apareça o id da minha tabela (ou outro campo), tipo:

117.trabalho.primeiro_envio.9f3c29d9f5b6afc2.756c667069653034343930315f746d202831292e706466.pdf

onde o 117 é o id. e o resto já é o nome padrão do arquivo

Alguém tem alguma sugestão?


Carlos Costa

unread,
Jun 22, 2017, 7:46:10 AM6/22/17
to web2py-us...@googlegroups.com
Dá uma olhada nesse tópico.
A diferença é que você vai usar um form. Vai ter o form.vars...

--
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
<º))><

Carlos Costa

unread,
Jun 22, 2017, 10:05:52 AM6/22/17
to web2py-us...@googlegroups.com

Em 22 de junho de 2017 08:45, Carlos Costa <yamand...@gmail.com> escreveu:
Dá uma olhada nesse tópico.
A diferença é que você vai usar um form. Vai ter o form.vars...
Em 21 de junho de 2017 15:24, Leandro Paz <leandro....@gmail.com> escreveu:
Boa tarde pessoal, em uma tabela "Trabalho" tenho o seguinte campo:

Field('primeiro_envio','upload',label='Trabalho',uploadseparate=True, requires=IS_LENGTH(tamanho_upload*1048576,error_message='O arquivo deve ser menor que '+str(tamanho_upload)+' mb!')),

Entretanto gostaria para minha organização que além no nome de arquivo padrão, no inicio apareça o id da minha tabela (ou outro campo), tipo:

117.trabalho.primeiro_envio.9f3c29d9f5b6afc2.756c667069653034343930315f746d202831292e706466.pdf

onde o 117 é o id. e o resto já é o nome padrão do arquivo

Alguém tem alguma sugestão?


--
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+unsubscribe...@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+unsubscribe...@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,
Aug 17, 2017, 3:54:21 PM8/17/17
to web2py-users-brazil
Segue solução que encontrei para assinar os arquivo com o id:

Detalhes: estou usando o uploadseparate=true, se alterar o inicio do arquivo o arquivo não será mais encontrado, por isso para simplificar resolvi alterar o final do arquivo, antes da extensão será adicionado por exemplo '__123' onde 123 é o id. O único inconveniente é que ao fazer o download o nome original não é mais restituído.

Pelo menos agora caso eu necessite apagar arquivos (sem apagar o registro na tabela) basta buscar por expressões do tipo *__123.* 

#No models incluir as seguintes funções
###############################################
def novo_nome_upload(arquivo, id):
    #arquivo='trabalho.primeiro_envio.a556fa9da8386716.74726162616c686f33342e646f6378.docx'    
    ult_ponto=arquivo.rfind('.')# posição do último ponto
    prim_ponto=arquivo.find('.')
    seg_ponto=arquivo.find('.',prim_ponto+1)
    table=arquivo[0:prim_ponto]
    field=arquivo[prim_ponto+1:seg_ponto]
    nome_codificado=arquivo[seg_ponto+1:ult_ponto]
    subpasta=nome_codificado[:2]
    extensao=arquivo[ult_ponto+1:]

    novo_nome=table+'.'+field+'.'+nome_codificado+'__'+str(id)+'.'+extensao
    
    resultado=[]
    resultado.append(novo_nome)
    resultado.append(table)
    resultado.append(field)
    resultado.append(subpasta)
    resultado.append(nome_codificado)
    resultado.append(str(id))
    resultado.append(extensao)
    return resultado

def assinar_upload_com_id_evento(nome_atual,id_evento):
    import os
    novo_nome=novo_nome_upload(nome_atual,id_evento)
    uploadfolder=os.path.join(request.folder, 'uploads',novo_nome[1]+'.'+novo_nome[2],novo_nome[3])
    
    os.rename(os.path.join(uploadfolder, nome_atual), os.path.join(uploadfolder, novo_nome[0]))

    return novo_nome[0]
###################################

#No controller, no formulário de inserção
###################################
    form = SQLFORM(dbtrabalho,fields=campos, user_signature=False, args=request.args[:1])
 
    if form.process(onvalidation=limitar_caracteres_primeiro_envio).accepted:
        # chama função para renomear o arquivo 
        form.vars.primeiro_envio=assinar_upload_com_id_evento(form.vars.primeiro_envio,linha_evento[0].id)

        session.flash = 'Novo trabalho submetido com sucesso!'
        redirect(URL(r=request,c='participante',f='meus_trabalhos', args=[k]))
    elif form.errors:
        response.flash = 'Erros no formulário'
    else:
        if not response.flash:
            response.flash = 'Preencha o formulário'
##################################




Leandro Paz

unread,
Aug 18, 2017, 6:07:16 PM8/18/17
to web2py-users-brazil
Achei um outro caminho melhor, usei o uploadfolder para criar pastas com o id dos registros.

Segue solução

Coloque no models a seguinte função
#####################################
def definir_uploadfolder(id_evento):
    import os
    caminho=os.path.join(request.folder,'uploads','eventos',str(id_evento))
 
    # todos os campos que possuem upload relacionados com o evento
    dbevento.arquivo_template.uploadfolder = caminho
    dbevento.regras_submissao.uploadfolder = caminho
    dbevento.logomarca_evento.uploadfolder = caminho
    dbtrabalho.poster_digital.uploadfolder = caminho
    dbtrabalho.oral_slide.uploadfolder = caminho
    dbtrabalho.primeiro_envio.uploadfolder = caminho
    dbtrabalho.trabalho_aceito.uploadfolder = caminho
    dbversoes_trabalho.arquivo.uploadfolder = caminho
    dbversoes_trabalho.arquivo_avaliador1.uploadfolder = caminho
    dbversoes_trabalho.arquivo_avaliador2.uploadfolder = caminho
    dbversoes_trabalho.arquivo_avaliador3.uploadfolder = caminho
    dbanexo_inscricao.arquivo.uploadfolder = caminho
    dbpagamento_inscricao.comprovante_anexado.uploadfolder = caminho

    #como chamar
    #definir_uploadfolder(linha_evento[0].id)

    #na view
    #<a href=
    #"{{=URL(r=request,c='default',f='download_custom',
    #args=[linha_evento[0].id,
    #    linha_versao_trabalho[0].arquivo]
    #)}}"> 
    #(Baixar esta versão do trabalho)
    #</a>

    #É necessário pernonalizar a função download do controller participante
    # o return só é necessário se usar SQLFORM.factory por exemplo em participante.py função: cadastrar_anexo_inscricao
    return caminho 

####################################

No controller criei a função:
@cache.action()
def download_custom():
    #Usado para identificar o id do evento, e sua pasta de download
    id_evento=request.args(0)
    definir_uploadfolder(id_evento)
    return response.download(request, db)

####################################

Na telas de edição e inserção: chamei definir_uploadfolder(id_evento)

###################################

definir_uploadfolder(linha_evento[0].id)
        if form.process().accepted:

            session.flash = 'Evento editado com sucesso!'
            redirect(URL(c='default',f='cadastrar_evento'))

        elif form.errors:
            response.flash = 'Erros no formulário'
        else:
            if not response.flash:
                response.flash = 'Preencha o formulário'
        
    else:
        session.flash = 'você não tem permissão para editar esse registro'
        redirect(URL(c='default',f='cadastrar_evento'))

#############################################

Para download direto na view:
<a href="{{=URL(r=request,c='default', f='download_custom', 
                   args=[linha_evento[0].id,
      linha_trabalho[0].oral_slide]
)}}"> (Baixar slide anexado) </a>

############################################

No caso de campos upload construidos com o SQLFORM.factory

    campos=[dbanexo_inscricao.anexo,
    Field('arquivo', 'upload', uploadseparate=True, 
        uploadfolder=definir_uploadfolder(linha_evento[0].id),
        label= dbanexo_inscricao.arquivo.label,requires=dbanexo_inscricao.arquivo.requires),
    ]

    form = SQLFORM.factory(*campos,
        table_name='anexo_inscricao', 
        user_signature=False,args=request.args[:1])
########################################################



Desta forma dentro da pasta:
...\uploads\eventos\1\trabalho.oral_slide\9b\trabalho.oral_slide.9b0ca46b645bdc75.7461672068746d6c20696672616d652e747874.txt

A terceira pasta é o id do evento.


Reply all
Reply to author
Forward
0 new messages