Ejemplo n.º 1
0
def pode_comprar(usr, pol, cpr):
  global cache, nome_tb, letra_tb, colunas, diags
  
  if cpr == None or pol == None or cpr == None: return False

  assert type(usr) is usuario.Objeto_Usuario
  assert type(pol) is poltrona.Objeto_Poltrona
  assert type(cpr) is compra.Objeto_Compra
  
  # A compra {cpr} ainda está aberta?
  if compra.obtem_atributo(cpr, 'status') != 'comprando': return False
  
  # A poltrona {pol} está livre?
  id_cpr_pol = poltrona.obtem_atributo(pol, 'id_compra');
  if id_cpr_pol != None: return False
  
  # O trecho da poltrona {pol} ainda está disponível?
  id_trc_pol = poltrona.obtem_atributo(pol, 'id_trecho');
  trc_pol = None if id_trc_pol == None else trecho.busca_por_identificador(id_trc_pol)
  assert trc_pol != None # Paranóia.
  if trecho.obtem_atributo(trc_pol, 'encerrado'): return False
  
  # Há incompatibilidade de horários com as poltronas já em {cpr}?
  if not compra.trecho_eh_compativel(cpr, trc_pol): return False
  
  # Pode comprar, parece:
  return True
Ejemplo n.º 2
0
def pode_trocar(usr, pol):
  global cache, nome_tb, letra_tb, colunas, diags

  if usr == None or pol == None: return False

  assert type(usr) is usuario.Objeto_Usuario
  assert type(pol) is poltrona.Objeto_Poltrona
  
  # A poltrona {pol} está reservada a alguma compra?
  id_cpr = poltrona.obtem_atributo(pol, 'id_compra'); 
  if id_cpr == None: return False
  
  # A compra {cpr} ainda está aberta?
  cpr = compra.busca_por_identificador(id_cpr)
  assert cpr != None # Paranóia.
  if compra.obtem_atributo(cpr, 'status') != 'comprando': return False

  # O trecho da poltrona {pol} ainda não foi encerrado?
  id_trc_pol = poltrona.obtem_atributo(pol, 'id_trecho');
  trc_pol = None if id_trc_pol == None else trecho.busca_por_identificador(id_trc_pol)
  assert trc_pol != None # Paranóia.
  if trecho.obtem_atributo(trc_pol, 'encerrado'): return False
  
  # O usuário tem direito de excluir e comprar nessa compra?
  dono = (compra.obtem_cliente(cpr) == usr)
  if not dono: return False
  
  # Pode trocar, parece:
  return True
def testa_cria_poltrona(rotulo, ident, atrs):
    """Testa criação de poltrona com atributos com {atrs}. Retorna a poltrona."""
    pol = poltrona.cria(atrs)
    assert poltrona.obtem_identificador(pol) == ident
    assert poltrona.obtem_atributo(
        pol, 'id_trecho') == atrs['id_trecho'], "epa, trecho errado"
    assert poltrona.obtem_atributo(
        pol, 'id_compra') == atrs['id_compra'], "epa, pedido de compra errado"
    verifica_poltrona(rotulo, pol, ident, atrs)
    return pol
