Document service¶
The document service delivers reports from the Jasper reporting service with permission control.
Report source files (*.jrxml
) must be placed below the report_dir
(see config below).
The reports are then referenced by their template name, which corresponds to their path below report_dir
, without extension.
For instance report_dir
is /path/to/report/dir
, then the template name for
/path/to/report/dir/topic/myreport.jrxml
is topic/myreport
.
The request format is
http://localhost:5018/<template>.<ext>?<key>=<value>&...
where
ext
is a supported report format (pdf
,html
,csv
,docx
,ods
,odt
,pptx
,rtf
,xlsx
,xml
). If not specified,pdf
is assumed.- Query KVPs are passed to the Jasper as report parameters.
Example request:
http://localhost:5018/topic/myreport.pdf?FEATURE_ID=1
If your report uses a PostgresSQL data adapter, use the name of the desired PG service connection as data adapter name in the report, and the connection will be automatically looked up from the pg_service.conf
file. Alternatively, you can set the name of the desired PG service connection as datasource
of in the service resource configuration, see below.
You can generically pass the generic feature
query parameter, which will be resolved to the report feature parameter configured in the report query string. You can pass:
-
A single or a comma-separated list of feature ids, i.e.
http://localhost:5018/topic/myreport.pdf?feature=1,3,6,9
-
*
to specify all features of the report datasource, i.e.http://localhost:5018/topic/myreport.pdf?feature=*
If multiple feature ids are specified, an aggregated report for all specified features will be returned.
To map feature
to the report feature parameter, and to resolve feature=*
, the table name, primary key column and report feature parameter will be extracted, if possible, from the report query string, which is expected to be of the form
SELECT <...> FROM <table_name> WHERE <pk_column> = $P{<FEATURE_PARAM_NAME>}
For more complex queries, you'll need to define table
, primary_key
and parameter_name
in the report resource configuration, see below. Note that the value(s) of the feature
query parameters are expected to be primary keys of the records of the table specified in the report query string.
If your report includes external resources (i.e. images), place these below the report_dir
and, add a REPORT_DIR
parameter of type java.lang.String
in the .jrxml
and use $P{REPORT_DIR}
in the resource location expression, for example:
$P{REPORT_DIR} + "mysubfolder/myimage.png"
If you may have a very large amount of input data, the report generation might result in a very large output file. This can lead to an Out-of-memory exception. To handle this, a "Virtualizer" could be used, which will cut the report into different files and save them on the hard drive during the generation process. The result generally makes the generation of the report a bit slower but it will solve the memory exception. To use a "JRSwapFileVirtualizer" for report generation, the virtualizer
configuration has to be set (see example below).
If your report requires extra fonts, place the *.ttfs
below the src/fonts
directory (when running locally) resp. mount them inside the /srv/qwc_service/fonts/
when running as docker container. Font names must respect the following naming convention:
- Regular:
<FontName>.ttf
or<FontName>-Regular.ttf
- Bold:
<FontName>-Bold.ttf
- Italic:
<FontName>-Italic.ttf
- BoldItalic:
<FontName>-BoldItalic.ttf
Set FLASK_DEBUG=1
to get additional logging output.
Configuration¶
The static config files are stored as JSON files in $CONFIG_PATH
with subdirectories for each tenant,
e.g. $CONFIG_PATH/default/*.json
. The default tenant name is default
.
JSON config¶
- JSON schema
- File location:
$CONFIG_PATH/<tenant>/documentConfig.json
Example:
{
"$schema": "https://raw.githubusercontent.com/qwc-services/qwc-document-service/master/schemas/qwc-document-service.json",
"service": "document",
"config": {
"report_dir": "/path/to/report/dir",
"max_memory": "1024M",
"virtualizer": {
"swapfile_blocksize": 4096,
"swapfile_mingrowcount" : 100,
"virtualizer_maxsize": 1
}
},
"resources": {
"document_templates": [
{
"template": "demo",
"datasource": "<pgservice_name>",
"table": "<table_name>",
"primary_key": "<primary_key_column_name>",
"parameter_name": "<report_parameter_name>"
}
]
}
}
Environment variables¶
Config options in the config file can be overridden by equivalent uppercase environment variables.
Permissions¶
- JSON schema
- File location:
$CONFIG_PATH/<tenant>/permissions.json
Example:
{
"$schema": "https://raw.githubusercontent.com/qwc-services/qwc-services-core/master/schemas/qwc-services-permissions.json",
"users": [
{
"name": "demo",
"groups": ["demo"],
"roles": []
}
],
"groups": [
{
"name": "demo",
"roles": ["demo"]
}
],
"roles": [
{
"role": "public",
"permissions": {
"document_templates": [
"demo",
"another demo"
]
}
},
{
"role": "demo",
"permissions": {
"document_templates": []
}
}
]
}
Usage¶
API documentation:
http://localhost:5018/api/
Request format:
http://localhost:5018/<template>?<key>=<value>&...
Example:
http://localhost:5018/BelasteteStandorte.pdf
Arbitrary parameters can be appended to the request:
http://localhost:5018/BelasteteStandorte.pdf?feature=123
The format of the report is extracted from the template name, i.e.
http://localhost:5018/BelasteteStandorte.xls?feature=123
If no extension is present in the template name, PDF is used as format.
Docker usage¶
To run this docker image you will need a running jasper reporting service.
The following steps explain how to download a jasper reporting service docker image and how to run the qwc-document-service
with docker-compose
.
Step 1: Clone qwc-docker
git clone https://github.com/qwc-services/qwc-docker
cd qwc-docker
Step 2: Create docker-compose.yml file
cp docker-compose-example.yml docker-compose.yml
Step 3: Start docker containers
docker-compose up qwc-document-service
For more information please visit: https://github.com/qwc-services/qwc-docker
Development¶
Create a virtual environment:
python3 -m venv .venv
Activate virtual environment:
source .venv/bin/activate
Install requirements:
pip install -r requirements.txt
wget -P src/libs -i libs.txt
Start local service:
CONFIG_PATH=/PATH/TO/CONFIGS/ python src/server.py
Testing¶
Run all tests:
FLASK_DEBUG=1 PYTHONPATH=$PWD/src FONT_DIR=$PWD/tests/fonts CONFIG_PATH=$PWD/tests/config/ python test.py