core.directives

Classes

HtmlHandleFormAction

Register Form view.

CronjobAction

Register a cronjob.

AnalyticsProviderAction

Register an analytics provider.

StaticDirectoryAction

Registers a static files directory.

TemplateVariablesAction

Registers a set of global template variables for chameleon templates.

ReplaceSettingSectionAction

Register application setting in a section.

ReplaceSettingAction

A setting action that takes precedence over a replaced section.

Layout

Registers a layout for a model. This is used to show breadcrumbs

ExtendedJsonAction

Extends the morepath json directive with an open_data parameter.

Functions

fetch_form_class(→ type[FormT])

Given the form_class defined with the form action, together with

query_form_class(→ type[wtforms.Form] | None)

Queries the app configuration for the form class associated with

wrap_with_generic_form_handler(...)

Wraps a view handler with generic form handling.

render_json_open_data(→ webob.Response)

Like morepath.render_json(), but adds an

Module Contents

class core.directives.HtmlHandleFormAction(model: type, form: type[wtforms.Form] | collections.abc.Callable[[Any, RequestT], type[wtforms.Form]], render: collections.abc.Callable[[Any, RequestT], webob.Response] | None = None, template: str | None = None, load: collections.abc.Callable[[RequestT], Any] | None = None, permission: object | None = None, internal: bool = False, pass_model: bool = False, **predicates: Any)[source]

Bases: morepath.directive.HtmlAction

Register Form view.

Basically wraps the Morepath’s html directive, registering both POST and GET (if no specific request method is given) and wrapping the view handler with wrap_with_generic_form_handler().

The form is either a class or a function. If it’s a function, it is expected to return a form class when given an instance of the model.

The form may also be None, which is useful under special circumstances. Generally you don’t want that though.

Example:

@App.form(model=Root, template='form.pt',
          permission=Public, form=LoginForm)
def handle_form(self, request, form):
    if form.submitted():
        # do something if the form was submitted with valid data
    else:
        # do something if the form was not submitted or not
        # submitted correctly

    return {}  # template variables
form[source]
pass_model = False[source]
perform[RequestT: onegov.core.request.CoreRequest](obj: collections.abc.Callable[[Any, RequestT, Any], Any], *args: Any, **kwargs: Any) → None[source]
core.directives.fetch_form_class[FormT: wtforms.Form, RequestT: onegov.core.request.CoreRequest](form_class: type[FormT] | collections.abc.Callable[[Any, RequestT], type[FormT]], model: object, request: RequestT) → type[FormT][source]

Given the form_class defined with the form action, together with model and request, this function returns the actual class to be used.

core.directives.query_form_class(request: onegov.core.request.CoreRequest, model: object, name: str | None = None) → type[wtforms.Form] | None[source]

Queries the app configuration for the form class associated with the given model and name. Take this configuration for example:

@App.form(model=Model, form_class=Form, name='foobar')
...

The form class defined here can be retrieved as follows:

query_form_class(request, model=Model, name=’foobar’)

core.directives.wrap_with_generic_form_handler[T, RequestT: onegov.core.request.CoreRequest, FormT: wtforms.Form](obj: collections.abc.Callable[[T, RequestT, FormT], Any], form_class: type[FormT] | collections.abc.Callable[[T, RequestT], type[FormT]], pass_model: bool) → collections.abc.Callable[[T, RequestT], Any][source]

Wraps a view handler with generic form handling.

This includes instantiating the form with translations/csrf protection and setting the correct action.

class core.directives.CronjobAction(hour: int | str, minute: int | str, timezone: str, once: bool = False)[source]

Bases: dectate.Action

Register a cronjob.

config[source]

Describe configuration.

A dict mapping configuration names to factory functions. The resulting configuration objects are passed into Action.identifier(), Action.discriminators(), Action.perform(), and Action.before() and Action.after().

After commit completes, the configured objects are found as attributes on App.config.

counter: ClassVar[source]
hour[source]
minute[source]
timezone[source]
name[source]
once = False[source]
identifier(**kw: Any) → int[source]
perform(func: collections.abc.Callable[[onegov.core.request.CoreRequest], Any], cronjob_registry: onegov.core.utils.Bunch) → None[source]
class core.directives.AnalyticsProviderAction(name: str, title: str)[source]

Bases: dectate.Action

Register an analytics provider.

config[source]

Describe configuration.

A dict mapping configuration names to factory functions. The resulting configuration objects are passed into Action.identifier(), Action.discriminators(), Action.perform(), and Action.before() and Action.after().

After commit completes, the configured objects are found as attributes on App.config.

name[source]
title[source]
identifier(analytics_provider_registry: dict[str, core.analytics.AnalyticsProvider]) → str[source]
perform(func: type[core.analytics.AnalyticsProvider], analytics_provider_registry: dict[str, type[core.analytics.AnalyticsProvider]]) → None[source]
class core.directives.StaticDirectoryAction[source]

Bases: dectate.Action

Registers a static files directory.

config[source]

Describe configuration.

