예제 #1
0
def gera_botoes_linha_2():
    """Gera uma lista de fragmentos de HTML com os botões da linha 2 do menu
  geral.  Estes botões são mostrados apenas se o usuário está logado
  e é um administrador."""

    ht_input = html_input.gera(None, "text", "id", None, None, True, True,
                               "Id do objeto", None)
    ht_bt_submit = html_botao_submit.gera("Checar Objeto", "ver_objeto", None,
                                          '#ffdd22')
    form_content = \
      ht_input + \
      ht_bt_submit

    ht_input2 = html_input.gera(None, "text", "passageiro", None, None, True,
                                True, "Nome ou documento", None)
    ht_bt_submit2 = html_botao_submit.gera("Buscar passageiro",
                                           "buscar_compras", None, '#ffdd22')
    form_content2 = \
      ht_input2 + \
      ht_bt_submit2

    botoes = (
        html_botao_simples.gera("Acrescentar trecho",
                                "solicitar_pag_acrescentar_trecho", None,
                                '#ffdd22'),
        html_botao_simples.gera("Trafego", "comando_relatorio_de_trafego",
                                None, '#FF00FF'), html_form.gera(form_content),
        html_form.gera(form_content2)

        # html_botao_simples.gera("Alterar trecho", "solicitar_pag_alterar_trecho", None, '#ffdd22'),
        # html_form_passageiros.gera(),
        # html_form_buscar_objeto.gera(),
    )
    return botoes