def gera(ids_poltronas, usr, carr):

    id_trc = None  # Identificador do trecho comum, ou None.

    admin = False if usr == None else usuario.obtem_atributo(
        usr, 'administrador')
    fazer_checkin = admin  # Por enquanto.
    embarcar = admin  #Por enquanto

    if admin or usr == None:
        assert carr == None  # Administrador e não-logado não tem carrinho.
    id_carr = None if carr == None else compra.obtem_identificador(carr)

    # Gera a linha de os cabeçalhos das colunas
    linha_cab = html_resumo_de_poltrona_de_trecho.gera_cabecalho(fazer_checkin)
    assert type(linha_cab) is list or type(linha_cab) is tuple  # Paranóia.

    # Gera as linhas da tabela.
    linhas = [].copy()
    for id_poltrona in ids_poltronas:
        pol = poltrona.busca_por_identificador(id_poltrona)

        # Obtem dados da poltrona:
        assert pol != None
        id_trc_pol = poltrona.obtem_atributo(pol, 'id_trecho')
        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 se o trecho é o mesmo para todas as poltronas:
        if id_trc != None: assert id_trc_pol == id_trc
        id_trc = id_trc_pol

        # Decide que botões vai ter:
        alterar = admin
        comprar = (carr != None) and poltrona.pode_comprar(usr, pol, carr)
        excluir = (cpr_pol != None) and (usr_pol
                                         == usr) and poltrona.pode_excluir(
                                             usr, pol)

        # Gera os campos da linha:
        linha = html_resumo_de_poltrona_de_trecho.gera(pol, alterar, comprar,
                                                       excluir, fazer_checkin,
                                                       embarcar)
        assert type(linha) is list or type(linha) is tuple  # Paranóia.
        linhas.append(linha)

    ht_tabela = html_table.gera(linhas, linha_cab)
    ht_legenda = html_resumo_de_poltrona_de_trecho.gera_legenda(fazer_checkin)
    ht_res = ht_tabela + ht_legenda
    return ht_res
Ejemplo n.º 5
0
def obtem_numeros_e_precos(ids_poltronas):
  global cache, nome_tb, letra_tb, colunas, diags
  assert isinstance(ids_poltronas, list)

  nums_e_precos = []
  for id_poltrona in ids_poltronas:
    assert isinstance(id_poltrona, str)
    pol = poltrona.busca_por_identificador(id_poltrona)
    nums_e_precos.append((
      poltrona.obtem_atributo(pol, 'numero'),
      poltrona.obtem_atributo(pol, 'preco')
    ))

  return nums_e_precos
Ejemplo n.º 6
0
def calcula_preco(cpr):
    global cache, nome_tb, letra_tb, colunas, diags
    assert cpr != None and type(cpr) is compra.Objeto_Compra
    preco = 0
    for id_pol in obtem_poltronas(cpr):
        pol = poltrona.busca_por_identificador(id_pol)
        preco = preco + poltrona.obtem_atributo(pol, 'preco')
    return preco
Ejemplo n.º 7
0
def processa(ses, args):
    id_poltronas = poltrona.busca_ofertas()
    poltronas = [poltrona.busca_por_identificador(id) for id in id_poltronas]
    id_trechos = list(
        set([poltrona.obtem_atributo(pol, 'id_trecho') for pol in poltronas]))
    trechos = [trecho.busca_por_identificador(id) for id in id_trechos]
    pag = html_pag_ofertas.gera(ses, trechos, None)
    return pag
def testa_valores_criticos_invalidos():
    id1 = "A-00000001"
    ptr1 = poltrona.busca_por_identificador(id1)
    assert ptr1 is not None, "Poltrona A-00000001 não encontrada no banco"

    # Valores antigos
    atributos_antigos = poltrona.obtem_atributos(ptr1)

    ptr2 = poltrona.busca_por_identificador("A-00000002")
    assert ptr2 is not None, "Poltrona A-00000002 não encontrada no banco"

    # Argumentos com id de trecho E número sendo usado por outra poltrona (A-00000002)
    args_mesmo_trecho = {'id_poltrona': id1,
     'id_trecho': poltrona.obtem_atributo(ptr2, 'id_trecho'), 
     'id_compra': atributos_antigos['id_compra'], 
     'numero': poltrona.obtem_atributo(ptr2, 'numero'), 
     'oferta': 'on' if atributos_antigos['oferta'] else 'off', 
     'preco': atributos_antigos['preco']}
    
    testa("MesmoTrechoENumero", ses, args_mesmo_trecho)
