def gera(ses, bt_ver, bt_fechar): sessao_id = sessao.obtem_identificador(ses) # Pega/monta atributos a mostrar: sessao_usuario = sessao.obtem_atributo(ses, 'usr') sessao_aberta = sessao.obtem_atributo(ses, 'abrt') sessao_cookie = sessao.obtem_atributo(ses, 'cookie') sessao_carrinho = sessao.obtem_atributo(ses, 'carrinho') sessao_data = sessao.obtem_atributo(ses, 'criacao') # Formata informações em HTML: ht_sessao_id = formata_texto(sessao_id) ht_codigo_usuario = formata_texto( usuario.obtem_identificador(sessao_usuario)) ht_estado = formata_texto(sessao_esta_aberta(sessao_aberta)) ht_cookie = formata_texto(sessao_cookie) ht_data = formata_texto(sessao_data) if sessao_carrinho == None: tx_carrinho = "" else: tx_carrinho = compra.obtem_identificador(sessao_carrinho) ht_carrinho = formata_texto(tx_carrinho) ht_campos = [ ht_sessao_id, ht_codigo_usuario, ht_estado, ht_cookie, ht_carrinho, ht_data ] args_bt = {'id_sessao': sessao_id} # Argumentos para os botões. cor_bt_admin = '#FFA700' # Cor para botões de adminstrador. # O comando para tratar a url "ver_detalhes_sessao" ainda não existe, e deverá ser implementado # no futuro. if bt_ver: ht_bt_fechar = html_botao_simples.gera("Ver", 'ver_sessao', args_bt, cor_bt_admin) ht_campos.append(ht_bt_fechar) if bt_fechar and sessao_aberta: ht_bt_fechar = html_botao_simples.gera("Fechar", 'fechar_sessao', args_bt, cor_bt_admin) ht_campos.append(ht_bt_fechar) if sessao_carrinho != None: tx_carrinho = compra.obtem_identificador(sessao_carrinho) if tx_carrinho[-1] == "1": ht_bt_fechar = html_label.gera("Sessão Atual", None) ht_campos.append(ht_bt_fechar) return ht_campos
def cria_testes(verb): global cache, nome_tb, letra_tb, colunas, diags inicializa(True) # Identificador de usuários e lista de poltronas de cada pedido de compra: lista_cupsf = \ [ ( "C-00000001", "U-00000001", "Amanda Almeida", "45.246.235-2", True, ), ( "C-00000002", "U-00000001", "Basílio Barros", "234.764.987-23", True, ), ( "C-00000003", "U-00000002", "Carlos Costa", "76.863.987-5", True, ), ( "C-00000004", "U-00000002", "Diego Dias", "654.987.098-09", False,), ( "C-00000005", "U-00000002", "Romario Silva", "122.787.038-05", False,), ( "C-00000006", "U-00000001", "Fabio Santos", "555.957.058-05", True, ), ( "C-00000007", "U-00000001", "Renato Augusto", "111.227.338-03", False,), ( "C-00000008", "U-00000001", "Carlos Tevez", "666.967.698-06", True, ), ( "C-00000009", "U-00000002", "André Santos", "554.181.018-01", False,), ( "C-00000010", "U-00000002", "Victor Cantillo", "444.955.085-08", True, ), ] for id_cpr_esp, id_cliente, nome_pass, doc_pass, comprando in lista_cupsf: cliente = usuario.busca_por_identificador(id_cliente) cpr = cria(cliente, nome_pass, doc_pass) assert cpr != None and type(cpr) is compra.Objeto_Compra id_cpr = compra.obtem_identificador(cpr) if not comprando: compra.fecha(cpr) # Paranóia: assert id_cpr == id_cpr_esp cliente_1 = compra.obtem_cliente(cpr) id_cliente_1 = usuario.obtem_identificador(cliente_1) assert id_cliente_1 == id_cliente if verb: sys.stderr.write("compra %s de %s criada\n" % (id_cpr, id_cliente)) return
def gera(ses, cpr, erros): id_compra = compra.obtem_identificador(cpr); ht_form = html_form_escolher_pagamento.gera(cpr) ht_cancelar = html_botao_simples.gera("Cancelar", "principal", None, "#ffff00") ht_conteudo = html_form.gera(ht_form + " " + ht_cancelar) pag = html_pag_generica.gera(ses, ht_conteudo, erros) return pag
def busca_por_compra(cpr): global cache, nome_tb, letra_tb, colunas, diags assert cpr != None and type(cpr) is compra.Objeto_Compra id_cpr = compra.obtem_identificador(cpr) unico = False ids_poltronas = objeto.busca_por_campo('id_compra', id_cpr, unico, cache, nome_tb, letra_tb, colunas) return ids_poltronas
def gera(ses): id_ses = sessao.obtem_identificador(ses) usr = sessao.obtem_usuario(ses) admin = usuario.obtem_atributo(usr, 'administrador') id_usr = usuario.obtem_identificador(usr) carr = sessao.obtem_carrinho(ses) id_cpr = compra.obtem_identificador(carr) abrt = sessao.aberta(ses) data_login = sessao.obtem_data_de_criacao(ses) atrs = { 'id_ses': id_ses, 'data_login': data_login, 'id_usr': id_usr, 'id_cpr': id_cpr, 'abrt': "Sim" if abrt else "Não", } # Dados para {html_form_table.gera} # {(rotulo,tipo,chave,dica,visivel,editavel,obrigatorio)} dados_linhas = \ ( ( "ID sessão", "text", "id_ses", None, True, False, False, ), ( "Criada em", "text", "data_login", None, True, False, False, ), ( "ID usuário", "text", "id_usr", None, True, False, False, ), ( "ID carrinho", "text", "id_cpr", None, True, False, False, ), ( "Status da sessão", "text", "abrt", None, True, admin, False, ), ) ht_table = html_form_table.gera(dados_linhas, atrs) return ht_table
def gera(cpr, ver, id_carrinho): id_cpr = compra.obtem_identificador(cpr) usr = compra.obtem_cliente(cpr) id_usr = usuario.obtem_identificador(usr) atrs_compra = compra.obtem_atributos(cpr) preco_tot = compra.calcula_preco(cpr) nome_pass = atrs_compra['nome_pass'] doc_pass = atrs_compra['doc_pass'] ids_poltronas = poltrona.busca_por_compra(cpr) num_poltronas = len(ids_poltronas) icone_carrinho = "<b>🛒</b>" if id_cpr == id_carrinho else "" # !!! Definir um estilo decente para os campos? Ou definir fora do {html_table}? !!! ht_carrinho = icone_carrinho ht_cpr = id_cpr ht_usr = id_usr ht_num_poltronas = str(num_poltronas) ht_preco_tot = str(preco_tot) ht_nome_pass = nome_pass ht_doc_pass = doc_pass campos = [ ht_carrinho, ht_cpr, ht_usr, ht_num_poltronas, ht_nome_pass, ht_doc_pass, ht_preco_tot ] if ver: ht_ver = html_botao_simples.gera("Ver", "ver_compra", {'id_compra': id_cpr}, "#22ff22") campos.append(ht_ver) return campos
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 processa(ses, args): if ses == None or not sessao.aberta(ses): return html_pag_mensagem_de_erro.gera(ses, "Sessão deveria estar aberta") try: carrinho = sessao.obtem_carrinho(ses) id_carrinho = compra.obtem_identificador( carrinho) if carrinho != None else None if not sessao.eh_administrador(ses): # Usuário comum só pode buscar as próprias compras: usr = sessao.obtem_usuario(ses) # Dono da sessao. usr_id = usuario.obtem_identificador(usr) if not (args['cliente'] == None or args['cliente'] == usr_id): raise ErroAtrib("Você não tem acesso a essa informação") args['cliente'] = usr_id # Se recebeu parâmetro genérico "passageiro", converte ele para "doc_pass" ou # "nome_pass" if 'passageiro' in args: matchList = re.findall( "([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})", args['passageiro']) # É um documento if len(matchList) > 0: args['doc_pass'] = args['passageiro'] # É um nome else: args['nome_pass'] = args['passageiro'] del args['passageiro'] campos = ['cliente', 'status', 'nome_pass', 'doc_pass'] verifica_campos(args, campos) cprs_ids = compra.busca_por_campos(args) cprs = map(lambda id_compra: compra.busca_por_identificador(id_compra), cprs_ids) ver = True if sessao.eh_administrador( ses) or args['cliente'] == sessao.obtem_usuario(ses) else False bloco = html_lista_de_compras.gera(cprs, ver, id_carrinho) pag = html_pag_generica.gera(ses, bloco, None) return pag except ErroAtrib as ex: erros = ex.args[0] # Repete a página com mensagem de erro: pag = html_pag_buscar_compras.gera(ses, args, sessao.eh_administrador(ses), erros) return pag
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): assert ses != None pag = html_pag_mensagem_de_erro.gera(ses, "sessão corrente") assert sessao.aberta(ses) usr = sessao.obtem_usuario(ses) assert usr != None id_usr = usuario.obtem_identificador(usr) ids_compras = compra.busca_por_cliente(id_usr) ver_compra = True # Queremos botão "Ver" em cada compra. carrinho = sessao.obtem_carrinho(ses) assert not ( (carrinho != None) and sessao.eh_administrador(ses)) # Paranóia. id_carrinho = compra.obtem_identificador( carrinho) if carrinho != None else None ht_conteudo = html_lista_de_compras.gera(ids_compras, ver_compra, id_carrinho) pag = html_pag_generica.gera(ses, ht_conteudo, None) return pag
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 processa(ses, args): assert ses != None pag = html_pag_mensagem_de_erro.gera(ses, "sessão corrente") assert sessao.aberta(ses) usr_ses = sessao.obtem_usuario(ses) assert usr_ses != None id_usr_ses = usuario.obtem_identificador(usr_ses) admin = sessao.eh_administrador(ses) # Usuário a examinar: if 'id' in args: id_usr = args['id'] usr = usuario.busca_por_identificador(id_usr) else: usr = usr_ses id_usr = id_usr_ses if (id_usr != id_usr_ses) and not admin: pag = html_pag_mensagem_de_erro.gera(ses, ["Apenas administradores podem ver sessões por este comando"]) return pag # Compra a identificar como "Seu carrinho": if id_usr == id_usr_ses: carrinho = sessao.obtem_carrinho(ses) id_carrinho = compra.obtem_identificador(carrinho) if carrinho != None else None else: carrinho = None # Usuário pode ter várias sessões, não vale a pena marcar carrinho(s). id_carrinho = None ids_compras = compra.busca_por_cliente(id_usr) ver_compra = True # Queremos botão "Ver" em cada compra. ht_conteudo = html_lista_de_compras.gera(ids_compras, ver_compra, id_carrinho) pag = html_pag_generica.gera(ses, ht_conteudo, None) return pag
pretty = False # Se {True}, formata HTML para legibilidate (mas introduz brancos nos textos). utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args) testes = ( \ ( "U-00000001", "T-00000001", ), # Cliente comum. ( "U-00000001", "T-00000002", ), # Cliente comum. ( "U-00000003", "T-00000003" ), # Admin. ( "U-00000003", "T-00000004", ), # Admin. ( None, "T-00000005", ), # Usuario deslogado. ) for usr_id, trc_id in testes: usr = None if usr_id == None else usuario.busca_por_identificador(usr_id) admin = False if usr == None else usuario.obtem_atributo( usr, 'administrador') usr_cprs = [] if usr == None else usuario.compras_abertas(usr) carr = None if len(usr_cprs) == 0 else usr_cprs[ 0] # Faz de conta que a primeira compra é o carrinho. id_carr = None if carr == None else compra.obtem_identificador(carr) trc = None if trc_id == None else trecho.busca_por_identificador(trc_id) assert trc != None ids_pols = trecho.obtem_poltronas(trc) fazer_checkin = admin #por enquanto rot = trc_id + "-" + str(usr_id) + "-" + str(id_carr) rot += "-admin" + str(admin)[0] rot += "-fzck" + str(fazer_checkin)[0] testa(rot, ids_pols, usr, carr)
def gera(ses, cpr, atrs, erros): # Validação dos parâmetros: assert ses != None # Paranóia (cliente deslogado não deve poder ver compra nenhuma). assert sessao.aberta(ses) # Paranóia. usr_ses = sessao.obtem_usuario(ses) assert usr_ses != None # Paranóia. admin = usuario.obtem_atributo(usr_ses, 'administrador') carr = None if admin or ses == None else sessao.obtem_carrinho(ses) if atrs == None: atrs = {}.copy() # Por via das dúvidas. # Botões de acão: ht_submit = "" ht_bt_def_carr = "" ht_bt_cancel = "" args_bt = {'id_compra': id_cpr} if cpr == None: # Nova compra: assert not admin # Paranóia (administrador não deve poder criar novas compras). id_cpr = None novo = True titulo = "Nova compra" else: assert type(cpr) is compra.Objeto_Compra usr_cpr = compra.obtem_cliente(cpr) assert usr_cpr != None # Paranóia. assert admin or ( usr_ses == usr_cpr ) # Paranóia (cliente comum só pode ver compras suas). id_cpr = compra.obtem_identificador(cpr) assert id_cpr != None # Paranóia. # Título da página: if admin: titulo = f"Compra {id_compra}" elif cpr == carr: titulo = "Seu carrinho de compras" else: titulo = f"Sua compra {id_compra}" ht_bt_def_carr = html_botao_simples.gera("Definir como carrinho", "definir_carrinho", args_bt, "#44ff00") # Completa {atrs} com atributos de {cpr}: atrs_cpr = compra.obtem_atributos(cpr) assert atrs_cpr != None # Paranóia for ch, val in atrs_cpr.items(): if not ch in atrs: atrs[ch] = val # Botoes de ação: # O submit é "Alterar": ht_submit += html_botao_submit.gera("Alterar", "alterar_compra", None, "#ff0000") if not admin and (compra.obtem_status(cpr) == 'comprando'): # Tem botão submit de "Finalizar compra" que aplica alterações: ht_submit += html_botao_submit.gera("Finalizar", "finalizar_compra", None, "#55ff00") ht_bt_cancel = html_botao_simples.gera("Continuar comprando", 'principal', None, "#ff2200") else: ht_bt_cancel = html_botao_simples.gera("Voltar", 'principal', None, "#ff2200") ht_titulo = "<h2>" + titulo + "</h2>" # Constrói formulário com dados da compra: ht_dados_da_compra = html_form_dados_de_compra.gera( id_cpr, atrs, admin, ht_submit) # Constrói a lista de poltronas da compra: if novo: ht_dados_das_poltronas = "" else: ids_pols = poltrona.busca_por_compra(cpr) if len(ids_pols) == 0: # Não há poltronas a mostrar. estilo_aviso = "color:red;font-size:20;" ht_dados_das_poltronas = "<br/>" + html_span.gera( estilo_aviso, "Não há poltronas disponíveis") else: ht_dados_das_poltronas = html_lista_de_poltronas_de_compra.gera( ids_pols, usr_ses, carr) # Verifica tempos de baldeação: poltronas_invalidas = compra.verificar_baldeacao(cpr) if erros is None: erros = [].copy() for id_poltrona in poltronas_invalidas: erros.append(f'Poltrona sem tempo para baldeação: {id_poltrona}') ht_conteudo = \ ht_titulo + "\n" + \ ht_dados_da_compra + "<br/>\n" + \ ht_bt_def_carr + "\n" + \ ht_bt_cancel + "<br/>\n" + \ ht_dados_das_poltronas pag = html_pag_generica.gera(ses, ht_conteudo, erros) return pag
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)