def define_carrinho(usr, id_usuario): """Esta função busca por compras em aberto do usuário {usr}. Se houver alguma nessa condição, então a com o MENOR indice contida no identificador sera usada como carrinho, caso contrário será criado um novo carrinho vazio. Identificador é dado por'C-{NNNNNNNN}'""" lista_ids_compras = compra.busca_por_cliente(id_usuario) # inicializo todos os identificadores com compras em aberto lista_ids_compras_abertos = [] if not lista_ids_compras: return compra.cria(usr) else: # define a posicao do elemento na lista_ids_compras_abertos comecando da posicao 0 posicao = 0 for id_compra in lista_ids_compras: obj_compra = compra.busca_por_identificador(id_compra) # pega a substring NNNNNNNN do identificador C-{NNNNNNNN}' substring_indice_compra = id_compra[2:10] if compra.obtem_status(obj_compra) == 'comprando': lista_ids_compras_abertos.insert(posicao, substring_indice_compra) posicao = posicao + 1 # seleciono o menor indice indice_minimo = min(lista_ids_compras_abertos) # monto o parametro identificador = "C-" + str(indice_minimo) # busco a compra em aberto com o menor indice no identificador obj_compra_identificador_min = compra.busca_por_identificador(identificador) return obj_compra_identificador_min return compra.cria(usr)
def compras_abertas(usr): id_usr = usuario.obtem_identificador(usr) ids_compras_usr = compra.busca_por_cliente( id_usr) # IDs das compras deste usuário. compras_usr = map(lambda id: compra.busca_por_identificador(id), ids_compras_usr) # Pega objetos. # Filtra apenas as compras que não estao finalizadas: abertas_usr = list( filter(lambda cpr: compra.obtem_status(cpr) != 'fechado', compras_usr)) return abertas_usr
def verifica_compra(rotulo, cpr, ident, cliente, status, nome_pass, doc_pass): """Testes básicos de consistência do objeto {cpr} da classe {Objeto_Compra}, dados {ident} e {atrs} esperados.""" global ok_global sys.stderr.write("%s\n" % ("-" * 70)) sys.stderr.write("verificando compra %s\n" % rotulo) atrs = { 'cliente': cliente, 'status': status, 'nome_pass': nome_pass, 'doc_pass': doc_pass } ok = compra.verifica(cpr, ident, atrs) if cpr != None and type(cpr) is compra.Objeto_Compra: sys.stderr.write("testando {obtem_cliente()}:\n") usr1 = compra.obtem_cliente(cpr) if usr1 != cliente: aviso_prog( "retornou " + str(usr1) + ", deveria ter retornado " + str(cliente), True) ok = False sys.stderr.write("testando {obtem_status()}:\n") status1 = compra.obtem_status(cpr) if status1 != status: aviso_prog( "retornou " + str(status1) + ", deveria ter retornado " + str(status), True) ok = False # erro na implementação de poltrona # sys.stderr.write("testando {obtem_poltronas()}:\n") # 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
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
import compra import tabelas import base_sql import utils_testes import sys 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 {html_form}: def testa(rotulo, *args): """Testa {funcao()}, grava resultado em "testes/saida/{modulo}.{funcao}.{rotulo}.html".""" modulo = html_form_escolher_pagamento funcao = modulo.gera frag = True # {True} se for apenas um fragmento HTML, {False} se for página completa. pretty = False # Se {True}, formata HTML para legibilidate (mas introduz brancos nos textos). utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args) cpr1 = compra.busca_por_identificador("C-00000002") assert compra.obtem_status(cpr1) == 'comprando' testa("N", cpr1)
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
# Dados para testes: # Um cliente comum: usrC_id = "U-00000001" usrC = usuario.busca_por_identificador(usrC_id) assert not usuario.obtem_atributo(usrC, 'administrador') # Um administrador: usrA_id = "U-00000003" usrA = usuario.busca_por_identificador(usrA_id) assert usuario.obtem_atributo(usrA, 'administrador') # Uma compra em aberto do cliente 1: cprC_id = "C-00000001" cprC = compra.busca_por_identificador(cprC_id) assert compra.obtem_status(cprC) == 'comprando' assert compra.obtem_cliente(cprC) == usrC # Uma compra fechada: cprF_id = "C-00000004" cprF = compra.busca_por_identificador(cprF_id) assert compra.obtem_status(cprF) != 'comprando' # Sessão do cliente 1: 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