From 11ab0203b169d33a0d9ddef1179bc321e7896d48 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 3 Jun 2025 17:07:12 +1000 Subject: [PATCH] [plugin] Auto issue orders (#9565) * Add builtin plugin for auto-issuing orders * Add plugin to auto-issue orders * Add placeholder documentation * Fix typo * Adds image macro - To replace img.html - includes checking if file exists * Fix tooltips * More docs * Adjust plugin settings filters * docs * More docs * More docs * Updates * Less restrictive URL checking * Refactor build order page * Fix typo * Allow 429 * Debug output * More debug * Construct assets dir * Cleanup * Update docs README * Refactoring more pages * Fix image link * Fix SSO settings * Add hook to check for missing settings - Ensure that all settings are documented! * Add missing user settings * Update docstring * Tweak SSO.md * Image updates * More updates * Tweaks * Exclude orders without a target_date * Fix for issuing build orders * Further refactoring * Fixes * Image refactoring * More refactoring * More refactoring * Refactor app images * Fix pathing issues * Suppress some openapidocs warnings in logs (much easier to debug docs build issues) * Fix image reference * Reduce error messages * Fix image links * Fix image links * Reduce docs log output * Ensure settings are loaded before displaying them * Fix for UI test * Fix unit test * Test tweaks --- docs/.gitignore | 12 ++ docs/README.md | 24 ++-- docs/_includes/app_img.html | 5 - docs/_includes/img.html | 30 ---- docs/docs/api/browse.md | 12 +- docs/docs/api/index.md | 12 +- docs/docs/api/metadata.md | 17 +-- docs/docs/app/barcode.md | 16 +-- docs/docs/app/connect.md | 25 +--- docs/docs/app/navigation.md | 20 +-- docs/docs/app/part.md | 56 ++------ docs/docs/app/po.md | 20 +-- docs/docs/app/search.md | 9 +- docs/docs/app/settings.md | 17 +-- docs/docs/app/so.md | 12 +- docs/docs/app/stock.md | 69 +++------ .../plugin/builtin/auto_issue_settings.png | Bin 0 -> 31644 bytes .../builtin/barcode_plugin_settings.png | Bin 0 -> 18154 bytes .../plugin/builtin/bom_export_options.png | Bin 0 -> 40111 bytes .../builtin/digikey_plugin_settings.png | Bin 0 -> 10211 bytes .../images/plugin/builtin/download_data.png | Bin 0 -> 27858 bytes .../images/plugin/builtin/enable_events.png | Bin 0 -> 5231 bytes .../images/plugin/builtin/filter_plugins.png | Bin 0 -> 89432 bytes .../images/plugin/builtin/label_options.png | Bin 0 -> 8812 bytes .../images/plugin/builtin/label_select.png | Bin 0 -> 21460 bytes .../plugin/builtin/label_sheet_options.png | Bin 0 -> 8616 bytes .../plugin/builtin/label_sheet_select.png | Bin 0 -> 38388 bytes .../plugin/builtin/lcsc_plugin_settings.png | Bin 0 -> 7726 bytes .../plugin/builtin/mouser_plugin_settings.png | Bin 0 -> 9680 bytes .../plugin/builtin/notification_settings.png | Bin 0 -> 20505 bytes .../builtin/parameter_export_options.png | Bin 0 -> 24788 bytes .../builtin/part_notification_settings.png | Bin 0 -> 9095 bytes .../images/plugin/builtin/select_exporter.png | Bin 0 -> 17874 bytes .../plugin/builtin/tme_plugin_settings.png | Bin 0 -> 7678 bytes docs/docs/barcodes/external.md | 18 +-- docs/docs/barcodes/index.md | 16 +-- docs/docs/concepts/company.md | 9 +- docs/docs/concepts/project_codes.md | 16 +-- docs/docs/hooks.py | 49 +++++++ docs/docs/manufacturing/allocate.md | 24 +--- docs/docs/manufacturing/bom.md | 22 +-- docs/docs/manufacturing/build.md | 56 ++------ docs/docs/manufacturing/example.md | 28 ++-- docs/docs/manufacturing/output.md | 24 +--- docs/docs/part/create.md | 24 +--- docs/docs/part/index.md | 22 +-- docs/docs/part/notification.md | 28 ++-- docs/docs/part/parameter.md | 34 ++--- docs/docs/part/pricing.md | 32 ++--- docs/docs/part/revision.md | 16 +-- docs/docs/part/scheduling.md | 4 +- docs/docs/part/stocktake.md | 48 +++---- docs/docs/part/test.md | 4 +- docs/docs/part/views.md | 16 +-- docs/docs/plugins/builtin/auto_issue.md | 25 ++++ docs/docs/plugins/builtin/bom_exporter.md | 25 ++++ .../docs/plugins/builtin/currency_exchange.md | 21 +++ docs/docs/plugins/builtin/digikey.md | 19 +++ docs/docs/plugins/builtin/index.md | 37 +++++ .../docs/plugins/builtin/inventree_barcode.md | 22 +++ .../plugins/builtin/inventree_exporter.md | 29 ++++ docs/docs/plugins/builtin/inventree_label.md | 25 ++++ .../builtin/inventree_label_machine.md | 23 +++ .../plugins/builtin/inventree_label_sheet.md | 29 ++++ docs/docs/plugins/builtin/lcsc.md | 19 +++ docs/docs/plugins/builtin/mouser.md | 19 +++ docs/docs/plugins/builtin/notifications.md | 21 +++ .../plugins/builtin/part_notifications.md | 23 +++ .../builtin/part_parameter_exporter.md | 25 ++++ docs/docs/plugins/builtin/tme.md | 19 +++ docs/docs/plugins/install.md | 8 +- docs/docs/plugins/metadata.md | 5 +- docs/docs/plugins/mixins/event.md | 4 +- docs/docs/plugins/mixins/export.md | 15 +- docs/docs/plugins/mixins/label.md | 4 +- docs/docs/plugins/mixins/locate.md | 8 +- docs/docs/plugins/mixins/schedule.md | 4 +- docs/docs/plugins/mixins/ui.md | 24 ++-- docs/docs/plugins/mixins/validation.md | 30 ++-- docs/docs/purchasing/manufacturer.md | 4 +- docs/docs/purchasing/purchase_order.md | 24 +--- docs/docs/purchasing/supplier.md | 20 +-- docs/docs/releases/0.1.4.md | 34 ----- docs/docs/releases/0.1.8.md | 4 - docs/docs/report/barcodes.md | 10 +- docs/docs/report/index.md | 20 +-- docs/docs/report/labels.md | 4 +- docs/docs/sales/return_order.md | 32 ++--- docs/docs/sales/sales_order.md | 28 +--- docs/docs/settings/SSO.md | 38 ++--- docs/docs/settings/admin.md | 16 +-- docs/docs/settings/export.md | 4 +- docs/docs/settings/global.md | 18 +++ docs/docs/settings/import.md | 12 +- docs/docs/settings/logs.md | 9 +- docs/docs/settings/permissions.md | 4 +- docs/docs/settings/user.md | 28 ++-- docs/docs/start/backup.md | 4 - docs/docs/stock/adjust.md | 24 +--- docs/docs/stock/expiry.md | 33 ++--- docs/docs/stock/index.md | 4 +- docs/docs/stock/owner.md | 18 +-- docs/docs/stock/status.md | 8 +- docs/docs/stock/test.md | 4 +- docs/docs/stock/tracking.md | 24 +--- docs/main.py | 134 +++++++++++++++++- docs/mkdocs.yml | 18 +++ docs/mlc_config.json | 11 ++ .../InvenTree/common/setting/system.py | 6 - .../plugin/builtin/events/__init__.py | 0 .../builtin/events/auto_issue_orders.py | 130 +++++++++++++++++ .../plugin/builtin/suppliers/digikey.py | 3 +- .../plugin/builtin/suppliers/lcsc.py | 3 +- .../plugin/builtin/suppliers/mouser.py | 3 +- .../InvenTree/plugin/builtin/suppliers/tme.py | 3 +- src/frontend/lib/types/Settings.tsx | 1 + .../src/components/settings/SettingList.tsx | 6 +- src/frontend/src/states/SettingsState.tsx | 33 ++++- src/frontend/src/tables/ColumnSelect.tsx | 2 +- .../src/tables/InvenTreeTableHeader.tsx | 6 +- .../tables/settings/ScheduledTasksTable.tsx | 7 +- src/frontend/tests/pages/pui_part.spec.ts | 2 + src/frontend/tests/pui_plugins.spec.ts | 5 +- src/frontend/tests/pui_printing.spec.ts | 5 +- 124 files changed, 1178 insertions(+), 957 deletions(-) delete mode 100644 docs/_includes/app_img.html delete mode 100644 docs/_includes/img.html create mode 100644 docs/docs/assets/images/plugin/builtin/auto_issue_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/barcode_plugin_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/bom_export_options.png create mode 100644 docs/docs/assets/images/plugin/builtin/digikey_plugin_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/download_data.png create mode 100644 docs/docs/assets/images/plugin/builtin/enable_events.png create mode 100644 docs/docs/assets/images/plugin/builtin/filter_plugins.png create mode 100644 docs/docs/assets/images/plugin/builtin/label_options.png create mode 100644 docs/docs/assets/images/plugin/builtin/label_select.png create mode 100644 docs/docs/assets/images/plugin/builtin/label_sheet_options.png create mode 100644 docs/docs/assets/images/plugin/builtin/label_sheet_select.png create mode 100644 docs/docs/assets/images/plugin/builtin/lcsc_plugin_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/mouser_plugin_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/notification_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/parameter_export_options.png create mode 100644 docs/docs/assets/images/plugin/builtin/part_notification_settings.png create mode 100644 docs/docs/assets/images/plugin/builtin/select_exporter.png create mode 100644 docs/docs/assets/images/plugin/builtin/tme_plugin_settings.png create mode 100644 docs/docs/plugins/builtin/auto_issue.md create mode 100644 docs/docs/plugins/builtin/bom_exporter.md create mode 100644 docs/docs/plugins/builtin/currency_exchange.md create mode 100644 docs/docs/plugins/builtin/digikey.md create mode 100644 docs/docs/plugins/builtin/index.md create mode 100644 docs/docs/plugins/builtin/inventree_barcode.md create mode 100644 docs/docs/plugins/builtin/inventree_exporter.md create mode 100644 docs/docs/plugins/builtin/inventree_label.md create mode 100644 docs/docs/plugins/builtin/inventree_label_machine.md create mode 100644 docs/docs/plugins/builtin/inventree_label_sheet.md create mode 100644 docs/docs/plugins/builtin/lcsc.md create mode 100644 docs/docs/plugins/builtin/mouser.md create mode 100644 docs/docs/plugins/builtin/notifications.md create mode 100644 docs/docs/plugins/builtin/part_notifications.md create mode 100644 docs/docs/plugins/builtin/part_parameter_exporter.md create mode 100644 docs/docs/plugins/builtin/tme.md create mode 100644 src/backend/InvenTree/plugin/builtin/events/__init__.py create mode 100644 src/backend/InvenTree/plugin/builtin/events/auto_issue_orders.py diff --git a/docs/.gitignore b/docs/.gitignore index a2a19ba748..7eea8e6063 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -13,5 +13,17 @@ site/ # Generated API schema files docs/api/schema/*.yml +# Temporary cache files +url_cache.txt +invoke-commands.txt + +# Temp files +releases.json +versions.json +inventree_filters.yml +inventree_settings.json +observed_settings.json +inventree_tags.yml + .vscode/ generated/ diff --git a/docs/README.md b/docs/README.md index 99f221794f..d9d1b1e1da 100644 --- a/docs/README.md +++ b/docs/README.md @@ -59,18 +59,24 @@ Click [here](/part/views) ### Images -Images are served from the `./docs/assets/images` folder and can be added as follow: +Images are served from the `./docs/assets/images` folder and can be added as follows: + ``` -{% with id="image_id", url="folder/image_name.png", description="Text shown if image is not loaded properly" %} -{% include 'img.html' %} -{% endwith %} +{{ image("image_name.png", base="subfolder", title="Image title") }} ``` -Replace: -* `image_id` with a short unique identifier for the image (most commonly, `image_id` is same as `image_name`) -* `folder` with the folder in `docs/assets/images` in which the image is stored -* `image_name` with the name of the image -* `.png` with the image extension (PNG or JPEG are preferred formats) +See the `image` macro in `./docs/main.py` for more information. + +### Icons + +Icons can be rendered (using the [tabler icon set](https://tabler.io/icons)) as follows: + +``` +{{ icon("brand-github", color="red")}} +``` + +See the `icon` macro in `./docs/main.py` for more information. + ### Global variables diff --git a/docs/_includes/app_img.html b/docs/_includes/app_img.html deleted file mode 100644 index ffafb7f32d..0000000000 --- a/docs/_includes/app_img.html +++ /dev/null @@ -1,5 +0,0 @@ -{% set url = 'app/' + url %} - -{% with id=id, url=url, maxheight="240px", description="" %} -{% include "img.html" %} -{% endwith %} diff --git a/docs/_includes/img.html b/docs/_includes/img.html deleted file mode 100644 index 620e41f447..0000000000 --- a/docs/_includes/img.html +++ /dev/null @@ -1,30 +0,0 @@ -{% if 'http' in url %} -{% set img_url = url %} -{% else %} -{% set img_url = config.assets_dir + '/images/' + url %} -{% endif %} - -
- {% if id %} - - - {% elif img_url %} - - {% endif %} - {{ description }} - {% if id or img_url %} - - {% endif %} - - {% if id %} - - - {{ description }} - - {% endif %} -
diff --git a/docs/docs/api/browse.md b/docs/docs/api/browse.md index 8fe50ef280..62b6d5f2b0 100644 --- a/docs/docs/api/browse.md +++ b/docs/docs/api/browse.md @@ -16,22 +16,16 @@ If the server is running in [Debug Mode](../start/index.md#debug-mode) then an i Various list endpoints can be displayed as shown below: -{% with id="api_browse", url="api/api_browse.png", description="List API" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_browse.png", "List API") }} ### Filtering List views can be filtered interactively: -{% with id="api_filter", url="api/api_filters.png", description="Filter API" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_filters.png", "Filter API") }} ### Detail View Detail view endpoints can also be displayed: -{% with id="api_detail", url="api/api_detail.png", description="Detail API" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_detail.png", "Detail API") }} diff --git a/docs/docs/api/index.md b/docs/docs/api/index.md index 341d50085e..0314d67436 100644 --- a/docs/docs/api/index.md +++ b/docs/docs/api/index.md @@ -13,9 +13,7 @@ InvenTree provides a powerful REST API for interacting with inventory data on th The API is self-documenting, and the documentation is provided alongside any InvenTree installation instance. If (for example) you have an InvenTree instance running at `http://127.0.0.1:8000` then the API documentation is available at `http://127.0.0.1:8000/api-doc/` -{% with id="api_doc", url="api/api_doc.png", description="API documentation" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_doc.png", "API documentation") }} ### Browseble API @@ -152,15 +150,11 @@ Once a user has *authenticated* via the API, a list of the available roles can b For example, when accessing the API from a *superuser* account: -{% with id="api_roles", url="api/api_roles.png", description="API superuser roles" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_roles.png", "API superuser roles") }} Or, when accessing the API from an account which has read-only permissions: -{% with id="api_roles_2", url="api/api_roles_2.png", description="API user roles" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_roles_2.png", "API user roles") }} ### Permission Denied diff --git a/docs/docs/api/metadata.md b/docs/docs/api/metadata.md index c89e31a8be..792bc547e7 100644 --- a/docs/docs/api/metadata.md +++ b/docs/docs/api/metadata.md @@ -15,9 +15,7 @@ To request metadata about a particular API endpoint, simply perform an `OPTIONS` For example, to view the metadata available for creating a new [Part Category](../part/index.md#part-category), an `OPTIONS` request to `/api/part/category/` yields: -{% with id="api_cat_options", url="api/api_category_options.png", description="Part category options" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_category_options.png", "Part category options") }} You can see here a detailed list of the various fields which are available for this API endpoint. @@ -33,9 +31,7 @@ The `OPTIONS` endpoint provides the following information: Specific details are provided on the available attributes of each field: -{% with id="api_fields", url="api/api_metadata_fields.png", description="Metadata fields" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_metadata_fields.png", "Metadata fields") }} ### Field Types @@ -82,10 +78,5 @@ Field *label* and *help text* values are localized using the [community contribu For example, the same forms (in the web interface) are served via identical API requests, with the locale information determined "on the fly": -{% with id="api_english", url="api/api_english.png", description="API forms (english)" %} -{% include 'img.html' %} -{% endwith %} - -{% with id="api_german", url="api/api_german.png", description="API forms (german)" %} -{% include 'img.html' %} -{% endwith %} +{{ image("api/api_english.png", "API forms (english)") }} +{{ image("api/api_german.png", "API forms (german)") }} diff --git a/docs/docs/app/barcode.md b/docs/docs/app/barcode.md index 98a6c60c36..5f470b3391 100644 --- a/docs/docs/app/barcode.md +++ b/docs/docs/app/barcode.md @@ -53,9 +53,7 @@ If a match is found, the app will navigate to the relevant page. From the [Stock Location detail page](./stock.md#stock-location-view), multiple barcode actions may be available: -{% with id="location-actions", url="app/barcode_stock_location_actions.png", maxheight="240px", description="Stock location barcode actions" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/barcode_stock_location_actions.png", "Stock location barcode actions") }} #### Assign Barcode @@ -77,9 +75,7 @@ the *Scan Items Into Location* action allows you to scan items into the selected From the [Stock Item detail page](./stock.md#stock-item-detail-view), the following barcode actions may be available: -{% with id="item-actions", url="app/barcode_stock_item_actions.png", maxheight="240px", description="Stock item barcode actions" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/barcode_stock_item_actions.png", "Stock item barcode actions") }} #### Assign Barcode @@ -93,9 +89,7 @@ Scan the selected stock item into a stock location. Scanning a valid barcode ass From the [Part detail page](./part.md#part-detail-view), the following barcode actions are available: -{% with id="part-actions", url="app/barcode_part_actions.png", maxheight="240px", description="Part barcode actions" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/barcode_part_actions.png", "Part barcode actions") }} #### Assign Barcode @@ -105,9 +99,7 @@ Assign a custom barcode to the selected part. Scanning a barcode (which is not a From the [Purchase Order detail page](./po.md#purchase-order-detail) page, the following barcode actions are available: -{% with id="po-actions", url="app/barcode_po_actions.png", maxheight="240px", description="Purchase order barcode actions" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/barcode_po_actions.png", "Purchase order barcode actions") }} #### Scan Received Parts diff --git a/docs/docs/app/connect.md b/docs/docs/app/connect.md index e55e076fb4..cf6a8f4e28 100644 --- a/docs/docs/app/connect.md +++ b/docs/docs/app/connect.md @@ -8,16 +8,11 @@ Use of the InvenTree app assumes that you (the user) have access to an InvenTree When first running the app, no profile has been configured. The *server* icon in the top-right corner of the home screen is red, indicating that there is no connection to an InvenTree server: -{% with id="no_server", url="app/initial.png", maxheight="240px", description="No server configured" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/initial.png", "No server configured") }} Press on the server icon to navigate to the server selection view: -{% with id="no_profiles", url="app/no_profiles.png", maxheight="240px", description="No server configured" %} -{% include "img.html" %} -{% endwith %} - +{{ image("app/no_profiles.png", "No server configured") }} ### Create Server @@ -26,9 +21,7 @@ Press on the server icon to navigate to the server selection view: Press the {{ icon("circle-plus", color="blue") }} button in the bottom-right corner of the screen to create a new server profile. -{% with id="add_profile", url="app/add_server_profile.png", maxheight="240px", description="Add server" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/add_server_profile.png", "Add server profile") }} Enter the required server details: @@ -47,22 +40,16 @@ Alternatively, long press on the server profile to activate the context menu, th When the app successfully connects to the server, a success message is briefly displayed at the bottom of the screen. A green {{ icon("circle-check", color="green") }} icon next to the server profile indicate that the profile is currently *selected* and also the connection was successful. -{% with id="connected", url="app/connected.png", maxheight="240px", description="Connected to server" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/connected.png", "Connected to server") }} ### Connection Failure If (for whatever reason) the app does not successfully connect to the InvenTree server, a failure message is displayed, and a red {{ icon("circle-x", color="red") }} icon is displayed next to the server profile. -{% with id="failed", url="app/unauthorized.png", maxheight="240px", description="Connection failure" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/unauthorized.png", "Connection failure") }} In this case, the error message displayed at the bottom of the screen provides context as to why the app could not successfully connect to the server. To edit the server profile details, long press on the server profile, and select *Edit Server Profile*: -{% with id="edit", url="app/edit_server.png", maxheight="240px", description="Edit server profile" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/edit_server.png", "Edit server profile") }} diff --git a/docs/docs/app/navigation.md b/docs/docs/app/navigation.md index 94ed6721c9..40b59809d8 100644 --- a/docs/docs/app/navigation.md +++ b/docs/docs/app/navigation.md @@ -7,17 +7,13 @@ title: App Navigation The app *home screen* provides quick-access buttons for stock view and actions: -{% with id="home", url="app/home.png", maxheight="240px", description="Home screen" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/home.png", "Home screen") }} ## Tab Display Some screens provide multiple tabbed views, which are displayed at the top of the screen: -{% with id="global_nav", url="app/app_tabs.png", maxheight="240px", description="App tabs" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/app_tabs.png", "App tabs") }} Tabs can be navigated by pressing on the text of each tab, or by scrolling the screen left or right. @@ -25,17 +21,13 @@ Tabs can be navigated by pressing on the text of each tab, or by scrolling the s The *Global Action* buttons are visible on most screens, displayed in the bottom left corner of the screen: -{% with id="global_nav", url="app/app_global_navigation.png", maxheight="240px", description="Global navigation actions" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/app_global_navigation.png", "Global navigation actions") }} ### Open Drawer Menu The {{ icon("list") }} action opens the *Drawer Menu*, which is a quick-access menu for global navigation: -{% with id="drawer", url="app/drawer.png", maxheight="240px", description="Open drawer menu" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/drawer.png", "Open drawer menu") }} The *Drawer Menu* can be accessed in the following ways: @@ -54,9 +46,7 @@ The {{ icon("barcode", title="Scan") }} action opens the [barcode scan](./barcod Within a given view, certain context actions may be available. If there are contextual actions which can be performed, they are displayed in the bottom right corner: -{% with id="drawer", url="app/context_actions.png", maxheight="240px", description="Context actions" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/context_actions.png", "Context actions") }} !!! tip "Barcode Actions" Available barcode actions are displayed in a separate context action menu diff --git a/docs/docs/app/part.md b/docs/docs/app/part.md index 5d6d6a1d5c..9d4f3b8cdc 100644 --- a/docs/docs/app/part.md +++ b/docs/docs/app/part.md @@ -10,9 +10,7 @@ From the *home screen*, select *Parts* to open the top-level part category view. The *Details* tab shows information about the selected part category. In particular, it shows the name and description of the category, a link to the parent category (if available) and a list of subcategories. -{% with id="part-category", url="part_category_detail.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_category_detail.png", "Part Category") }} #### Parent Category @@ -26,47 +24,35 @@ If the current category has any subcategories, these are listed here. Select any The *Parts* tab displays all the parts available in this category. Tap a displayed part to navigate to the part detail view. -{% with id="cat-parts", url="category_parts_tab.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/category_parts_tab.png", "Category Parts") }} The list of available parts can be filtered using the input box at the top of the screen: -{% with id="cat-parts-filter", url="category_parts_filter.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/category_parts_filter.png", "Category Parts Filter") }} ### Context Actions The following *Context Actions* are available for the selected category: -{% with id="cat-actions", url="category_actions_tab.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/category_actions_tab.png", "Category Actions") }} #### New Category Create a new subcategory under the current category: -{% with id="cat-new-cat", url="new_category.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/new_category.jpg", "New Category") }} #### New Part Create a new part within the current category: -{% with id="cat-new-part", url="new_part.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/new_part.jpg", "New Part") }} ### Edit Category Select the *Edit* button in the top right corner of the screen to edit the details for the selected part category: -{% with id="cat-edit", url="part_category_edit.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_category_edit.jpg", "Edit Category") }} !!! info "Permission Required" If the user does not have permission to edit part details, this button will be hidden @@ -77,9 +63,7 @@ In the part category display screen, there are three tabs of information availab The *Part Detail* view displays information about a single part: -{% with id="part-details", url="part_details.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_details.png", "Part Detail") }} ### Details Tab @@ -97,17 +81,13 @@ The *stock* tile shows the total quantity of stock available for the part. Tap o Tap on the *notes* tile to view (and edit) the notes for this part: -{% with id="part-notes", url="part_notes.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_notes.jpg", "Part Notes") }} #### Attachments Tap on the *attachments* tile to view the file attachments for this part: -{% with id="part-attachments", url="part_attachments.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_attachments.jpg", "Part Attachments") }} New attachments can be uploaded by tapping on the icons in the top right of the screen. @@ -117,9 +97,7 @@ Select a particular attachment file to downloaded it to the local device. The *Stock* tab displays all the stock items available for this part. Tap on a particular stock item to navigate to a detail view for that item. -{% with id="part-stock", url="part_stock.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_stock.png", "Part Stock") }} The list of available stock items can be filtered using the input box at the top of the screen. @@ -131,17 +109,13 @@ The *Actions* tab displays the available actions for the selected part: Create a new stock item for this part: -{% with id="part-stock-new", url="new_stock_item.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/new_stock_item.jpg", "New Stock Item") }} ### Edit Part To edit the part details, select the *Edit* button in the top right corner of the screen: -{% with id="part-edit", url="part_edit.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_edit.jpg", "Edit Part") }} !!! info "Permission Required" If the user does not have permission to edit part details, this button will be hidden @@ -150,8 +124,6 @@ To edit the part details, select the *Edit* button in the top right corner of th Tap the image of the part (displayed at the top left of the screen) to launch the part image view: -{% with id="part-image", url="part_image.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/part_image.jpg", "Part Image") }} A full-screen view of the image is displayed. The user can also upload a new image for the part, either selecting an image from the device, or taking a new picture with the device's camera. diff --git a/docs/docs/app/po.md b/docs/docs/app/po.md index 8d7a8bdbb2..b6098b2d6f 100644 --- a/docs/docs/app/po.md +++ b/docs/docs/app/po.md @@ -6,9 +6,7 @@ title: Purchase Orders The purchase order list display lists all purchase orders: -{% with id="po_list", url="app/po_list.png", maxheight="240px", description="Purchase order list" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/po_list.png", "Purchase order list") }} Select an individual purchase order to display the detail view for that order. @@ -18,25 +16,19 @@ Displayed purchase orders can be subsequently filtered using the search input at ## Purchase Order Detail -{% with id="po_detail", url="app/po_detail.png", maxheight="240px", description="Purchase order details" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/po_detail.png", "Purchase order detail") }} ### Edit Order Details From the detail view, select the *Edit* button in the top-right of the screen. This opens the purchase order editing display: -{% with id="edit_po", url="app/po_edit.png", maxheight="240px", description="Edit purchase order" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/po_edit.png", "Edit purchase order") }} ### Line Items The *Line Items* tab shows the line items associated with this purchase order: -{% with id="po_lines", url="app/po_lines.png", maxheight="240px", description="Purchase order line items" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/po_lines.png", "Purchase order line items") }} Long press on a particular line item to receive the item into stock. @@ -44,6 +36,4 @@ Long press on a particular line item to receive the item into stock. Once items have been received into stock against a particular purchase order, they are displayed in the *Stock Items* tab: -{% with id="po_stock", url="app/po_stock.png", maxheight="240px", description="Purchase order stock items" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/po_stock.png", "Purchase order stock items") }} diff --git a/docs/docs/app/search.md b/docs/docs/app/search.md index e258698b5e..0c83aa7f74 100644 --- a/docs/docs/app/search.md +++ b/docs/docs/app/search.md @@ -6,10 +6,5 @@ title: App Search The global search screen provides quick search functionality across the connected InvenTree database. Entering a search term will return multiple search results, as shown in the examples below: -{% with id="search_1", url="app/search_1.png", maxheight="240px", description="Search results" %} -{% include 'img.html' %} -{% endwith %} - -{% with id="search_2", url="app/search_2.png", maxheight="240px", description="Search results" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/search_1.png", "Search results") }} +{{ image("app/search_2.png", "Search results") }} diff --git a/docs/docs/app/settings.md b/docs/docs/app/settings.md index 807616eeb2..d415dce933 100644 --- a/docs/docs/app/settings.md +++ b/docs/docs/app/settings.md @@ -17,18 +17,13 @@ The main settings view is shown below, and provides the following options: | [Part](#part-settings) | Configure part management options | | About | Display app version information | - -{% with id="settings_view", url="app/settings.png", maxheight="240px", description="Settings view" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/settings.png", "Settings view") }} ## App Settings The *App Settings* view provides configuration options for the InvenTree app: -{% with id="app_settings", url="app/app_settings.png", maxheight="240px", description="App Settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/app_settings.png", "App settings") }} ### App Settings @@ -57,9 +52,7 @@ Configure audible app notifications: The *Barcode Settings* view allows you to configure options relating to [barcode scanning](./barcode.md): -{% with id="barcode_settings", url="app/barcode_settings.png", maxheight="240px", description="Barcode Settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/barcode_settings.png", "Barcode settings") }} | Option | Description | | --- | --- | @@ -70,9 +63,7 @@ The *Barcode Settings* view allows you to configure options relating to [barcode The *Home Screen* view allows you to configure display options for the app 'home screen': -{% with id="home_settings", url="app/home_settings.png", maxheight="240px", description="Home Screen Settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("app/home_settings.png", "Home screen settings") }} | Option | Description | | --- | --- | diff --git a/docs/docs/app/so.md b/docs/docs/app/so.md index a259877eb6..0c9131c624 100644 --- a/docs/docs/app/so.md +++ b/docs/docs/app/so.md @@ -6,9 +6,7 @@ title: Sales Orders The sales order list display shows all sales orders: -{% with id="so_list", url="app/so_list.png", maxheight="240px", description="Sales order list" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/so_list.png", "Sales order list") }} Select an individual sales order to display the detail view for that order. @@ -20,9 +18,7 @@ Displayed sales orders can be subsequently filtered using the search input at th Select an individual order to show the detailed view for that order: -{% with id="so_detail", url="app/so_detail.png", maxheight="240px", description="Sales order details" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/so_detail.png", "Sales order detail") }} ### Edit Order Details @@ -32,6 +28,4 @@ From the detail view, select the *Edit* button in the top-right of the screen. T View the line items associated with the selected order: -{% with id="so_lines", url="app/so_lines.png", maxheight="240px", description="Sales order lines" %} -{% include "img.html" %} -{% endwith %} +{{ image("app/so_lines.png", "Sales order line items") }} diff --git a/docs/docs/app/stock.md b/docs/docs/app/stock.md index 14113bd666..106f9623ff 100644 --- a/docs/docs/app/stock.md +++ b/docs/docs/app/stock.md @@ -10,9 +10,7 @@ From the *home screen*, select *Stock* to open the top-level stock location view The *Details* tab shows information about the selected stock location. -{% with id="loc-detail", url="location_detail.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/location_detail.png", "Stock Location") }} #### Parent Location @@ -26,44 +24,29 @@ If the current stock location has any sublocations, they are listed here. Select The *Stock* tab displays all the stock items available in this location. Tap a displayed stock item to navigate to the stock item detail view. -{% with id="loc-stock", url="location_stock.png" %} -{% include "app_img.html" %} -{% endwith %} - +{{ image("app/location_stock.png", "Location Stock") }} The list of available stock items can be filtered using the input box at the top of the screen: -{% with id="loc-filter", url="location_stock_filter.jpg" %} -{% include "app_img.html" %} -{% endwith %} - +{{ image("app/location_stock_filter.jpg", "Location Stock Filter") }} ### Context Actions The following *Context Actions* are available for the selected location: -{% with id="loc-actions", url="location_actions.png" %} -{% include "app_img.html" %} -{% endwith %} - +{{ image("app/location_actions.png", "Location Actions") }} #### New Location Create a new location under the current location: -{% with id="loc-new", url="new_location.jpg" %} -{% include "app_img.html" %} -{% endwith %} - +{{ image("app/new_location.jpg", "New Location") }} #### New Stock Item Create a new stock item in the current location: -{% with id="loc-new-stock", url="new_stock_item_from_location.jpg" %} -{% include "app_img.html" %} -{% endwith %} - +{{ image("app/new_stock_item_from_location.jpg", "New Stock Item") }} #### Scan Stock Items Into Location @@ -74,10 +57,7 @@ Use the barcode scanner to scan a stock item into the current location. The *Stock Item Detail* view displays information about a single stock item: -{% with id="stock-detail", url="stock_detail.png" %} -{% include "app_img.html" %} -{% endwith %} - +{{ image("app/stock_detail.png", "Stock Item") }} ### Details Tab @@ -99,44 +79,34 @@ Tap on the notes tile to display and edit the notes for this stock item The *actions* tab displays the available actions for the selected stock item: -{% with id="stock-actions", url="stock_actions.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/stock_actions.png", "Stock Actions") }} #### Count Stock Select the *Count Stock* action to validate the current number of items in stock. Use this option to perform a quick stocktake! -{% with id="stock-count", url="stock_count.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/stock_count.png", "Count Stock") }} !!! info "Serialized Stock" The *count stock* action is not available for serialized stock items, as they have a fixed quantity of 1 #### Remove Stock -Select this action to remove a certain quantity from the selected stock item. For example, if there are 12 items available, and you take 3 items, the listed quantity will be reduced to 9 itemes. +Select this action to remove a certain quantity from the selected stock item. For example, if there are 12 items available, and you take 3 items, the listed quantity will be reduced to 9 items. -{% with id="stock-remove", url="stock_remove.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/stock_remove.png", "Remove Stock") }} #### Add Stock Select this action to add a certain quantity to the selected stock item. For example, if there are 12 items available, and you add 3 items, the listed quantity will be increased to 15 items. -{% with id="stock-add", url="stock_add.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/stock_add.png", "Add Stock") }} #### Transfer Stock Transfer (move) the stock item to a new location: -{% with id="stock-transfer", url="stock_transfer.png" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/stock_transfer.png", "Transfer Stock") }} #### Scan Into Location @@ -154,18 +124,11 @@ This barcode can then be used to track the stock item. If the server supports [label printing plugins](../plugins/mixins/label.md), then an option to print a label for the selected stock item: -{% with id="label_print_1", url="stock_print_label_1.png", description="Print label via plugin" %} -{% include 'app_img.html' %} -{% endwith %} - -{% with id="label_print_2", url="stock_print_label_2.png", description="Print label via plugin" %} -{% include 'app_img.html' %} -{% endwith %} +{{ image("app/stock_print_label_1.png", "Print Label") }} +{{ image("app/stock_print_label_2.png", "Print Label") }} ### Edit Stock Item To edit the stock item details, select the *Edit* button in the top right corner of the screen: -{% with id="stock-edit", url="stock_edit.jpg" %} -{% include "app_img.html" %} -{% endwith %} +{{ image("app/stock_edit.jpg", "Edit Stock Item") }} diff --git a/docs/docs/assets/images/plugin/builtin/auto_issue_settings.png b/docs/docs/assets/images/plugin/builtin/auto_issue_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..87042121358eeaf40d54b4e5b29af65b17decafe GIT binary patch literal 31644 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/barcode_plugin_settings.png b/docs/docs/assets/images/plugin/builtin/barcode_plugin_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..d502ec54aafc341ad6be864a473584f0b1eaba06 GIT binary patch literal 18154 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 E0cLIbE&u=k literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/bom_export_options.png b/docs/docs/assets/images/plugin/builtin/bom_export_options.png new file mode 100644 index 0000000000000000000000000000000000000000..2da4aa44b062755b4c96dd23ba226be9bea9cb5f GIT binary patch literal 40111 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 aPOlUx@1ekHd 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 HAH4Wq-fHp` literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/download_data.png b/docs/docs/assets/images/plugin/builtin/download_data.png new file mode 100644 index 0000000000000000000000000000000000000000..5da8101163b80eff39ad8e120f36891902497cb1 GIT binary patch literal 27858 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/enable_events.png b/docs/docs/assets/images/plugin/builtin/enable_events.png new file mode 100644 index 0000000000000000000000000000000000000000..7095ea3d1e75ffd8b723850dcd973e9cf1f33e2e GIT binary patch literal 5231 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 bVt>r=qg7M4pzLw=Njs31fo7GuW8{AUC!dQP literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/filter_plugins.png b/docs/docs/assets/images/plugin/builtin/filter_plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..18c83bab1dddd06800bd818118e8a32bc302fad8 GIT binary patch literal 89432 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/label_options.png b/docs/docs/assets/images/plugin/builtin/label_options.png new file mode 100644 index 0000000000000000000000000000000000000000..cad52dbdeb488acdeb794cd6f9509dbcd88478dd GIT binary patch literal 8812 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/label_select.png b/docs/docs/assets/images/plugin/builtin/label_select.png new file mode 100644 index 0000000000000000000000000000000000000000..165883d6158f4c087e25d8588dc018787601ab51 GIT binary patch literal 21460 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 a<-6SBFp#hTA??!M4s^5(@1r&BU;i&7Pd%3a literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/label_sheet_select.png b/docs/docs/assets/images/plugin/builtin/label_sheet_select.png new file mode 100644 index 0000000000000000000000000000000000000000..0dfedbfe20c6274b620dc894daf302e85daef753 GIT binary patch literal 38388 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/lcsc_plugin_settings.png b/docs/docs/assets/images/plugin/builtin/lcsc_plugin_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..c88eaa26003b8e6bbed3c2da854aaf28b4d7a30e GIT binary patch literal 7726 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/mouser_plugin_settings.png b/docs/docs/assets/images/plugin/builtin/mouser_plugin_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..182e690316ea1d08972007faecd462c149e8c5c4 GIT binary patch literal 9680 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 CUP^2L literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/notification_settings.png b/docs/docs/assets/images/plugin/builtin/notification_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c897527947410af2a2e4a6585cc3a00b34436e GIT binary patch literal 20505 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/part_notification_settings.png b/docs/docs/assets/images/plugin/builtin/part_notification_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..084e5128f1f517155e7bffbebbff9a2102afa4de GIT binary patch literal 9095 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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/images/plugin/builtin/tme_plugin_settings.png b/docs/docs/assets/images/plugin/builtin/tme_plugin_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..d717b6d45df08c6df1e965ea7b9ef044d082e79d GIT binary patch literal 7678 zcmc(Ec{tSF|F`b$(uQQsT1eS%*|QZPge+rh!;K_+vTvjAqOneqAwmnvGNxgSow7|K z3S(bxCdM+BVKxkYpV4z&zyF?pp6~U2{x~yp&YaIV@9pz?zuxC0-LW*`I3;w7jg5`N z^wv!qHnu+-f!_@$jsu^@d{!2~*O3q#69cx&K9MD$^QZR>iyLfgX!vQS`!S$@^1&^~ z5H>c>c2+xr3;KAMjZHMu^yUq_NY~Y=n3wrsQA!)ceABD-mX)IqEhSH${Q82;h(jT| zA^k>~nuGw)nLngEq(5uDk-m?fG-yZSPo2CF@FMS@3-{YDB}Dr8EN7ARO=>@N(j`F;Y+S%s@ZOhFaQ%9|3yL1=R3IS;IfTCs_)!edYK)t^OkE51@NN<0*tS{44R( zY2fS8zXg-<_-#~ zTunmtiF3bClpA0fa}oVi$~5Cv223i0L~PqVYNd_?MUYZ;EgVlEc!~DnZ=R)dvZ zg9FUfl_UmKk!1(hG#B!JUE2I;K9Kj>D)E>uQQeJPms9e?( zL(c-Wd*K7|Ro=O}N`Oj_TJF!bB`8Cg42QZ0?$nYe@7QC)SJNIJl?ZGKy>(k8PvN}F z4$30*$j1KKwt2_8s0yFR$wkilxqzI?% z(P&PMXqLB?bMvaZD}jhi`G%vR3hb+jFQzF?SLvz;`1P2LXTZvdXVNmIIbc&3J}w8; zE{EpuAV*X+X>StFnJfUU(XbaNo9+I-!}vGnYJKI9ivK_dH28Z0m76hYW1@K}{mgg%`-s&5 za)Obw=hm=la=fCaF}~ybmWh+WNx+DqJ~Yx8nKEdF>&}w%?0zW|{NR@9H8LI&_Sl`2FW!&=k8*=WlNPdDrJ}8_oCK3ex%d1e7b*0JM9v_yKWz)$Kv7VZB&{F#s;^yEqEJl0=w5((wFgFS%Kjt}pleZ7rKBYaE z8s$uQl})p^3RqtS)m3`vR|~ICbDM)nfvrUzsOq+um`mW+QS>Yu>=DLTMU{vi0`g;ZE4*BUHne`}5OI>DO>pBX!!ciMuU^2~MD*xV)5kU!Lm zAQ~SJsLh7I*IytitnLq^u8iR7f(ah;-B~O%h*M6X#7;L3sJ<)Jnmb)fN>w3hbddZ2 zs6nU>+#+PgyMoJTW|HNcvg_j@(kuva*Pdw?>(+=?gEsgE6>$UJIY(ElfM4e4fCFH{ zw@{3CJ3dAws?Lp`tRa7$;ehY*bHbG+GhnJ|HNq2fBM12)!?1;SOHT;EgfaI4(rb;$ z8p*zvSig#?9FRv1oo43Q{j0&i4P~vog?aqKxWiW8CmCYFtr3USt1M8#JXq&eu@dI( z;fE)m7eCK?IGn4kD)GHwq+;-RCr^q=C&rfDD|0Ztzg+6O>}Q06m?*ek)Ltl-rl0E> zVJqY}b3dt2rw~+|cHWU^rY`WVd}G+{ULXR?jvDE-mS_R+b!!la+hJUlGp>WxWY&8M zv;ZSsuaU7W=}6=dW?8Qo9ZcxzjH6Epu*^DE?G5f-H`V10=PS!dUU$4`GlVyqj2-)t zLwig6yU6amoqd*F1#elUoiB>ft%r&Z3sTkat}zp^61H20t9d0dV6msta!N+$pLwKt9W69N={ob?#Qw33^7*KFk!C7X?vO* z3azMPd1c>bu)zJba*!XZO&#H~b^R6M8Vm&}W6q>)~tx$D^;<&j1)J>AP z?A6Z%kQY~!v?n2vG!y8PG8Hr6KwX}`@7tFiLZ-YeE{54kbEPUv`pKp<`r4~6<(r-h zZijFL&#z8+00t!%s&||-2JG|3w))=pvJ(x-U1`DsBd#$4y}4@T(YElVw-||XX6Z^{ z7ntZh)5TyYP=V0EXUjI2shrL-n+KV8nxU4>ifPHHDs*!0r>hCF<(uDtvE=rWPB7kj zz~6(a7V2decaAPEC`N~9NEpLECaDgLVu}^)_dTp;g&G;z#w4G>6orZE`F|25keu1J z`=*AO#yKc#|wn`e*cGtGzU)lBTA=fW>J*-!ZGifv{K_<&& z^_{cb+spRbT?52T(d5E%R85)F@^w}|^As1n6Q%EUaE}imjc~2Kw|?0|ma;z%_5!;b zKJ$|$4Y@ac9Gu0ql$hi>ifUyfj9 zYtcSe9Wegy`52#A@k{o{{4}r~X>?V4)lV}3x!5dJ&F0jgZH(vqg>_36dzE0ob@0Hd zG#kvDPHry5Xe2A;t4pZwt2fdIux(HMogKx|ZI+_4Ey)dnis|sZ_VIydIPjV*=>F8f zuf9=C4RVgn+@6%|R?*jjd^leEgn&>=g*6;8E%L#u{jWCV@N4#`K;~s-8OMh&k*5#v z`WaG53(cmnWJG@Of)@w*bLMwolk~h%C25O~X;Kodt|LN3m!D_7duPO~^s6-*6G>-Q ziL!PoAQuohgj&2--cid;ky{mk{^3+qpkb8y5yX3ZD(8zIF%j-UdL>4|^g$ zLJ2_+{N0jSS@nmrlux$b>`r=(urr|>wF+BUfN@!_iEs6Zy67ex{X|Pc)XmWVwq!|o znYsMGjFjT5Yd1!v)rTytIW(f1!9$2d)qPq^{?DP;c!{`wpYHQ*EluW|hj)!@jK?Ge zj7{@vOic({e0S`x1WfA7;@^ugJ1$-$bI-y%2M?w*kRQx5+G4QFYlDZxwnmA&$S*~F zl3T9OryC)|U*JX#?qhL{@Z~qlhb%t2Sr0tMXT9hKqUlB7WTi5J&@fxHI2cVHUF23{ z0qv;5m{Xj;J@HKCG^M0@{?kg@0W*O4CCA!Y<4rtOnl)?D#&&C(v09=)?mHl}sjZ9yWzN- zm;0elo+XMrg`jYA-`eK}pmZFqE5CT8_5;1ZIWL;N?lEXZ>>OR@U_DLwIGuT-*)(9K zAeB9ynp8*ZgWIQCHLtYfWZ0iMELB6|^hn7t*zhGZWj6r-{?ZD6zKDq{vpE@!4U6db z<$k#Fj>3iuP?enz*`@;@*v2 zssL*KS&vfcYSb%9j#l zK4(&>TSbXlhRmc}VMvV)6;cpx4f#$IncU z^>`ftzn(;#=x*hv4EHzd;5KD7@@BcPEKd6;Z9LaO6xB74<3c)gF-lFsL6)RnPOOct zRRbHj#beaOoL_Y<1aRlo8ck9igi!vP6ro(AG)cDX)dN$V!Ht`-%+B(;p81|XVlu~< z$dT@)ceht+;>-N2xPVnY>E~gKgQ@zME;->0K}Yf69xt`vdGD&P#Gm3d_E!DPlL-*+ ze6W*R)2EVm1Ldn(L<0WkmDfA7o^agac_L{mPjq5f_dHk2RpooH)mx%%+0{&1zf@50FzCVIZKo(yQ*IaIA@qr5sM2bc4cK8T(S?{mZL5bkvjk=dUYT>8*8 zrg9v2l-OH&|9)%WPd7x%`E$U|nwWrbL>B~J)7g6rsT^`+_({2w@?y7aLx!NPgmX*e z-c$hjD_8Y)e7Hv;9NM5D5W)0+s~ksG+hHz5Hj(S=KAzRfiuWV{FO&!4Bl{c^6fbT9 z_BP)u!5M;EMKY6dTEw>uN=6rB+(cG-gO0vSraI_E*~sVBm(5ME z&I8z@2Y|5i+`_`-^lf=?spazNrJN1?5PN5#R)RJXy*9$Vw`(+6{l={m%5J{*;|tz! zYJg|VrruC#`tS&4UOlL1x{)W8C8&WBcoTaJ(){8OiQjOIy8Qs@LO-56%utjg`Ny38 zsZ4(gIku-44)&jEKtUng+$J4O-a^zB)*04xILiMkLiJPw&EgORf8b6uG)NyFZ!H?$ zQ@o$n6X?Se8ul9^f3P#hlCoxcuPiRRWRxuFHQKHA@1(URkv+LkVrz&*(Z;f8z?y8F zjw%8ez+6Jn3>TmT6eQqX;&kYzi@LX_u6QU13)wy?`T4dK7# z&)y-21mF$xqrKXlo$9jX5XvkmDOZ7Pe-7pUk@Pd{!ak`(YN3Ei8&-GhIsyFoSr5WU z8t3F#qI&^;^6V-Oiur*TrmkLoUI`m(Pwd!O9{K8sz6#*pjw5>W^MT?uadv;v*KGh053py)5GyFovwepV4*gN8Dp<}gkxSaz&CYHL|kBn`V>cwx{v?_ZMUhJFuEV+Ws z_l6aGTSvNADqJL@m$=3~wqLi;*}_T5>?K@suRjo8`$9xpd;AnX0+7lqvTLphTG#Tk zCoyPMRlBa-8ZI%Rv2!2scb*F`!q=}$djc~svYA4!cT0zpW4mhrB(~H;)njym04|VKHX+6sGE@%1 z^^Hz%++-HAqvRpr`jcDn_D;uldXAwGvPEUtFzBkJnlg25rnA=jOuChlPpXA}zQ8m6 zFvCgO^txSd>F_q$4UXFTUR``CX?}!xZ%8b}l=;0eC{;)Tmisjt8LLX*sP6h)t|!wjK(+L~4f2Rf7oGK^d4jmjDXYD8Y+o)*a9< zqjX&%HJ8P5Tq^>jBV2a7b0f)k`Maj9xkILGb}F+N&4~3qbZnf^N_L!_r4yr;TnQT6 zLq_=o?GE%R7Fg9&ds_I~D_gOH`;bB?qs3oGORcYfyfP35y5cvvUvNyRBQbmUW|7=n z7F{qQ>*ZJJs#8!jBs;Co(Bp zI$w~7zIDZq^}egFr8YYCt;C-96u`k@IV@VZi?G7&O;vQSn6<(oqJ=TEGRCv@y^vUX zvxcu8i!d|~?b~F!bjv1Qa|<6?qt;Q|oO^au_hjvxGrpq^Rc>F!JL$)g$OEq2+)6L0 z5l*#?Tt;n3zYJ)*NC{fao5PB{O2}2Ul074EYhs1LQjgm{l$y9F6u-0mlQKso-(S7# zX(mLTt+q^!(W8!_XD0{g=a)gd8;;&xM~S4EQZMkht20lz9~}N3-W#r{_n~5wl$%q7 zN=9DgSvZha*N+W+TU7=DfELnP}z)6j{8~VCMJ`d9Upf zx%%0RK(@F(W~ifyU{fzSm!V>xjkv~%(w9t>k5X3@Dtw6m4mwnHokE;C3)XWnvU=8| z>nyUlkF2;6^^kOuymg+c96S14Fluf}nOGl03aOtMYCO=@qmwRc2eh>)sqt8*R2Mp* zJ9_%d?bcG2xzX&wzU-M*!&dkdU#rW8?~-ey?Ik=ln2#?eE2xvUl~NQJ%XIxT;s?(M9L{fYA3GFY3!qH@2gamMhM&2)*WFhAMKc zYD#xSV_&)puGaO{G!xd{5k$BW%@_%Xi>QR^;52`Qp)sqwqBf%_AD6$1{#j+ z#mu*})_oIVnsIaL(LTPtHNrHv#E1HKM8ymvPf(w>vFy%Te-u^Fhln=%UHwx2{4ZRK z1!~fkCOm!`Nlkog~|j;_>lZ zL9JMaGs0Kvq6hP6i1x#qxkZI&tmPTj3@H4+c!l??Mq^(EDfTC@@1qtE=4iXQ{$-!s nQ@?KqkM$f{{ icon("users") }} Contacts navigation tab: -{% with id="contact_list", url="order/contact_list.png", description="Contact List" %} -{% include "img.html" %} -{% endwith %} - +{{ image("order/contact_list.png", "Company Contacts") }} A *contact* can be assigned to orders, (such as [purchase orders](../purchasing/purchase_order.md) or [sales orders](../sales/sales_order.md)). diff --git a/docs/docs/concepts/project_codes.md b/docs/docs/concepts/project_codes.md index caebefcc39..f357149ceb 100644 --- a/docs/docs/concepts/project_codes.md +++ b/docs/docs/concepts/project_codes.md @@ -12,9 +12,11 @@ Individual orders (such as [Purchase Orders](../purchasing/purchase_order.md) or Management of project codes (such as creating or editing codes) is accessed via the [settings page](../settings/global.md). Select the *Project Codes* tab to access project code configuration options: -{% with id="project_codes", url="settings/project_codes.png", description="Project Codes List" %} -{% include "img.html" %} -{% endwith %} +{{ image("settings/project_codes.png", "Project Codes") }} + +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("PROJECT_CODES_ENABLED") }} #### Enable Project Code Support @@ -24,14 +26,10 @@ By default, project code support is disabled. Select the *Enable Project Codes* Project codes can be assigned to an order when the order is created, or at any later stage by simply editing the order. If project code support is enabled, a *Project Code* field is available in the order details form: -{% with id="assign_project_code", url="order/assign_project_code.png", description="Assign Project Code" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/assign_project_code.png", "Assign Project Code") }} ## Filtering by Project Codes The order tables can be easily filtered or sorted by project code: -{% with id="filter-by-project", url="order/filter_by_project.png", description="Filter by Project Code" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/filter_by_project.png", "Filter by Project Code") }} diff --git a/docs/docs/hooks.py b/docs/docs/hooks.py index fe3f7096cf..9a5cf2a41b 100644 --- a/docs/docs/hooks.py +++ b/docs/docs/hooks.py @@ -258,3 +258,52 @@ def on_config(config, *args, **kwargs): config['releases'] = sorted(releases, key=lambda it: it['date'], reverse=True) return config + + +def on_post_build(*args, **kwargs): + """Run after the build is complete. + + Here we check that all global settings and user settings are documented. + """ + here = Path(__file__).parent + gen_base = here.parent.joinpath('generated') + + expected_settings_file = gen_base.joinpath('inventree_settings.json') + observed_settings_file = gen_base.joinpath('observed_settings.json') + + with open(observed_settings_file, encoding='utf-8') as f: + observed_settings = json.loads(f.read()) + + with open(expected_settings_file, encoding='utf-8') as f: + expected_settings = json.loads(f.read()) + + ignored_settings = { + 'global': ['SERVER_RESTART_REQUIRED'], + 'user': ['LAST_USED_PRINTING_MACHINES'], + } + + for group in ['global', 'user']: + expected = expected_settings.get(group, {}) + observed = observed_settings.get(group, {}) + ignored = ignored_settings.get(group, []) + + missing = [] + + for key in expected: + if key.startswith('_'): + # Ignore internal settings + continue + + if key in ignored: + # Ignore settings that are not relevant + continue + + if key not in observed: + missing.append(key) + + if missing: + raise NotImplementedError( + 'Missing Settings:\n' + + f"There are {len(missing)} missing settings in the '{group}' group:\n" + + '\n- '.join(missing) + ) diff --git a/docs/docs/manufacturing/allocate.md b/docs/docs/manufacturing/allocate.md index 2505ac85f8..0293d644c1 100644 --- a/docs/docs/manufacturing/allocate.md +++ b/docs/docs/manufacturing/allocate.md @@ -46,9 +46,7 @@ Untracked stock items are allocated against the *Build Order* itself. We do not Navigate to the *Allocate Stock* tab to view the stock allocation table: -{% with id="build_allocate_detail", url="build/build_allocate_detail.png", description="Allocate stock" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_allocate_detail.png", "Allocate stock") }} In this example, there are two BOM line items which have been partially allocated to the build. Each line has a progress bar indicating how much of the required stock has been allocated. @@ -57,19 +55,13 @@ Clicking on a particular row expands the row, showing a list of stock items whic !!! info "Multiple Allocations" Note that multiple stock items can be allocated to the given BOM line, if a single stock item does not have sufficient stock -{% with id="build_allocation_expand", url="build/build_allocation_expand.png", description="Allocate expand" %} -{% include "img.html" %} -{% endwith %} - ## Manual Stock Allocation For each line in the BOM, stock will be automatically allocated if one (and only one) stock item (for the referenced part) is found (within the specified *source location* for the build): Selecting *Allocate Stock* opens a dialog window which displays the stock items which will be allocated to the build during the auto allocation process: -{% with id="build_auto", url="build/build_auto_allocate.png", description="Auto allocate" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_auto_allocate.png", "Auto allocate") }} Note here that there are two parts in the BOM which can be automatically allocated, as they only have a single corresponding StockItem available. However the other BOM line item exists in multiple locations, and thus cannot be automatically allocated. These will need to be manually selected by the user. @@ -92,9 +84,7 @@ To speed up the allocation process, the *Auto Allocate* button can be used to al The *Automatic Allocation* dialog is presented as shown below: -{% with id="auto_allocate_dialog", url="build/auto_allocate_dialog.png", description="Automatic allocation dialog" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/auto_allocate_dialog.png", "Automatic allocation dialog") }} **Source Location** @@ -122,9 +112,7 @@ Allocating tracked stock items to particular build outputs is performed in the * In the *Pending Items* tab, we can see that each build output has a stock allocation requirement which must be met before that build output can be completed: -{% with id="build_allocate_tracked_parts", url="build/build_allocate_tracked_parts.png", description="Allocate tracked parts" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_allocate_tracked_parts.png", "Allocate tracked parts") }} Here we can see that the incomplete build outputs (serial numbers 15 and 14) now have a progress bar indicating the status of tracked stock item allocation: @@ -145,9 +133,7 @@ Here we can see that the incomplete build outputs (serial numbers 15 and 14) now Once all build outputs have been completed, the build order itself can be completed by selecting the *Complete Build* button: -{% with id="build_complete", url="build/complete_build.png", description="Complete build order" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_complete.png", "Complete build") }} ### Allocated Stock diff --git a/docs/docs/manufacturing/bom.md b/docs/docs/manufacturing/bom.md index a9a275eb79..6488a939d6 100644 --- a/docs/docs/manufacturing/bom.md +++ b/docs/docs/manufacturing/bom.md @@ -8,9 +8,7 @@ A Bill of Materials (BOM) defines the list of component parts required to make a A part which can be built from other sub components is called an *Assembly*. -{% with id="bom_flat", url="build/bom_flat.png", description="Flat BOM Table" %} -{% include 'img.html' %} -{% endwith %} +{{ image("build/bom_flat.png", "Flat BOM Table") }} ## BOM Line Items @@ -33,9 +31,7 @@ If a BOM line item is marked as *consumable*, this means that while the part and In the example below, see that the *Wood Screw* line item is marked as consumable. It is clear that 12 screws are required for each assembled *Table*, but the screws will not be tracked through the build process, as this line item is marked as *consumable* -{% with id="bom_item_consumable", url="build/bom_consumable_item.png", description="Consumable BOM Item" %} -{% include 'img.html' %} -{% endwith %} +{{ image("build/bom_consumable_item.png", "Consumable BOM Item") }} Further, in the [Build Order](./build.md) stock allocation table, we see that this line item cannot be allocated, as it is *consumable*. @@ -56,9 +52,7 @@ This is particularly useful if a template part is defined with the "common" BOM Consider the example diagram below: -{% with id="inherited_bom", url="build/inherited_bom.png", description="Inherited BOM Line Items" %} -{% include 'img.html' %} -{% endwith %} +{{ image("build/inherited_bom.png", "Inherited BOM Line Items") }} **Template Part A** has two BOM line items defined: *A1* and *A2*. @@ -99,9 +93,8 @@ BOMs can be created manually, by adjusting individual line items, or by upload a To manually add a BOM item, navigate to the part/assembly detail page then click on the "BOM" tab. On top of the tab view, click on the {{ icon("edit", color="blue", title="Edit") }} icon then, after the page reloads, click on the {{ icon("plus-circle") }} icon. The `Create BOM Item` form will be displayed: -{% with id="bom_add_item", url="build/bom_add_item.png", description="Create BOM Item Form" %} -{% include 'img.html' %} -{% endwith %} + +{{ image("build/bom_add_item.png", "Create BOM Item Form") }} Fill-out the `Quantity` (required), `Reference`, `Overage` and `Note` (optional) fields then click on Submit to add the BOM item to this part's BOM. @@ -110,9 +103,8 @@ Fill-out the `Quantity` (required), `Reference`, `Overage` and `Note` (optional) To manually add a substitute for a BOM item, click on the {{ icon("transfer") }} icon in the *Actions* columns. The `Edit BOM Item Substitutes` form will be displayed: -{% with id="bom_substitute_item", url="build/bom_substitute_item.png", description="Edit BOM Item Substitutes" %} -{% include 'img.html' %} -{% endwith %} + +{{ image("build/bom_substitute_item.png", "Edit BOM Item Substitutes") }} Select a part in the list and click on "Add Substitute" button to confirm. diff --git a/docs/docs/manufacturing/build.md b/docs/docs/manufacturing/build.md index 197faaf432..2e7c713328 100644 --- a/docs/docs/manufacturing/build.md +++ b/docs/docs/manufacturing/build.md @@ -16,9 +16,7 @@ To navigate to the Build Order display, select *Manufacturing* from the main nav The *Build Order Index Page* allows the user to view all build orders: -{% with id="build_display", url="build/build_display.png", description="Display Builds" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_display.png", title="Build Orders") }} The following view modes are available: @@ -26,17 +24,13 @@ The following view modes are available: *Table View* provides a table of Build Orders, which can be filtered to only show the orders you are interested in. -{% with id="build_list", url="build/build_list.png", description="Build List" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_list.png", title="Build List") }} #### Calendar View *Calendar View* shows a calendar display with outstanding build orders, based on the various dates specified for each order. -{% with id="build_calendar", url="build/build_calendar.png", description="Build Calendar" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_calendar.png", title="Build Calendar") }} The build calendar allows the user to navigate month-by-month and display the filtered build orders @@ -121,17 +115,13 @@ The detail view for a single build order provides multiple display panels, as fo The *Build Details* panel provides an overview of the Build Order: -{% with id="build_details", url="build/build_panel_details.png", description="Build details panel" %} -{% include "img.html" %} -{% endwith %} +{{ image ("build/build_panel_details.png", title="Build Details") }} ### Line Items The *Line Items* panel displays all the line items (as defined by the [bill of materials](./bom.md)) required to complete the build order. -{% with id="build_allocate", url="build/build_panel_line_items.png", description="Build line items panel" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_panel_line_items.png", title="Line Items") }} The allocation table (as shown above) provides an interface to allocate required stock, and also shows the stock allocation progress for each line item in the build. @@ -139,9 +129,7 @@ The allocation table (as shown above) provides an interface to allocate required The *Incomplete Outputs* panel shows the list of in-progress [build outputs](./output.md) (created stock items) associated with this build. -{% with id="build_outputs", url="build/build_outputs.png", description="Outputs tab" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_outputs.png", title="Build Outputs") }} !!! info "Example: Build Outputs" In the example image above, a single output (serial number 2) has been completed, while serial numbers 1 and 4 are still in progress. @@ -158,9 +146,7 @@ This panel displays all the completed build outputs (stock items) which have bee The *Allocated Stock* tab displays all stock items which have been *allocated* to this build order. These stock items are reserved for this build, and will be consumed when the build is completed: -{% with id="allocated_stock_table", url="build/allocated_stock_table.png", description="Allocated Stock Table" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/allocated_stock_table.png", title="Allocated Stock Table") }} ### Consumed Stock @@ -173,43 +159,27 @@ The *Consumed Stock* tab displays all stock items which have been *consumed* by If there exist any build orders which are *children* of the selected build order, they are displayed in the *Child Builds* tab: -{% with id="build_childs", url="build/build_childs.png", description="Child builds panel" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_childs.png", title="Child Builds") }} ### Test Results For *trackable* parts, test results can be recorded against each build output. These results are displayed in the *Test Results* panel: -{% with id="build_test_results", url="build/build_panel_test_results.png", description="Test Results panel" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_panel_test_results.png", title="Test Results") }} This table provides a summary of the test results for each build output, and allows test results to be quickly added for each build output. -### Test Statistics - -For *trackable* parts, this panel displays a summary of the test results for all build outputs: - -{% with id="build_test_stats", url="build/build_panel_test_statistics.png", description="Test Statistics panel" %} -{% include "img.html" %} -{% endwith %} - ### Attachments Files attachments can be uploaded against the build order, and displayed in the *Attachments* tab: -{% with id="build_attachments", url="build/build_attachments.png", description="Attachments tab" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_attachments.png", title="Attachments") }} ### Notes Build order notes (which support markdown formatting) are displayed in the *Notes* tab: -{% with id="build_notes", url="build/build_notes.png", description="Notes tab" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_notes.png", title="Notes") }} ## Create Build Order @@ -221,9 +191,7 @@ To create a build order for your part, you have two options: - Select the *Build Orders* tab - Select *Start new Build* -{% with id="build_create_from_part", url="build/build_create_from_part.png", description="Create build from Part view" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_create_from_part.png", title="Create Build Order from Part") }} ### Build Order Page diff --git a/docs/docs/manufacturing/example.md b/docs/docs/manufacturing/example.md index 624f83fa95..c3649acf61 100644 --- a/docs/docs/manufacturing/example.md +++ b/docs/docs/manufacturing/example.md @@ -4,53 +4,41 @@ title: Build Order Example ## Build Order Example -For example, let's say we wish to create 10 new "Widgets". We create a new build for the widget, which signals an *intent* to assemble the "Widget" in quantity 10. As the *Widget* is a serialized part, with tracked subcomponents, the build outputs must themselves be serialized. This means that we need to generate 10 separate build outputs for this build order. +For example, let's say we wish to create 10 new "Widgets". We create a new build for the widget, which signals an *intent* to assemble the "Widget" in quantity 10. As the *Widget* is a serialized part, with tracked sub-components, the build outputs must themselves be serialized. This means that we need to generate 10 separate build outputs for this build order. ### Create Build Order First, create a new build order for the *Widget* assembly: -{% with id="build_example_create", url="build/build_example_create.png", description="Create build order" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_example_create.png", "Create Build Order") }} ### Generate Build Outputs -Generate build outputs for this build order. As this is a tracked item, with tracked subcomponents, the build outputs must be serialized: +Generate build outputs for this build order. As this is a tracked item, with tracked sub-components, the build outputs must be serialized: -{% with id="build_example_create_outputs", url="build/build_example_create_outputs.png", description="Create build outputs" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_example_create_outputs.png", "Create Build Outputs") }} A list of new build outputs will have now been generated: -{% with id="build_example_incomplete_list", url="build/build_example_incomplete_list.png", description="Incomplete build outputs" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_example_incomplete_list.png", "Incomplete Build Outputs") }} ### Allocate Untracked Stock Untracked stock items are allocated to the build order in the *Allocate Stock* tab: -{% with id="build_example_allocate_untracked", url="build/build_example_allocate_untracked.png", description="Allocated Untracked Stock" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_example_allocate_untracked.png", "Allocate Untracked Stock") }} ### Allocate Tracked Stock Tracked stock items are allocated to individual build outputs: -{% with id="build_example_allocate_tracked", url="build/build_example_allocated_tracked.png", description="Allocated Tracked Stock" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_example_allocated_tracked.png", "Allocate Tracked Stock") }} ### Complete Build Outputs Mark each build output as complete: -{% with id="build_example_complete_outputs", url="build/build_example_complete_outputs.png", description="Complete Build Outputs" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_example_complete_outputs.png", "Complete Build Outputs") }} ### Complete Build Order diff --git a/docs/docs/manufacturing/output.md b/docs/docs/manufacturing/output.md index e907c02dd6..a4a9d56f49 100644 --- a/docs/docs/manufacturing/output.md +++ b/docs/docs/manufacturing/output.md @@ -14,25 +14,19 @@ With reference to a [build order](./build.md), a *Build Output* is a finished pr The *Incomplete Outputs* tab displays any outstanding / in-progress build outputs for the current build order. -{% with id="build-outputs-incomplete", url="build/build_outputs_incomplete.png", description="Incomplete build outputs" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_outputs_incomplete.png", "Incomplete build outputs") }} ### Completed Outputs The *Completed Outputs* tab displays any [completed](#complete-build-output) or [scrapped](#scrap-build-output) outputs for the current build order. -{% with id="build-outputs-complete", url="build/build_outputs_complete.png", description="Complete build outputs" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_outputs_complete.png", "Completed build outputs") }} ## Create Build Output Create a new build output by pressing the {{ icon("plus-circle") }} New Build Output button under the [incomplete outputs](#incomplete-outputs) tab: -{% with id="build_output_create", url="build/build_output_create.png", description="Create build output" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_output_create.png", "Create build output") }} ### Create Options @@ -55,9 +49,7 @@ Refer to the [serial number generation guide](../stock/tracking.md#generating-se An individual build output is completed by selecting the "Complete build output" button associated with that build output: -{% with id="build_output_complete", url="build/build_output_complete.png", description="Complete build output" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_output_complete.png", "Complete build output") }} Here the user can select the destination location for the build output, as well as the stock item status. @@ -84,9 +76,7 @@ The following options are available when completing a build output: An individual build output is completed by selecting the *Scrap build output* button associated with that build output: -{% with id="build_output_scrap", url="build/build_output_scrap.png", description="Scrap build output" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_output_scrap.png", "Scrap build output") }} Marking the build output(s) as scrapped performs the following actions: @@ -109,9 +99,7 @@ The following options are available when scrapping a build order: *Deleting* a build output causes the build output to be cancelled, and removed from the database entirely. Use this option when the build output does not physically exist (or was never built) and should not be tracked in the database. -{% with id="build_output_delete", url="build/build_output_delete.png", description="Delete build output" %} -{% include "img.html" %} -{% endwith %} +{{ image("build/build_output_delete.png", "Delete build output") }} Marking the build output(s) as deleted performs the following actions: diff --git a/docs/docs/part/create.md b/docs/docs/part/create.md index 43c9ff4a7a..0fc3c7a930 100644 --- a/docs/docs/part/create.md +++ b/docs/docs/part/create.md @@ -9,17 +9,12 @@ New parts can be created from the *Part Category* view, by pressing the *New Par !!! info "Permissions" If the user does not have "create" permission for the *Part* permission group, the *New Part* button will not be available. -{% with id="new", url="part/new_part.png", description="New Part" %} -{% include "img.html" %} -{% endwith %} +{{ image("part/new_part.png", "New part") }} A part creation form is opened as shown below: - -{% with id="newform", url="part/part_create_form.png", description="New Part Form" %} -{% include "img.html" %} -{% endwith %} +{{ image("part/part_create_form.png", "New part form") }} Fill out the required part parameters and then press *Submit* to create the new part. If there are any form errors, you must fix these before the form can be successfully submitted. @@ -32,9 +27,7 @@ If the *Create Initial Stock* setting is enabled, then an extra section is avail If this setting is enabled, the following elements are available in the form: -{% with id="initial_stock", url="part/part_initial_stock.png", descript="Initial stock" %} -{% include "img.html" %} -{% endwith %} +{{ image("part/part_initial_stock.png", "Initial stock") }} Checking the *Create Initial Stock* form input then allows the creation of an initial quantity of stock for the new part. @@ -43,18 +36,11 @@ Checking the *Create Initial Stock* form input then allows the creation of an in If the part is marked as *Purchaseable*, the form provides some extra options to initialize the new part with manufacturer and / or supplier information: - -{% with id="supplierinfo", url="part/part_create_supplier.png", descript="Add supplier information" %} -{% include "img.html" %} -{% endwith %} - +{{ image("part/part_create_supplier.png", "Part supplier options") }} If the *Add Supplier Data* option is checked, then supplier part and manufacturer part information can be added to the newly created part: - -{% with id="suppliers", url="part/part_new_suppliers.png", descript="Part supplier information" %} -{% include "img.html" %} -{% endwith %} +{{ image("part/part_new_suppliers.png", "Part supplier information") }} ## Other Part Creation Methods diff --git a/docs/docs/part/index.md b/docs/docs/part/index.md index 7f359ee2c8..c14ec788d6 100644 --- a/docs/docs/part/index.md +++ b/docs/docs/part/index.md @@ -4,7 +4,7 @@ title: Parts ## Part -The *Part* is the core element of the InvenTree ecosystem. A Part object is the archetype of any stock item in your inventory. Parts are arranged in hierarchical categories which are used to organise and filter parts by function. +The *Part* is the core element of the InvenTree ecosystem. A Part object is the archetype of any stock item in your inventory. Parts are arranged in hierarchical categories which are used to organize and filter parts by function. ## Part Category @@ -12,9 +12,7 @@ Part categories are very flexible and can be easily arranged to match a particul Each part category also shows a list of sub-categories which exist underneath it. -{% with id="part_category", url="part/part_category.png", description="Parts are arranged in categories" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_category.png", "Part category") }} The category part list provides an overview of each part: @@ -100,9 +98,7 @@ Each type of part can define a custom "unit of measure" which is a standardized It is possible to track parts using physical quantity values, such as *metres* or *litres*. For example, it would make sense to track a "wire" in units of "metres": -{% with id="part_units", url="part/part_units.png", description="Parts units" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_units.png", "Part units") }} ### Supplier Part Units @@ -113,17 +109,13 @@ By default, units of measure for [supplier parts](../purchasing/supplier.md#supp If an incompatible unit type is specified, an error will be displayed: -{% with id="part_units_invalid", url="part/part_units_invalid.png", description="Invalid supplier part units" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_units_invalid.png", "Invalid supplier part units") }} ## Part Images Each part can have an associated image, which is used for display purposes throughout the InvenTree interface. A prominent example is on the part detail page itself: -{% with id="part_image", url="part/part_image_example.png", description="Part image example" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_image_example.png", "Part image example") }} ### Image Thumbnails @@ -135,9 +127,7 @@ Thumbnail images are also used throughout the interface, particularly in table v In the web interface, part images can be uploaded directly from the [part view](./views.md). Hover the mouse cursor over the Part image to reveal multiple options: -{% with id="part_image_uplaod", url="part/part_image_upload.png", description="Upload part image" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_image_upload.png", "Part image upload") }} | Action | Description | | --- | --- | diff --git a/docs/docs/part/notification.md b/docs/docs/part/notification.md index 745495434f..7ca8d36aa3 100644 --- a/docs/docs/part/notification.md +++ b/docs/docs/part/notification.md @@ -13,24 +13,20 @@ Users can select to receive notifications when certain events occur. Each user must have a valid email address associated with their account to receive email notifications Notifications are also shown in the user interface. New notifications are announced in the header. -{% with id="notification_header", url="part/notification_header.png", description="One new notification in the header" %} -{% include 'img.html' %} -{% endwith %} + +{{ image("part/notification_header.png", "Notification header") }} They can be viewed in a flyout. -{% with id="notification_flyout", url="part/notification_flyout.png", description="One new notification in the flyout" %} -{% include 'img.html' %} -{% endwith %} + +{{ image("part/notification_flyout.png", "Notification flyout") }} All current notifications are listed in the inbox. -{% with id="notification_inbox", url="part/notification_inbox.png", description="One new notification in the notification inbox" %} -{% include 'img.html' %} -{% endwith %} + +{{ image("part/notification_inbox.png", "Notification inbox") }} All past notification are listed in the history. They can be deleted one-by-one or all at once from there. -{% with id="notification_history", url="part/notification_history.png", description="One old notification in the notification history" %} -{% include 'img.html' %} -{% endwith %} + +{{ image("part/notification_history.png", "Notification history") }} ## Part Notification Events @@ -59,15 +55,11 @@ When subscribed to a *Part*, a user will receive notifications when events occur If a user is subscribed to a particular part, it will be indicated as shown below: -{% with id="part_sub_on", url="part/part_subscribe_on.png", description="Subscribe" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_subscribe_on.png", "Part subscribed") }} If the user is not subscribed, the subscription icon is greyed out, as shown here: -{% with id="part_sub_off", url="part/part_subscribe_off.png", description="Subscribe" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_subscribe_off.png", "Part not subscribed") }} Clicking on this icon will toggle the subscription status for this part. diff --git a/docs/docs/part/parameter.md b/docs/docs/part/parameter.md index 120ddbcd18..78e924ab49 100644 --- a/docs/docs/part/parameter.md +++ b/docs/docs/part/parameter.md @@ -11,9 +11,7 @@ There is no limit for the number of part parameters and they are fully customiza Here is an example of parameters for a capacitor: -{% with id="part_parameters_example", url="part/part_parameters_example.png", description="Part Parameters Example List" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_parameters_example.png", "Part Parameters Example") }} ## Parameter Templates @@ -42,9 +40,7 @@ To create a template: An existing template can be edited by clicking on the "Edit" button associated with that template: -{% with id="part_parameter_template", url="part/parameter_template_edit.png", description="Edit Parameter Template" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/parameter_template_edit.png", "Edit Parameter Template") }} ### Create Parameter @@ -52,9 +48,7 @@ After [creating a template](#create-template) or using the existing templates, y To add a parameter, navigate to a specific part detail page, click on the "Parameters" tab then click on the "New Parameters" button, the `Create Part Parameter` form will be displayed: -{% with id="create_part_parameter", url="part/create_part_parameter.png", description="Create Part Parameter Form" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/create_part_parameter.png", "Create Part Parameter Form") }} Select the parameter `Template` you would like to use for this parameter, fill-out the `Data` field (value of this specific parameter) and click the "Submit" button. @@ -64,17 +58,13 @@ Parametric tables gather all parameters from all parts inside a particular [part To access a category's parametric table, click on the "Parameters" tab within the category view: -{% with id="parametric_table_tab", url="part/parametric_table_tab.png", description="Parametric Table Tab" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/parametric_table_tab.png", "Parametric Table Tab") }} ### Sorting by Parameter Value The parametric parts table allows the returned parts to be sorted by particular parameter values. Click on the header of a particular parameter column to sort results by that parameter: -{% with id="sort_by_param", url="part/part_sort_by_param.png", description="Sort by Parameter" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_sort_by_param.png", "Sort by Parameter") }} ## Parameter Units @@ -89,23 +79,15 @@ The in-built conversion functionality means that parameter values can be input i If a part parameter is created with a value which is incompatible with the units specified for the template, it will be rejected: -{% with id="invalid_units", url="part/part_invalid_units.png", description="Invalid Parameter Units" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_invalid_units.png", "Invalid Parameter Units") }} -This behaviour can be disabled if required, so that any parameter value is accepted: - -{% with id="enforce_units", url="part/part_parameters_enforce.png", description="Enforce part parameters" %} -{% include 'img.html' %} -{% endwith %} +This behaviour can be disabled if required, so that any parameter value is accepted. ### Parameter Sorting Parameter sorting takes unit conversion into account, meaning that values provided in different (but compatible) units are sorted correctly: -{% with id="sort_by_param_units", url="part/part_sorting_units.png", description="Sort by Parameter Units" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_sorting_units.png", "Sort by Parameter Units") }} ### Selection Lists diff --git a/docs/docs/part/pricing.md b/docs/docs/part/pricing.md index 507e72ce0c..fb6e9b3723 100644 --- a/docs/docs/part/pricing.md +++ b/docs/docs/part/pricing.md @@ -42,9 +42,7 @@ The pricing tab is divided into different sections, based on the available prici At the top of the pricing tab, an *Overview* section shows a synopsis of the available pricing data: -{% with id="pricing_overview", url="part/pricing_overview.png", description="Pricing Overview" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_overview.png", "Pricing Overview") }} This overview tab provides information on the *range* of pricing data available within each category. If pricing data is not available for a given category, it is marked as *No data*. @@ -65,9 +63,7 @@ A particular Part may have a set of *Internal Price Breaks* which denote quantit If desired, price breaks can be specified based on particular quantities. -{% with id="pricing_internal", url="part/pricing_internal.png", description="Internal Pricing" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_internal.png", "Internal Pricing") }} #### Pricing Override @@ -77,25 +73,19 @@ If the **Internal Price Override** setting is enabled, then internal pricing dat If the Part is designated as *purchaseable*, then historical purchase cost information is displayed (and used to calculate overall pricing). Purchase history data is collected from *completed* [purchase orders](../purchasing/purchase_order.md). -{% with id="pricing_purchase_history", url="part/pricing_purchase_history.png", description="Purchase History" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_purchase_history.png", "Purchase History") }} ### Supplier Pricing If supplier pricing information is available, this can be also used to determine price range data. -{% with id="pricing_supplier", url="part/pricing_supplier.png", description="Supplier Pricing" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_supplier.png", "Supplier Pricing") }} ### BOM Pricing If a Part is designated as an *assembly*, then the [Bill of Materials](../manufacturing/bom.md) (BOM) can be used to determine the price of the assembly. The price of each component in the BOM is used to calculate the overall price of the assembly. -{% with id="pricing_bom", url="part/pricing_bom.png", description="BOM Pricing" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_bom.png", "BOM Pricing") }} #### BOM Pricing Chart @@ -108,25 +98,19 @@ The BOM *Pricing Chart* displays two separate "pie charts", with minimum and max For *template* parts, the price of any *variants* of the template is taken into account: -{% with id="pricing_variants", url="part/pricing_variants.png", description="Variant Pricing" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_variants.png", "Variant Pricing") }} ### Sale Pricing If the Part is designated as *Salable* then sale price breaks are made available. These can be configured as desired by the user, to define the desired sale price at various quantities. -{% with id="pricing_sale_price_breaks", url="part/pricing_sale_price_breaks.png", description="Sale Pricing" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_sale_price_breaks.png", "Sale Pricing") }} ### Sale History If the Part is designated as *Salable* then historical sale cost information is available. Sale history data is collected from *completed* [sales orders](../sales/sales_order.md). -{% with id="pricing_sale_history", url="part/pricing_sale_history.png", description="Sale History" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/pricing_sale_history.png", "Sale History") }} ### Price Data Caching diff --git a/docs/docs/part/revision.md b/docs/docs/part/revision.md index 4d3a9bd79d..fe7d94304d 100644 --- a/docs/docs/part/revision.md +++ b/docs/docs/part/revision.md @@ -37,9 +37,7 @@ The following options are available to control the behavior of part revisions. Note that these options can be changed in the InvenTree settings: -{% with id="part_revision_settings", url="part/part_revision_settings.png", description="Part revision settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_revision_settings.png", "Part revision settings") }} * **Enable Revisions**: If this setting is enabled, parts can have revisions. If this setting is disabled, parts cannot have revisions. * **Assembly Revisions Only**: If this setting is enabled, only assembly parts can have revisions. This is useful if you only want to track revisions of assemblies, and not individual parts. @@ -50,9 +48,7 @@ To create a new revision for a given part, navigate to the part detail page, and Select the "Duplicate Part" action, to create a new copy of the selected part. This will open the "Duplicate Part" form: -{% with id="part_create_revision", url="part/part_create_revision.png", description="Create part revision" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_create_revision.png", "Create part revision") }} In this form, make the following updates: @@ -63,16 +59,12 @@ Once these changes (and any other required changes) are made, press *Submit* to Once the form is submitted (without any errors), you will be redirected to the new part revision. Here you can see that it is linked to the original part: -{% with id="part_revision_b", url="part/part_revision_b.png", description="Revision B" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_revision_b.png", "Part revision B") }} ## Revision Navigation When multiple revisions exist for a particular part, you can navigate between revisions using the *Select Part Revision* drop-down which renders at the top of the part page: -{% with id="part_revision_select", url="part/part_revision_select.png", description="Select part revision" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_revision_select.png", "Select part revision") }} Note that this revision selector is only visible when multiple revisions exist for the part. diff --git a/docs/docs/part/scheduling.md b/docs/docs/part/scheduling.md index b9e667d9d8..199075d259 100644 --- a/docs/docs/part/scheduling.md +++ b/docs/docs/part/scheduling.md @@ -29,6 +29,4 @@ Additionally, any orders with a target date in the "past" are also ignored for t Finally, any unexpected or unscheduled stock operations which are not associated with future orders cannot be predicted or displayed in the scheduling tab. -{% with id="scheduling", url="part/scheduling.png", description="Part Scheduling View" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/scheduling.png", "Part Scheduling View") }} diff --git a/docs/docs/part/stocktake.md b/docs/docs/part/stocktake.md index 85ad6676d0..6ec9b2e217 100644 --- a/docs/docs/part/stocktake.md +++ b/docs/docs/part/stocktake.md @@ -31,15 +31,11 @@ Historical stocktake data for a particular part can be viewed in the *Stocktake* This tab displays a chart of historical stock quantity and cost data, and corresponding tabulated data: -{% with id="stocktake_tab", url="part/part_stocktake_tab.png", description="Part stocktake tab" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_tab.png", "Part stocktake tab") }} If this tab is not visible, ensure that the *Part Stocktake* [user setting](../settings/user.md) is enabled in the *Display Settings* section. -{% with id="stocktake_tab_enable", url="part/part_stocktake_enable_tab.png", description="Enable stocktake tab" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_enable_tab.png", "Enable stocktake tab") }} !!! info "Permission Required" The stocktake tab will be unavailable if your user account does not have the [required permissions](#stocktake-permissions) @@ -61,9 +57,7 @@ Stocktake reports are made available for download as a tabulated `.csv` file, wh There are a number of configuration options available in the [settings view](../settings/global.md): -{% with id="stocktake_settings", url="part/part_stocktake_settings.png", description="Stocktake settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_settings.png", "Stocktake settings") }} ### Enable Stocktake @@ -71,7 +65,7 @@ Enable or disable stocktake functionality. Note that by default, stocktake funct ### Automatic Stocktake Period -Configure the number of days between genenration of [automatic stocktake reports](#automatic-stocktake). If this value is set to zero, automatic stocktake reports will not be generated. +Configure the number of days between generation of [automatic stocktake reports](#automatic-stocktake). If this value is set to zero, automatic stocktake reports will not be generated. ### Delete Old Reports @@ -81,9 +75,7 @@ Configure how many days stocktake reports will be retained, before being deleted The *Stocktake Settings* display also provides a table of historical stocktake reports: -{% with id="stocktake_report_table", url="part/part_stocktake_report_table.png", description="Stocktake reports" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_report_table.png", "Stocktake report table") }} ## Stocktake Permissions @@ -101,9 +93,7 @@ Manual stocktake can be performed via the web interface in a number of locations When performing a stocktake, various options are presented to the user: -{% with id="stocktake_generate", url="part/part_stocktake_generate.png", description="Generate stocktake report" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_generate.png", "Generate stocktake report") }} | Option | Description | | --- | --- | @@ -115,27 +105,21 @@ When performing a stocktake, various options are presented to the user: ### Part Stocktake -A stockake report for a single part can be generated from the *Stocktake Tab* on the part page: +A stocktake report for a single part can be generated from the *Stocktake Tab* on the part page: -{% with id="stocktake_part", url="part/part_stocktake_from_part.png", description="Generate part stocktake report" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_from_part.png", "Generate part stocktake report") }} ### Category Stocktake A stocktake report for a part category can be generated from the *Part Category* page: -{% with id="stocktake_category", url="part/part_stocktake_from_category.png", description="Generate category stocktake report" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_from_category.png", "Generate category stocktake report") }} ### Location Stocktake A stocktake report for a stock location can be generated from the *Stock Location* page: -{% with id="stocktake_location", url="part/part_stocktake_from_location.png", description="Generate location stocktake report" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stocktake_from_location.png", "Generate location stocktake report") }} ### Automatic Stocktake @@ -144,3 +128,15 @@ If enabled, stocktake reports can be generated automatically at a configured int ### API Functionality Stocktake actions can also be performed via the [API](../api/index.md). + +## Stocktake Settings + +The following settings are available for stocktake: + +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("STOCKTAKE_ENABLE") }} +{{ globalsetting("STOCKTAKE_EXCLUDE_EXTERNAL") }} +{{ globalsetting("STOCKTAKE_AUTO_DAYS") }} +{{ globalsetting("STOCKTAKE_DELETE_REPORT_DAYS") }} +{{ globalsetting("DISPLAY_PROFILE_INFO") }} diff --git a/docs/docs/part/test.md b/docs/docs/part/test.md index c3c0fc8ff0..17513820cb 100644 --- a/docs/docs/part/test.md +++ b/docs/docs/part/test.md @@ -10,9 +10,7 @@ A test template defines the parameters of the test; the individual stock items c Test templates "cascade" down to variant parts: this means that if a master part has multiple variants, any test template defined for the master part will be assigned to the variants. Any stock items of the variant parts will have the same test templates associated with them. -{% with id="part_test_templates", url="part/part_test_templates.png", description="Part Test Templates" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_test_templates.png", "Part Test Templates") }} ### Test Template Parameters diff --git a/docs/docs/part/views.md b/docs/docs/part/views.md index 10882707c1..cf5bd850b7 100644 --- a/docs/docs/part/views.md +++ b/docs/docs/part/views.md @@ -15,9 +15,7 @@ The categories of each part is displayed on the top navigation bar as show in th Details provides information about the particular part. Parts details can be displayed in the header panel clicking on "Show Part Details" toggle button. -{% with id="part_overview", url="part/part_overview.png", description="Part details" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_overview.png", "Part Overview") }} A Part is defined in the system by the following parameters: @@ -57,9 +55,7 @@ If a part is a *Template Part* then the *Variants* tab will be visible. The *Stock* tab shows all the stock items for the selected *Part*. The user can quickly determine how many parts are in stock, where they are located, and the status of each *Stock Item*. -{% with id="part_stock", url="part/part_stock.png", description="Part Stock" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_stock.png", "Part Stock") }} #### Functions @@ -99,9 +95,7 @@ The *Suppliers* tab displays all the *Part Suppliers* and *Part Manufacturers* f This tab is only visible if the *Part* is designated as *Purchaseable*. -{% with id="part_manufacturers_suppliers", url="part/part_manufacturers_suppliers.png", description="Part Suppliers and Manufacturers" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_manufacturers_suppliers.png", "Part Suppliers and Manufacturers") }} ### Purchase Orders @@ -131,9 +125,7 @@ Related Part denotes a relationship between two parts, when users want to show t Related parts can be added and are shown under a table of the same name in the "Part" view: -{% with id="related_parts", url="part/part_related.png", description="Related Parts Example View" %} -{% include 'img.html' %} -{% endwith %} +{{ image("part/part_related.png", "Related Parts Example View") }} This feature can be enabled or disabled in the global part settings. diff --git a/docs/docs/plugins/builtin/auto_issue.md b/docs/docs/plugins/builtin/auto_issue.md new file mode 100644 index 0000000000..412c931467 --- /dev/null +++ b/docs/docs/plugins/builtin/auto_issue.md @@ -0,0 +1,25 @@ +--- +title: Auto Issue Orders Plugin +--- + +## Auto Issue Orders Plugin + +The **Auto Issue Orders Plugin** provides a mechanism to automatically issue pending orders when the target date is reached. + +### Activation + +This plugin is an *optional* plugin, and must be enabled in the InvenTree settings. + +Additionally, the "Enable Schedule Integration" setting must be enabled in the InvenTree plugin settings. This is required to allow plugins to run scheduled tasks. + +### Plugin Settings + +The plugin allows configuration for which order types should be automatically issued. + +{{ image("auto_issue_settings.png", base="plugin/builtin", title="Auto Issue Settings") }} + +## Usage + +When this plugin is enabled, any pending orders will be automatically issued when the target date is reached. This is done in the background, and does not require any user interaction. + +The plugin checks once per day to see if any orders are pending and have reached their target date. If so, the order will be automatically issued. diff --git a/docs/docs/plugins/builtin/bom_exporter.md b/docs/docs/plugins/builtin/bom_exporter.md new file mode 100644 index 0000000000..7a785b8c05 --- /dev/null +++ b/docs/docs/plugins/builtin/bom_exporter.md @@ -0,0 +1,25 @@ +--- +title: BOM Exporter Plugin +--- + +## BOM Exporter Plugin + +The **BOM Exporter Plugin** provides custom export functionality for [Bill of Materials (BOM)](../../manufacturing/bom.md) data. + +It utilizies the [ExporterMixin](../mixins/export.md) mixin to provide a custom export format for BOM data. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin has no configurable settings. + +## Usage + +This plugin is used in the same way as the [InvenTree Exporter Plugin](./inventree_exporter.md), but provides a custom export format for BOM data. + +When exporting BOM data, the *BOM Exporter* plugin is available for selection in the export dialog. When selected, the plugin provides some additional export options to control the data export process. + +{{ image("bom_export_options.png", base="plugin/builtin", title="BOM Export Options") }} diff --git a/docs/docs/plugins/builtin/currency_exchange.md b/docs/docs/plugins/builtin/currency_exchange.md new file mode 100644 index 0000000000..4f67ee1eda --- /dev/null +++ b/docs/docs/plugins/builtin/currency_exchange.md @@ -0,0 +1,21 @@ +--- +title: InvenTree Currency Exchange +--- + +## InvenTree Currency Exchange + +The **InvenTree Currency Exchange** plugin provides a default currency exchange rate provider for InvenTree. + +The plugin pulls exchange rate information from the [frankfurter API](https://www.frankfurter.app/) API. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin has no configurable settings. + +## Usage + +This plugin is the default currency exchange provider for InvenTree. It is used to convert between different currencies when displaying prices in the InvenTree user interface. An altertnative currency exchange provider can be configured in the InvenTree settings, but this plugin is always available as a fallback option. diff --git a/docs/docs/plugins/builtin/digikey.md b/docs/docs/plugins/builtin/digikey.md new file mode 100644 index 0000000000..5534faf6da --- /dev/null +++ b/docs/docs/plugins/builtin/digikey.md @@ -0,0 +1,19 @@ +--- +title: DigiKey Barcode Plugin +--- + +## DigiKey Barcode Plugin + +The **DigiKey Barcode Plugin** provides barcode support for [DigiKey](https://www.digikey.com/) products. When receiving items from DigiKey, the barcode on the product can be scanned to automatically identify the product in InvenTree. + +This plugin implements the [BarcodeMixin](../mixins/barcode.md) mixin to provide custom barcode support. + +### Activation + +This plugin is an *optional* plugin, and must be enabled in the InvenTree admin center. + +### Plugin Settings + +After activating the plugin, the user must specify which [supplier](../../purchasing/supplier.md) the plugin should be associated with. This is done by selecting the supplier from the dropdown list in the plugin settings: + +{{ image("digikey_plugin_settings.png", base="plugin/builtin", title="DigiKey Plugin Settings") }} diff --git a/docs/docs/plugins/builtin/index.md b/docs/docs/plugins/builtin/index.md new file mode 100644 index 0000000000..d2e38ffef3 --- /dev/null +++ b/docs/docs/plugins/builtin/index.md @@ -0,0 +1,37 @@ +--- +title: Builtin Plugins +--- + +## Builtin Plugins + +InvenTree comes with a number of builtin plugins, which provide additional functionality to the system. These plugins are installed by default, and do not require any additional configuration. + +Some of the provided builtin plugins are *mandatory*, as they provide core functionality to the system. Other plugins are optional, and can be enabled or disabled as required. + +### Available Plugins + +The following builtin plugins are available in InvenTree: + +| Plugin Name | Description | Mandatory | +| ----------- | ----------- | --------- | +| [Auto Issue Orders](./auto_issue.md) | Automatically issue pending orders when target date is reached | No | +| [BOM Exporter](./bom_exporter.md) | Custom [exporter](../mixins/export.md) for BOM data | Yes | +| [Currency Exchange](./currency_exchange.md) | Currency exchange rate plugin | Yes | +| [DigiKey](./digikey.md) | DigiKey barcode support | No | +| [InvenTree Barcode](./inventree_barcode.md) | Internal barcode support | Yes | +| [InvenTree Core Notifications](./notifications.md) | Core notification system | Yes | +| [InvenTree Exporter](./inventree_exporter.md) | Custom [exporter](../mixins/export.md) for InvenTree data | Yes | +| [Label Printer](./inventree_label.md) | Custom [label](../mixins/label.md) for InvenTree data | Yes | +| [Label Machine](./inventree_label_machine.md) | Custom [label](../mixins/label.md) for InvenTree data | Yes | +| [Label Sheet](./inventree_label_sheet.md) | Custom [label](../mixins/label.md) for InvenTree data | Yes | +| [LCSC](./lcsc.md) | LCSC barcode support | No | +| [Mouser](./mouser.md) | Mouser barcode support | No | +| [Parameter Exporter](./part_parameter_exporter.md) | Custom [exporter](../mixins/export.md) for part parameter data | Yes | +| [Part Notifications](./part_notifications.md) | Notifications for part changes | No | +| [TME](./tme.md) | TME barcode support | No | + +### Plugin Table + +In the admin center, the plugins table can be filtered to display only builtin plugins. This is done by selecting the "Builtin" filter in the table toolbar: + +{{ image("filter_plugins.png", base="plugin/builtin", title="Builtin Plugin Filter") }} diff --git a/docs/docs/plugins/builtin/inventree_barcode.md b/docs/docs/plugins/builtin/inventree_barcode.md new file mode 100644 index 0000000000..ee7ba38b3d --- /dev/null +++ b/docs/docs/plugins/builtin/inventree_barcode.md @@ -0,0 +1,22 @@ +--- +title: InvenTree Barcode Plugin +--- + +## InvenTree Barcode Plugin + +The **InvenTree Barcode Plugin** provides builtin barcode support for InvenTree products. It provides functionality for generating and scanning barcodes. It implements the [BarcodeMixin](../mixins/barcode.md) mixin to provide custom barcode support. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin provides selection of the barcode format to use when generating labels. The format can be selected from: + +- **JSON Barcodes**: This format is used for generating barcodes in JSON format, which is a 'human readable' format. +- **Short Barcodes**: This format is used for generating barcodes in a short format, which is a more compact representation of the barcode data. + +Additionally, if the "Short Barcodes" format is selected, the user can specify the prefix used for the barcode. This prefix is used to identify the barcode format, and can be set to any value. The default value is `INV-` - although can be changed. + +{{ image("barcode_plugin_settings.png", base="plugin/builtin", title="Barcode Plugin Settings") }} diff --git a/docs/docs/plugins/builtin/inventree_exporter.md b/docs/docs/plugins/builtin/inventree_exporter.md new file mode 100644 index 0000000000..661e644cb8 --- /dev/null +++ b/docs/docs/plugins/builtin/inventree_exporter.md @@ -0,0 +1,29 @@ +--- +title: InvenTree Exporter Plugin +--- + +## InvenTree Exporter Plugin + +The **InvenTree Exporter Plugin** provides basic data export functionality. It is the "default" export plugin, and can be used to export data from any tabulated dataset. + +It utilizes the [ExporterMixin](../mixins/export.md) mixin to provide a general purpose export format for InvenTree data. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin has no configurable settings. + +## Usage + +To export table data using this plugin, first click the *Download Data* button in the table toolbar: + +{{ image("download_data.png", base="plugin/builtin", title="Download Data") }} + +Then, select the *InvenTree Exporter* plugin from the list of available plugins: + +{{ image("select_exporter.png", base="plugin/builtin", title="Select Exporter") }} + +Finally, select the desired export format and then click the *Export* button to download the data. diff --git a/docs/docs/plugins/builtin/inventree_label.md b/docs/docs/plugins/builtin/inventree_label.md new file mode 100644 index 0000000000..5802a557d6 --- /dev/null +++ b/docs/docs/plugins/builtin/inventree_label.md @@ -0,0 +1,25 @@ +--- +title: InvenTree Label Plugin +--- + +## InvenTree Label Plugin + +The **InvenTree Label Plugin** provides a simple way to print labels for InvenTree products. The plugin utilizes the [label mixin](../mixins/label.md) to provide custom printing support. + +When printing labels using this plugin, the labels are printed as PDF files which can be downloaded and printed using any PDF viewer. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin provides a "DEBUG" mode, which can be enabled in the plugin settings. This mode is intended for development and testing purposes only, and should not be used in production environments. In debug mode, the plugin will generate labels with raw HTML - which can be useful for debugging purposes. However, this mode may not produce valid PDF files, and should not be used for actual label printing. + +{{ image("label_options.png", base="plugin/builtin", title="Label Options") }} + +## Usage + +To use this plugin, select the *InvenTreeLabel* option from the list of available plugins when printing labels. The plugin will generate a PDF file containing the labels for the selected products. + +{{ image("label_select.png", base="plugin/builtin", title="Label Plugin") }} diff --git a/docs/docs/plugins/builtin/inventree_label_machine.md b/docs/docs/plugins/builtin/inventree_label_machine.md new file mode 100644 index 0000000000..8bc7b6a0f9 --- /dev/null +++ b/docs/docs/plugins/builtin/inventree_label_machine.md @@ -0,0 +1,23 @@ +--- +title: InvenTree Label Machine Plugin +--- + +## InvenTree Label Machine Plugin + +The **InvenTree Label Machine Plugin** provides support for printing labels using the [machines interface](../machines/overview.md) in InvenTree. + +It allows labels to be printed directly to an external label printer, using the machines interface. + +This plugin by itself does *not* provide connection to any specific label printer. Instead, it provides a generic interface for printing labels to any machine that is configured in InvenTree. A separate plugin is required to provide the actual connection to the label printer. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin has no configurable settings. + +## Usage + +When printing a label, select the *InvenTreeLabelMachine* option from the list of available plugins. Then, select the desired machine from the list of available machines. diff --git a/docs/docs/plugins/builtin/inventree_label_sheet.md b/docs/docs/plugins/builtin/inventree_label_sheet.md new file mode 100644 index 0000000000..1ea58a1a0f --- /dev/null +++ b/docs/docs/plugins/builtin/inventree_label_sheet.md @@ -0,0 +1,29 @@ +--- +title: InvenTree Label Sheet Plugin +--- + +## InvenTree Label Sheet Plugin + +The **InvenTree Label Sheet Plugin** provides a custom label sheet format for InvenTree. This plugin utilizes the [label mixin](../mixins/label.md) to provide custom printing support. + +When printing labels using this plugin, the labels are collated and printed on a single "sheet", in a regular grid format. This is useful for printing labels on standard label sheets. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +### Plugin Settings + +This plugin provides a "DEBUG" mode, which can be enabled in the plugin settings. This mode is intended for development and testing purposes only, and should not be used in production environments. In debug mode, the plugin will generate labels with raw HTML - which can be useful for debugging purposes. However, this mode may not produce valid PDF files, and should not be used for actual label printing. + +{{ image("label_sheet_options.png", base="plugin/builtin", title="Label Options") }} + +## Usage + +To use this plugin, select the *InvenTreeLabelSheet* option from the list of available plugins when printing labels. The plugin will generate a PDF file containing the labels for the selected products. + +This plugin provides some additional options in the dialog for customizing the output. + +{{ image("label_sheet_select.png", base="plugin/builtin", title="Label Sheet Plugin") }} diff --git a/docs/docs/plugins/builtin/lcsc.md b/docs/docs/plugins/builtin/lcsc.md new file mode 100644 index 0000000000..9e09322596 --- /dev/null +++ b/docs/docs/plugins/builtin/lcsc.md @@ -0,0 +1,19 @@ +--- +title: LCSC Barcode Plugin +--- + +## LCSC Barcode Plugin + +The **LCSC Barcode Plugin** provides barcode support for [LCSC](https://lcsc.com/) products. When receiving items from LCSC, the barcode on the product can be scanned to automatically identify the product in InvenTree. + +This plugin implements the [BarcodeMixin](../mixins/barcode.md) mixin to provide custom barcode support. + +### Activation + +This plugin is an *optional* plugin, and must be enabled in the InvenTree admin center. + +### Plugin Settings + +After activating the plugin, the user must specify which [supplier](../../purchasing/supplier.md) the plugin should be associated with. This is done by selecting the supplier from the dropdown list in the plugin settings: + +{{ image("lcsc_plugin_settings.png", base="plugin/builtin", title="LCSC Plugin Settings") }} diff --git a/docs/docs/plugins/builtin/mouser.md b/docs/docs/plugins/builtin/mouser.md new file mode 100644 index 0000000000..86afa24210 --- /dev/null +++ b/docs/docs/plugins/builtin/mouser.md @@ -0,0 +1,19 @@ +--- +title: Mouser Barcode Plugin +--- + +## Mouser Barcode Plugin + +The **Mouser Barcode Plugin** provides barcode support for [Mouser](https://www.mouser.com/) products. When receiving items from Mouser, the barcode on the product can be scanned to automatically identify the product in InvenTree. + +This plugin implements the [BarcodeMixin](../mixins/barcode.md) mixin to provide custom barcode support. + +### Activation + +This plugin is an *optional* plugin, and must be enabled in the InvenTree admin center. + +### Plugin Settings + +After activating the plugin, the user must specify which [supplier](../../purchasing/supplier.md) the plugin should be associated with. This is done by selecting the supplier from the dropdown list in the plugin settings: + +{{ image("mouser_plugin_settings.png", base="plugin/builtin", title="Mouser Plugin Settings") }} diff --git a/docs/docs/plugins/builtin/notifications.md b/docs/docs/plugins/builtin/notifications.md new file mode 100644 index 0000000000..4e3a5a34e2 --- /dev/null +++ b/docs/docs/plugins/builtin/notifications.md @@ -0,0 +1,21 @@ +--- +title: Notifications Plugin +--- + +## InvenTree Core Notifications + +The **InvenTree Core Notifications** plugin provides a notification system for InvenTree. It allows users to receive notifications when certain events occur in the system. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +The following settings are available for the notifications plugin: + +{{ image("notification_settings.png", base="plugin/builtin", title="Notification Settings") }} + +## Usage + +Configure the plugin to enable the desired notification types. The plugin will then send notifications to users when the specified events occur. diff --git a/docs/docs/plugins/builtin/part_notifications.md b/docs/docs/plugins/builtin/part_notifications.md new file mode 100644 index 0000000000..09c33ad2eb --- /dev/null +++ b/docs/docs/plugins/builtin/part_notifications.md @@ -0,0 +1,23 @@ +--- +title: Part Notifications +--- + +## Part Notifications Plugin + +The **Part Notifications Plugin** provides a notification system for part changes. It allows users to receive notifications when certain events occur on parts. + +### Activation + +This plugin is an *optional* plugin, and must be enabled in the InvenTree settings. + +### Plugin Settings + +This plugin has the following configurable settings: + +{{ image("part_notification_settings.png", base="plugin/builtin", title="Part Notification Settings") }} + +## Usage + +To enable the part notifications plugin, the *Enable Event Integration* setting must be enabled in the InvenTree settings. This will allow the plugin to send notifications when certain events occur on parts. + +{{ image("enable_events.png", base="plugin/builtin", title="Enable Events") }} diff --git a/docs/docs/plugins/builtin/part_parameter_exporter.md b/docs/docs/plugins/builtin/part_parameter_exporter.md new file mode 100644 index 0000000000..f77962e58d --- /dev/null +++ b/docs/docs/plugins/builtin/part_parameter_exporter.md @@ -0,0 +1,25 @@ +--- +title: Part Parameter Exporter +--- + +## Part Parameter Exporter + +The **Part Parameter Exporter** plugin provides custom export functionality for [Part Parameter](../../part/parameter.md) data. + +It utilizes the [ExporterMixin](../mixins/export.md) mixin to provide a custom export format for part parameter data. + +### Activation + +This plugin is a *mandatory* plugin, and is always enabled. + +### Plugin Settings + +This plugin has no configurable settings. + +## Usage + +This plugin is used in the same way as the [InvenTree Exporter Plugin](./inventree_exporter.md), but provides a custom export format for part parameter data. + +When exporting part parameter data, the *Part Parameter Exporter* plugin is available for selection in the export dialog. When selected, the plugin provides some additional export options to control the data export process. + +{{ image("parameter_export_options.png", base="plugin/builtin", title="Part Parameter Export Options") }} diff --git a/docs/docs/plugins/builtin/tme.md b/docs/docs/plugins/builtin/tme.md new file mode 100644 index 0000000000..608aa16df3 --- /dev/null +++ b/docs/docs/plugins/builtin/tme.md @@ -0,0 +1,19 @@ +--- +title: TME Barcode Plugin +--- + +## TME Barcode Plugin + +The **TME Barcode Plugin** provides barcode support for [TME](http://tme.eu/) products. When receiving items from TME, the barcode on the product can be scanned to automatically identify the product in InvenTree. + +This plugin implements the [BarcodeMixin](../mixins/barcode.md) mixin to provide custom barcode support. + +### Activation + +This plugin is an *optional* plugin, and must be enabled in the InvenTree admin center. + +### Plugin Settings + +After activating the plugin, the user must specify which [supplier](../../purchasing/supplier.md) the plugin should be associated with. This is done by selecting the supplier from the dropdown list in the plugin settings: + +{{ image("tme_plugin_settings.png", base="plugin/builtin", title="TME Plugin Settings") }} diff --git a/docs/docs/plugins/install.md b/docs/docs/plugins/install.md index 08c6b0ba08..f0ca40839e 100644 --- a/docs/docs/plugins/install.md +++ b/docs/docs/plugins/install.md @@ -26,9 +26,7 @@ In certain container environments (such as docker), plugins are installed into a !!! tip "Check Plugins on Startup" Ensure the **Check Plugins on Startup** option is enabled, when running InvenTree in a container environment! -{% with id="check_plugins", url="plugin/check_on_startup.png", description="Check plugins on startup" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/check_on_startup.png", "Check plugins on startup") }} ### Installation Methods @@ -65,9 +63,7 @@ Installation via PIP (using the *plugins.txt* file) provides a number of advanta Admin users can install plugins directly from the web interface, via the "Plugin Settings" view: -{% with id="plugin_install", url="plugin/plugin_install_web.png", description="Install via web interface" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/plugin_install_web.png", "Install plugin via web interface") }} !!! success "Plugin File" A plugin installed via the web interface is added to the [plugins.txt](#plugin-installation-file-pip) plugin file. diff --git a/docs/docs/plugins/metadata.md b/docs/docs/plugins/metadata.md index 86999d52af..605436b4c9 100644 --- a/docs/docs/plugins/metadata.md +++ b/docs/docs/plugins/metadata.md @@ -46,9 +46,8 @@ For models which provide this metadata field, access is also provided via the AP For example: -{% with id="metadata_api", url="plugin/model_metadata_api.png", description="Access model metadata via API", maxheight="400px" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/model_metadata_api.png", "Access model metadata via API", maxheight="400px") }} + #### PUT vs PATCH diff --git a/docs/docs/plugins/mixins/event.md b/docs/docs/plugins/mixins/event.md index 8ec1ccc6f9..c2f048b055 100644 --- a/docs/docs/plugins/mixins/event.md +++ b/docs/docs/plugins/mixins/event.md @@ -11,9 +11,7 @@ When a certain (server-side) event occurs, the background worker passes the even !!! tip "Enable Event Integration" The *Enable Event Integration* option must first be enabled to allow plugins to respond to events. -{% with id="events", url="plugin/enable_events.png", description="Enable event integration" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/enable_events.png", "Enable event integration") }} ## Events diff --git a/docs/docs/plugins/mixins/export.md b/docs/docs/plugins/mixins/export.md index 938e7cce36..e96dec8245 100644 --- a/docs/docs/plugins/mixins/export.md +++ b/docs/docs/plugins/mixins/export.md @@ -21,9 +21,10 @@ Each plugin can dictate which datasets are supported using the `supports_export` show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True The default implementation returns `True` for all data types. @@ -36,9 +37,10 @@ The `generate_filename` method constructs a filename for the exported file. show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True ### Adjust Columns @@ -49,9 +51,10 @@ The `update_headers` method allows the plugin to adjust the columns selected to show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True ### Queryset Filtering @@ -62,9 +65,10 @@ The `filter_queryset` method allows the plugin to provide custom filtering to th show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True ### Export Data @@ -75,9 +79,10 @@ The `export_data` method performs the step of transforming a [Django QuerySet]({ show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True Note that the default implementation simply uses the builtin tabulation functionality of the provided serializer class. In most cases, this will be sufficient. diff --git a/docs/docs/plugins/mixins/label.md b/docs/docs/plugins/mixins/label.md index 77b6927e78..d115f9f4f3 100644 --- a/docs/docs/plugins/mixins/label.md +++ b/docs/docs/plugins/mixins/label.md @@ -112,9 +112,7 @@ To merge (combine) multiple labels into a single output (for example printing mu If label printing plugins are enabled, they are able to be used directly from the InvenTree web interface: -{% with id="label_print", url="plugin/print_label_select_plugin.png", description="Print label via plugin" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/print_label_select_plugin.png", "Print label via plugin") }} ### App Integration diff --git a/docs/docs/plugins/mixins/locate.md b/docs/docs/plugins/mixins/locate.md index 1f45ba32a6..8d5ac999d6 100644 --- a/docs/docs/plugins/mixins/locate.md +++ b/docs/docs/plugins/mixins/locate.md @@ -14,17 +14,13 @@ The possibilities are endless! ### Web Integration -{% with id="web_locate", url="plugin/web_locate.png", description="Locate stock item from web interface", maxheight="400px" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/web_locate.png", "Locate stock item from web interface", maxheight="400px") }} ### App Integration If a locate plugin is installed and activated, the [InvenTree mobile app](../../app/index.md) displays a button for locating a StockItem or StockLocation (see below): -{% with id="app_locate", url="plugin/app_locate.png", description="Locate stock item from app", maxheight="400px" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/app_locate.png", "Locate stock item from app", maxheight="400px") }} ### Implementation diff --git a/docs/docs/plugins/mixins/schedule.md b/docs/docs/plugins/mixins/schedule.md index d0f28de7e2..25af4999c5 100644 --- a/docs/docs/plugins/mixins/schedule.md +++ b/docs/docs/plugins/mixins/schedule.md @@ -14,9 +14,7 @@ The ScheduleMixin class provides a plugin with the ability to call functions at !!! tip "Enable Schedule Integration" The *Enable Schedule Integration* option but be enabled, for scheduled plugin events to be activated. -{% with id="schedule", url="plugin/enable_schedule.png", description="Enable schedule integration" %} -{% include 'img.html' %} -{% endwith %} +{{ image("plugin/enable_schedule.png", "Enable schedule integration") }} ### SamplePlugin diff --git a/docs/docs/plugins/mixins/ui.md b/docs/docs/plugins/mixins/ui.md index f9ce26ae66..75446452a5 100644 --- a/docs/docs/plugins/mixins/ui.md +++ b/docs/docs/plugins/mixins/ui.md @@ -21,9 +21,10 @@ The entrypoint for user interface plugins is the `UserInterfaceMixin` class, whi show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True Note here that the `get_ui_features` calls other methods to extract the available features from the plugin, based on the requested feature type. These methods can be overridden to provide custom functionality. @@ -39,9 +40,10 @@ The `get_ui_features` method should return a list of `UIFeature` objects, which show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True summary: False members: [] + extra: + show_sources: True Note that the *options* field contains fields which may be specific to a particular feature type - read the documentation below on each feature type for more information. @@ -76,7 +78,8 @@ The InvenTree dashboard is a collection of "items" which are displayed on the ma show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -89,7 +92,8 @@ The *options* field in the returned `UIFeature` object can contain the following show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -110,7 +114,8 @@ Many of the pages in the InvenTree web interface are built using a series of "pa show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -123,7 +128,8 @@ The *options* field in the returned `UIFeature` object can contain the following show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -144,7 +150,8 @@ The `get_ui_template_editors` feature type can be used to provide custom templat show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -157,7 +164,8 @@ The `get_ui_template_previews` feature type can be used to provide custom templa show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] diff --git a/docs/docs/plugins/mixins/validation.md b/docs/docs/plugins/mixins/validation.md index d227321f6b..f7fd6e8025 100644 --- a/docs/docs/plugins/mixins/validation.md +++ b/docs/docs/plugins/mixins/validation.md @@ -25,7 +25,8 @@ A custom plugin may implement the `validate_model_deletion` method to perform cu show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -40,7 +41,8 @@ Any plugin which inherits the `ValidationMixin` can implement the `validate_mode show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -113,7 +115,8 @@ If the custom method determines that the part name is *objectionable*, it should show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -126,7 +129,8 @@ Validation of the Part IPN (Internal Part Number) field is exposed to custom plu show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -139,7 +143,8 @@ Validation of the Part IPN (Internal Part Number) field is exposed to custom plu show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -156,7 +161,8 @@ The `validate_batch_code` method allows plugins to raise an error if a batch cod show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -169,7 +175,8 @@ The `generate_batch_code` method can be implemented to generate a new batch code show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -188,7 +195,8 @@ Custom serial number validation can be implemented using the `validate_serial_nu show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -227,7 +235,8 @@ A custom plugin can implement the `convert_serial_to_int` method to determine ho show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] @@ -245,7 +254,8 @@ For custom serial number schemes, it is important to provide a method to generat show_bases: False show_root_heading: False show_root_toc_entry: False - show_sources: True + extra: + show_sources: True summary: False members: [] diff --git a/docs/docs/purchasing/manufacturer.md b/docs/docs/purchasing/manufacturer.md index 0e391f5159..616fbbbc6f 100644 --- a/docs/docs/purchasing/manufacturer.md +++ b/docs/docs/purchasing/manufacturer.md @@ -11,9 +11,7 @@ A manufacturer is an external **producer** of parts and raw materials. To access the list of manufacturers , click on the {{ icon("shopping-cart") }} Buy navigation tab and click on {{ icon("building-factory-2") }} Manufacturers option in the dropdown list. -{% with id="manufacturer_list", url="order/manufacturer_list.png", description="Manufacturer List" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/manufacturer_list.png", "Manufacturer List") }} ### Add Manufacturer diff --git a/docs/docs/purchasing/purchase_order.md b/docs/docs/purchasing/purchase_order.md index 16827fce53..a3d21fbc15 100644 --- a/docs/docs/purchasing/purchase_order.md +++ b/docs/docs/purchasing/purchase_order.md @@ -10,9 +10,7 @@ Purchase orders allow to track which parts are bought from suppliers and manufac To navigate to the Purchase Order display, select *Purchasing* from the main navigation menu, and *Build Orders* from the sidebar: -{% with id="purchase_order_display", url="order/po_display.png", description="Purchase Order Display" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/po_display.png", "Purchase Order Display") }} The following view modes are available: @@ -20,17 +18,13 @@ The following view modes are available: *Table View* provides a list of Purchase Orders, which can be filtered to display a subset of orders according to user supplied parameters. -{% with id="purchase_order_list", url="order/po_list.png", description="Purchase Order List" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/po_list.png", "Purchase Order List") }} #### Calendar View *Calendar View* shows a calendar display with outstanding purchase orders, based on the various dates specified for each order. -{% with id="purchase_order_calendar", url="order/po_calendar.png", description="Purchase Order Calendar" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/po_calendar.png", "Purchase Order Calendar") }} ### Purchase Order Status Codes @@ -159,21 +153,15 @@ Duplicating a Purchase Order allows the user to quickly create a new *copy* of a To duplicate an existing order, select the *Duplicate Order* action from the menu in the top-right of the screen (as shown below): -{% with id="purchase_order_duplicate", url="order/po_duplicate.png", description="Duplicate Purchase Order" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/po_duplicate.png", "Duplicate Purchase Order") }} This opens the following dialog, where you can adjust the parameters of the new order before proceeding to actually create the new order. You can see in the screenshot below that some extra options are provided in this form, to control duplication of individual line items. -{% with id="purchase_order_duplicate_2", url="order/po_duplicate_2.png", description="Duplicate Purchase Order" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/po_duplicate_2.png", "Duplicate Purchase Order") }} A new purchase order is then created based on the currently selected order: -{% with id="purchase_order_duplicate_3", url="order/po_duplicate_3.png", description="Duplicate Purchase Order" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/po_duplicate_3.png", "Duplicate Purchase Order") }} ## Order Scheduling diff --git a/docs/docs/purchasing/supplier.md b/docs/docs/purchasing/supplier.md index 30d9c7d050..fac5ae239d 100644 --- a/docs/docs/purchasing/supplier.md +++ b/docs/docs/purchasing/supplier.md @@ -9,9 +9,7 @@ A supplier is an external **vendor** of parts and raw materials. To access the supplier page, click on the {{ icon("shopping-cart") }} Buy navigation tab and click on {{ icon("building") }} Suppliers option in the dropdown list. -{% with id="supplier_list", url="order/supplier_list.png", description="Supplier List" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/supplier_list.png", "Supplier List") }} !!! info **Viewing**, **adding**, **editing** and **deleting** suppliers require the corresponding [Purchase Orders user permissions](../settings/permissions.md) @@ -56,15 +54,11 @@ Supplier parts can be individually disabled - for example, if a supplier part is The "active" status of a supplier part is clearly visible within the user interface: -{% with id="supplier_part_disable", url="order/disable_supplier_part.png", description="Disable Supplier Part" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/disable_supplier_part.png", "Disable Supplier Part") }} To change the "active" status of a supplier part, simply edit the supplier part details and set the `active` attribute: -{% with id="supplier_part_disable_edit", url="order/disable_supplier_part_edit.png", description="Disable Supplier Part" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/disable_supplier_part_edit.png", "Disable Supplier Part Edit") }} It is recommended to disable a supplier part rather than deleting it, as this will preserve the integrity of historical data. @@ -82,15 +76,11 @@ A custom can periodically request availability information (via a supplier API), If provided, availability information is displayed on the Supplier Part detail page. -{% with id="supplier_part_availability", url="order/supplier_part_availability.png", maxheight="240px", description="Supplier part availability" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/supplier_part_availability.png", "Supplier Part Availability") }} Availability information can be manually updated via the user interface: -{% with id="update_availability", url="order/update_availability.png", maxheight="240px", description="Update availability" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/update_availability.png", "Update Availability") }} ## Supplier Part Pack Size diff --git a/docs/docs/releases/0.1.4.md b/docs/docs/releases/0.1.4.md index 8963bb9198..506c726cae 100644 --- a/docs/docs/releases/0.1.4.md +++ b/docs/docs/releases/0.1.4.md @@ -39,19 +39,11 @@ Related Part denotes a relationship between two parts, when users want to show t - Ability to add relationships between parts through both main and admin interfaces - Can only manage relationship if user has "change" permission on Part ruleset -#### Example View - -{% with id="related_parts_example", url="https://user-images.githubusercontent.com/4020546/96306587-8f2d0b80-0fc5-11eb-8fdb-20cb2dabfcc6.png", description="Related Parts Example View" %} -{% include 'img.html' %} -{% endwith %} ### InvenTree "Global" Settings Global settings control the default value of fields across the entire web interface, for all-users. -!!! TODO - More information to come soon - Also, dedicated settings sections were added for: - Category @@ -72,32 +64,6 @@ Added support for configuring parameter templates defined by categories. * User can now setup a list of parameter templates for each (or all) part category(ies) in InvenTree settings * During part creation, part parameters are automatically created using the list of parameter templates from the parent category it belongs to (if option is enabled) -#### Screenshots - -* Select category - -{% with id="related_parts_example", url="https://user-images.githubusercontent.com/4020546/98037571-c2ef9a00-1de9-11eb-96a1-542b18cdda7e.png", description="Select Category" %} -{% include 'img.html' %} -{% endwith %} - -* Add parameter template - -{% with id="related_parts_example", url="https://user-images.githubusercontent.com/4020546/98145792-1cfb6880-1e99-11eb-82eb-c96d1ba9541a.png", description="Add Parameter Template" %} -{% include 'img.html' %} -{% endwith %} - -* Control global behavior within part settings - -{% with id="related_parts_example", url="https://user-images.githubusercontent.com/4020546/98130420-39db7000-1e88-11eb-9ca0-78370e19ccdd.png", description="Global Settings For Category Templates" %} -{% include 'img.html' %} -{% endwith %} - -* Control instance behavior during part creation - -{% with id="related_parts_example", url="https://user-images.githubusercontent.com/4020546/98130496-4f509a00-1e88-11eb-9239-4dc215cbc620.png", description="Instance Settings For Category Templates" %} -{% include 'img.html' %} -{% endwith %} - ### Currency Support A more comprehensive implementation of Currency support has been implemented. diff --git a/docs/docs/releases/0.1.8.md b/docs/docs/releases/0.1.8.md index 78da6ec046..195aaa2a1b 100644 --- a/docs/docs/releases/0.1.8.md +++ b/docs/docs/releases/0.1.8.md @@ -19,10 +19,6 @@ title: Release 0.1.8 ### Global Setting for Part IPN Edit [#1400](https://github.com/inventree/InvenTree/pull/1400) adds the ability to disable IPN field when editing part information for **all** parts and **all** users. This global setting is located in the "Part" section of the InvenTree settings. Toggling it off means the IPN field cannot be edited manually anymore after a part is created (the field is greyed out). Only admin users retain the ability to edit this field. -{% with id="disable_ipn_edit", url="part/part_ipn_editing.png", description="Disable Edit of Part IPN Field" %} -{% include 'img.html' %} -{% endwith %} - ### Image Download [#1410](https://github.com/inventree/InvenTree/pull/1410) introduces a new feature which allows thumbnail images (e.g. for *Part* and *Company* objects) to be downloaded from a remote URL (by the server). This feature is disabled by default, and must be enabled in the *Global Settings* menu. diff --git a/docs/docs/report/barcodes.md b/docs/docs/report/barcodes.md index 06099e646e..07187509e6 100644 --- a/docs/docs/report/barcodes.md +++ b/docs/docs/report/barcodes.md @@ -119,15 +119,11 @@ To render a QR code, use the `qrcode` template tag: which produces the following output: -{% with id="qrcode", url="report/qrcode.png", description="QR Code" %} -{% include 'img.html' %} -{% endwith %} - +{{ image("report/qrcode.png", "QR Code") }} !!! tip "Documentation" Refer to the [qrcode library documentation](https://pypi.org/project/qrcode/) for more information - ## Data Matrix !!! info "ppf.datamatrix" @@ -173,6 +169,4 @@ which produces the following output: which produces the following output: -{% with id="datamatrix", url="report/datamatrix.png", description="Datamatrix barcode" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/datamatrix.png", "Data Matrix") }} diff --git a/docs/docs/report/index.md b/docs/docs/report/index.md index 5bfd05d8d8..36a2490257 100644 --- a/docs/docs/report/index.md +++ b/docs/docs/report/index.md @@ -57,9 +57,7 @@ Report and label templates can be created (and edited) via the [admin interface] Select the type of template you are wanting to create (a *Report Template* or *Label Template*) and press the *Add* button in the top right corner: -{% with id="report-list", url="report/report_template_admin.png", description="Report templates in admin interface" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/report_template_admin.png", "Report template admin") }} !!! tip "Staff Access Only" Only users with staff access can upload or edit report template files. @@ -84,9 +82,7 @@ The filename pattern used to generate the output `.pdf` file. Defaults to "repor The filename pattern allows custom rendering with any context variables which are available to the report. For example, a test report for a particular [Stock Item](../stock/index.md#stock-item) can use the part name and serial number of the stock item when generating the report name: -{% with id="report-filename-pattern", url="report/filename_pattern.png", description="Report filename pattern" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/filename_pattern.png", "Report filename pattern") }} ### Template Filters @@ -95,15 +91,11 @@ Each template instance provides a *filters* field, which can be used to filter w As an example, let's say that a certain `StockItem` report should only be generated for "trackable" stock items. A filter could easily be constructed to accommodate this, by limiting available items to those where the associated [Part](../part/index.md) is *trackable*: -{% with id="report-filter-valid", url="report/filters_valid.png", description="Report filter selection" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/filters_valid.png", "Report filter selection") }} If you enter an invalid option for the filter field, an error message will be displayed: -{% with id="report-filter-invalid", url="report/filters_invalid.png", description="Invalid filter selection" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/filters_invalid.png", "Report filter error") }} !!! warning "Advanced Users" Report filtering is an advanced topic, and requires a little bit of knowledge of the underlying data structure! @@ -116,9 +108,7 @@ A JSON field made available to any [plugins](../plugins/index.md) - but not used A number of global reporting options are available for customizing InvenTree reports: -{% with id="report-options", url="report/report.png", description="Report Options" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/report.png", "Report options") }} ### Enable Reports diff --git a/docs/docs/report/labels.md b/docs/docs/report/labels.md index f2f455ec36..7b4ac1b768 100644 --- a/docs/docs/report/labels.md +++ b/docs/docs/report/labels.md @@ -19,9 +19,7 @@ A label template is a single `.html` file which is uploaded to the InvenTree ser Below is a reasonably simple example of a label template which demonstrates much of the available functionality. The template code shown below will produce the following label: -{% with id="label_example", url="report/label_example.png", description="Example label" %} -{% include 'img.html' %} -{% endwith %} +{{ image("report/label_example.png", "Example label") }} ```html {% raw %} diff --git a/docs/docs/sales/return_order.md b/docs/docs/sales/return_order.md index decacb9f88..37389a0b4c 100644 --- a/docs/docs/sales/return_order.md +++ b/docs/docs/sales/return_order.md @@ -13,9 +13,7 @@ Return Orders allow stock items (which have been sold or allocated to a customer To navigate to the Return Order display, select *Sales* from the main navigation menu, and *Return Orders* from the sidebar: -{% with id="return_order_display", url="order/ro_display.png", description="Return Order Display" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/ro_display.png", "Return Order Display") }} The following view modes are available: @@ -23,31 +21,23 @@ The following view modes are available: *Table View* provides a list of Return Orders, which can be filtered to display a subset of orders according to user supplied parameters. -{% with id="purchase_order_list", url="order/po_list.png", description="Return Order List" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/ro_list.png", "Return Order List") }} #### Calendar View *Calendar View* shows a calendar display with outstanding return orders, based on the various dates specified for each order. -{% with id="return_order_calendar", url="order/ro_calendar.png", description="Return Order Calendar" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/ro_calendar.png", "Return Order Calendar") }} ### Enable Return Order Functionality By default, Return Order functionality is not enabled - it must be enabled by a *staff* user from the settings page: -{% with id="enable-return-order", url="order/return_order_enable.png", description="Enable Return Orders" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/return_order_enable.png", "Enable Return Orders") }} Once this setting is enabled, you can access the "Return Orders" page from the main navigation bar: -{% with id="return-order-navbar", url="order/return_order_navbar.png", description="Access Return Orders" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/return_order_navbar.png", "Access return orders") }} ### Return Order Permissions @@ -57,9 +47,7 @@ Once this setting is enabled, you can access the "Return Orders" page from the m A list of Return Orders is displayed on the *Return Order* index page: -{% with id="return-order-index", url="order/return_order_index.png", description="Return Order Index" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/return_order_index.png", "Return Order Index") }} Various filters are available to configure which orders are displayed, and how they are arranged. @@ -98,9 +86,7 @@ A Return Order is linked to a specific customer, which can be selected from the !!! warning "Customers Only" Only companies with the "Customer" attribute enabled will be shown and can be selected -{% with id="return-order-create", url="order/return_order_create.png", description="Return Order Create" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/return_order_create.png", "Create Return Order") }} Fill in the rest of the form with the return order information, and then click on Submit to create the order. @@ -116,9 +102,7 @@ The order can be assigned to a responsible *owner*, which is either a user or gr Individual Return Orders can be viewed via the Return Order detail page: -{% with id="return-order-detail", url="order/return_order_detail.png", description="Return Order Detail" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/return_order_detail.png", "Return Order Detail") }} Here the details of the return order are available, and specific actions can be performed: diff --git a/docs/docs/sales/sales_order.md b/docs/docs/sales/sales_order.md index b3b368e053..0d5fba4a61 100644 --- a/docs/docs/sales/sales_order.md +++ b/docs/docs/sales/sales_order.md @@ -10,9 +10,7 @@ Sales orders allow tracking of which stock items are sold to customers, therefor To navigate to the Sales Order display, select *Sales* from the main navigation menu, and *Sales Orders* from the sidebar: -{% with id="sales_order_display", url="order/so_display.png", description="Sales Order Display" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/so_display.png", "Sales Order display") }} The following view modes are available: @@ -20,17 +18,13 @@ The following view modes are available: *Table View* provides a list of Sales Orders, which can be filtered to display a subset of orders according to user supplied parameters. -{% with id="sales_order_list", url="order/so_list.png", description="Sales Order List" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/so_list.png", "Sales Order list") }} #### Calendar View *Calendar View* shows a calendar display with outstanding sales orders. -{% with id="sales_order_calendar", url="order/so_calendar.png", description="Sales Order Calendar" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/so_calendar.png", "Sales Order calendar") }} ### Sales Order Status Codes @@ -167,9 +161,7 @@ The *Pending Shipments* panel displays the shipments which have not yet been sen - Pending sales order items can be allocated to these shipments - New shipments can be created if the order is still open -{% with id="pending-shipments", url="order/pending_shipments.png", description="Pending shipments" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/pending_shipments.png", "Pending shipments") }} #### Creating a new Shipment @@ -179,15 +171,11 @@ To create a new shipment for a sales order, press the *New Shipment* button abov To complete a shipment, press the *Complete Shipment* button associated with the particular shipment: -{% with id="complete-shipment", url="order/complete_shipment.png", description="Complete shipment" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/complete_shipment.png", "Complete shipment") }} ### Completed Shipments -{% with id="completed-shipments", url="order/completed_shipments.png", description="Completed shipments" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/completed_shipments.png", "Completed shipments") }} ### Shipment Data @@ -211,9 +199,7 @@ An optional URL field which can be used to provide a link to an external URL. All these fields can be edited by the user: -{% with id="edit-shipment", url="order/edit_shipment.png", description="Edit shipment" %} -{% include "img.html" %} -{% endwith %} +{{ image("order/edit_shipment.png", "Edit shipment") }} ## Sales Order Settings diff --git a/docs/docs/settings/SSO.md b/docs/docs/settings/SSO.md index df53d5e1a6..62849500b1 100644 --- a/docs/docs/settings/SSO.md +++ b/docs/docs/settings/SSO.md @@ -36,9 +36,7 @@ There are two variables in the configuration file which define the operation of In the example below, SSO provider modules are activated for *google*, *github* and *microsoft*. Specific configuration options are specified for the *microsoft* provider module: -{% with id="SSO", url="settings/sso_config.png", description="SSO Config" %} -{% include 'img.html' %} -{% endwith %} +{{ image("settings/sso_config.png", "SSO Config") }} !!! info "Provider Module Format" Note that the provider modules specified in `social_backends` must be prefixed with `allauth.socialaccounts.providers` @@ -69,17 +67,13 @@ Once your external SSO app has been created, you need to create a new *SocialAcc In the admin interface, select *Add Social Application* -{% with id="social-add", url="settings/social_account_add.png", description="Add Social Application" %} -{% include 'img.html' %} -{% endwith %} +{{ image("settings/social_account_add.png", "Add Social Application") }} #### Configure Social Application Configure the social application entry with the app details: -{% with id="social-configure", url="settings/social_application_configure.png", description="Configure Social Application" %} -{% include 'img.html' %} -{% endwith %} +{{ image("settings/social_application_configure.png", "Configure Social Application") }} - Select the *provider* type as required - Provide a *name* for the application (note that this should match the *name* used for any custom settings provided in the configuration file) @@ -117,16 +111,12 @@ Now that the social application is created, you need to enable SSO authenticatio In the [settings screen](./global.md), navigate to the *Login Settings* panel. Here you will see the required configuration options to enable SSO: -{% with id="sso-settings", url="settings/sso_settings.png", description="SSO Settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("settings/sso_settings.png", "SSO Settings") }} -| Setting | Description | -| --- | --- | -| Enable SSO | Enable this option to allow single sign on for user login | -| Enable SSO registration | Allow users to self-register with SSO | -| Auto-fill SSO users | Automatically fill out user account data with information provided by external SSO app | -| Allowed domains | Optionally restrict user registration to certain domains | +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("LOGIN_ENABLE_SSO") }} +{{ globalsetting("LOGIN_SIGNUP_SSO_AUTO") }} ### Configure Email @@ -136,12 +126,12 @@ Note that [email settings](./email.md) must be correctly configured before SSO w InvenTree has the ability to synchronize groups assigned to each user directly from the IdP. To enable this feature, navigate to the *Login Settings* panel in the [settings screen](./global.md) first. Here, the following options are available: -| Setting | Description | -| --- | --- | -| Enable SSO group sync | Enable synchronizing InvenTree groups with groups provided by the IdP | -| SSO group key | The name of the claim containing all groups, e.g. `groups` or `roles` | -| SSO group map | A mapping from SSO groups to InvenTree groups as JSON, e.g. `{"/inventree/admins": "admin"}`. If the mapped group does not exist once a user signs up, a new group without assigned permissions will be created. | -| Remove groups outside of SSO | Whether groups should be removed from the user if they are not present in the IdP data | +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("LOGIN_ENABLE_SSO_GROUP_SYNC") }} +{{ globalsetting("SSO_GROUP_KEY") }} +{{ globalsetting("SSO_GROUP_MAP") }} +{{ globalsetting("SSO_REMOVE_GROUPS") }} !!! warning "Remove groups outside of SSO" Disabling this feature might cause security issues as groups that are removed in the IdP will stay assigned in InvenTree diff --git a/docs/docs/settings/admin.md b/docs/docs/settings/admin.md index 4dbf5f77f1..53c088b792 100644 --- a/docs/docs/settings/admin.md +++ b/docs/docs/settings/admin.md @@ -47,9 +47,7 @@ To access the admin interface, select the "Admin" option from the drop-down user An administration panel will be presented as shown below: -{% with id="admin", url="admin/admin.png", description="InvenTree Admin Panel" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/admin.png", "Admin panel") }} !!! info "Admin URL" To directly access the admin interface, append /admin/ to the InvenTree site URL - e.g. http://localhost:8000/admin/ @@ -58,9 +56,7 @@ An administration panel will be presented as shown below: Database objects can be listed and filtered directly. The image below shows an example of displaying existing part categories. -{% with id="part_cats", url="admin/part_cats.png", description="Display part categories" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/part_cats.png", "Part categories") }} !!! info "Permissions" A "staff" account does not necessarily provide access to all administration options, depending on the roles assigned to the user. @@ -69,14 +65,10 @@ Database objects can be listed and filtered directly. The image below shows an e Some admin views support filtering of results against specified criteria. For example, the list of Part objects can be filtered as follows: -{% with id="filter", url="admin/filter.png", description="Filter part list" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/filter.png", "Filter part list") }} #### Edit Database Objects Individual database objects can be edited directly in the admin interface. The image below shows an example of editing a Part object: -{% with id="edit_part", url="admin/edit_part.png", description="Edit Part object" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/edit_part.png", "Edit part") }} diff --git a/docs/docs/settings/export.md b/docs/docs/settings/export.md index 313999556b..9661157889 100644 --- a/docs/docs/settings/export.md +++ b/docs/docs/settings/export.md @@ -8,6 +8,4 @@ InvenTree provides data export functionality for a variety of data types. Most d In the top right corner of the table, click the "Export Data" button to export the data in the table. -{% with id="export", url="admin/export.png", description="Export data" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/export.png", "Export data") }} diff --git a/docs/docs/settings/global.md b/docs/docs/settings/global.md index 68bfbcd0d9..9cf7c2a346 100644 --- a/docs/docs/settings/global.md +++ b/docs/docs/settings/global.md @@ -25,8 +25,11 @@ Configuration of basic server settings: {{ globalsetting("INVENTREE_COMPANY_NAME") }} {{ globalsetting("INVENTREE_INSTANCE") }} {{ globalsetting("INVENTREE_INSTANCE_TITLE") }} +{{ globalsetting("INVENTREE_INSTANCE_ID") }} +{{ globalsetting("INVENTREE_ANNOUNCE_ID") }} {{ globalsetting("INVENTREE_RESTRICT_ABOUT") }} {{ globalsetting("DISPLAY_FULL_NAMES") }} +{{ globalsetting("DISPLAY_PROFILE_INFO") }} {{ globalsetting("INVENTREE_UPDATE_CHECK_INTERVAL") }} {{ globalsetting("INVENTREE_DOWNLOAD_FROM_URL") }} {{ globalsetting("INVENTREE_DOWNLOAD_IMAGE_MAX_SIZE") }} @@ -101,6 +104,8 @@ Configuration of pricing data and currency support: | ---- | ----------- | ------- | ----- | {{ globalsetting("INVENTREE_DEFAULT_CURRENCY") }} {{ globalsetting("CURRENCY_CODES") }} +{{ globalsetting("CURRENCY_UPDATE_PLUGIN") }} +{{ globalsetting("CURRENCY_UPDATE_INTERVAL") }} {{ globalsetting("PRICING_DECIMAL_PLACES_MIN") }} {{ globalsetting("PRICING_DECIMAL_PLACES") }} {{ globalsetting("PRICING_UPDATE_DAYS") }} @@ -131,6 +136,15 @@ Configuration of report generation: {{ globalsetting("REPORT_DEBUG_MODE") }} {{ globalsetting("REPORT_LOG_ERRORS") }} +### Label Printing + +Configuration of label printing: + +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ globalsetting("LABEL_ENABLE") }} +{{ globalsetting("LABEL_DPI") }} + ### Parts | Name | Description | Default | Units | @@ -226,3 +240,7 @@ Refer to the [return order settings](../sales/return_order.md#return-order-setti {{ globalsetting("ENABLE_PLUGINS_SCHEDULE") }} {{ globalsetting("ENABLE_PLUGINS_EVENTS") }} {{ globalsetting("ENABLE_PLUGINS_INTERFACE") }} + +### Project Codes + +Refer to the [project code settings](../concepts/project_codes.md). diff --git a/docs/docs/settings/import.md b/docs/docs/settings/import.md index fa0b3fa176..71c3052fe2 100644 --- a/docs/docs/settings/import.md +++ b/docs/docs/settings/import.md @@ -41,17 +41,13 @@ The following steps outline the process of importing data into InvenTree: An import session can be created via the methods outlined above. The first step is to create an import session, and upload the data file to import. Note that depending on the context of the data import, the user may have to select the database model to import data into. -{% with id="import-create", url="admin/import_session_create.png", description="Create import session" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/import_session_create.png", "Create import session") }} ### Map Data Fields Next, the user must map the data fields in the uploaded file to the fields in the database model. This is a critical step, as the data fields must be correctly matched to the database fields. -{% with id="import-map", url="admin/import_session_map.png", description="Map data fields" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/import_session_map.png", "Map data fields") }} The InvenTree server will attempt to automatically associate the data fields in the uploaded file with the database fields. However, the user may need to manually adjust the field mappings to ensure that the data is imported correctly. @@ -65,9 +61,7 @@ Note that this process may take some time if the data file is large. The import Once the data has been loaded into the import session, the user can process the data. This step will attempt to validate the data, and check for any errors or issues that may prevent the data from being imported. -{% with id="import-process", url="admin/import_session_process.png", description="Process data" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/import_session_process.png", "Process data") }} Note that each row must be selected and confirmed by the user before it is actually imported into the database. Any errors which are detected will be displayed to the user, and the user can choose to correct the data and re-process it. diff --git a/docs/docs/settings/logs.md b/docs/docs/settings/logs.md index c81a7dece7..d161ea1fe4 100644 --- a/docs/docs/settings/logs.md +++ b/docs/docs/settings/logs.md @@ -8,18 +8,15 @@ Any critical server error logs are recorded to the database, and can be viewed b In the admin interface, select the "Errors" view: -{% with id="admin_error_link", url="admin/admin_errors_link.png", description="Admin errors" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/admin_errors_link.png", "Admin errors") }} !!! info "URL" Alternatively, navigate to the error list view at /admin/error_report/error/ A list of error logs is presented. -{% with id="admin_error_logs", url="admin/admin_errors.png", description="Error logs" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/admin_errors.png", "Error logs") }} + !!! info "Deleting Logs" Error logs should be deleted periodically diff --git a/docs/docs/settings/permissions.md b/docs/docs/settings/permissions.md index 5b1c055f84..1fb24289d7 100644 --- a/docs/docs/settings/permissions.md +++ b/docs/docs/settings/permissions.md @@ -35,9 +35,7 @@ InvenTree functionality is split into a number of distinct roles. A group will h - **Sales Order** - The *sales* role is related to accessing Sales Order data - **Return Order** - The *return* role is related to accessing Return Order data -{% with id="Roles Admin View", url="admin/roles.png", description="Roles" %} -{% include 'img.html' %} -{% endwith %} +{{ image("admin/roles.png", "Roles") }} ### Role Permissions diff --git a/docs/docs/settings/user.md b/docs/docs/settings/user.md index 999cb0536a..55ce786435 100644 --- a/docs/docs/settings/user.md +++ b/docs/docs/settings/user.md @@ -10,25 +10,23 @@ The various user settings described below can be configured for an individual us The *Account Settings* screen shows configuration options for your user account, including linking [third party logins](./SSO.md) and [multi factor authentication](./MFA.md): -{% with id="user-account", url="settings/user_account.png", description="User Account Settings" %} -{% include 'img.html' %} -{% endwith %} +{{ image("settings/user_account.png", "User Account Settings") }} ### Display Settings -The *Display Settings* screen shows general display configuration options. Additionally, this screen allows the user to select the primary language in which InvenTree is displayed. +The *Display Settings* screen shows general display configuration options: -{% with id="user-display", url="settings/user_display.png", description="User Display Settings" %} -{% include 'img.html' %} -{% endwith %} - -### Home Page - -This screen allows the user to customize display of items on the InvenTree home page. - -{% with id="user-home", url="settings/user_home.png", description="Home Page Settings" %} -{% include 'img.html' %} -{% endwith %} +| Name | Description | Default | Units | +| ---- | ----------- | ------- | ----- | +{{ usersetting("ICONS_IN_NAVBAR") }} +{{ usersetting("STICKY_HEADER") }} +{{ usersetting("DATE_DISPLAY_FORMAT") }} +{{ usersetting("FORMS_CLOSE_USING_ESCAPE") }} +{{ usersetting("PART_SHOW_QUANTITY_IN_FORMS") }} +{{ usersetting("DISPLAY_SCHEDULE_TAB") }} +{{ usersetting("DISPLAY_STOCKTAKE_TAB") }} +{{ usersetting("TABLE_STRING_MAX_LENGTH") }} +{{ usersetting("ENABLE_LAST_BREADCRUMB") }} ### Search Settings diff --git a/docs/docs/start/backup.md b/docs/docs/start/backup.md index 42178ce5e7..cb7f14399b 100644 --- a/docs/docs/start/backup.md +++ b/docs/docs/start/backup.md @@ -54,10 +54,6 @@ When performing an update of your InvenTree installation - via either [docker](. If desired, InvenTree can be configured to perform automated daily backups. The run-time setting to control this is found in the *Server Configuration* tab. -{% with id="auto-backup", url="start/auto-backup.png", description="Automatic daily backup" %} -{% include 'img.html' %} -{% endwith %} - !!! tip "Optional Feature" Automated backup is disabled by default, and must be enabled by an admin user diff --git a/docs/docs/stock/adjust.md b/docs/docs/stock/adjust.md index 992e7abbdf..69cf5eaa2c 100644 --- a/docs/docs/stock/adjust.md +++ b/docs/docs/stock/adjust.md @@ -8,41 +8,31 @@ InvenTree provides simple yet powerful management of stock levels. Multiple stoc Stock adjustments can be accessed in any stock items table using the "Stock Options" dropdown entries: -{% with id="stock_options", url="stock/stock_options.png", description="Stock Options" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_options.png", "Stock Options") }} ### Move Stock Multiple stock items can be moved to a new location in a single operation. Each item is moved to the selected location, and a stock tracking entry is added to the stock item history. -{% with id="stock_move", url="stock/stock_move.png", description="Stock movement" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_move.png", "Stock Move") }} ### Add Stock Add parts to a stock item record - for example putting parts back into stock. The in-stock quantity for each selected item is increased by the given amount. -{% with id="stock_add", url="stock/stock_add.png", description="Stock addition" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_add.png", "Stock Add") }} ### Remove Stock Remove parts from a stock item record - for example taking parts from stock for use. The in-stock quantity for each selected item is decreased by the given amount. -{% with id="stock_remove", url="stock/stock_remove.png", description="Stock removal" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_remove.png", "Stock Remove") }} ### Count Stock Count stock items (stocktake) to record the number of items in stock at a given point of time. The quantity for each part is pre-filled with the current quantity based on stock item history. -{% with id="stock_count", url="stock/stock_count.png", description="Stock count" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_count.png", "Stock Count") }} ### Merge Stock @@ -72,8 +62,6 @@ To merge stock items, check two or more items in a stock table and click on the In the Merge Stock Items form, user can decide to allow mismatched suppliers or status to be merged together (disabled by default). -{% with id="stock_item_merge", url="stock/stock_item_merge.png", description="Stock Item Merge" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_item_merge.png", "Stock Item Merge") }} Select the location for the new stock item and confirm the merge, then click on Submit to process the merge. diff --git a/docs/docs/stock/expiry.md b/docs/docs/stock/expiry.md index 02e79612a8..62aaa2730e 100644 --- a/docs/docs/stock/expiry.md +++ b/docs/docs/stock/expiry.md @@ -8,9 +8,8 @@ InvenTree supports stock expiration dates, which allows individual stock items t The stock expiry feature is disabled by default, and must be enabled via the settings menu: -{% with id="stock_expiry", url="stock/enable_stock_expiry.png", description="Enable stock expiry feature" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/enable_stock_expiry.png", title="Enable stock expiry feature") }} + !!! info "Non Expiring Stock" If a Stock Item is not expected to expire, leave the expiry date field blank, or zero @@ -19,29 +18,21 @@ The stock expiry feature is disabled by default, and must be enabled via the set When creating a new stock item, the expiry date can be manually set by the user. -{% with id="expiry_create", url="stock/expiry_date_create.png", description="Add expiry date" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/expiry_date_create.png", title="Add expiry date") }} If an expiry date is defined for a particular stock item, it will be displayed on the detail page. If the expiry date has passed (and the stock item is *expired*) then this will also be indicated. -{% with id="item_expired", url="stock/item_expired.png", description="Display expiry date" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/item_expired.png", title="Display expiry date") }} The expiry date can be adjusted in the stock item edit form. -{% with id="expiry_edit", url="stock/expiry_date_edit.png", description="Edit expiry date" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/expiry_date_edit.png", title="Edit expiry date") }} ### Filter Expired Stock The various stock display tables can be filtered by *expired* status, and also display a column for the expiry date for each stock item. -{% with id="stock_table_expiry", url="stock/stock_table_expiry.png", description="Filter by stock expiry" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_table_expiry.png", title="Filter by stock expiry") }} ### Index Page @@ -58,20 +49,14 @@ For example, if a Part has a default expiry time of 30 days, then any Stock Item If a Part has a non-zero default expiry time, it will be displayed on the Part details page -{% with id="part_expiry_display", url="stock/part_expiry_display.png", description="Part expiry" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/part_expiry_display.png", title="Display part expiry") }} The Part expiry time can be altered using the Part editing form. -{% with id="part_expiry_edit", url="stock/part_expiry.png", description="Edit part expiry" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/part_expiry.png", title="Edit part expiry") }} ## Sales and Build Orders By default, expired Stock Items cannot be added to neither a Sales Order nor a Build Order. This behavior can be adjusted using the *Sell Expired Stock* and *Build Expired Stock* settings: -{% with id="sell_build_expired", url="stock/sell_build_expired_stock.png", description="Sell Build Expired Stock" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/sell_build_expired_stock.png", title="Sell and build expired stock") }} diff --git a/docs/docs/stock/index.md b/docs/docs/stock/index.md index 1106c202cb..97f1200d6a 100644 --- a/docs/docs/stock/index.md +++ b/docs/docs/stock/index.md @@ -23,9 +23,7 @@ An external stock location can be used to indicate that items in there might not for immediate usage. Stock items in an external location are marked with an additional icon in the build order line items view where the material is allocated. -{% with id="stock_external_icon", url="stock/stock_external_icon.png", description="External stock indication" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_external_icon.png", title="External stock indication") }} Anyhow there is no limitation on the stock item. It can be allocated as usual. diff --git a/docs/docs/stock/owner.md b/docs/docs/stock/owner.md index 03a4765ea6..0e6d116176 100644 --- a/docs/docs/stock/owner.md +++ b/docs/docs/stock/owner.md @@ -8,9 +8,7 @@ InvenTree supports stock ownership, which allows to set groups and users as "own The stock ownership feature is disabled by default, and must be enabled via the settings menu: -{% with id="stock_owner", url="stock/enable_stock_owner.png", description="Enable stock ownership feature" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/enable_stock_owner.png", title="Enable stock ownership feature") }} ### Background The stock item ownership function does not change or the influence the access rights that have been set @@ -41,22 +39,18 @@ There are two types of owners in InvenTree: [groups](../settings/permissions.md# When selecting an owner, in the drop-down list, groups are annotated with the {{ icon("users", title="Users") }} icon and users are annotated with the {{ icon("user", title="User") }} icon: -{% with id="stock_owner_type", url="stock/stock_owner_type.png", description="Display stock owner type" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_owner_type.png", title="Display stock owner type") }} ### Set Stock Location Owner To specify the owner of a stock location, navigate to the stock location detail page. Click on the {{ icon("sitemap") }}icon under the location's name then click on "Edit Location". !!! warning - If you cannot see the {{ icon("sitemap") }}icon, it means that you do **not** have permissions to edit stock locations. Refer to [the permissions documentation](../settings/permissions.md#roles) and/or contact your InvenTree administrator. + If you cannot see the {{ icon("sitemap") }} icon, it means that you do **not** have permissions to edit stock locations. Refer to [the permissions documentation](../settings/permissions.md#roles) and/or contact your InvenTree administrator. In the "Edit Stock Location" form, select the owner and click the "Submit" button: -{% with id="stock_location_owner", url="stock/stock_location_owner.png", description="Set stock location owner" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_location_owner.png", title="Set stock location owner") }} Setting the owner of stock location will automatically: @@ -81,6 +75,4 @@ To specify the owner of a stock item, navigate to the stock item detail page. Cl In the "Edit Stock Item" form, select the owner and click the "Save" button: -{% with id="stock_item_owner", url="stock/stock_item_owner.png", description="Set stock item owner" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_item_owner.png", title="Set stock item owner") }} diff --git a/docs/docs/stock/status.md b/docs/docs/stock/status.md index fc4df03af5..8a50d02a5e 100644 --- a/docs/docs/stock/status.md +++ b/docs/docs/stock/status.md @@ -22,9 +22,7 @@ Below is the list of available stock status codes and their meaning: The *status* of a given stock item is displayed on the stock item detail page: -{% with id="stock_status_label", url="stock/stock_status_label.png", description="Stock Status Label" %} -{% include 'img.html' %} -{% endwith %} +{{ image("stock/stock_status_label.png", title="Stock status label") }} **Source Code** @@ -48,6 +46,4 @@ The default status code for any newly created Stock Item is bool: if url in cache: return True - print(f'Checking external URL: {url}') - attempts = 5 while attempts > 0: @@ -105,7 +121,7 @@ def check_link(url) -> bool: attempts -= 1 - print(f' - URL check failed with status code {response.status_code}') + print(f'URL check failed with status code {response.status_code}') return False @@ -127,6 +143,18 @@ def get_build_environment() -> str: def define_env(env): """Define custom environment variables for the documentation build process.""" + config = env.config + assets_dir = config.get('assets_dir', None) + + if assets_dir is None: + # Construct the assets directory based on the current build environment + rtd_version = os.environ.get('READTHEDOCS_VERSION') + rtd_language = os.environ.get('READTHEDOCS_LANGUAGE') + + if rtd_version and rtd_language: + assets_dir = f'/{rtd_language}/{rtd_version}/assets' + else: + assets_dir = '/assets' @env.macro def sourcedir(dirname: str, branch=None): @@ -267,6 +295,28 @@ def define_env(env): return includefile(fn, f'Template: {base}', fmt='html') + def observe_setting(key: str, group: str): + """Record that a particular setting has been observed. + + This is used to ensure that all settings are documented in the generated documentation. + + Arguments: + key: The name of the setting to observe + group: The group of the setting (e.g. 'global', 'user') + """ + # Read the observed settings file + with open(observed_settings_file, encoding='utf-8') as f: + data = json.load(f) + + if group not in data: + data[group] = {} + + data[group][key] = True + + # Write the updated data back to the file + with open(observed_settings_file, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=4) + @env.macro def rendersetting(key: str, setting: dict): """Render a provided setting object into a table row.""" @@ -292,6 +342,8 @@ def define_env(env): global GLOBAL_SETTINGS setting = GLOBAL_SETTINGS[key] + observe_setting(key, 'global') + return rendersetting(key, setting) @env.macro @@ -304,6 +356,8 @@ def define_env(env): global USER_SETTINGS setting = USER_SETTINGS[key] + observe_setting(key, 'user') + return rendersetting(key, setting) @env.macro @@ -363,3 +417,75 @@ def define_env(env): t = f' {title}' if title else '' return f"{t}" + + @env.macro + def image( + source: str, + title: Optional[str] = '', + iid: Optional[str] = '', + alt: Optional[str] = '', + base: Optional[str] = '', + maxwidth: Optional[str] = '', + maxheight: Optional[str] = '', + ): + """Render an image within the documentation. + + Arguments: + title: The title of the image (default: '') + source: The name of the image to display (e.g. 'check', 'cross', etc.) + iid: The ID of the image (default: '') + alt: The alt text for the image (default: '') + base: The base directory for the image (default: './assets/images/') + maxwidth: The maximum width of the image (default: '') + maxheight: The maximum height of the image (default: '') + + - This will render an image which can be clicked on to expand to full size. + - It will also validate that the image exists in the specified directory. + + The image must be located in the './docs/assets/images/' directory + """ + # Allow external images too - without validation + if source.startswith('http'): + img = source + else: + basedir = os.path.dirname(__file__) + basedir = os.path.join(basedir, 'docs', 'assets', 'images') + + if base: + basedir = os.path.abspath(os.path.join(basedir, base)) + filename = os.path.join(basedir, source) + + if not os.path.exists(filename): + raise FileNotFoundError(f'Image {filename} does not exist.') + + # Now, create a proper URL to the image + img = os.path.join(assets_dir, 'images', base, source) + + if not title: + title = os.path.splitext(source)[0] + + if not iid: + iid = title.replace(' ', '_').replace('-', '_') + + if not alt: + alt = iid + + styles = [] + + if maxwidth: + styles.append(f'max-width: {maxwidth};') + if maxheight: + styles.append(f'max-height: {maxheight};') + + style = f"style='{' '.join(styles)}' " if styles else '' + + return textwrap.dedent(f""" +
+ + {alt} + + + {alt} + +
+ """) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 08e9b73e1e..723414faff 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -233,6 +233,23 @@ nav: - Machines: - Overview: plugins/machines/overview.md - Label Printer: plugins/machines/label_printer.md + - Builtin Plugins: + - Builtin Plugins: plugins/builtin/index.md + - Auto Issue: plugins/builtin/auto_issue.md + - BOM Exporter: plugins/builtin/bom_exporter.md + - Currency Exchange: plugins/builtin/currency_exchange.md + - DigiKey: plugins/builtin/digikey.md + - InvenTree Barcode: plugins/builtin/inventree_barcode.md + - InvenTree Exporter: plugins/builtin/inventree_exporter.md + - Label Printer: plugins/builtin/inventree_label.md + - Label Machine: plugins/builtin/inventree_label_machine.md + - Label Sheet: plugins/builtin/inventree_label_sheet.md + - LCSC: plugins/builtin/lcsc.md + - Mouser: plugins/builtin/mouser.md + - Notification: plugins/builtin/notifications.md + - Parameter Exporter: plugins/builtin/part_parameter_exporter.md + - Part Notifications: plugins/builtin/part_notifications.md + - TME: plugins/builtin/tme.md - Third-Party: plugins/integrate.md # Plugins @@ -247,6 +264,7 @@ plugins: - mkdocs-simple-hooks: hooks: on_config: "docs.docs.hooks:on_config" + on_post_build: "docs.docs.hooks:on_post_build" - macros: include_dir: docs/_includes module_name: main diff --git a/docs/mlc_config.json b/docs/mlc_config.json index dfe26d15a3..a3e538ca10 100644 --- a/docs/mlc_config.json +++ b/docs/mlc_config.json @@ -1,4 +1,15 @@ { + "aliveStatusCodes": [ + 200, + 201, + 202, + 204, + 301, + 302, + 401, + 403, + 429 + ], "ignorePatterns": [ { "pattern": "http://inventree.localhost" diff --git a/src/backend/InvenTree/common/setting/system.py b/src/backend/InvenTree/common/setting/system.py index ff54f94714..c2b38a6b8d 100644 --- a/src/backend/InvenTree/common/setting/system.py +++ b/src/backend/InvenTree/common/setting/system.py @@ -461,12 +461,6 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = { 'default': False, 'validator': bool, }, - 'PART_SHOW_IMPORT': { - 'name': _('Show Import in Views'), - 'description': _('Display the import wizard in some part views'), - 'default': False, - 'validator': bool, - }, 'PART_SHOW_RELATED': { 'name': _('Show related parts'), 'description': _('Display related parts for a part'), diff --git a/src/backend/InvenTree/plugin/builtin/events/__init__.py b/src/backend/InvenTree/plugin/builtin/events/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/backend/InvenTree/plugin/builtin/events/auto_issue_orders.py b/src/backend/InvenTree/plugin/builtin/events/auto_issue_orders.py new file mode 100644 index 0000000000..bd0866f495 --- /dev/null +++ b/src/backend/InvenTree/plugin/builtin/events/auto_issue_orders.py @@ -0,0 +1,130 @@ +"""Plugin to automatically issue orders on the assigned target date.""" + +from django.utils.translation import gettext_lazy as _ + +import structlog + +from InvenTree.helpers import current_date +from plugin import InvenTreePlugin +from plugin.mixins import ScheduleMixin, SettingsMixin + +logger = structlog.get_logger('inventree') + + +class AutoIssueOrdersPlugin(ScheduleMixin, SettingsMixin, InvenTreePlugin): + """Plugin to automatically issue orders on the assigned target date.""" + + NAME = _('Auto Issue Orders') + SLUG = 'autoiissueorders' + AUTHOR = _('InvenTree contributors') + DESCRIPTION = _('Automatically issue orders on the assigned target date') + VERSION = '1.0.0' + + # Set the scheduled tasks for this plugin + SCHEDULED_TASKS = { + 'auto_issue_orders': {'func': 'auto_issue_orders', 'schedule': 'D'} + } + + SETTINGS = { + 'AUTO_ISSUE_BUILD_ORDERS': { + 'name': _('Auto Issue Build Orders'), + 'description': _( + 'Automatically issue build orders on the assigned target date' + ), + 'validator': bool, + 'default': True, + }, + 'AUTO_ISSUE_PURCHASE_ORDERS': { + 'name': _('Auto Issue Purchase Orders'), + 'description': _( + 'Automatically issue purchase orders on the assigned target date' + ), + 'validator': bool, + 'default': True, + }, + 'AUTO_ISSUE_SALES_ORDERS': { + 'name': _('Auto Issue Sales Orders'), + 'description': _( + 'Automatically issue sales orders on the assigned target date' + ), + 'validator': bool, + 'default': True, + }, + 'AUTO_ISSUE_RETURN_ORDERS': { + 'name': _('Auto Issue Return Orders'), + 'description': _( + 'Automatically issue return orders on the assigned target date' + ), + 'validator': bool, + 'default': True, + }, + 'ISSUE_BACKDATED_ORDERS': { + 'name': _('Issue Backdated Orders'), + 'description': _('Automatically issue orders that are backdated'), + 'validator': bool, + 'default': False, + }, + } + + def auto_issue_orders(self): + """Automatically issue orders on the assigned target date.""" + if self.get_setting('AUTO_ISSUE_BUILD_ORDERS', backup_value=True): + self.auto_issue_build_orders() + + if self.get_setting('AUTO_ISSUE_PURCHASE_ORDERS', backup_value=True): + self.auto_issue_purchase_orders() + + if self.get_setting('AUTO_ISSUE_SALES_ORDERS', backup_value=True): + self.auto_issue_sales_orders() + + if self.get_setting('AUTO_ISSUE_RETURN_ORDERS', backup_value=True): + self.auto_issue_return_orders() + + def issue_func(self, model, status: int, func_name: str = 'issue_order'): + """Helper function to issue orders of a given model and status.""" + orders = model.objects.filter(status=status) + orders = orders.filter(target_date__isnull=False) + + if self.get_setting('ISSUE_BACKDATED_ORDERS', backup_value=False): + orders = orders.filter(target_date__lte=current_date()) + else: + orders = orders.filter(target_date=current_date()) + + if orders.count() == 0: + return + + logger.info('Auto-issuing %d orders for %s', orders.count(), model.__name__) + + for order in orders: + try: + getattr(order, func_name)() + except Exception as e: + logger.error('Failed to issue order %s: %s', order.pk, str(e)) + + def auto_issue_build_orders(self): + """Automatically issue build orders on the assigned target date.""" + from build.models import Build + from build.status_codes import BuildStatus + + self.issue_func(Build, BuildStatus.PENDING, func_name='issue_build') + + def auto_issue_purchase_orders(self): + """Automatically issue purchase orders on the assigned target date.""" + from order.models import PurchaseOrder + from order.status_codes import PurchaseOrderStatus + + self.issue_func(PurchaseOrder, PurchaseOrderStatus.PENDING) + + def auto_issue_sales_orders(self): + """Automatically issue sales orders on the assigned target date.""" + from order.models import SalesOrder + from order.status_codes import SalesOrderStatus + + self.issue_func(SalesOrder, SalesOrderStatus.PENDING) + + def auto_issue_return_orders(self): + """Automatically issue return orders on the assigned target date.""" + from order.models import ReturnOrder + from order.status_codes import ReturnOrderStatus + + self.issue_func(ReturnOrder, ReturnOrderStatus.PENDING) diff --git a/src/backend/InvenTree/plugin/builtin/suppliers/digikey.py b/src/backend/InvenTree/plugin/builtin/suppliers/digikey.py index 180a25bea5..88c04baa81 100644 --- a/src/backend/InvenTree/plugin/builtin/suppliers/digikey.py +++ b/src/backend/InvenTree/plugin/builtin/suppliers/digikey.py @@ -15,7 +15,7 @@ class DigiKeyPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): NAME = 'DigiKeyPlugin' TITLE = _('Supplier Integration - DigiKey') DESCRIPTION = _('Provides support for scanning DigiKey barcodes') - VERSION = '1.0.0' + VERSION = '1.0.1' AUTHOR = _('InvenTree contributors') DEFAULT_SUPPLIER_NAME = 'DigiKey' @@ -25,6 +25,7 @@ class DigiKeyPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): 'name': _('Supplier'), 'description': _("The Supplier which acts as 'DigiKey'"), 'model': 'company.company', + 'model_filters': {'is_supplier': True}, } } diff --git a/src/backend/InvenTree/plugin/builtin/suppliers/lcsc.py b/src/backend/InvenTree/plugin/builtin/suppliers/lcsc.py index e52f406bd9..5831fb39c9 100644 --- a/src/backend/InvenTree/plugin/builtin/suppliers/lcsc.py +++ b/src/backend/InvenTree/plugin/builtin/suppliers/lcsc.py @@ -17,7 +17,7 @@ class LCSCPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): NAME = 'LCSCPlugin' TITLE = _('Supplier Integration - LCSC') DESCRIPTION = _('Provides support for scanning LCSC barcodes') - VERSION = '1.0.0' + VERSION = '1.0.1' AUTHOR = _('InvenTree contributors') DEFAULT_SUPPLIER_NAME = 'LCSC' @@ -26,6 +26,7 @@ class LCSCPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): 'name': _('Supplier'), 'description': _("The Supplier which acts as 'LCSC'"), 'model': 'company.company', + 'model_filters': {'is_supplier': True}, } } diff --git a/src/backend/InvenTree/plugin/builtin/suppliers/mouser.py b/src/backend/InvenTree/plugin/builtin/suppliers/mouser.py index 47825ba900..3195ed31d9 100644 --- a/src/backend/InvenTree/plugin/builtin/suppliers/mouser.py +++ b/src/backend/InvenTree/plugin/builtin/suppliers/mouser.py @@ -15,7 +15,7 @@ class MouserPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): NAME = 'MouserPlugin' TITLE = _('Supplier Integration - Mouser') DESCRIPTION = _('Provides support for scanning Mouser barcodes') - VERSION = '1.0.0' + VERSION = '1.0.1' AUTHOR = _('InvenTree contributors') DEFAULT_SUPPLIER_NAME = 'Mouser' @@ -24,6 +24,7 @@ class MouserPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): 'name': _('Supplier'), 'description': _("The Supplier which acts as 'Mouser'"), 'model': 'company.company', + 'model_filters': {'is_supplier': True}, } } diff --git a/src/backend/InvenTree/plugin/builtin/suppliers/tme.py b/src/backend/InvenTree/plugin/builtin/suppliers/tme.py index f614765ad0..d470034090 100644 --- a/src/backend/InvenTree/plugin/builtin/suppliers/tme.py +++ b/src/backend/InvenTree/plugin/builtin/suppliers/tme.py @@ -17,7 +17,7 @@ class TMEPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): NAME = 'TMEPlugin' TITLE = _('Supplier Integration - TME') DESCRIPTION = _('Provides support for scanning TME barcodes') - VERSION = '1.0.0' + VERSION = '1.0.1' AUTHOR = _('InvenTree contributors') DEFAULT_SUPPLIER_NAME = 'TME' @@ -26,6 +26,7 @@ class TMEPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): 'name': _('Supplier'), 'description': _("The Supplier which acts as 'TME'"), 'model': 'company.company', + 'model_filters': {'is_supplier': True}, } } diff --git a/src/frontend/lib/types/Settings.tsx b/src/frontend/lib/types/Settings.tsx index 2203f66195..71acf685f2 100644 --- a/src/frontend/lib/types/Settings.tsx +++ b/src/frontend/lib/types/Settings.tsx @@ -48,6 +48,7 @@ export interface SettingsStateProps { settings: Setting[]; lookup: SettingsLookup; fetchSettings: () => Promise; + loaded: boolean; endpoint: ApiEndpoints; pathParams?: PathParams; getSetting: (key: string, default_value?: string) => string; // Return a raw setting value diff --git a/src/frontend/src/components/settings/SettingList.tsx b/src/frontend/src/components/settings/SettingList.tsx index a706a112b3..fc89a83843 100644 --- a/src/frontend/src/components/settings/SettingList.tsx +++ b/src/frontend/src/components/settings/SettingList.tsx @@ -1,6 +1,6 @@ import { t } from '@lingui/core/macro'; import { Trans } from '@lingui/react/macro'; -import { Stack, Text } from '@mantine/core'; +import { Skeleton, Stack, Text } from '@mantine/core'; import { notifications } from '@mantine/notifications'; import React, { useCallback, @@ -133,6 +133,10 @@ export function SettingList({ [settingsState] ); + if (!settingsState?.loaded) { + return ; + } + return ( <> {editSettingModal.modal} diff --git a/src/frontend/src/states/SettingsState.tsx b/src/frontend/src/states/SettingsState.tsx index 253af7d99f..4db0a9b567 100644 --- a/src/frontend/src/states/SettingsState.tsx +++ b/src/frontend/src/states/SettingsState.tsx @@ -21,6 +21,7 @@ import { useUserState } from './UserState'; export const useGlobalSettingsState = create( (set, get) => ({ settings: [], + loaded: false, lookup: {}, endpoint: ApiEndpoints.settings_global_list, fetchSettings: async () => { @@ -28,6 +29,9 @@ export const useGlobalSettingsState = create( const { isLoggedIn } = useUserState.getState(); if (!isLoggedIn()) { + set({ + loaded: false + }); return success; } @@ -36,12 +40,17 @@ export const useGlobalSettingsState = create( .then((response) => { set({ settings: response.data, + loaded: true, lookup: generate_lookup(response.data) }); }) .catch((_error) => { console.error('ERR: Error fetching global settings'); success = false; + + set({ + loaded: false + }); }); return success; @@ -62,12 +71,16 @@ export const useGlobalSettingsState = create( export const useUserSettingsState = create((set, get) => ({ settings: [], lookup: {}, + loaded: false, endpoint: ApiEndpoints.settings_user_list, fetchSettings: async () => { let success = true; const { isLoggedIn } = useUserState.getState(); if (!isLoggedIn()) { + set({ + loaded: false + }); return success; } @@ -76,12 +89,16 @@ export const useUserSettingsState = create((set, get) => ({ .then((response) => { set({ settings: response.data, - lookup: generate_lookup(response.data) + lookup: generate_lookup(response.data), + loaded: true }); }) .catch((_error) => { console.error('ERR: Error fetching user settings'); success = false; + set({ + loaded: false + }); }); return success; @@ -110,6 +127,7 @@ export const createPluginSettingsState = ({ return createStore()((set, get) => ({ settings: [], lookup: {}, + loaded: false, endpoint: ApiEndpoints.plugin_setting_list, pathParams, fetchSettings: async () => { @@ -121,12 +139,16 @@ export const createPluginSettingsState = ({ const settings = response.data; set({ settings, - lookup: generate_lookup(settings) + lookup: generate_lookup(settings), + loaded: true }); }) .catch((_error) => { console.error(`Error fetching plugin settings for plugin ${plugin}`); success = false; + set({ + loaded: false + }); }); return success; @@ -158,6 +180,7 @@ export const createMachineSettingsState = ({ return createStore()((set, get) => ({ settings: [], lookup: {}, + loaded: false, endpoint: ApiEndpoints.machine_setting_detail, pathParams, fetchSettings: async () => { @@ -171,7 +194,8 @@ export const createMachineSettingsState = ({ ); set({ settings, - lookup: generate_lookup(settings) + lookup: generate_lookup(settings), + loaded: true }); }) .catch((error) => { @@ -180,6 +204,9 @@ export const createMachineSettingsState = ({ error ); success = false; + set({ + loaded: false + }); }); return success; diff --git a/src/frontend/src/tables/ColumnSelect.tsx b/src/frontend/src/tables/ColumnSelect.tsx index b2b21d1b22..163ab5e2cf 100644 --- a/src/frontend/src/tables/ColumnSelect.tsx +++ b/src/frontend/src/tables/ColumnSelect.tsx @@ -13,7 +13,7 @@ export function TableColumnSelect({ - + diff --git a/src/frontend/src/tables/InvenTreeTableHeader.tsx b/src/frontend/src/tables/InvenTreeTableHeader.tsx index 422c87a940..5c6047a3a1 100644 --- a/src/frontend/src/tables/InvenTreeTableHeader.tsx +++ b/src/frontend/src/tables/InvenTreeTableHeader.tsx @@ -208,7 +208,7 @@ export default function InvenTreeTableHeader({ )} {tableProps.enableRefresh && ( - + { tableState.refreshTable(); @@ -235,7 +235,7 @@ export default function InvenTreeTableHeader({ variant='transparent' aria-label='table-select-filters' > - + setFiltersVisible(!filtersVisible)} /> @@ -245,7 +245,7 @@ export default function InvenTreeTableHeader({ )} {tableUrl && tableProps.enableDownload && ( - + diff --git a/src/frontend/src/tables/settings/ScheduledTasksTable.tsx b/src/frontend/src/tables/settings/ScheduledTasksTable.tsx index e30f7d97b0..18609cb49a 100644 --- a/src/frontend/src/tables/settings/ScheduledTasksTable.tsx +++ b/src/frontend/src/tables/settings/ScheduledTasksTable.tsx @@ -15,10 +15,13 @@ export default function ScheduledTasksTable() { const columns: TableColumn[] = useMemo(() => { return [ { - accessor: 'func', + accessor: 'name', title: t`Task`, sortable: true, - switchable: false + switchable: false, + render: (record: any) => { + return record.name || record.task; + } }, { accessor: 'last_run', diff --git a/src/frontend/tests/pages/pui_part.spec.ts b/src/frontend/tests/pages/pui_part.spec.ts index 64ec6289a8..d09351f5a7 100644 --- a/src/frontend/tests/pages/pui_part.spec.ts +++ b/src/frontend/tests/pages/pui_part.spec.ts @@ -128,11 +128,13 @@ test('Part - Editing', async ({ browser }) => { // Test URL validation await page.getByLabel('text-field-link').fill('htxp-??QQQ++'); + await page.waitForTimeout(200); await page.getByRole('button', { name: 'Submit' }).click(); await page.getByText('Enter a valid URL.').waitFor(); // Fill with an empty URL await page.getByLabel('text-field-link').fill(''); + await page.waitForTimeout(200); await page.getByRole('button', { name: 'Submit' }).click(); await page.getByText('Item Updated').waitFor(); }); diff --git a/src/frontend/tests/pui_plugins.spec.ts b/src/frontend/tests/pui_plugins.spec.ts index 91402f20d2..30783d8c43 100644 --- a/src/frontend/tests/pui_plugins.spec.ts +++ b/src/frontend/tests/pui_plugins.spec.ts @@ -41,7 +41,10 @@ test('Plugins - Settings', async ({ browser, request }) => { // Edit numerical value await page.getByLabel('edit-setting-NUMERICAL_SETTING').click(); - const originalValue = await page.getByLabel('number-field-value').innerText(); + const originalValue = await page + .getByLabel('number-field-value') + .inputValue(); + await page .getByLabel('number-field-value') .fill(originalValue == '999' ? '1000' : '999'); diff --git a/src/frontend/tests/pui_printing.spec.ts b/src/frontend/tests/pui_printing.spec.ts index 3bc8130167..002456aed5 100644 --- a/src/frontend/tests/pui_printing.spec.ts +++ b/src/frontend/tests/pui_printing.spec.ts @@ -28,7 +28,7 @@ test('Label Printing', async ({ browser }) => { // Select plugin await page.getByLabel('related-field-plugin').click(); - await page.getByText('InvenTreeLabelSheet').last().click(); + await page.getByText('InvenTreeLabelMachine').last().click(); // Select label template await page.getByLabel('related-field-template').click(); @@ -37,7 +37,8 @@ test('Label Printing', async ({ browser }) => { await page.waitForTimeout(100); await page.getByLabel('related-field-plugin').click(); - await page.getByText('InvenTreeLabelSheet').last().click(); + + await page.getByText('InvenTreeLabel', { exact: true }).click(); // Submit the print form (second time should result in success) await page.getByRole('button', { name: 'Print', exact: true }).isEnabled();