From 7bbdbdac70f9eadc94e2aec3838ae15635acbb21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Setni=C4=8Dka?= <setnicka@seznam.cz> Date: Sat, 19 Feb 2022 17:52:33 +0100 Subject: [PATCH] =?UTF-8?q?Table:=20Zaveden=C3=AD=20in=5Fhtml=20a=20in=5Fe?= =?UTF-8?q?xport=20na=20Column?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pro zjednodušení vyrábění sloupečků a jako příprava na volbu sloupečků pro export. --- mo/web/table.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/mo/web/table.py b/mo/web/table.py index bc067d8e..4b76d8f8 100644 --- a/mo/web/table.py +++ b/mo/web/table.py @@ -4,7 +4,7 @@ from flask import Response, url_for from html import escape import io from markupsafe import Markup -from typing import Any, Dict, Sequence, Optional, Iterable, Union +from typing import Any, Dict, List, Sequence, Optional, Iterable, Union import urllib.parse import werkzeug.exceptions @@ -19,11 +19,15 @@ class Column: key: str # Jméno klíče ve slovnících name: str # Název v hlavičce CSV title: str # Titulek v HTML tabulkách + in_html: bool # Jestli sloupec zobrazit na webu + in_export: Optional[bool] # Jestli sloupec defaultně exportovat, None = ani nenabízet - def __init__(self, key: str, name: Optional[str] = None, title: Optional[str] = None): + def __init__(self, key: str, name: Optional[str] = None, title: Optional[str] = None, in_html: bool = True, in_export: Optional[bool] = True): self.key = key self.name = name or key self.title = title or self.name + self.in_html = in_html + self.in_export = in_export class Cell: @@ -165,6 +169,8 @@ class Table: tab = [f'<table class="{self.table_class}" id="{self.id}">', '<thead>', '<tr>'] for c in self.columns: + if not c.in_html: + continue tab.append(f'\t<th>{c.title}') tab.append('<tbody>') @@ -173,6 +179,8 @@ class Table: r_attr = [f' {key}="{val}"' for (key, val) in r.html_attr.items()] tab.append(f'<tr{"".join(r_attr)}>') for c in self.columns: + if not c.in_html: + continue val = r.get(c.key) if isinstance(val, Cell): tab.append(val.to_html()) @@ -184,29 +192,29 @@ class Table: tab.append("<p>Stáhnout jako <a href='?format=en_csv'>CSV s čárkami</a>, <a href='?format=cs_csv'>CSV se středníky</a> nebo <a href='?format=tsv'>TSV</a>.") return Markup("\n".join(tab)) - def to_csv(self, fmt: FileFormat) -> bytes: + def to_csv(self, fmt: FileFormat, export_columns: List[Column]) -> bytes: out = io.StringIO() writer = csv.writer(out, dialect=fmt.get_dialect()) - header = [c.name for c in self.columns] + header = [c.name for c in export_columns] writer.writerow(header) for row in self.rows: - r = [row.get(c.key) for c in self.columns] + r = [row.get(c.key) for c in export_columns] writer.writerow(r) return out.getvalue().encode(fmt.get_charset()) - def to_csv_stream(self, fmt: FileFormat) -> Iterable[bytes]: + def to_csv_stream(self, fmt: FileFormat, export_columns: List[Column]) -> Iterable[bytes]: out = io.StringIO() writer = csv.writer(out, dialect=fmt.get_dialect()) - header = [c.name for c in self.columns] + header = [c.name for c in export_columns] writer.writerow(header) nrows = 0 for row in self.rows: - r = [row.get(c.key) for c in self.columns] + r = [row.get(c.key) for c in export_columns] writer.writerow(r) nrows += 1 @@ -224,10 +232,12 @@ class Table: except ValueError: raise werkzeug.exceptions.NotFound() + export_columns = [c for c in self.columns if c.in_export] + if streaming: - resp = Response(self.to_csv_stream(fmt)) + resp = Response(self.to_csv_stream(fmt, export_columns)) else: - out = self.to_csv(fmt) + out = self.to_csv(fmt, export_columns) resp = app.make_response(out) resp.content_type = fmt.get_content_type() -- GitLab