def cria_linha(texto): """Cria uma linha de teste com {texto} dado.""" t1 = html_span.gera("font-family: 'Courier'; font-size: 30px", texto) t2 = html_span.gera( "font-family: 'Helvetica'; font-size: 20px; color: red", texto) t3 = html_span.gera( "font-family: 'Helvetica'; font-size: 20px; background-color: yellow", texto) linha = "<li>" + \ "Lorem ipsum" + t1 + \ "Gallia omnia" + t2 + \ "Quousque tandem" + t3 + \ "Pluribus unum" + \ "</li>" return linha
def gera(erros): if type(erros) is list or type(erros) is tuple: erros = "\n".join(erros) # Processa quebras de linha em {erros}: erros = re.sub(r'\n', r'<br/>Erro: \n', erros) # Formata as mensagens: estilo_erro = \ "font-family:Courier;" + \ "font-size:20px;" + \ "font-weight:bold;" + \ "padding: 2px;" + \ "text-align:left;" + \ "color: #880000;" ht_erros = html_span.gera(estilo_erro, erros) # Formata como parágrafo: estilo_parag = \ "margin-top:2px;" + \ "margin-bottom:2px;" + \ "text-indent:0px;" ht_res = html_paragrafo.gera(estilo_parag, ht_erros) return ht_res
def gera(ses, dados): # Converte dados no formato gerado por {trecho.resumo_de_trafego} para # formato aceito por {html_table} estilo_item = "font-family:Courier;font-size:20;" ht_linhas_dados = [].copy() for dado in dados: linha_porto = [].copy() # Codigo do aeroporto linha_porto.append(html_span.gera(estilo_item, str(dado[0]))) # Infos de chegada for ch_item in dado[1]: linha_porto.append(html_span.gera(estilo_item, str(ch_item))) # Infos de saida for sa_item in dado[2]: linha_porto.append(html_span.gera(estilo_item, str(sa_item))) ht_linha_porto = [html_span.gera(estilo_item, x) for x in linha_porto] ht_linhas_dados.append(ht_linha_porto) linha_cab = [].copy() linha_cab.append("Aeroporto") for lado in ("chegada", "saida"): for tt in ( \ "# de trechos", \ "# total de poltronas", \ "# de poltronas reservadas", \ "Total dos preços das poltronas reservadas", \ "# de passageiros que fizeram checkin" \ ): linha_cab.append(tt + " (" + lado + ")") estilo_cab = html_estilo_cabecalho_de_tabela.gera() ht_linha_cab = map(lambda x: html_span.gera(estilo_cab, x), linha_cab) ht_table = html_table.gera(ht_linhas_dados, ht_linha_cab) return html_pag_generica.gera(ses, ht_table, None)
def gera(conteudo): # define o estilo padrão: fam_fonte = "Courier" peso_fonte = None tam_fonte = "18px" estilo = \ " display: inline-block;" + \ " font-family: " + fam_fonte + ";" + \ " font-size: " + tam_fonte + ";" + \ " padding: 5px;" form = "<form>" + str(conteudo) + "</form>" ht = html_span.gera(estilo, form) return ht
def gera_legenda(fazer_checkin): estilo = "font-size:20px;font-weight:bold;" legenda_txt = \ "<br/>" + \ "NP = Número da poltrona<br/>" + \ "OF = Passagem em promoção<br/>" + \ "CK = Passageiro já fez checkin<br/>" + \ "EM = Passageiro já embarcou<br/>" ht_legenda = html_span.gera(estilo, legenda_txt) return ht_legenda
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
def gera(pol, id_compra, ver, excluir): # Atributos da poltrona: id_pol = poltrona.obtem_identificador(pol) atrs_pol = poltrona.obtem_atributos(pol) assert atrs_pol['id_compra'] == id_compra preco_pol = atrs_pol['preco'] numero_pol = atrs_pol['numero'] # Atributos do trecho da poltrona id_trecho = atrs_pol['id_trecho'] trc = trecho.busca_por_identificador(id_trecho) atrs_trc = trecho.obtem_atributos(trc) origem_trc = atrs_trc['origem'] dt_partida_trc = atrs_trc['dia_partida'] + ' ' + atrs_trc['hora_partida'] destino_trc = atrs_trc['destino'] dt_chegada_trc = atrs_trc['dia_chegada'] + ' ' + atrs_trc['hora_chegada'] # Campos da linha para {html_table.gera}: ht_trecho = html_span.gera(None, id_trecho) ht_origem = html_span.gera(None, origem_trc) ht_dt_partida = html_span.gera(None, dt_partida_trc) ht_destino = html_span.gera(None, destino_trc) ht_dt_chegada = html_span.gera(None, dt_chegada_trc) ht_numero = html_span.gera(None, numero_pol) ht_preco = html_span.gera(None, preco_pol) linha = [ \ ht_trecho, ht_origem, ht_dt_partida, ht_destino, ht_dt_chegada, ht_numero, ht_preco ] ver = True # Por enquanto. if ver: args_ver = {'id_poltrona': id_pol} ht_ver = html_botao_simples.gera("Ver", 'ver_poltrona', args_ver, '#60a3bc') linha.append(ht_ver) linha.append("</form>") if excluir: args_excluir = {'id_poltrona': id_pol, 'id_compra': id_compra} ht_excluir = html_botao_simples.gera("Excluir", 'excluir_poltrona', args_excluir, '#ff4422') linha.append(ht_excluir) return linha
def gera_cabecalho(fazer_checkin): campos = [].copy() # Campos a devolver # Devolve a linha de cabeçalho: estilo = html_estilo_cabecalho_de_tabela.gera() campos.append(html_span.gera(estilo, "NP")) # Número da poltrona. campos.append(html_span.gera(estilo, "Preço")) # Preço. campos.append(html_span.gera(estilo, "OF")) # É oferta? campos.append(html_span.gera(estilo, "Compra")) # Compra que reservou. campos.append(html_span.gera(estilo, "CK")) # Passageiro fez checkin? campos.append(html_span.gera(estilo, "EM")) # Passageiro embarcou? campos.append(""); # Botão "Ver". campos.append(""); # Botão "Alterar"/"Comprar"/"Excluir". if fazer_checkin: campos.append(html_span.gera(estilo, "Passageiro")) # Nome do passageiro. campos.append(html_span.gera(estilo, "Documento")) # Docmento do passageiro. campos.append("") # Botão "Checkin. return campos
def formata_dados_http(cmd, args, resto): """Esta função de depuração devolve um string que é um trecho de HTML5 a ser inserido no final de uma página. Ele mostra a função {cmd} que foi executada, o dicionário {args} com os argumentos da mesma, e o dicionário {resto} com os demais parâmetros do comando HTTP recebido, num formato razoavelmente legível.""" resto_d = resto.copy() tipo = resto_d['command'] del resto_d['command'] # 'GET', 'POST', ou 'HEAD' # Dados principais: args_lin = utils_testes.formata_dict(args) resto_lin = utils_testes.formata_dict(resto_d) # Monta um bloco HTML com os dados de depuração: texto = ("Resposta a comando HTTP \"%s\" recebido com dados principais:" % tipo) texto = texto + ("<br/>cmd = \"%s\"<br/>args =<br/>%s" % (cmd, args_lin)) texto = texto + ("<br/><hr/>Outros dados:<br/>%s" % resto_lin) estilo = f"font-family: Courier; font-size: 18px; font-weight: normal; padding: 5px; text-align: left;" conteudo = html_span.gera(estilo, texto) conteudo = "<hr/>\n" + html_div.gera("background-color:#bbbbbb;", conteudo) + "<hr/>\n" return conteudo
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
def formata_texto(txt): """Formata o texto {txt} com um estilo apropriado.""" estilo = "font-weight:bold" return html_span.gera(estilo, txt)
def gera_nome_usuario(nome_usuario): """Gera o texto "Oi {nome}" para o menu geral.""" res = html_span.gera(None, "Oi " + nome_usuario)
def gera(pol, alterar, comprar, excluir, fazer_checkin, embarcar): assert int(alterar) + int(comprar) + int(excluir) <= 1 # No máximo um deve ser "True" campos = [].copy() # Campos a devolver estilo = "font-size:20px;font-weight:bold;" # Obtem atributos da poltrona: id_pol = poltrona.obtem_identificador(pol) atrs_pol = poltrona.obtem_atributos(pol) numero = atrs_pol['numero'] preco = atrs_pol['preco'] oferta = atrs_pol['oferta'] # Se a poltrona está em oferta. id_cpr = atrs_pol['id_compra'] # Pedido de compra que reservou a poltrona, ou {None} fez_checkin = atrs_pol['fez_checkin'] # Passageiro já fez checkin? embarcou = atrs_pol['embarcou'] # Passageiro já embarcou? if id_cpr != None: # Poltrona está reservada. Determina a compra: cpr = compra.busca_por_identificador(id_cpr) assert cpr != None # Paranóia. else: # Poltrona está livre: cpr = None args_cmd = { 'íd_poltrona': id_pol } # Argumentos para os comandos. # Número da poltrona sempre aparece: ht_numero = html_span.gera(estilo, numero) campos.append(ht_numero) # Preço da poltrona senmpre aparece: ht_preco = html_span.gera(estilo, preco) campos.append(ht_preco) # Indicação de oferta sempre aparece: ht_oferta = html_span.gera(estilo + "color:'#ffbb00';", "★" if oferta else "") campos.append(ht_oferta) # Coluna de identificador da compra sempre aparece: ht_id_cpr = html_span.gera(estilo, id_cpr if cpr != None else "LIVRE") campos.append(ht_id_cpr); # Coluna de "fez checkin" sempre aparece: ht_fez_checkin = html_span.gera(estilo, "CK" if fez_checkin else "") campos.append(ht_fez_checkin); # Coluna de "embarcou" sempre aparece: ht_embarcou = html_span.gera(estilo, "EM" if embarcou else "") campos.append(ht_embarcou); # Coluna do botão "Ver" sempre aparece: ht_bt_ver = html_botao_simples.gera("Ver", "ver_poltrona", {'id_poltrona': id_pol}, "55ee55") campos.append(ht_bt_ver); # Coluna do botão de ação: if alterar: ht_bt_acao = html_botao_simples.gera("Alterar", "solicitar_pag_alterar_poltrona", args_cmd, '#bca360') elif comprar: ht_bt_acao = html_botao_simples.gera("Comprar", 'comprar_poltrona', args_cmd, '#ff0000') elif excluir: ht_bt_acao = html_botao_simples.gera("Excluir", 'excluir_poltrona', args_cmd, '#ff0000') else: ht_bt_acao = "" campos.append(ht_bt_acao); if fazer_checkin: # Campos para checkin: if cpr != None: # Nome e documento do passageiro, e botão de fazer checkin: nome_pass = compra.obtem_atributo(cpr, 'nome_pass') doc_pass = compra.obtem_atributo(cpr, 'doc_pass') ht_nome_pass = html_span.gera(estilo, nome_pass) campos.append(ht_nome_pass); ht_doc_pass = html_span.gera(estilo, doc_pass) campos.append(ht_doc_pass); if fez_checkin: ht_bt_checkin = "" else: # Apresentando o botão fazer checkin somente quando o status é pago if compra.obtem_atributo(cpr, 'status') == 'pago': ht_bt_checkin = html_botao_simples.gera("Checkin", 'fazer_checkin', args_cmd, '#55ee55') campos.append(ht_bt_checkin); else: # Campos em branco: campos.append(""); campos.append(""); campos.append(""); if embarcar: ht_bt_embarcar = "" if fez_checkin: ht_bt_embarcar = html_botao_simples.gera("Embarcar", 'embarcar', args_cmd, '#55ee55') campos.append(ht_bt_embarcar); return 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