A dict mapping configuration names to factory functions. The resulting configuration objects are passed into Action.identifier(), Action.discriminators(), Action.perform(), and Action.before() and Action.after().

After commit completes, the configured objects are found as attributes on App.config.

counter: ClassVar[source]
name[source]
identifier(staticdirectory_registry: onegov.core.utils.Bunch) → int[source]
perform(func: collections.abc.Callable[..., Any], staticdirectory_registry: onegov.core.utils.Bunch) → None[source]
class core.directives.TemplateVariablesAction[source]

Bases: dectate.Action

Registers a set of global template variables for chameleon templates.

Only exists once per application. Template variables defined in child applications completely replace the variables defined by the parent application.

Example:

@App.template_variables()
def get_template_variables(request):
    return {
        'foo': 'bar'
    }
config[source]

Describe configuration.

A dict mapping configuration names to factory functions. The resulting configuration objects are passed into Action.identifier(), Action.discriminators(), Action.perform(), and Action.before() and Action.after().

After commit completes, the configured objects are found as attributes on App.config.

depends[source]

List of other action classes to be executed before this one.

The depends class attribute contains a list of other action classes that need to be executed before this one is. Actions which depend on another will be executed after those actions are executed.

Omit if you don’t care about the order.

section = 'templatevariables'[source]
identifier(setting_registry: morepath.settings.SettingRegistry) → str[source]
perform(func: collections.abc.Callable[[onegov.core.request.CoreRequest], dict[str, Any]], setting_registry: morepath.settings.SettingRegistry) → None[source]
class core.directives.ReplaceSettingSectionAction(section: str)[source]

Bases: dectate.Action

Register application setting in a section.

In contrast to the regular SettingSectionAction this completely replaces the existing section.

config[source]

Describe configuration.

A dict mapping configuration names to factory functions. The resulting configuration objects are passed into Action.identifier(), Action.discriminators(), Action.perform(), and Action.before() and Action.after().

After commit completes, the configured objects are found as attributes on App.config.

depends[source]

List of other action classes to be executed before this one.

The depends class attribute contains a list of other action classes that need to be executed before this one is. Actions which depend on another will be executed after those actions are executed.

Omit if you don’t care about the order.

section[source]
identifier(**kw: Any) → str[source]
perform(obj: collections.abc.Callable[[], collections.abc.Mapping[str, Any]], setting_registry: morepath.settings.SettingRegistry) → None[source]
class core.directives.ReplaceSettingAction(section: str, name: str)[source]

Bases: morepath.directive.SettingAction

A setting action that takes precedence over a replaced section.

So we can override single settings without overriding the whole section.

depends[source]

List of other action classes to be executed before this one.

The depends class attribute contains a list of other action classes that need to be executed before this one is. Actions which depend on another will be executed after those actions are executed.

Omit if you don’t care about the order.

class core.directives.Layout(model: type)[source]

Bases: dectate.Action

Registers a layout for a model. This is used to show breadcrumbs for search results.

app_class_arg = True[source]

Pass in app class as argument.

In addition to the arguments defined in Action.config, pass in the app class itself as an argument into Action.identifier(), Action.discriminators(), Action.perform(), and Action.before() and Action.after().

depends[source]

List of other action classes to be executed before this one.

The depends class attribute contains a list of other action classes that need to be executed before this one is. Actions which depend on another will be executed after those actions are executed.

Omit if you don’t care about the order.

filter_convert[source]

Map of names to convert functions.

The query tool that can be generated for a Dectate-based application uses this information to parse filter input into actual objects. If omitted it defaults to passing through the string unchanged.

A conversion function takes a string as input and outputs a Python object. The conversion function may raise ValueError if the conversion failed.

A useful conversion function is provided that can be used to refer to an object in a module using a dotted name: convert_dotted_name().

filter_compare[source]

Map of names used in query filter to comparison functions.

If for instance you want to be able check whether the value of model on the action is a subclass of the value provided in the filter, you can provide it here:

filter_compare = {
    'model': issubclass
}

The default filter compare is an equality comparison.

model[source]
identifier(app_class: type[onegov.core.Framework]) → str[source]
perform(obj: type[onegov.core.layout.Layout], app_class: type[onegov.core.Framework]) → None[source]
core.directives.render_json_open_data(content: object, request: morepath.Request) → webob.Response[source]

Like morepath.render_json(), but adds an Access-Control-Allow-Origin: * header to GET and HEAD responses, making the endpoint accessible from browser scripts on any origin.

class core.directives.ExtendedJsonAction(model: type, render: collections.abc.Callable[[Any, Any], webob.Response] | None = None, template: str | None = None, load: collections.abc.Callable[[Any], Any] | None = None, permission: object = None, internal: bool = False, open_data: bool = False, **predicates: Any)[source]

Bases: morepath.directive.JsonAction

Extends the morepath json directive with an open_data parameter.

When open_data=False (the default), the views should not be publicly accessible cross-origin.

When open_data=True, the view’s GET and HEAD responses will include an Access-Control-Allow-Origin: * header, making it usable from browser scripts on any origin.