Skip to content
Snippets Groups Projects
Commit 76f5d19d authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Table: Vybírání sloupečků pro export

Při show_downlink včetně vypsání checkboxů, pokud se používají alternativně generované
odkazy, poslouží pomocné metoda get_columns_checkboxes().

Issue #182
parent d5110215
No related branches found
No related tags found
1 merge request!115Výběr sloupečků v exportech
This commit is part of merge request !115. Comments created here will be created in the context of that merge request.
...@@ -6,6 +6,7 @@ import io ...@@ -6,6 +6,7 @@ import io
from markupsafe import Markup from markupsafe import Markup
from typing import Any, Dict, List, Sequence, Optional, Iterable, Union from typing import Any, Dict, List, Sequence, Optional, Iterable, Union
import urllib.parse import urllib.parse
from werkzeug.datastructures import ImmutableMultiDict
import werkzeug.exceptions import werkzeug.exceptions
from mo.csv import FileFormat from mo.csv import FileFormat
...@@ -189,9 +190,33 @@ class Table: ...@@ -189,9 +190,33 @@ class Table:
tab.append('</table>') tab.append('</table>')
if self.show_downlink: if self.show_downlink:
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>.") id = 'column-selection-toggle-' + self.id
tab.extend([
'<form method="GET">',
' <p>Stáhnout jako <button class="btn btn-default btn-xs" name="format" value="en_csv">CSV s čárkami</button>,',
' <button class="btn btn-default btn-xs" name="format" value="cs_csv">CSV se středníky</button> nebo <button class="btn btn-default btn-xs" name="format" value="tsv">TSV</button>.',
f' <div class="collapsible"><input type="checkbox" class="toggle" id="{id}">',
f' <label for="{id}" class="toggle toggle-small">Vybrat sloupce pro stažení</label>',
' <div class="collapsible-inner"><div class="form-frame">',
self.get_columns_checkboxes(line_prefix=" "),
' </div></div>',
' </div>',
'</form>',
])
return Markup("\n".join(tab)) return Markup("\n".join(tab))
def get_columns_checkboxes(self, line_prefix: str = "", args: Optional[ImmutableMultiDict] = None) -> Markup:
out = [line_prefix + '<input type="hidden" name="do_column_selection" value="1">']
for c in self.columns:
if c.in_export is None:
continue
checked = c.in_export
if args is not None and args.get('do_column_selection') is not None:
checked = args.get('column_' + c.name) is not None
out.append(f'{line_prefix}<div class="checkbox show"><label><input name="column_{c.name}" type="checkbox"{" checked" * checked} value="1">{c.title} <small>(<code>{c.name}</code></small>)</label></div>')
return Markup("\n".join(out))
def to_csv(self, fmt: FileFormat, export_columns: List[Column]) -> bytes: def to_csv(self, fmt: FileFormat, export_columns: List[Column]) -> bytes:
out = io.StringIO() out = io.StringIO()
writer = csv.writer(out, dialect=fmt.get_dialect()) writer = csv.writer(out, dialect=fmt.get_dialect())
...@@ -226,13 +251,18 @@ class Table: ...@@ -226,13 +251,18 @@ class Table:
yield out.getvalue().encode(fmt.get_charset()) yield out.getvalue().encode(fmt.get_charset())
def send_as(self, format: Union[FileFormat, str], streaming: bool = False) -> Response: def send_as(self, format: Union[FileFormat, str], streaming: bool = False, args: Optional[ImmutableMultiDict] = None) -> Response:
try: try:
fmt = FileFormat.coerce(format) fmt = FileFormat.coerce(format)
except ValueError: except ValueError:
raise werkzeug.exceptions.NotFound() raise werkzeug.exceptions.NotFound()
export_columns = [c for c in self.columns if c.in_export] export_columns = [c for c in self.columns if c.in_export]
if args is not None and args.get('do_column_selection') is not None:
export_columns = [c for c in self.columns if args.get('column_' + c.name) is not None]
if len(export_columns) == 0:
raise werkzeug.exceptions.BadRequest("Žádné sloupce v exportu, musíte zvolit alespoň jeden")
if streaming: if streaming:
resp = Response(self.to_csv_stream(fmt, export_columns)) resp = Response(self.to_csv_stream(fmt, export_columns))
......
...@@ -388,6 +388,10 @@ div.alert + div.alert { ...@@ -388,6 +388,10 @@ div.alert + div.alert {
cursor: pointer; cursor: pointer;
margin-left: 15px; margin-left: 15px;
} }
.collapsible label.toggle-small {
font-weight: normal;
margin-bottom: 0px;
}
.collapsible label.toggle::before { .collapsible label.toggle::before {
position: absolute; position: absolute;
content: ""; content: "";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment