Frontend Design
Frontend endpoints are invoked depending on the URL requested by the client as mapped to
in cdedb/frontend/paths.py
. Each endpoint is a python function responsible for
aggregating the requested information from the backend and
returning a rendered template or redirect.
Todo
Add information on abstract stuff
See also
A rough overview about the general control flow upon a request can be found in the development chapter at A typical request.
Input handling
For retrieving user input from POST-requests, there are the REQUEST*
decorators in
cdedb.frontend.common
, furthermore the request_extractor
functions for
some rare use cases where it is not known at the beginning which data is needed.
In general, you should always provide feedback on user input, which basically means
every POST action should cause a meaningful notification. The notification mostly tells
about success or failure of input validation.
Remember to check successful validation before doing any processing, since the backend
raises errors on invalid data.
Cron jobs
All tasks which are designed to be executed regularly in an automated way, like syncing
with the mailinglist software or cleaning up the database, are represented by a frontend
function with the @periodic
decorator.
This decorator sets an additional cron
attribute on the function, that is a dict
containing an identifier and the interval (measured in executions of the cron frontend,
see below) in which to run that job.
Every periodic function is given the RequestState
and a dict conventionally named
store
as parameters. This store is to be saved in the database between the single
runs, thus the function should return an updated version of it. The function should also
take care of proper initialisation of the store if it is empty, as that is the case if
there was no execution of the task before.
To take care of the stores and actually run the tasks, we have the CronFrontend
found in cdedb.frontend.cron
, whose execute
function sets up a basic
RequestState
, searches for periodic functions and executes them. This should be done
every 15 minutes (commonly via system cron) and can be run using the cron_execute.py
script for convenience.