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