From a92694677ad5f9104de7a72f0b09ef56b1562e32 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 4 Feb 2021 20:00:59 +1100 Subject: [PATCH 1/4] Update report docs - Remove LaTeX references - Better docs on uploading report templates (but not good enough yet!) --- _includes/config.yaml | 13 --- docs/extend/plugins.md | 2 +- docs/releases/0.1.6.md | 11 +++ docs/report/report.md | 177 ++++++++++++++++++++++++++++++++--------- docs/start/config.md | 7 -- mkdocs.yml | 9 ++- 6 files changed, 155 insertions(+), 64 deletions(-) diff --git a/_includes/config.yaml b/_includes/config.yaml index c655ffd..18e3197 100644 --- a/_includes/config.yaml +++ b/_includes/config.yaml @@ -107,19 +107,6 @@ static_root: '../inventree_static' # If unspecified, the local user's temp directory will be used #backup_dir: '/home/inventree/backup/' -# LaTeX report rendering -# InvenTree uses the django-tex plugin to enable LaTeX report rendering -# Ref: https://pypi.org/project/django-tex/ -# Note: Ensure that a working LaTeX toolchain is installed and working *before* starting the server -latex: - # Select the LaTeX interpreter to use for PDF rendering - # Note: The intepreter needs to be installed on the system! - # e.g. to install pdflatex: apt-get texlive-latex-base - enabled: False - interpreter: pdflatex - # Extra options to pass through to the LaTeX interpreter - options: '' - # Permit custom authentication backends #authentication_backends: # - 'django.contrib.auth.backends.ModelBackend' diff --git a/docs/extend/plugins.md b/docs/extend/plugins.md index 30fab08..9a230c7 100644 --- a/docs/extend/plugins.md +++ b/docs/extend/plugins.md @@ -14,7 +14,7 @@ Multiple plugins are supported: ### Reporting Plugins -InvenTree can generate customized reports (for example stocktake information, packing lists, acceptance test reports, etc). The reporting interface is extremely versatile, allowing the generation of reports in multiple formats (PDF / LaTeX / etc). +InvenTree can generate customized reports (for example stocktake information, packing lists, acceptance test reports, etc). !!! missing "TODO" Include more information here on reporting plugins diff --git a/docs/releases/0.1.6.md b/docs/releases/0.1.6.md index 9150696..9ca8351 100644 --- a/docs/releases/0.1.6.md +++ b/docs/releases/0.1.6.md @@ -8,6 +8,17 @@ title: v0.1.5 ## New Features +### Report Templates + +Support for report templates has been greatly improved, moving towards "out of the box" support for various reports. + +[#1270](https://github.com/inventree/InvenTree/pull/1270) represents a significant refactor of code, and tooling for report functionality. + +Refer to the [report documentation](../../report/report) for further information. + +!!! warning "LaTeX Support" + LaTeX report templates are no longer supported. + ## Major Bug Fixes | PR | Description | | --- | --- | diff --git a/docs/report/report.md b/docs/report/report.md index 6d5b568..4f4f5dc 100644 --- a/docs/report/report.md +++ b/docs/report/report.md @@ -6,62 +6,161 @@ title: Report Generation InvenTree supports a customizable reporting ecosystem, allowing the user to develop reporting templates that meet their particular needs. -PDF reports can be generated from either [HTML](https://github.com/fdemmer/django-weasyprint) or [LaTeX](https://github.com/weinbusch/django-tex) template files which are written by the user. +PDF reports are generated from custom HTML template files which are written by the user. Reports are used in a variety of situations to format data in a friendly format for printing, distribution, conformance and testing. In addition to providing the ability for end-users to provide their own reporting templates, some report types offer "built-in" report templates ready for use. -## Report Types +### WeasyPrint Templates -Following is a list of available report types +InvenTree report templates utilize the powerful [WeasyPrint](https://weasyprint.org/) PDF generation engine. -* [Test Report](../test): Format results of a test report against for a particular StockItem -* [Packing List](../pack): Format a list of items for shipping or transfer -* [Order List](../order): Order line items +!!! info "WeasyPrint" + WeasyPrint is an extremely powerful and flexible reporting library. Refer to the [WeasyPrint docs](https://weasyprint.readthedocs.io/en/stable/) for further information. -## Template Formats +### Stylesheets -Report templates can be written in multiple formats as per the requirement of the user. Uploaded template files are passed through the django/jinja rendering framework, and as such accept the same variable template strings as any other django template file. +Templates are rendered using standard HTML / CSS - if you are familiar with web page layout, you're ready to go! + +### Template Language + +Uploaded report template files are passed through the [django template rendering framework](https://docs.djangoproject.com/en/dev/topics/templates/), and as such accept the same variable template strings as any other django template file. Different variables are passed to the report template (based on the context of the report) and can be used to customize the contents of the generated PDF. + +### Variables + +Each report template is provided a set of *context variables* which can be used when rendering the template. For example, rendering the name of a part (which is available in the particular template context as *part*) is as follows: -*The name of the part is **\{\{ part.name \}\}**.* +```html +{% raw %} + + +