Ejemplo n.º 9
0
def trecho_eh_compativel(cpr, trc):
    global cache, nome_tb, letra_tb, colunas, diags
    assert cpr != None and type(cpr) is compra.Objeto_Compra
    for id_pol in obtem_poltronas(cpr):
        pol = poltrona.busca_por_identificador(id_pol)
        id_trc_pol = poltrona.obtem_atributo(pol, 'id_trecho')
        # Verifca se {trc} é compatível com o trecho da polrona {pol}:
        trc_pol = None if id_trc_pol == None else trecho.busca_por_identificador(
            id_trc_pol)
        assert trc_pol != None  # Paranóia.
        if not trecho.horarios_sao_compativeis(trc, trc_pol): return False
    # Todos compatíveis
    return preco
Ejemplo n.º 10
0
def poltronas_abertas(usr):
    id_usr = usuario.obtem_identificador(usr)

    abertas_usr = [].copy()
    ids_compras = compra.busca_por_cliente(id_usr)
    for id_cpr in ids_compras:
        cpr = compra.busca_por_identificador(id_cpr)
        assert cpr != None  # Paranóia.
        # Pega o id das poltronas de cada uma dessas compras
        ids_poltronas = compra.obtem_poltronas(cpr)
        for id_pol in ids_poltronas:
            # Para cada um desses ids pega o objeto da poltrona
            pol = poltrona.busca_por_identificador(id_pol)
            assert pol != None  # Paranóia.
            assert poltrona.obtem_atributo(pol,
                                           'id_compra') == id_cpr  # Paranóia.
            # Verifica se o trecho não foi encerrado
            id_trc = poltrona.obtem_atributo(pol, 'id_trecho')
            trc = trecho.busca_por_identificador(id_trc)
            if not trecho.obtem_atributo(trc, 'encerrado'):
                abertas_usr.append(pol)
    return abertas_usr
Ejemplo n.º 11
0
def processa(ses, args):

    # Usuário deve estar logado para iniciar um pedido de compra
    if ses == None:
        pag = html_pag_mensagem_de_erro.gera(
            ses, ["Voce deve estar logado para comprar um roteiro!"])
        return pag

    cpr = sessao.obtem_carrinho(ses)
    if cpr == None:
        # Novo carrinho associada ao usuario
        compra.cria(ses.cliente, ses.cliente.nome_pass, ses.cliente.doc_pass)

    # Recupera os objetos trechos para verificar poltronas
    ids_trechos = args['ids_trechos'].split(',')
    obj_trechos = []
    for id in ids_trechos:
        obj_trechos.append(trecho.busca_por_identificador(id))

    # Verifica e inclui poltronas na compra
    for trc in obj_trechos:
        # Verifica se o trecho possui pelo menos uma poltrona livre
        if trecho.numero_de_poltronas_livres(trc) < 1:
            pag = html_pag_mensagem_de_erro.gera(ses, [
                "Nao tem mais poltronas livres no trecho {} :(".format(
                    trecho.obtem_atributo(trc, "codigo"))
            ])
            return pag

        # Obtem lista de poltronas livres para comparacao do melhor preco
        id_pol_livres = poltrona.lista_livres(trc)
        melhor_preco = math.inf
        id_melhor_preco = None

        for id_pol in id_pol_livres:

            pol = poltrona.busca_por_identificador(id_pol)
            preco_pol = poltrona.obtem_atributo(pol, "preco")

            # Atualiza melhor preco, assim como seu id
            if preco_pol < melhor_preco:
                melhor_preco = preco_pol
                id_melhor_preco = id_pol

        # Adiciona a poltrona ao carrinho
        comando_comprar_poltrona.processa(ses,
                                          {'id_poltrona': id_melhor_preco})

    pag = comando_ver_carrinho.processa(ses, None)
    return pag
