def processa(ses, args): # Determina se o usuário corrente {usr_ses} é administrador: if ses is None: usr_ses = None admin = False else: usr_ses = sessao.obtem_usuario(ses) assert usr_ses is not None admin = usuario.obtem_atributos(usr_ses)['administrador'] id_usr = args["id_usuario"] if "id_usuario" in args else None assert id_usr is not None, "id_usuario obrigatório para atualizar" usr = usuario.busca_por_identificador(id_usr) # Tenta editar o usuário: try: if usr == None: raise ErroAtrib("esse usuário não existe") atrs_muda = args.copy() del atrs_muda["id_usuario"] usuario.confere_e_elimina_conf_senha(atrs_muda) usuario.muda_atributos(usr, atrs_muda) # Mostra de novo a página de alterar com dados novos: args_novos = usuario.obtem_atributos(usr) pag = html_pag_usuario.gera(ses, usr, args_novos, None) except ErroAtrib as ex: erros = ex.args[0] # Repete a página de cadastrar com os mesmos argumentos e mens de erro: pag = html_pag_usuario.gera(ses, usr, args, erros) return pag
def testa_atualiza_atributo(rot, ses, args): assert 'id_usuario' in args testa(rot, ses, args) id_usr = args['id_usuario'] usr = usuario.busca_por_identificador(id_usr) atrs_usr = usuario.obtem_atributos(usr) for ch, val in atrs_usr.items(): if ch in args: assert val == args[ch], ( "campo '%s' = '%s' não foi alterado para '%s'\n" % (ch, val, args[ch]))
def processa(ses, args): usr_ses = None if ses == None else sessao.obtem_usuario(ses) assert sessao.eh_administrador( ses) # O dono da sessão deve ser administrador. try: if not 'id' in args: pag = html_pag_mensagem_de_erro.gera( ses, 'É necessário adicionar um ID para pesquisar.') return pag id = args['id'] if len(id) != 10: raise ErroAtrib("O identificador \"" + id + "\" é inválido") letra = id[0] if letra == "U": usr = usuario.busca_por_identificador(id) if usr == None: raise ErroAtrib("Não existe usuário com identificador " + id) usr_atrs = usuario.obtem_atributos(usr) usr_atrs['id_usuario'] = usuario.obtem_identificador(usr) pag = html_pag_usuario.gera(ses, usr, usr_atrs, None) elif letra == "C": cpr = compra.busca_por_identificador(id) if cpr == None: raise ErroAtrib( "Não existe pedido de compra com identificador" + id) pag = html_pag_compra.gera(ses, cpr, None, None) elif letra == "T": trc = trecho.busca_por_identificador(id) if trc == None: raise ErroAtrib( "Não existe trecho de viagem com identificador" + id) pag = html_pag_trecho.gera(ses, trc, None, None) elif letra == "S": ses_a_ver = sessao.busca_por_identificador(id) if ses_a_ver == None: raise ErroAtrib("Não existe sessão com identificador" + id) pag = html_pag_sessao.gera(ses, ses_a_ver, None) elif letra == "A": pol = poltrona.busca_por_identificador(id) if pol == None: raise ErroAtrib("Não existe poltrona com identificador" + id) pag = html_pag_poltrona.gera(ses, pol, None, None) else: raise ErroAtrib("Classe de objeto \"" + letra + "\" inválida") except ErroAtrib as ex: erros = ex.args[0] return html_pag_mensagem_de_erro.gera(ses, erros) return pag
def processa(ses, dados): ses_nova = ses # Caso o login falhe. if ses != None: # Não deveria acontecer, mas por via das dúvidas: pag = html_pag_mensagem_de_erro.gera(ses, "Favor sair da sessão corrente primeiro") else: erro_email = None # Email não especificado ou não cadastrado. erro_senha = None # Senha não especificada ou inválida. if 'senha' not in dados: erro_senha = "campo 'senha' é obrigatório" senha = None else: senha = dados['senha'] if 'email' not in dados: erro_email = "campo 'email' é obrigatório" email = None else: email = dados['email'] usr = None if email != None and senha != None: # Obtem o usuário pelo email: id_usuario = usuario.busca_por_email(email) if id_usuario == None: erro_email = "Usuário " + email + " não está cadastrado" else: usr = usuario.busca_por_identificador(id_usuario) assert usr != None atrs_usr = usuario.obtem_atributos(usr) if atrs_usr["senha"] != senha: erro_senha = "Senha incorreta" usr = None if usr != None: cookie = secrets.token_urlsafe(32) carrinho = define_carrinho(usr, id_usuario) ses_nova = sessao.cria(usr, cookie, carrinho) pag = html_pag_principal.gera(ses_nova, None) else: erros = [ erro_email, erro_senha ] pag = html_pag_mensagem_de_erro.gera(None, erros) return pag, ses_nova
def processa(ses, args): if ses == None or not sessao.aberta(ses): erro_prog("sessão deveria estar aberta") else: usr_ses = sessao.obtem_usuario(ses) admin = usuario.obtem_atributo(usr_ses, 'administrador') if args == {} or args['id_usuario'] == None: # O 'id_usuario' nao foi especificado; supõe que é o dono da sessao: usr = usr_ses id_usr = usuario.obtem_identificador(usr) elif args['id_usuario'] != None: # O 'id_usuario' foi especificado; obtém dados do do dito cujo. id_usr = args['id_usuario'] usr = usuario.busca_por_identificador(id_usr) else: erro_prog("usuário não identificado") atrs = usuario.obtem_atributos(usr) pag = html_pag_usuario.gera(ses, usr, atrs, None) return pag
def gera(ses, erros): if ses !=None: usr = sessao.obtem_usuario(ses) atrs = usuario.obtem_atributos(usr) nome = atrs['nome'] texto1 = "Olá <b>"+nome+"</b>!" else: texto1 = None texto2 = "Bem vindo(a) ao nosso site de viagens!" now = datetime.now(timezone.utc) data = now.strftime("%Y-%m-%d %H:%M:%S %z") texto3 = "<hr/><i>DATA CORRENTE </i><b>" + data + "</b><br/>TUDO EM ORDEM NESTE SERVIDOR<hr/>" cor_texto = "#000488" cor_fundo = "#eeeeee" estilo = f"font-family: Courier; font-size: 16px; font-weight: normal; padding: "\ f"5px; text-align: center; color: {cor_texto}; background-color: {cor_fundo}" bloco_texto1 = html_span.gera(estilo, texto1) bloco_texto2 = html_span.gera(estilo, texto2) bloco_texto3 = html_span.gera(estilo, texto3) conteudo = bloco_texto1 + bloco_texto2 + bloco_texto3 pagina = html_pag_generica.gera(ses, conteudo, erros) return pagina
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). utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args) # ---------------------------------------------------------------------- # Sessao de teste de usuário comum: ses_com = sessao.busca_por_identificador("S-00000001") assert ses_com != None assert not sessao.eh_administrador(ses_com) # Usuario comum de teste: usr_com = sessao.obtem_usuario(ses_com) assert usr_com != None usr_com_id = usuario.obtem_identificador(usr_com) usr_com_atrs = usuario.obtem_atributos(usr_com) # Sessao de teste de administrador: ses_adm = sessao.busca_por_identificador("S-00000004") assert ses_adm != None assert sessao.eh_administrador(ses_adm) # Usuario administrador de teste: usr_adm = sessao.obtem_usuario(ses_adm) assert usr_adm != None usr_adm_id = usuario.obtem_identificador(usr_adm) usr_adm_atrs = usuario.obtem_atributos(usr_adm) # Trechos de teste (somente id): trc1_id = "T-00000001" # Não encerrado. trc1 = trecho.busca_por_identificador(trc1_id)
# itens1 = compra.obtem_poltronas(cpr) # if itens1 != usr: # aviso_prog("retornou " + str(itens1) + ", deveria ter retornado " + str(usr),True) # ok = False if not ok: aviso_prog("teste falhou", True) ok_global = False sys.stderr.write("%s\n" % ("-" * 70)) return # ---------------------------------------------------------------------- sys.stderr.write("testando {compra.cria}:\n") nome_pass1 = usuario.obtem_atributos(usr1)['nome'] doc_pass1 = usuario.obtem_atributos(usr1)['documento'] compra1 = compra.cria(usr1, nome_pass1, doc_pass1) # print(compra.obtem_atributos(compra1)) compraIndice1 = 1 compraId1 = "C-00000001" verifica_compra("c1", compra1, compraId1, usr1, 'comprando', nome_pass1, doc_pass1) nome_pass2 = usuario.obtem_atributos(usr2)['nome'] doc_pass2 = usuario.obtem_atributos(usr2)['documento'] compra2 = compra.cria(usr2, nome_pass2, doc_pass2) compraIndice2 = 2 compraId2 = "C-00000002" verifica_compra("c2", compra2, compraId2, usr2, 'comprando', nome_pass2, doc_pass2)
sys.stderr.write("Conectando com base de dados...\n") res = base_sql.conecta("DB", None, None) assert res == None sys.stderr.write("Criando alguns objetos...\n") tabelas.cria_todos_os_testes(False) # Sessao de teste: ses = sessao.busca_por_identificador("S-00000001") assert ses != None # Usuario teste: usr1 = sessao.obtem_usuario(ses) assert usr1 != None usr1_id = usuario.obtem_identificador(usr1) usr1_atrs = usuario.obtem_atributos(usr1) def testa(rotulo, *args): """Testa {funcao(*args)}, grava resultado em "testes/saida/{modulo}.{funcao}.{rotulo}.html".""" modulo = html_pag_buscar_compras funcao = modulo.gera 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). utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args) for admin in (False, True): ad = "-a" + str(admin)
utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args) # fixtures sys.stderr.write("Conectando com base de dados...\n") res = base_sql.conecta("DB", None, None) assert res == None sys.stderr.write("Criando alguns objetos...\n") tabelas.cria_todos_os_testes(False) # Testes das funções de {gera_html_form}: usr1 = usuario.busca_por_identificador("U-00000001") assert usr1 != None id_usr1 = usuario.obtem_identificador(usr1) atrs_usr1 = usuario.obtem_atributos(usr1) assert not usuario.obtem_atributo(usr1, 'administrador') usr3 = usuario.busca_por_identificador("U-00000003") assert usr3 != None id_usr3 = usuario.obtem_identificador(usr3) atrs_usr3 = usuario.obtem_atributos(usr3) assert usuario.obtem_atributo(usr3, 'administrador') atrs_usr0 = atrs_usr1 del atrs_usr0['nome'] del atrs_usr0['telefone'] ht_bt_coisar = html_botao_submit.gera("Coisar", "coisar", {'coisa': "568"}, "#ffaa00")
def gera(cpr, editavel, texto_bt, comando_bt): # Obtem atributos a mostrar: valores = {}.copy() id_cpr = compra.obtem_identificador(cpr) atrs_cpr = compra.obtem_atributos(cpr) # Atributos da compra em si valores['id_cpr'] = id_cpr valores['status'] = atrs_cpr['status'] valores['nome_pass'] = atrs_cpr['nome_pass'] valores['doc_pass'] = atrs_cpr['doc_pass'] valores['preco_tot'] = ("%.2f" % compra.calcula_preco(cpr)) # valores['pagamento'] = atrs_cpr['pagamento'] # Cliente que está montando ou montou a compra: usr = compra.obtem_cliente(cpr) valores['id_usr'] = usuario.obtem_identificador(usr) atrs_usr = usuario.obtem_atributos(usr) valores['nome_usr'] = atrs_usr['nome'] # Bilhetes da compra: ids_pols = compra.obtem_poltronas(cpr) num_trechos = len(ids_pols) valores['n_trechos'] = str(num_trechos) if (num_trechos >= 1): # Obtém origem, data, e hora de partida do primeiro trecho: pol_ini = poltrona.busca_por_identificador(ids_pols[0]) id_trc_ini = poltrona.obtem_atributo(pol_ini, 'id_trecho') trc_ini = trecho.busca_por_identificador(id_trc_ini) origem = trecho.obtem_atributo(trc_ini, 'origem') dh_partida = trecho.obtem_dia_e_hora_de_partida(trc_ini) valores['partida'] = origem + " " + dh_partida # Obtém destino, data, e hora de chegada do último trecho: pol_fin = poltrona.busca_por_identificador(ids_pols[-1]) id_trc_fin = poltrona.obtem_atributo(pol_fin, 'id_trecho') trc_fin = trecho.busca_por_identificador(id_trc_fin) destino = trecho.obtem_atributo(trc_fin, 'destino') dh_chegada = trecho.obtem_dia_e_hora_de_chegada(trc_fin) valores['chegada'] = destino + " " + dh_chegada # Linhas para {html_table.gera}: linhas = ( html_cpr_campo("Compra", 'id_cpr', valores, 'text', None, False), html_cpr_campo("Cliente", 'id_usr', valores, 'text', None, False), html_cpr_campo("Nome do cliente", 'nome_usr', valores, 'text', None, False), html_cpr_campo("Nome do passageiro", 'nome_pass', valores, 'text', "Fulano da Silva", editavel), html_cpr_campo("Documento do passageiro", 'doc_pass', valores, 'text', "123.456.789-10", editavel), html_cpr_campo("Número de trechos", 'n_trechos', valores, 'text', None, False), html_cpr_campo("Preço total", 'preco_tot', valores, 'text', None, False), html_cpr_campo("Estado", 'status', valores, 'text', None, False), html_cpr_campo("Partida", 'partida', valores, 'text', None, False), html_cpr_campo("Chegada", 'chegada', valores, 'text', None, False), ) ht_campos = html_table.gera(linhas, ["", ""]) # Botões: if editavel: args_submit = { 'id_compra': id_cpr } # Argumentos adicionais para submissão. ht_submit = html_botao_submit.gera(texto_bt, comando_bt, args_submit, "#44ff44") ht_campos += "<br/>" + ht_submit return html_form.gera(ht_campos)
def gera(ses, usr, atrs, erros): # Obtem usuário da sessão, determina privilégios: usr_ses = None if ses == None else sessao.obtem_usuario(ses) if usr_ses == None: # Usuário que pediu não está logado: admin = False mesmo = False else: assert type(usr_ses) is usuario.Objeto_Usuario admin = usuario.obtem_atributo(usr_ses, "administrador") mesmo = (usr_ses == usr) if atrs == None: atrs = {}.copy() # Por via das dúvidas. ht_submit = "" ht_bt_cancel = "" if usr == None: # Cadastramento de novo usuário: id_usr = None ht_submit += html_botao_submit.gera("Cadastrar", "cadastrar_usuario", None, "#ff0000") titulo = "Novo usuário" else: # Visualização/alteração de usuário existente: assert usr_ses != None, "operação não autorizada sem login" assert admin or mesmo, "usuário não está autorizado a efetuar esta operação" assert type(usr) is usuario.Objeto_Usuario id_usr = usuario.obtem_identificador(usr) assert id_usr != None # Paranóia. if mesmo: titulo = f"Sua conta" else: titulo = f"Usuário {id_usr}" # Completa {atrs} com atributos de {usr}: atrs_usr = usuario.obtem_atributos(usr) assert atrs_usr != None # Paranóia for ch, val in atrs_usr.items(): if not ch in atrs: atrs[ch] = val # Botoes de ação: ht_submit += html_botao_submit.gera("Alterar", "alterar_usuario", None, "#ff0000") ht_bt_cancel = html_botao_simples.gera("Voltar", 'principal', None, "#ff2200") ht_titulo = "<h2>" + titulo + "</h2>" # Cria formulário: ht_form = html_form_dados_de_usuario.gera(id_usr, atrs, admin, ht_submit) # Botoes adicionais: ht_bt_linhas = [].copy() if usr != None and not mesmo: # Botões para administrador ver objetos associados a usuário: args_bt = {'id': id_usr} estilo_n = "font-family:\"Courier\";font-size:20;" n_compras = len(usuario.compras_abertas(usr)) ht_n_compras = html_span.gera(estilo_n, str(n_compras)) ht_bt_compras = html_botao_simples.gera("Ver compras", "ver_compras_de_usuario", args_bt, '#eeee55') ht_bt_linhas.append(( html_label.gera("Compras abertas", ":"), ht_n_compras, ht_bt_compras, )) n_sessoes = len(usuario.sessoes_abertas(usr)) ht_n_sessoes = html_span.gera(estilo_n, str(n_sessoes)) ht_bt_sessoes = html_botao_simples.gera("Ver sessões", "ver_sessoes_de_usuario", args_bt, '#eeee55') ht_bt_linhas.append(( html_label.gera("Sessoes abertas", ":"), ht_n_sessoes, ht_bt_sessoes, )) n_poltronas = len(usuario.poltronas_abertas(usr)) ht_n_poltronas = html_span.gera(estilo_n, str(n_poltronas)) ht_bt_poltronas = html_botao_simples.gera("Ver poltronas", "ver_poltronas_de_usuario", args_bt, '#eeee55') ht_bt_linhas.append(( html_label.gera("Poltronas abertas", ":"), ht_n_poltronas, ht_bt_poltronas, )) ht_bts_ver_coisas = html_table.gera(ht_bt_linhas, ( "", "", )) ht_conteudo = \ ht_titulo + \ ht_form + "<br/>\n" + \ ht_bts_ver_coisas + "<br/>" + \ ht_bt_cancel pag = html_pag_generica.gera(ses, ht_conteudo, erros) return pag