def gera():
    linhas = [].copy()

    ht_rotulo = html_label.gera("E-mail", ": ")
    ht_campo = html_input.gera(None, "text", "email", None, None, True, True,
                               "nome@provedor", None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    ht_rotulo = html_label.gera("Senha", ": ")
    ht_campo = html_input.gera(None, "password", "senha", None, None, True,
                               True, None, None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    # Monta a tabela com os fragmentos HTML:
    ht_table = html_table.gera(linhas, None)

    ht_bt_login = html_botao_submit.gera("Entrar", 'fazer_login', None,
                                         '#55ee55')

    ht_campos = \
      ht_table + \
      ht_bt_login

    ht = html_form.gera(ht_campos)
    return ht
예제 #3
0
def gera(atrs, admin):

    # Dados para {html_form_table.gera}
    # {(rotulo,tipo,chave,dica,visivel,editavel,obrigatorio)}
    dados_linhas = ((
        "Usuário",
        "text",
        "id_usuario",
        "U-xxxxxxxx",
        True,
        True,
        True,
    ), )

    ht_table = html_form_table.gera(dados_linhas, atrs)
    ht_submit = html_botao_submit.gera("Buscar", "buscar_compras", None,
                                       '#55ee55')
    ht_cancel = html_botao_simples.gera("Cancelar", "principal", None,
                                        '#ff2200')

    ht_conteudo = \
          ht_table + \
          ht_submit + \
          ht_cancel

    return html_form.gera(ht_conteudo)
예제 #4
0
def gera():
  linhas = [].copy()

  ht_rotulo = html_label.gera("Origem", ": ")
  ht_campo = html_input.gera(None, "text", "origem", None, None, True, True, "VCP", None)
  linhas.append((ht_rotulo, ht_campo,))

  ht_rotulo = html_label.gera("Data mínima de partida", ": ")
  ht_campo = html_input.gera(None, "text", "dia_min", None, None, True, True, "aaaa-mm-dd", None)
  ht_campo2 = html_input.gera(None, "text", "hora_min", None, None, True, True, "HH:MM", None)
  ht_rotulo2 = html_label.gera("UTC", "")
  linhas.append((ht_rotulo, ht_campo, ht_campo2, ht_rotulo2))

  ht_rotulo = html_label.gera("Destino", ": ")
  ht_campo = html_input.gera(None, "text", "destino", None, None, True, True, "SDU", None)
  linhas.append((ht_rotulo, ht_campo,))

  ht_rotulo = html_label.gera("Data máxima de chegada", ": ")
  ht_campo = html_input.gera(None, "text", "dia_max", None, None, True, True, "aaaa-mm-dd", None) 
  ht_campo2 = html_input.gera(None, "text", "hora_max", None, None, True, True, "HH:MM", None)
  ht_rotulo2 = html_label.gera("UTC", "")
  linhas.append((ht_rotulo, ht_campo, ht_campo2, ht_rotulo2))

  # Monta a tabela com os fragmentos HTML:
  ht_table = html_table.gera(linhas, None)

  ht_bt_buscar = html_botao_submit.gera("Buscar", 'sugerir_roteiros', None, '#55ee55')

  ht_campos = \
    ht_table + \
    ht_bt_buscar

  ht = html_form.gera(ht_campos)
  return ht
예제 #5
0
def gera(pol):

    # Atributos da poltrona:
    id_pol = poltrona.obtem_identificador(pol)
    atrs_pol = poltrona.obtem_atributos(pol)

    preco_pol = atrs_pol['preco']
    numero_pol = atrs_pol['numero']

    # Atributos do trecho da poltrona
    id_trecho = atrs_pol['id_trecho']
    trc = trecho.busca_por_identificador(id_trecho)
    atrs_trc = trecho.obtem_atributos(trc)
    origem_trc = atrs_trc['origem']
    dt_partida_trc = atrs_trc['dia_partida'] + ' ' + atrs_trc['hora_partida']
    destino_trc = atrs_trc['destino']
    dt_chegada_trc = atrs_trc['dia_chegada'] + ' ' + atrs_trc['hora_chegada']

    # Campos da linha para {html_table.gera}:
    ht_trecho = html_span.gera(None, id_trecho)
    ht_origem = html_span.gera(None, origem_trc)
    ht_dt_partida = html_span.gera(None, dt_partida_trc)
    ht_destino = html_span.gera(None, destino_trc)
    ht_dt_chegada = html_span.gera(None, dt_chegada_trc)

    ht_numero = html_span.gera(None, numero_pol)
    ht_preco = html_span.gera(None, preco_pol)

    linha = [ \
      ht_trecho, ht_origem, ht_dt_partida, ht_destino, ht_dt_chegada,
      ht_numero, ht_preco
    ]

    ver = True  # Por enquanto.
    if ver:
        args_ver = {'id_poltrona': id_pol}
        ht_ver = html_botao_submit.gera("Ver", 'ver_poltrona', args_ver,
                                        '#60a3bc')
        linha.append(ht_ver)

    return linha
def gera(cpr):
    id_compra = compra.obtem_identificador(cpr)
    ht_titulo = html_label.gera("Selecione o método de pagamento", ": ")
    ht_opcoes = \
      html_botao_radio.gera("metodo", "paypau",   "PayPau")      + "<br/>" + \
      html_botao_radio.gera("metodo", "mrcard",   "MonsterCard") + "<br/>" + \
      html_botao_radio.gera("metodo", "boleto",   "Boleto")      + "<br/>" + \
      html_botao_radio.gera("metodo", "deposito", "Depósito")    + "<br/>" + \
      html_botao_radio.gera("metodo", "bois",     "Bois gordos") + "<br/>" + \
      html_botao_radio.gera("metodo", "balas",    "Balinhas")

    ht_submit = html_botao_submit.gera("Alterar", "alterar_pagamento",
                                       {'id_compra': id_compra}, '#55ee55')

    ht_campos = \
      ht_titulo + "<br/>" + \
      "" + "<br/>" + \
      ht_opcoes + "<br/>" + \
      "" + "<br/>" + \
      ht_submit
    return html_form.gera(ht_campos)
def gera(atrs, admin):

  # Dados para {html_form_table.gera}
  # {(rotulo,tipo,chave,dica,visivel,editavel,obrigatorio)}
  dados_linhas = (
    ( "Nome",       "text",   "nome",          "Fulano de tal",         True, True, False, ),
    ( "documento",  "text",   "documento",     "RG 4.444.444-4 SSP SP", True, True, False, ),
    ( "email",      "email",  "email",         "*****@*****.**",      True, True, False, ),
    ( "telefone",   "text",   "telefone",      "(XX) XXXX-XXXX",        True, True, False, ),
    ( "CPF",        "text",   "cpf",           "XXX.XXX.XXX-XX",        True, True, False, ),
    )

  ht_table = html_form_table.gera(dados_linhas, atrs)
  ht_submit = html_botao_submit.gera("Buscar", "buscar_usuarios", None, '#55ee55')
  ht_cancel = html_botao_simples.gera("Cancelar", "principal", None, '#ff2200')

  ht_conteudo = \
        ht_table + \
        ht_submit + \
        ht_cancel

  return html_form.gera(ht_conteudo)
예제 #8
0
def gera(ses, pol, atrs, erros):
    # Obtem dados da sessão e seu usuário:
    usr_ses = None if ses == None else sessao.obtem_usuario(ses)
    admin = sessao.eh_administrador(ses)
    carr = None if (ses == None) or admin else sessao.obtem_carrinho(ses)

    # Obtem dados correntes da poltrona:
    assert pol != None, "poltrona deve ser especificada"
    assert type(pol) is poltrona.Objeto_Poltrona
    id_pol = poltrona.obtem_identificador(pol)
    assert id_pol != None  # Paranóia.

    # Completa {atrs} com atributos correntes de {pol}:
    if atrs == None: atrs = {}.copy()  # Por via das dúvidas.
    atrs_pol = poltrona.obtem_atributos(pol)
    assert atrs_pol != None  # Paranóia
    for ch, val in atrs_pol.items():
        if not ch in atrs: atrs[ch] = val

    # Obtem compra {cpr} da poltrona, se houver:
    id_cpr = poltrona.obtem_atributo(pol, 'id_compra')
    cpr = None if id_cpr == None else compra.busca_por_identificador(id_cpr)
    cpr_aberta = False if cpr == None else compra.obtem_status(
        cpr) == 'comprando'
    usr_cpr = None if cpr == None else compra.obtem_cliente(cpr)

    # Obtem trecho {trc} da poltrona:
    id_trc = poltrona.obtem_atributo(pol, 'id_trecho')
    assert id_trc != None  # Paranóia.
    trc = trecho.busca_por_identificador(id_trc)
    assert trc != None  # Paranóia.
    encerrado = trecho.obtem_atributo(trc, 'encerrado')

    # Gera botões da página:
    ht_submit = ""
    # Tem botão "Alterar" para alterar dados?
    if admin:
        ht_submit += html_botao_submit.gera("Alterar", "alterar_poltrona",
                                            None, "#ff0000")

    # Tem botão "Excluir" para excluir a poltrona de {cpr}?
    if poltrona.pode_excluir(usr_ses, pol):
        ht_submit += html_botao_simples.gera("Excluir", "excluir_poltrona",
                                             {'id_poltrona': id_pol},
                                             "#ff4400")

    # Tem botão "Comprar" para comprar a poltrona?
    if poltrona.pode_comprar(usr_ses, pol, carr):
        ht_submit += html_botao_simples.gera("Comprar", "comprar_poltrona",
                                             {'id_poltrona': id_pol},
                                             "#ff4400")

    # Tem botão "Trocar" para trocar a poltrona?
    if poltrona.pode_trocar(usr_ses, pol):
        ht_submit += html_botao_simples.gera("Trocar", "trocar_poltrona",
                                             {'id_poltrona': id_pol},
                                             "#ff4400")

    # Botão de cancelar alteração:
    if admin:
        ht_submit += html_botao_simples.gera("Cancelar", "principal", None,
                                             "#00ff00")

    ht_conteudo = html_form_dados_de_poltrona.gera(id_pol, atrs, admin,
                                                   ht_submit)
    pag = html_pag_generica.gera(ses, ht_conteudo, erros)
    return pag
예제 #9
0
def gera(ses, trc, atrs, erros):
    # Obtem usuário da sessão, determina privilégios:
    usr_ses = None if ses == None else sessao.obtem_usuario(ses)
    admin = sessao.eh_administrador(ses)

    if atrs == None: atrs = {}.copy()  # Por via das dúvidas.

    # Botões de acão:
    ht_submit = ""
    if trc == None:
        # Acrescentando novo trecho:
        id_trc = None
        novo = True
        # O submit é "Acrescentar":
        ht_submit += html_botao_submit.gera("Acrescentar",
                                            "acrescentar_trecho", None,
                                            "#ff0000")
    else:
        # Visualização/alteração de trecho existente:
        assert type(trc) is trecho.Objeto_Trecho
        novo = False

        id_trc = trecho.obtem_identificador(trc)
        assert id_trc != None  # Paranóia.

        # Completa {atrs} com atributos de {trc}:
        atrs_trc = trecho.obtem_atributos(trc)
        assert atrs_trc != None  # Paranóia
        for ch, val in atrs_trc.items():
            if not ch in atrs: atrs[ch] = val

        # Botoes de ação:
        if admin:
            # O submit é "Alterar":
            ht_submit += html_botao_submit.gera("Alterar", "alterar_trecho",
                                                None, "#ff0000")
            # Tem tamém botão "Clonar":
            ht_submit += html_botao_simples.gera("Clonar", "clonar_trecho",
                                                 {'id_trecho': id_trc},
                                                 "#ff0000")

    # Constrói formulário com dados do trecho:
    ht_dados_trecho = html_form_dados_de_trecho.gera(id_trc, atrs, admin,
                                                     ht_submit)

    # Constrói a lista de poltronas do trecho:
    if novo:
        ht_dados_poltronas = ""
    else:
        # Formata a lista de poltronas:
        ids_pols_todas = poltrona.busca_por_trecho(trc)
        if admin:
            # Mostra todas as poltronas do trecho:
            ids_pols_ver = ids_pols_todas
        else:
            # Mostra só as poltronas disponíveis ou reservadas para compras do usuário {usr}:
            trc_encerrado = atrs_trc['encerrado']
            ids_pols_ver = [].copy()
            for id_pol in ids_pols_todas:
                assert id_pol != None  # Paranóia.
                pol = poltrona.busca_por_identificador(id_pol)
                assert pol != None  # Paranóia.
                id_cpr_pol = poltrona.obtem_atributo(pol, 'id_compra')
                cpr_pol = None if id_cpr_pol == None else compra.busca_por_identificador(
                    id_cpr_pol)
                usr_pol = None if cpr_pol == None else compra.obtem_cliente(
                    cpr_pol)
                # Verifica relevância de {pol} para o usuário:
                livre = (cpr_pol == None)
                if (livre and (not trc_encerrado)) or ((usr_ses != None) and
                                                       (usr_pol == usr_ses)):
                    ids_pols_ver.append(id_pol)

        if len(ids_pols_ver) == 0:
            # Não há poltronas a mostrar.
            estilo_aviso = "color:red;font-size:20;"
            ht_dados_poltronas = "<br/>" + html_span.gera(
                estilo_aviso, "Não há poltronas disponíveis")
        else:
            # Formata a lista de poltronas:
            fazer_checkin = admin  # Deve ter botão de "Checkin" em cada poltrona?
            # sys.stderr.write(" ids_pols = %s\n" % str(ids_pols))
            # sys.stderr.write(" id_trc = %s\n" % str(id_trc))

            carr = None if ses == None else sessao.obtem_carrinho(ses)
            ht_dados_poltronas = html_lista_de_poltronas_de_trecho.gera(
                ids_pols_ver, usr_ses, carr)

    # Botão "Voltar":
    ht_bt_cancel = html_botao_simples.gera("Voltar", 'principal', None,
                                           "#ff2200")

    # Monta a página:
    ht_conteudo = \
      ht_dados_trecho + "<br/>" +  \
      ht_dados_poltronas + "<br/>" +  \
      ht_bt_cancel

    pagina = html_pag_generica.gera(ses, ht_conteudo, erros)
    return pagina
def cria_form_completo():
    linhas = [].copy()

    # cria campo de texto com valor inicial
    ht_rotulo = html_label.gera("campo de texto", ": ")
    ht_campo = html_input.gera(None, "text", "texto1", "blabla", None, True,
                               True, None, None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    # cria campo de texto sem valor inicial, com dica
    ht_rotulo = html_label.gera("campo de texto", ": ")
    ht_campo = html_input.gera(None, "text", "texto2", None, None, True, False,
                               "Lorem ipusm", None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    # cria campo de senha
    ht_rotulo = html_label.gera("campo de senha", ": ")
    ht_campo = html_input.gera(None, "password", "senha", None, None, True,
                               True, None, None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    # cria campo numerico
    ht_rotulo = html_label.gera("campo numerico", ": ")
    ht_campo = html_input.gera(None, "number", "pernas", "17", "5", True,
                               False, None, None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    # cria campo escondido
    ht_rotulo = html_label.gera("campo escondido", ": ")
    ht_campo = html_input.gera(None, "hidden", "segredo", "boo", None, True,
                               False, None, None)
    linhas.append((
        ht_rotulo,
        ht_campo,
    ))

    # Monta a tabela com os fragmentos HTML:
    ht_table = html_table.gera(linhas, ["TIPO", "ELEMENTO"])

    # cria botao de interacao com o formulario
    ht_botao = html_botao_submit.gera("Botao", 'url test', None, '#55ee55')

    # counteudo do formulario
    ht_campos = \
      ht_table + \
      ht_botao

    # cria formulario de teste
    formulario = html_form.gera(ht_campos)
    return formulario
예제 #11
0
res = base_sql.conecta("DB", None, None)
assert res == None

sys.stderr.write("Criando alguns objetos...\n")
tabelas.cria_todos_os_testes(False)

# Testes das funções de {gera_html_form}:
usr1 = usuario.busca_por_identificador("U-00000001")
assert usr1 != None
id_usr1 = usuario.obtem_identificador(usr1)
atrs_usr1 = usuario.obtem_atributos(usr1)
assert not usuario.obtem_atributo(usr1, 'administrador')

usr3 = usuario.busca_por_identificador("U-00000003")
assert usr3 != None
id_usr3 = usuario.obtem_identificador(usr3)
atrs_usr3 = usuario.obtem_atributos(usr3)
assert usuario.obtem_atributo(usr3, 'administrador')

atrs_usr0 = atrs_usr1
del atrs_usr0['nome']
del atrs_usr0['telefone']

ht_bt_coisar = html_botao_submit.gera("Coisar", "coisar", {'coisa': "568"},
                                      "#ffaa00")

testa("admF_usrN", None, atrs_usr0, False, ht_bt_coisar)
testa("admF_usrC", id_usr1, atrs_usr1, False, ht_bt_coisar)
testa("admT_usrC", id_usr1, atrs_usr1, True, ht_bt_coisar)
testa("admT_usrA", id_usr3, atrs_usr3, True, ht_bt_coisar)
def gera(atrs, admin):

    # Dados para {html_form_table.gera}
    # {(rotulo,tipo,chave,dica,visivel,editavel,obrigatorio)}
    dados_linhas = (
        (
            "Nome",
            "text",
            "nome",
            "Nome",
            True,
            True,
            True,
        ),
        (
            "Email",
            "text",
            "email",
            "Email",
            True,
            True,
            True,
        ),
        (
            "Telefone",
            "text",
            "telefone",
            "Telefone",
            True,
            True,
            True,
        ),
        (
            "Assunto",
            "text",
            "assunto",
            "Assunto",
            True,
            True,
            True,
        ),
        (
            "Mensagem",
            "textarea",
            "mensagem",
            "Digite sua mensagem aqui",
            True,
            True,
            True,
        ),
    )

    ht_table = html_form_table.gera(dados_linhas, atrs)
    ht_submit = html_botao_submit.gera("Enviar", "enviar_msg_contato", None,
                                       '#55ee55')
    ht_cancel = html_botao_simples.gera("Cancelar", "principal", None,
                                        '#ff2200')

    ht_conteudo = \
          ht_table + \
          ht_submit + \
          ht_cancel

    return html_form.gera(ht_conteudo)
def gera(atrs, admin):

    ht_cabe = html_cabecalho.gera("Busca de trechos", False)

    # Dados para {html_form_table.gera}
    # {(rotulo,tipo,chave,dica,visivel,editavel,obrigatorio)}
    dados_linhas = ((
        "Origem",
        "text",
        "origem",
        "Código do aeroporto",
        True,
        True,
        False,
    ), (
        "Data mínima de partida",
        "text",
        "dia_partida",
        "aaaa-mm-dd",
        True,
        True,
        False,
    ), (
        None,
        "text",
        "hora_partida",
        "hh:mm",
        True,
        True,
        False,
    ), (
        "Destino",
        "text",
        "destino",
        "Código do aeroporto",
        True,
        True,
        False,
    ), (
        "Data máxima de chegada",
        "text",
        "dia_chegada",
        "aaaa-mm-dd",
        True,
        True,
        False,
    ), (
        None,
        "text",
        "hora_chegada",
        "hh:mm",
        True,
        True,
        False,
    ), ("Veiculo", "text", "veiculo", "Código do veiculo", admin, True, False))

    ht_table = html_form_table.gera(dados_linhas, atrs)
    ht_submit = html_botao_submit.gera("Buscar", "buscar_trechos", None,
                                       '#55ee55')
    ht_cancel = html_botao_simples.gera("Cancelar", "principal", None,
                                        '#ff2200')

    ht_conteudo = \
      ht_cabe + "<br/>\n" + \
      ht_table + \
      ht_submit + \
      ht_cancel

    return html_form.gera(ht_conteudo)
poltrona.cria_testes(False)


def testa(rotulo, *args):
    """Testa {funcao(*args)}, grava resultado
  em "testes/saida/{modulo}.{funcao}.{rotulo}.html"."""

    modulo = html_form_dados_de_poltrona
    funcao = modulo.gera
    frag = True  # {True} se for apenas um fragmento HTML, {False} se for página completa.
    pretty = False  # Se {True}, formata HTML para legibilidate (mas introduz brancos nos textos).
    utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args)


ht_submit = ""
ht_submit += html_botao_submit.gera("Escovar", "escovar_poltrona", None,
                                    "#ffff00")
ht_submit += html_botao_simples.gera("Repensar", "repensar_a_vida",
                                     {'coisa': "418"}, "#00cc00")

pol1_id = "A-00000001"
pol1 = poltrona.busca_por_identificador(pol1_id)
pol1_atrs = {}
pol1_id_cpr = None
testa("pol1_alterar_vazio", pol1_id, pol1_atrs, True, ht_submit)

pol2_id = "A-00000007"
pol2 = poltrona.busca_por_identificador(pol2_id)
pol2_atrs = {'preco': 23.45, 'id_trecho': "T-00000231", 'numero': "99F"}
assert poltrona.obtem_atributo(pol2, 'id_compra') == None
pol2_id_cpr = None
testa("pol2_alterar_alguns", pol2_id, pol2_atrs, True, ht_submit)
예제 #15
0
def gera(cpr, editavel, texto_bt, comando_bt):

    # Obtem atributos a mostrar:

    valores = {}.copy()
    id_cpr = compra.obtem_identificador(cpr)
    atrs_cpr = compra.obtem_atributos(cpr)

    # Atributos da compra em si
    valores['id_cpr'] = id_cpr
    valores['status'] = atrs_cpr['status']
    valores['nome_pass'] = atrs_cpr['nome_pass']
    valores['doc_pass'] = atrs_cpr['doc_pass']
    valores['preco_tot'] = ("%.2f" % compra.calcula_preco(cpr))
    # valores['pagamento'] = atrs_cpr['pagamento']

    # Cliente que está montando ou montou a compra:
    usr = compra.obtem_cliente(cpr)
    valores['id_usr'] = usuario.obtem_identificador(usr)
    atrs_usr = usuario.obtem_atributos(usr)
    valores['nome_usr'] = atrs_usr['nome']

    # Bilhetes da compra:
    ids_pols = compra.obtem_poltronas(cpr)
    num_trechos = len(ids_pols)
    valores['n_trechos'] = str(num_trechos)

    if (num_trechos >= 1):
        # Obtém origem, data, e hora de partida do primeiro trecho:
        pol_ini = poltrona.busca_por_identificador(ids_pols[0])
        id_trc_ini = poltrona.obtem_atributo(pol_ini, 'id_trecho')
        trc_ini = trecho.busca_por_identificador(id_trc_ini)
        origem = trecho.obtem_atributo(trc_ini, 'origem')
        dh_partida = trecho.obtem_dia_e_hora_de_partida(trc_ini)
        valores['partida'] = origem + " " + dh_partida

        # Obtém destino, data, e hora de chegada do último trecho:
        pol_fin = poltrona.busca_por_identificador(ids_pols[-1])
        id_trc_fin = poltrona.obtem_atributo(pol_fin, 'id_trecho')
        trc_fin = trecho.busca_por_identificador(id_trc_fin)
        destino = trecho.obtem_atributo(trc_fin, 'destino')
        dh_chegada = trecho.obtem_dia_e_hora_de_chegada(trc_fin)
        valores['chegada'] = destino + " " + dh_chegada

    # Linhas para {html_table.gera}:
    linhas = (
        html_cpr_campo("Compra", 'id_cpr', valores, 'text', None, False),
        html_cpr_campo("Cliente", 'id_usr', valores, 'text', None, False),
        html_cpr_campo("Nome do cliente", 'nome_usr', valores, 'text', None,
                       False),
        html_cpr_campo("Nome do passageiro", 'nome_pass', valores, 'text',
                       "Fulano da Silva", editavel),
        html_cpr_campo("Documento do passageiro", 'doc_pass', valores, 'text',
                       "123.456.789-10", editavel),
        html_cpr_campo("Número de trechos", 'n_trechos', valores, 'text', None,
                       False),
        html_cpr_campo("Preço total", 'preco_tot', valores, 'text', None,
                       False),
        html_cpr_campo("Estado", 'status', valores, 'text', None, False),
        html_cpr_campo("Partida", 'partida', valores, 'text', None, False),
        html_cpr_campo("Chegada", 'chegada', valores, 'text', None, False),
    )
    ht_campos = html_table.gera(linhas, ["", ""])

    # Botões:
    if editavel:
        args_submit = {
            'id_compra': id_cpr
        }  # Argumentos adicionais para submissão.
        ht_submit = html_botao_submit.gera(texto_bt, comando_bt, args_submit,
                                           "#44ff44")
        ht_campos += "<br/>" + ht_submit

    return html_form.gera(ht_campos)
def gera(ses, usr, atrs, erros):

    # Obtem usuário da sessão, determina privilégios:
    usr_ses = None if ses == None else sessao.obtem_usuario(ses)
    if usr_ses == None:
        # Usuário que pediu não está logado:
        admin = False
        mesmo = False
    else:
        assert type(usr_ses) is usuario.Objeto_Usuario
        admin = usuario.obtem_atributo(usr_ses, "administrador")
        mesmo = (usr_ses == usr)

    if atrs == None: atrs = {}.copy()  # Por via das dúvidas.

    ht_submit = ""
    ht_bt_cancel = ""
    if usr == None:
        # Cadastramento de novo usuário:
        id_usr = None
        ht_submit += html_botao_submit.gera("Cadastrar", "cadastrar_usuario",
                                            None, "#ff0000")
        titulo = "Novo usuário"
    else:
        # Visualização/alteração de usuário existente:
        assert usr_ses != None, "operação não autorizada sem login"
        assert admin or mesmo, "usuário não está autorizado a efetuar esta operação"
        assert type(usr) is usuario.Objeto_Usuario
        id_usr = usuario.obtem_identificador(usr)
        assert id_usr != None  # Paranóia.

        if mesmo:
            titulo = f"Sua conta"
        else:
            titulo = f"Usuário {id_usr}"

        # Completa {atrs} com atributos de {usr}:
        atrs_usr = usuario.obtem_atributos(usr)
        assert atrs_usr != None  # Paranóia
        for ch, val in atrs_usr.items():
            if not ch in atrs: atrs[ch] = val

        # Botoes de ação:
        ht_submit += html_botao_submit.gera("Alterar", "alterar_usuario", None,
                                            "#ff0000")

    ht_bt_cancel = html_botao_simples.gera("Voltar", 'principal', None,
                                           "#ff2200")

    ht_titulo = "<h2>" + titulo + "</h2>"

    # Cria formulário:
    ht_form = html_form_dados_de_usuario.gera(id_usr, atrs, admin, ht_submit)

    # Botoes adicionais:
    ht_bt_linhas = [].copy()
    if usr != None and not mesmo:
        # Botões para administrador ver objetos associados a usuário:
        args_bt = {'id': id_usr}
        estilo_n = "font-family:\"Courier\";font-size:20;"

        n_compras = len(usuario.compras_abertas(usr))
        ht_n_compras = html_span.gera(estilo_n, str(n_compras))
        ht_bt_compras = html_botao_simples.gera("Ver compras",
                                                "ver_compras_de_usuario",
                                                args_bt, '#eeee55')
        ht_bt_linhas.append((
            html_label.gera("Compras abertas", ":"),
            ht_n_compras,
            ht_bt_compras,
        ))

        n_sessoes = len(usuario.sessoes_abertas(usr))
        ht_n_sessoes = html_span.gera(estilo_n, str(n_sessoes))
        ht_bt_sessoes = html_botao_simples.gera("Ver sessões",
                                                "ver_sessoes_de_usuario",
                                                args_bt, '#eeee55')
        ht_bt_linhas.append((
            html_label.gera("Sessoes abertas", ":"),
            ht_n_sessoes,
            ht_bt_sessoes,
        ))

        n_poltronas = len(usuario.poltronas_abertas(usr))
        ht_n_poltronas = html_span.gera(estilo_n, str(n_poltronas))
        ht_bt_poltronas = html_botao_simples.gera("Ver poltronas",
                                                  "ver_poltronas_de_usuario",
                                                  args_bt, '#eeee55')
        ht_bt_linhas.append((
            html_label.gera("Poltronas abertas", ":"),
            ht_n_poltronas,
            ht_bt_poltronas,
        ))

    ht_bts_ver_coisas = html_table.gera(ht_bt_linhas, (
        "",
        "",
    ))

    ht_conteudo = \
      ht_titulo + \
      ht_form + "<br/>\n" + \
      ht_bts_ver_coisas + "<br/>" + \
      ht_bt_cancel

    pag = html_pag_generica.gera(ses, ht_conteudo, erros)
    return pag