Ejemplo n.º 12
0
def resumo_de_trafego(ids_trechos):
    global cache, nome_tb, letra_tb, colunas, diags

    custo_total = 0
    total_checkins = 0
    total_poltronas = 0
    total_poltronas_pagas = 0
    for id in ids_trechos:
        trc = busca_por_identificador(id)
        total_poltronas += numero_de_poltronas(trc)
        total_poltronas_pagas += (total_poltronas -
                                  numero_de_poltronas_livres(trc))
        poltronas = obtem_poltronas(trc)
        for id_poltrona in poltronas:
            pol = poltrona.busca_por_identificador(id_poltrona)
            custo_total += poltrona.obtem_atributo(pol, 'preco')
            if poltrona.obtem_atributo(pol, 'fez_checkin'):
                total_checkins += 1

    #O resultado é uma tupla {(ntr, npol_tot, npol_pag, renda_tot, npol_chk)}
    resumo = (len(ids_trechos), total_poltronas, total_poltronas_pagas,
              custo_total, total_checkins)
    return resumo
Ejemplo n.º 13
0
def processa(ses, args):
  
  # Obtem usuário e carrinho de compras:
  assert ses != None # Comando não deveria ser acessível a usuário não logado. 
  usr_ses = sessao.obtem_usuario(ses)
  assert usr_ses != None # Paranóia.

  admin = usuario.obtem_atributo(usr_ses, 'administrador')
  assert not admin # Admnistrador não deveria ter acesso a este cmd.
  
  #Obtem a poltrona a comprar:
  id_pol = args['id_poltrona'] if 'id_poltrona' in args else None
  assert id_pol != None #  Paranóia (formulário ou botão deve fornecer)
  pol = poltrona.busca_por_identificador(id_pol)
  assert pol != None # Paranóia.

  # Obtém carrinho do usuário:
  carr = sessao.obtem_carrinho(ses)
  assert carr != None # Todo cliente comum deve ter carrinho.
  id_carr = compra.obtem_identificador(carr)

  try:
    if not poltrona.pode_comprar(usr, pol, carr):
      # Não deveria acontecer, mas em todo caso:
      raise ErroAtrib("Esta poltrona não está disponível") 
    
    # Muda a poltrona para comprada
    poltrona.muda_atributos(pol, { 'id_compra': id_carr })

    # Mostra o carrinho do usuário com a poltrona comprada:
    pag = html_pag_compra.gera(ses, cpr, excluir, None)
  except ErroAtrib as ex:
    erros = ex.args[0]
    # Se o trecho da poltrona estiver disponível, mostra o trecho para outra compra:
    id_trc = poltrona.obtem_atributo(pol, 'id_trecho')
    assert id_trc != None # Paranoia.
    trc = trecho.busca_por_identificador(id_trc)
    assert trc != None # Paranoia.
    if trecho.verificar_disponibilidade(trc) and trecho_eh_compativel(cpr, trc):
      # Usuário pode comprar outra poltrona deste trecho:
      pag = html_pag_trecho.gera(ses, trc, None, erros)
    else:
      # Usuário não pode comprar nenuma poltrona neste trecho.
      # Volte para a página principal.
      # !!! Deveria buscar e mostrar roteiros de mesma origem e destino !!!
      pag = html_pag_principal.gera(ses, erros)
  return pag
Ejemplo n.º 14
0
def processa(ses, args):

  # Obtem o dono da sessão {ses}:
  usr_ses = None if ses == None else sessao.obtem_usuario(ses)
  assert usr_ses != None # Usuário não logado não deveria ter acesso a este comando.
  admin = False if usr_ses == None else usuario.obtem_atributo(usr_ses, 'administrador')
  carr = None if ses == None else sessao.obtem_carrinho(ses) # Carrinho de compras da sessão.

  # Obtem a poltrona a excluir:
  id_pol = args['id_poltrona']
  pol = None if id_pol == None else poltrona.busca_por_identificador(id_pol)
  assert pol != None # A poltrona deve estar identificada em {args}.
  del args['id_poltrona']
  
  # Obtem a compra de onde excluir:
  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)
  assert cpr_pol != None # A poltrona não pode estar livre.
  
  # Obtem o dono da compra:
  usr_pol = compra.obtem_cliente(cpr_pol)
  assert usr_pol != None # Paranoia.
  
  # Verifica permissão:
  assert admin or (usr_pol == usr_ses) # Outro usuário não deveria ter acesso a este comando.

  try:
    # Ao definir {id_compra} como {None}, estamos excluindo a poltrona
    poltrona.muda_atributos(pol, {'id_compra': None})

    if (not admin) and (cpr_pol != carr):
      # Mudamos o carrinho:
      sessao.muda_atributos(ses, {'carrinho': cpr_pol})
      aviso = ("Seu carrinho agora é a compra %s" % id_cpr_pol)
    else:
      aviso = None

    # Gera a página de retorno:
    pag = html_pag_compra.gera(ses, cpr_pol, None, aviso)
  except ErroAtrib as ex:
    erros = ex[0]
    # Mostra a página da poltrona com mesmos args e erro:
    pag = html_pag_compra.gera(ses, cpr_pol, args, aviso)
  return pag