Part: {{ part.name }}

+

+ Description:
+ {{ part.description }} +

+{% endraw %} +``` !!! info "Variables" - Templates will have different variables available to them depending on the report type. Read the detail information on each report type for further information. + Templates will have different variables available to them depending on the report type. Read the detail information on each report type for further information. -### HTML +### Conditional Rendering -HTML templating uses the [django-weasyprint](https://github.com/fdemmer/django-weasyprint) engine for rendering templated HTML files to PDF. +The django template system allows for conditional rendering, providing conditional flow statements such as `{% raw %}{% if %}{% endraw %}`, `{% raw %}{% for in %}{% endraw %}`, etc. -### LaTeX - -LaTeX templating uses the [django-tex](https://github.com/weinbusch/django-tex) engine for rendering templated LaTeX files to PDF. Using LaTeX templates is much more complicated and requires advanced knowledge of configuring a LaTeX install. However it provides a much more powerful framework for generation of publication-quality documents. - -!!! info "LaTeX Configuration" - To use LaTeX templating, the system where InvenTree is installed must have a LaTeX toolchain accessible from the command line. Installation of such a toolchain is beyond the scope of this documenation. - -!!! info "Special Characters" - Special care must be taken to ensure that the LaTeX template file does not contain any LaTeX control characters that look like jinja template control codes! - -#### Intepreter Selection - -Out of the box, the LaTeX template rendering system is set to use *pdflatex* as the LaTeX interpreter. However this can easily be changed in the *config.yaml* configuration file: - -``` yaml -## LaTeX report rendering -## InvenTree uses the django-tex plugin to enable LaTeX report rendering -## Ref: https://pypi.org/project/django-tex/ -latex: - ## Select the LaTeX interpreter to use for PDF rendering - ## Note: The intepreter needs to be installed on the system! - ## e.g. to install pdflatex: apt-get texlive-latex-base - interpreter: pdflatex - ## Extra options to pass through to the LaTeX interpreter - options: '' -``` +!!! info "Conditionals" + Refer to the django documentation for more information. ## Uploading Templates -Custom report templates can be uploaded using the [Admin Interface](../../admin/admin). Only users with admin access can upload and/or edit report template files. \ No newline at end of file +Custom report templates can be uploaded using the [Admin Interface](../../admin/admin). Only users with admin access can upload and/or edit report template files. + +## Report Assets + +User can upload asset files (e.g. images) which can be used when generating reports. For example, you may wish to generate a report with your company logo in the header. Asset files are uploaded via the admin interface. + +Asset files can be rendered directly into the template as follows + +```html +{% raw %} + +{% load report %} + + + + + + + + + + + + + + + +{% endraw %} +``` + +!!! warning "Asset Naming" + If the requested asset name does not match the name of an uploaded asset, the template will continue without loading the image. + +## Report Snippets + +A powerful feature provided by the django / WeasyPrint templating framework is the ability to include external template files. This allows commonly used template features to be broken out into separate files and re-used across multiple templates. + +To support this, InvenTree provides report "snippets" - short (or not so short) template files which cannot be rendered by themselves, but can be called from other templates. + +Similar to assets files, snippet template files are uploaded via the admin interface. + +Snippets are included in a template as follows: + +``` +{% raw %}{% include 'snippets/' %}{% endraw %} +``` + +For example, consider a stocktake report for a particular stock location, where we wish to render a table with a row for each item in that location. + +```html +{% raw %} + + + + + + + {% for item in location.stock_items %} + {% include 'snippets/stock_row.html' with item=item %} + {% endfor %} + + +{% endraw %} +``` + +!!! note "Snippet Arguments" + Note above that named argument variables can be passed through to the snippet! + +And the snippet (very simple for this example) is as follows: + +```html +{% raw %} + + + + + +{% endraw %} +``` + +## Report Types + +InvenTree supports the following reporting functionality: + +### Test Report + +[Test Report](../test): Format results of a test report against for a particular StockItem + +### Packing List +[Packing List](../pack): Format a list of items for shipping or transfer + +### Build Report + +Build Report: TODO + +### Purchase Order +[Purchase Order report](../order): Order line items + +### Sales Order +Sales Order: TODO + +### Stocktake +Stocktake Report: TODO diff --git a/docs/start/config.md b/docs/start/config.md index 6b09d1e..6df457a 100644 --- a/docs/start/config.md +++ b/docs/start/config.md @@ -148,13 +148,6 @@ The default behaviour of the database backup is to generate backup files for dat Alternatively this location can be specified with the `INVENTREE_BACKUP_DIR` environment variable. -### LaTeX Support - -To enable genration of [LaTeX](https://en.wikipedia.org/wiki/LaTeX) reports, latex support must be enabled here. - -- **enabled** : Set to True to enable LaTeX support -- **interpreter** : Select the LaTeX interpreter to be used (must be installed on the local machine!) - ### Authentication Backends Custom authentication backends can be used by specifying them here diff --git a/mkdocs.yml b/mkdocs.yml index 29a15b6..208146e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -70,11 +70,12 @@ nav: - Purchase Orders: companies/po.md - Sales Orders: companies/so.md - Report: - - Labels: report/labels.md - Templates: report/report.md - - Test Reports: report/test.md - - Packing List: report/pack.md - - Order: report/order.md + - Reports: + - Test Reports: report/test.md + - Packing List: report/pack.md + - Order: report/order.md + - Labels: report/labels.md - Admin: - Admin Interface: admin/admin.md - User Permissions: admin/permissions.md From c44f315d63726ed45534642bbcf3e3b889a833b1 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 6 Feb 2021 17:53:56 +1100 Subject: [PATCH 2/4] Add documentation for new report features --- .../images/report/report_debug_mode.png | Bin 0 -> 19812 bytes .../report/report_default_page_size.png | Bin 0 -> 19797 bytes docs/report/report.md | 32 ++++++++++++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 docs/assets/images/report/report_debug_mode.png create mode 100644 docs/assets/images/report/report_default_page_size.png diff --git a/docs/assets/images/report/report_debug_mode.png b/docs/assets/images/report/report_debug_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..86d2f0f554260ca009528a4325b03604b1e314e5 GIT binary patch literal 19812 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 literal 0 HcmV?d00001 diff --git a/docs/report/report.md b/docs/report/report.md index 4f4f5dc..fca460f 100644 --- a/docs/report/report.md +++ b/docs/report/report.md @@ -55,6 +55,34 @@ The django template system allows for conditional rendering, providing condition !!! info "Conditionals" Refer to the django documentation for more information. +## Report Options + +A number of global reporting options are available for customizing InvenTree reports: + +### Default Page Size + +The built-in InvenTree report templates (and any reports which are derived from the built-in templates) use the *Page Size* option to set the page size of the generated reports. + +{% with id="report_page_size", url="report/report_default_page_size.png", description="Report Page Size" %} +{% include 'img.html' %} +{% endwith %} + +!!! info "Override Page Size" + Custom report templates do not have to make use of the *Page Size* option, although it is made available to the template context. + +### Debug Mode + +As templates are rendered directly to a PDF object, it can be difficult to debug problems when the PDF does not render exactly as expected. + +Setting the *Debug Mode* option renders the template as raw HTML instead of PDF, allowing the rendering output to be introspected. This feature allows template designers to understand any issues with the generated HTML (before it is passed to the PDF generation engine). + +{% with id="report_debu_mode", url="report/report_debug_mode.png", description="Report Debug Mode" %} +{% include 'img.html' %} +{% endwith %} + +!!! warning "HTML Rendering Limitations" + When rendered in debug mode, @page attributes (such as size, etc) will **not** be observed. Additionally, any asset files stored on the InvenTree server will not be rendered. Debug mode is not intended to produce "good looking" documents! + ## Uploading Templates Custom report templates can be uploaded using the [Admin Interface](../../admin/admin). Only users with admin access can upload and/or edit report template files. @@ -126,10 +154,10 @@ For example, consider a stocktake report for a particular stock location, where {% endraw %} ``` -!!! note "Snippet Arguments" +!!! info "Snippet Arguments" Note above that named argument variables can be passed through to the snippet! -And the snippet (very simple for this example) is as follows: +And the snippet file `stock_row.html` is as follows: ```html {% raw %} From b36a8a547226f60b2f2a2477fd457fe3187ddd36 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Sat, 6 Feb 2021 17:56:42 +1100 Subject: [PATCH 3/4] Update relase notes --- docs/releases/0.1.6.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/releases/0.1.6.md b/docs/releases/0.1.6.md index 9ca8351..a832f1b 100644 --- a/docs/releases/0.1.6.md +++ b/docs/releases/0.1.6.md @@ -14,10 +14,15 @@ Support for report templates has been greatly improved, moving towards "out of t [#1270](https://github.com/inventree/InvenTree/pull/1270) represents a significant refactor of code, and tooling for report functionality. +[#1279](https://github.com/inventree/InvenTree/pull/1279) adds the following report features: + +- Adjustable page size for generated reports +- Debug mode (renders reports as simple HTML files) + Refer to the [report documentation](../../report/report) for further information. !!! warning "LaTeX Support" - LaTeX report templates are no longer supported. + LaTeX report templates are no longer supported for a number of technical and ideological reasons ## Major Bug Fixes | PR | Description | From 2ad94cd4e9989fb615440411970eed1303aed639 Mon Sep 17 00:00:00 2001 From: eeintech Date: Thu, 11 Feb 2021 09:24:19 -0500 Subject: [PATCH 4/4] Added backup and restore instructions --- docs/start/migrate.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/start/migrate.md b/docs/start/migrate.md index 72217eb..4f6bfa2 100644 --- a/docs/start/migrate.md +++ b/docs/start/migrate.md @@ -52,3 +52,19 @@ inv import-records -f data.json !!! warning "Character Encoding" If the character encoding of the data file does not exactly match the target database, the import operation may not succeed. In this case, some manual editing of the database JSON file may be required. + +### Backup and Restore + +To backup your database data and media files, first define a [Backup Location](../config/#backup-location) in your configuration file. + +Then run the following command to backup the data: +``` +inv backup +``` + +It should create two separate backup files in the [Backup Location](../config/#backup-location) folder: one for the database data and one for the media files (part pictures, etc.) + +To restore your data from a backup, use the following command: +``` +inv restore +```
{{ item.part.full_name }}{{ item.quantity }}