from dectate import Action
from morepath.directive import HtmlAction
from morepath.directive import ViewAction
from morepath.request import Response
from onegov.core.csv import convert_list_of_dicts_to_csv
from onegov.core.custom import json
from onegov.core.directives import HtmlHandleFormAction
from onegov.core.security import Private
from onegov.core.security import Public
from onegov.core.security import Secret
from onegov.election_day.forms import EmptyForm
from webob.exc import HTTPAccepted
from typing import cast
from typing import Any
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Callable
from collections.abc import Iterable
from onegov.core.request import CoreRequest
from typing import Protocol
from webob import Response as BaseResponse
from wtforms import Form
class ScreenWidget(InputScreenWidget, Protocol):
category: str
[docs]
class ManageHtmlAction(HtmlAction):
""" HTML directive for manage views which makes sure the permission is set
to private.
"""
def __init__[RequestT: CoreRequest](
self,
model: type,
render: Callable[[Any, RequestT], BaseResponse] | None = None,
template: str | None = None,
load: Callable[[RequestT], Any] | None = None,
permission: object | None = None,
internal: bool = False,
**predicates: Any,
) -> None:
super().__init__(
model,
render,
template,
load,
Secret if permission == Secret else Private,
internal,
**predicates
)
[docs]
def render_svg(content: dict[str, Any], request: CoreRequest) -> Response:
path = content.get('path')
name = content.get('name')
if not path:
raise HTTPAccepted()
svg_content = None
fs = request.app.filestorage
assert fs is not None
with fs.open(path, 'r') as f:
svg_content = f.read()
return Response(
svg_content,
content_type='application/svg; charset=utf-8',
content_disposition=f'inline; filename={name}'
)
[docs]
def render_pdf(content: dict[str, Any], request: CoreRequest) -> Response:
path = content.get('path')
name = content.get('name')
if not path:
raise HTTPAccepted()
pdf_content = None
fs = request.app.filestorage
assert fs is not None
with fs.open(path, 'rb') as f:
pdf_content = f.read()
return Response(
pdf_content,
content_type='application/pdf',
content_disposition=f'inline; filename={name}.pdf'
)
[docs]
def render_json(content: dict[str, Any], request: CoreRequest) -> Response:
data = content.get('data', {})
name = content.get('name', 'data')
response = Response(
json.dumps_bytes(data, sort_keys=True, indent=2),
content_type='application/json; charset=utf-8',
content_disposition=f'inline; filename={name}.json',
)
if request.method in ('GET', 'HEAD'):
response.headers['Access-Control-Allow-Origin'] = '*'
return response
[docs]
def render_csv(content: dict[str, Any], request: CoreRequest) -> Response:
data = content.get('data', {})
name = content.get('name', 'data')
response = Response(
convert_list_of_dicts_to_csv(data),
content_type='text/csv',
content_disposition=f'inline; filename={name}.csv',
)
if request.method in ('GET', 'HEAD'):
response.headers['Access-Control-Allow-Origin'] = '*'
return response
[docs]
class SvgFileViewAction(ViewAction):
""" View directive for viewing SVG files from filestorage. The SVGs
are created using a cronjob and might not be available. """
def __init__[RequestT: CoreRequest](
self,
model: type,
load: Callable[[RequestT], Any] | None = None,
permission: object = Public,
internal: bool = False,
**predicates: Any,
) -> None:
super().__init__(
model,
render_svg,
None,
load,
permission,
internal,
**predicates
)
[docs]
class PdfFileViewAction(ViewAction):
""" View directive for viewing PDF files from filestorage. The PDFs
are created using a cronjob and might not be available. """
def __init__[RequestT: CoreRequest](
self,
model: type,
load: Callable[[RequestT], Any] | None = None,
permission: object = Public,
internal: bool = False,
**predicates: Any,
) -> None:
super().__init__(
model,
render_pdf,
None,
load,
permission,
internal,
**predicates
)
[docs]
class JsonFileAction(ViewAction):
""" View directive for viewing JSON data as file. """
def __init__[RequestT: CoreRequest](
self,
model: type,
load: Callable[[RequestT], Any] | None = None,
permission: object = Public,
internal: bool = False,
**predicates: Any,
) -> None:
super().__init__(
model,
render_json,
None,
load,
permission,
internal,
**predicates
)
[docs]
class CsvFileAction(ViewAction):
""" View directive for viewing CSV data as file. """
def __init__[RequestT: CoreRequest](
self,
model: type,
load: Callable[[RequestT], Any] | None = None,
permission: object = Public,
internal: bool = False,
**predicates: Any,
) -> None:
super().__init__(
model,
render_csv,
None,
load,
permission,
internal,
**predicates
)