def processa(ses, args):

    assert ses != None and sessao.eh_administrador(ses)  # Paranóia.

    # Obtem a poltrona a fazer cehckin:
    id_pol = args['id_poltrona'] if 'id_poltrona' in args else None
    assert id_pol != None  # Paranoia (formulário deve incluir este dado)
    pol = poltrona.busca_por_identificador(id_pol)

    # A poltrona deve estar reservada para alguma compra:
    assert poltrona.obtem_atributo(pol, 'id_compra') != None
    try:
        poltrona.muda_atributos(pol, {'fez_checkin': True})
        pag = html_pag_poltrona.gera(ses, pol, None, None)
    except ErroAtrib as ex:
        erros = ex[0]
        # Mostra os dados da poltrona:
        pag = html_pag_poltrona.gera(ses, pol, None, erros)
    return pag
Ejemplo n.º 16
0
def livre_mais_proxima(pol, preco_max):
  global cache, nome_tb, letra_tb, colunas, diags
  dist_pol_desejada = -1
  id_trc = poltrona.obtem_atributo(pol, 'id_trecho')
  trc = trecho.busca_por_identificador(id_trc)
  ids_livres = lista_livres(trc)
  id_pol = poltrona.obtem_identificador(pol)
  pol_desejada = None
  if len(ids_livres) != 0:
    for id in ids_livres:
        if (id != id_pol):
            pol_aux = poltrona.busca_por_identificador(id)
            dist_aux = distancia(pol, pol_aux)
            preco_aux = obtem_atributo(pol_aux, 'preco')
            if (dist_pol_desejada == -1 and preco_aux <= preco_max):
                pol_desejada = pol_aux
                dist_pol_desejada = dist_aux
            else:
                if (dist_aux < dist_pol_desejada and preco_aux <= preco_max):
                    pol_desejada = pol_aux
                    dist_pol_desejada = dist_aux
  return pol_desejada
Ejemplo n.º 17
0
    frag = False  # {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).
    testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args)


# Sessao de usuário comum e poltrona desse usuário:
ses_com1 = sessao.busca_por_identificador("S-00000003")
usr_com1 = sessao.obtem_usuario(ses_com1)
assert not usuario.obtem_atributo(usr_com1, 'administrador')

id_cpr_com1 = "C-00000003"
cpr_com1 = compra.busca_por_identificador(id_cpr_com1)
assert compra.obtem_cliente(cpr_com1) == usr_com1
id_pol_com1 = "A-00000008"
pol_com1 = poltrona.busca_por_identificador(id_pol_com1)
assert poltrona.obtem_atributo(pol_com1, "id_compra") == id_cpr_com1

testa("com1-com1", ses_com1, {'id_poltrona': id_pol_com1})

# Sessao de administrador e poltrona de outro usuário:
ses_adm3 = sessao.busca_por_identificador("S-00000004")
usr_adm3 = sessao.obtem_usuario(ses_adm3)
assert usuario.obtem_atributo(usr_adm3, 'administrador')

