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
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
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
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
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)
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
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
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
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
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
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
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
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
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 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)
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" %
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)