id_cpr_com2 = "C-00000001"
cpr_com2 = compra.busca_por_identificador(id_cpr_com2)
usr_com2 = compra.obtem_cliente(cpr_com2)
assert not usuario.obtem_atributo(usr_com2, 'administrador')
id_pol_com2 = "A-00000006"
pol_com2 = poltrona.busca_por_identificador(id_pol_com2)
assert poltrona.obtem_atributo(pol_com2, "id_compra") == id_cpr_com2
Ejemplo n.º 18
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)
Ejemplo n.º 19
0
def cria_testes(verb):
  global cache, nome_tb, letra_tb, colunas, diags
  inicializa(True)
  lista_atrs = \
    [
      # Poltrona "A-00000001":
      { 'id_trecho':   "T-00000001",
        'numero':      "01A",
        'oferta':      True,
        'id_compra':   "C-00000001",
        'preco':       10.00,
        'bagagens':    0,
        'fez_checkin': True, 
        'embarcou': True,
      },
      # Poltrona "A-00000002":
      { 'id_trecho':   "T-00000001",
        'numero':      "02A",
        'oferta':      True,
        'id_compra':   None,
        'preco':       60.00,
        'bagagens':    None,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000003":
      { 'id_trecho':   "T-00000001",
        'numero':      "02B",
        'oferta':      False,
        'id_compra':   "C-00000002",
        'preco':       11.00,
        'bagagens':    1,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000004":
      { 'id_trecho':   "T-00000002",
        'numero':      "31",
        'oferta':      False,
        'id_compra':   None,
        'preco':       20.00,
        'bagagens':    None,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000005":
      { 'id_trecho':   "T-00000002",
        'numero':      "32",
        'oferta':      False,
        'id_compra':   None,
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000006":
      { 'id_trecho':   "T-00000002",
        'numero':      "33",
        'oferta':      False,
        'id_compra':   "C-00000001",
        'preco':       12.00,
        'bagagens':    2,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000007":
      { 'id_trecho':   "T-00000003",
        'numero':      "31",
        'oferta':      True,
        'id_compra':   None,
        'preco':       50.00,
        'bagagens':    None,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000008":
      { 'id_trecho':   "T-00000003",
        'numero':      "33",
        'oferta':      False,
        'id_compra':   "C-00000003",
        'preco':       13.00,
        'bagagens':    3,
        'fez_checkin': False, 
        'embarcou': False,
      },
      # Poltrona "A-00000009":
      { 'id_trecho':   "T-00000001",
        'numero':      "50",
        'oferta':      True,
        'id_compra':   "C-00000005",
        'preco':       15.00,
        'bagagens':    2,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000010":
      { 'id_trecho':   "T-00000002",
        'numero':      "51",
        'oferta':      False,
        'id_compra':   "C-00000006",
        'preco':       10.00,
        'bagagens':     4,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000011":
      { 'id_trecho':   "T-00000003",
        'numero':      "52",
        'oferta':      True,
        'id_compra':   "C-00000007",
        'preco':       18.00,
        'bagagens':    5,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000012":
      { 'id_trecho':   "T-00000002",
        'numero':      "53",
        'oferta':      False,
        'id_compra':   "C-00000008",
        'preco':       25.00,
        'bagagens':    2,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000013":
      { 'id_trecho':   "T-00000003",
        'numero':      "54",
        'oferta':      True,
        'id_compra':   "C-00000009",
        'preco':       8.00,
        'bagagens':    1,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000014":
      { 'id_trecho':   "T-00000001",
        'numero':      "55",
        'oferta':      False,
        'id_compra':   "C-00000010",
        'preco':       20.00,
        'bagagens':    5,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000015":
      { 'id_trecho':   "T-00000004",
        'numero':      "56",
        'oferta':      False,
        'id_compra':   None,
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000016":
      { 'id_trecho':   "T-00000005",
        'numero':      "57",
        'oferta':      False,
        'id_compra':   "C-00000010",
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000017":
      { 'id_trecho':   "T-00000006",
        'numero':      "58",
        'oferta':      False,
        'id_compra':   None,
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000018":
      { 'id_trecho':   "T-00000007",
        'numero':      "59",
        'oferta':      False,
        'id_compra':   None,
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000019":
      { 'id_trecho':   "T-00000008",
        'numero':      "60",
        'oferta':      False,
        'id_compra':   "C-00000001",
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000020":
      { 'id_trecho':   "T-00000009",
        'numero':      "61",
        'oferta':      False,
        'id_compra':   "C-00000002",
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': True,
        'embarcou': True,
      },
      # Poltrona "A-00000021":
      { 'id_trecho':   "T-00000010",
        'numero':      "62",
        'oferta':      False,
        'id_compra':   "C-00000003",
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000022":
      { 'id_trecho':   "T-00000011",
        'numero':      "63",
        'oferta':      False,
        'id_compra':   "C-00000004",
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': True,
        'embarcou': True,
      },
      # Poltrona "A-00000023":
      { 'id_trecho':   "T-00000012",
        'numero':      "64",
        'oferta':      False,
        'id_compra':   None,
        'preco':       30.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000024":
      { 'id_trecho':   "T-00000001",
        'numero':      "01B",
        'oferta':      True,
        'id_compra':   "C-00000004",
        'preco':       25.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
      # Poltrona "A-00000025":
      { 'id_trecho':   "T-00000004",
        'numero':      "01B",
        'oferta':      True,
        'id_compra':   "C-00000002",
        'preco':       25.00,
        'bagagens':    None,
        'fez_checkin': True,
        'embarcou': True,
      },
      # Poltrona "A-00000026":
      { 'id_trecho':   "T-00000005",
        'numero':      "01B",
        'oferta':      True,
        'id_compra':   None,
        'preco':       25.00,
        'bagagens':    None,
        'fez_checkin': False,
        'embarcou': False,
      },
    ]
  for atrs in lista_atrs:
    pol = cria(atrs)
    assert pol != None and type(pol) is poltrona.Objeto_Poltrona
    id_ass = poltrona.obtem_identificador(pol)
    id_trc = poltrona.obtem_atributo(pol, 'id_trecho')
    id_cpr = poltrona.obtem_atributo(pol, 'id_compra')
    if id_cpr == None: id_cpr = "LIVRE"
    if verb: sys.stderr.write("poltrona %s no trecho %s (compra %s) criado\n" % (id_ass, id_trc, id_cpr))
  return
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)

pol3_id = "A-00000003"
pol3 = poltrona.busca_por_identificador(pol3_id)
pol3_atrs = poltrona.obtem_atributos(pol3)
pol3_id_cpr = poltrona.obtem_atributo(pol3, 'id_compra')
testa("pol3_ver_todos", pol3_id, pol3_atrs, False, ht_submit)

pol4_id = "A-00000007"
pol4 = poltrona.busca_por_identificador(pol4_id)
pol4_atrs = poltrona.obtem_atributos(pol4)
assert poltrona.obtem_atributo(pol4, 'id_compra') == None
pol4_id_cpr = "C-00000002"
testa("pol4_comprar_todos", pol4_id, pol4_atrs, False, ht_submit)
Ejemplo n.º 21
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
( True,  False,  False,  True,  ),
( False, True,   False,  False, ),
( False, False,  True,   False, ),
          )

for id_pol in ("A-00000001", "A-00000002", "A-00000003", "A-00000004"):
    for alterar, comprar, excluir, fazer_checkin in testes:
        embarcar = fazer_checkin
        rot = id_pol

        # Estamos garantindo que a poltrona A-00000001 está com status pago e
        # checkin não realizado, para testar o botão de checkin
        if id_pol == "A-00000001":
            ptr = poltrona.busca_por_identificador(id_pol)
            poltrona.muda_atributos(ptr, {'fez_checkin': False})
            id_compra = poltrona.obtem_atributo(ptr, "id_compra")
            if id_compra != None:
                cpr = compra.busca_por_identificador(id_compra)
                estado = compra.obtem_atributo(cpr, 'status')
                compra.muda_atributos(cpr, {'status': 'pago'})

        pol = poltrona.busca_por_identificador(id_pol)
        assert pol != None
        rot += "-alter" + str(alterar)[0]
        rot += "-compr" + str(comprar)[0]
        rot += "-exclu" + str(excluir)[0]
        rot += "-fzchk" + str(fazer_checkin)[0]
        testa_gera_cabecalho(rot, fazer_checkin)
        testa_gera(rot, pol, alterar, comprar, excluir, fazer_checkin,
                   embarcar)
        testa_gera_legenda(rot, fazer_checkin)
lista_de_pares2 = [('10B', '100'), ('1B', '100'), ('3B', '100'), ('1', '20.0')]
lista_de_pares3 = [('1', '10.0'), ('2', '20.0'), ('3', '30.0')]

representacao_str1 = poltrona.resume_numeros_e_precos(lista_de_pares1)
representacao_str2 = poltrona.resume_numeros_e_precos(lista_de_pares2)
representacao_str3 = poltrona.resume_numeros_e_precos(lista_de_pares3)

sys.stderr.write(representacao_str1 + "\n")
sys.stderr.write(representacao_str2 + "\n")
sys.stderr.write(representacao_str3 + "\n")

# ----------------------------------------------------------------------
sys.stderr.write("testando {poltrona.obtem_dia_e_hora_de_partida}:\n")
pol3 = pol[3]
assert poltrona.obtem_identificador(pol3) == "A-00000004"
assert poltrona.obtem_atributo(
    pol3, 'id_trecho') == "T-00000002", "epa, trecho errado"
pol3_dhp_res = poltrona.obtem_dia_e_hora_de_partida(pol3)
pol3_dhp_esp = "2020-05-08 19:45 UTC"
if pol3_dhp_res != pol3_dhp_esp:
    sys.stderr.write("{poltrona.obtem_dia_e_hora_de_partida(pol3)}:")
    sys.stderr.write(" devolveu %s, esperado %s\n" %
                     (pol3_dhp_res, pol3_dhp_esp))
    ok_global = False

# ----------------------------------------------------------------------
sys.stderr.write("testando {poltrona.obtem_dia_e_hora_de_chegada}:\n")
pol3_dhc_res = poltrona.obtem_dia_e_hora_de_chegada(pol3)
pol3_dhc_esp = "2020-05-08 20:40 UTC"
if pol3_dhc_res != pol3_dhc_esp:
    sys.stderr.write("{poltrona.obtem_dia_e_hora_de_chegada(pol3)}:")
    sys.stderr.write(" devolveu %s, esperado %s\n" %
Ejemplo n.º 24
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
sesC = sessao.busca_por_identificador("S-00000001")
assert sessao.obtem_usuario(sesC) == usrC

# Sessão de outro cliente comum:
sesO = sessao.busca_por_identificador("S-00000003")
assert sessao.obtem_usuario(sesO) != None
assert sessao.obtem_usuario(sesO) != usrC

# Sessão de administrador:
sesA = sessao.busca_por_identificador("S-00000004")
assert sessao.eh_administrador(sesA)

# Poltrona reservada pelo usuario 1:
polR_id = "A-00000001"
polR = poltrona.busca_por_identificador(polR_id)
assert poltrona.obtem_atributo(polR, 'id_compra') == "C-00000001"

# Poltrona livre:
polL_id = "A-00000005"
polL = poltrona.busca_por_identificador(polL_id)
assert poltrona.obtem_atributo(polL, 'id_compra') == None

# Atributos a alterar:
atrs_m = {}.copy()

for ses_tag, ses in (("sesN", None), ("sesC", sesC), ("sesO", sesO), ("sesA",
                                                                      sesA)):
    for pol_tag, pol in (("polL", polL), ("polR", polR)):
        for err_tag, err in (("err0", None), ("err1",
                                              "Das schibunga is kaput")):
            atrs_pol = poltrona.obtem_atributos(pol)