From 4dea47922761d872bbb65edb262cb664e2c58d2d Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 20 Oct 2021 10:58:09 +1100 Subject: [PATCH 01/26] Adds release page for 0.5.3 --- docs/releases/0.5.3.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/releases/0.5.3.md diff --git a/docs/releases/0.5.3.md b/docs/releases/0.5.3.md new file mode 100644 index 0000000..145bb79 --- /dev/null +++ b/docs/releases/0.5.3.md @@ -0,0 +1,13 @@ +--- +title: Release 0.5.3 +--- + +## Release 0.5.3 + +Release 0.5.3 is a bug-fix release on the 0.5.x stable branch + +### Bug Fixes + +| Pull Request | Description | +| --- | --- | +| [#2122](https://github.com/inventree/InvenTree/pull/2122) | Provides a temporary fix for query speed issues when loading BOM tables. | From b8e5a453b1162b6578210f78e4b65217a35c5f29 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 20 Oct 2021 12:49:50 +1100 Subject: [PATCH 02/26] Add link to 0.5.3 --- docs/releases/release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases/release_notes.md b/docs/releases/release_notes.md index d60374e..d7c2cab 100644 --- a/docs/releases/release_notes.md +++ b/docs/releases/release_notes.md @@ -28,6 +28,7 @@ Tagged released are shown below. Click on the release notes for each version to | Release | Date | GitHub | Docker | | --- | --- | --- | --- | +| [0.5.3](./0.5.3.md) | 2021-10-19 | [0.5.2](https://github.com/inventree/InvenTree/releases/tag/0.5.3) | [inventree:0.5.3](https://hub.docker.com/layers/inventree/inventree/0.5.3/images/sha256-ecdfbd2906241b2495cee3c5acc12bdec5ed66b2d32ab146dbc2b71131a73a7a?context=explore) | | [0.5.2](./0.5.2.md) | 2021-10-19 | [0.5.2](https://github.com/inventree/InvenTree/releases/tag/0.5.2) | [inventree:0.5.2](https://hub.docker.com/layers/inventree/inventree/0.5.2/images/sha256-ff4f435df894c5aa5ea18ee7f3637e81a29ed356ed82dba70ecbd28da3e3d965?context=explore) | | [0.5.1](./0.5.1.md) | 2021-10-11 | [0.5.1](https://github.com/inventree/InvenTree/releases/tag/0.5.1) | [inventree:0.5.1](https://hub.docker.com/layers/inventree/inventree/0.5.1/images/sha256-3dbfb2e1bc73a0ff2bf537b56f7151c98097923cf77f5313a2a914586ab75973?context=explore) | | [0.5.0](./0.5.0.md) | 2021-10-1 | [0.5.0](https://github.com/inventree/InvenTree/releases/tag/0.5.0) | [inventree:0.5.0](https://hub.docker.com/layers/inventree/inventree/0.5.0/images/sha256-eed8b5df1512d4f1f8596d782d894f8e582c0978d0109020da3ee852bb9326ee?context=explore) | From ba684dde80f09ac5edb48b01e6d5102ed39f9ea0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 20 Oct 2021 13:07:37 +1100 Subject: [PATCH 03/26] Update release_notes.md fix typo --- docs/releases/release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/release_notes.md b/docs/releases/release_notes.md index d7c2cab..c2d2d40 100644 --- a/docs/releases/release_notes.md +++ b/docs/releases/release_notes.md @@ -28,7 +28,7 @@ Tagged released are shown below. Click on the release notes for each version to | Release | Date | GitHub | Docker | | --- | --- | --- | --- | -| [0.5.3](./0.5.3.md) | 2021-10-19 | [0.5.2](https://github.com/inventree/InvenTree/releases/tag/0.5.3) | [inventree:0.5.3](https://hub.docker.com/layers/inventree/inventree/0.5.3/images/sha256-ecdfbd2906241b2495cee3c5acc12bdec5ed66b2d32ab146dbc2b71131a73a7a?context=explore) | +| [0.5.3](./0.5.3.md) | 2021-10-19 | [0.5.3](https://github.com/inventree/InvenTree/releases/tag/0.5.3) | [inventree:0.5.3](https://hub.docker.com/layers/inventree/inventree/0.5.3/images/sha256-ecdfbd2906241b2495cee3c5acc12bdec5ed66b2d32ab146dbc2b71131a73a7a?context=explore) | | [0.5.2](./0.5.2.md) | 2021-10-19 | [0.5.2](https://github.com/inventree/InvenTree/releases/tag/0.5.2) | [inventree:0.5.2](https://hub.docker.com/layers/inventree/inventree/0.5.2/images/sha256-ff4f435df894c5aa5ea18ee7f3637e81a29ed356ed82dba70ecbd28da3e3d965?context=explore) | | [0.5.1](./0.5.1.md) | 2021-10-11 | [0.5.1](https://github.com/inventree/InvenTree/releases/tag/0.5.1) | [inventree:0.5.1](https://hub.docker.com/layers/inventree/inventree/0.5.1/images/sha256-3dbfb2e1bc73a0ff2bf537b56f7151c98097923cf77f5313a2a914586ab75973?context=explore) | | [0.5.0](./0.5.0.md) | 2021-10-1 | [0.5.0](https://github.com/inventree/InvenTree/releases/tag/0.5.0) | [inventree:0.5.0](https://hub.docker.com/layers/inventree/inventree/0.5.0/images/sha256-eed8b5df1512d4f1f8596d782d894f8e582c0978d0109020da3ee852bb9326ee?context=explore) | From 27c4cb0dec45fac9b10817643ffed0b43b36bf3c Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 26 Oct 2021 21:21:38 +1100 Subject: [PATCH 04/26] Adds release notes page for 0.5.4 --- docs/releases/0.5.4.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/releases/0.5.4.md diff --git a/docs/releases/0.5.4.md b/docs/releases/0.5.4.md new file mode 100644 index 0000000..b889436 --- /dev/null +++ b/docs/releases/0.5.4.md @@ -0,0 +1,13 @@ +--- +title: Release 0.5.4 +--- + +## Release 0.5.4 + +Release 0.5.4 is a bug-fix release on the 0.5.x stable branch + +### Bug Fixes + +| Pull Request | Description | +| --- | --- | +| [#2202](https://github.com/inventree/InvenTree/pull/2202) | Fixes server error when submitting invalid supplier price value | From e1ce8213cf316536eaa5998078b6e87cd118bd87 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 27 Oct 2021 19:07:35 +1100 Subject: [PATCH 05/26] Update release.md --- docs/app/release.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/app/release.md b/docs/app/release.md index db8887b..216e1a5 100644 --- a/docs/app/release.md +++ b/docs/app/release.md @@ -5,6 +5,16 @@ title: App Release Notes ## InvenTree App Release Notes --- +### 0.5.2 - October 2021 +--- + +- Display error message on HTTPS certificate error + +### 0.5.1 - October 2021 +--- + +- Bug fix for app title + ### 0.5.0 - October 2021 --- From 66fe08f23454db93729b21640437b42dbf83c82d Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 30 Oct 2021 22:37:21 +1100 Subject: [PATCH 06/26] Update 0.6.0.md https://github.com/inventree/InvenTree/pull/2205 --- docs/releases/0.6.0.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/releases/0.6.0.md b/docs/releases/0.6.0.md index 46a3c50..ec77dab 100644 --- a/docs/releases/0.6.0.md +++ b/docs/releases/0.6.0.md @@ -42,6 +42,10 @@ PR [#2150](https://github.com/inventree/InvenTree/pull/2150) adds support for *B PR [#2159](https://github.com/inventree/InvenTree/pull/2159) provides a major improvement to the process by which build outputs are completed. The build output completion process now uses the API and provides a much more intuitive and efficient user interface. +### Bootstrap Yourselves In + +PR [#2205](https://github.com/inventree/InvenTree/pull/2205) represents a major visual overhaul of the user interface, updating to bootstrap 5. + ### Bug Fixes | Pull Request | Description | From 3174173fa2fdf2f9af6e2eb06bc5789c92669548 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 1 Nov 2021 22:49:27 +1100 Subject: [PATCH 07/26] Update 0.6.0.md https://github.com/inventree/InvenTree/pull/2208 --- docs/releases/0.6.0.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/releases/0.6.0.md b/docs/releases/0.6.0.md index ec77dab..d68f99c 100644 --- a/docs/releases/0.6.0.md +++ b/docs/releases/0.6.0.md @@ -46,6 +46,10 @@ PR [#2159](https://github.com/inventree/InvenTree/pull/2159) provides a major im PR [#2205](https://github.com/inventree/InvenTree/pull/2205) represents a major visual overhaul of the user interface, updating to bootstrap 5. +### Low Stock Notifications + +PR [#2208](https://github.com/inventree/InvenTree/pull/2208) provides notification emails when the stock level for a particular part falls below the configured "minimum stock" threshold for that part. An email is automatically sent to any users who are subscribed to notifications for that part. + ### Bug Fixes | Pull Request | Description | From 0fbdbe19806b1b7e0ad89c55817f0b2163d83a9c Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 2 Nov 2021 10:55:03 +1100 Subject: [PATCH 08/26] Update 0.6.0.md --- docs/releases/0.6.0.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/releases/0.6.0.md b/docs/releases/0.6.0.md index d68f99c..e115224 100644 --- a/docs/releases/0.6.0.md +++ b/docs/releases/0.6.0.md @@ -4,6 +4,8 @@ title: Release 0.6.0 ## Release 0.6.0 +0.6.0 is a major feature release of the InvenTree software project. For a comprehensive list of changes associated with this release, refer to the [InvenTree GitHub page](https://github.com/inventree/InvenTree/milestone/8). + ### Build Order Allocation PR [#2094](https://github.com/inventree/InvenTree/pull/2094) represents a significant improvement to the worflow for allocating stock items against a build order. A new API endpoint has been created allowing stock items to be allocated against builds, with dynamic validation and feedback of error messages. From 340582cb9753c92771b2bccf8ca0825f5e34e528 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 2 Nov 2021 14:22:33 +1100 Subject: [PATCH 09/26] Update 0.6.0.md --- docs/releases/0.6.0.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/releases/0.6.0.md b/docs/releases/0.6.0.md index e115224..96985b8 100644 --- a/docs/releases/0.6.0.md +++ b/docs/releases/0.6.0.md @@ -6,6 +6,8 @@ title: Release 0.6.0 0.6.0 is a major feature release of the InvenTree software project. For a comprehensive list of changes associated with this release, refer to the [InvenTree GitHub page](https://github.com/inventree/InvenTree/milestone/8). +## New Features + ### Build Order Allocation PR [#2094](https://github.com/inventree/InvenTree/pull/2094) represents a significant improvement to the worflow for allocating stock items against a build order. A new API endpoint has been created allowing stock items to be allocated against builds, with dynamic validation and feedback of error messages. @@ -52,7 +54,7 @@ PR [#2205](https://github.com/inventree/InvenTree/pull/2205) represents a major PR [#2208](https://github.com/inventree/InvenTree/pull/2208) provides notification emails when the stock level for a particular part falls below the configured "minimum stock" threshold for that part. An email is automatically sent to any users who are subscribed to notifications for that part. -### Bug Fixes +## Major Bug Fixes | Pull Request | Description | | --- | --- | From 898b773ef27638e2c9f8f07da764c894e8430535 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 3 Nov 2021 15:06:34 +1100 Subject: [PATCH 10/26] Add link for 0.5.4 --- docs/releases/release_notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases/release_notes.md b/docs/releases/release_notes.md index c2d2d40..319f903 100644 --- a/docs/releases/release_notes.md +++ b/docs/releases/release_notes.md @@ -28,6 +28,7 @@ Tagged released are shown below. Click on the release notes for each version to | Release | Date | GitHub | Docker | | --- | --- | --- | --- | +| [0.5.4](./0.5.4.md) | 2021-11-3 | [0.5.4](https://github.com/inventree/InvenTree/releases/tag/0.5.4) | [inventree:0.5.4](https://hub.docker.com/layers/inventree/inventree/0.5.4/images/sha256-35512b55ea1f78a802c915d3ea920bb8e1ef0c8f3f1b68ec1941d2a6a1141bd3?context=explore) | | [0.5.3](./0.5.3.md) | 2021-10-19 | [0.5.3](https://github.com/inventree/InvenTree/releases/tag/0.5.3) | [inventree:0.5.3](https://hub.docker.com/layers/inventree/inventree/0.5.3/images/sha256-ecdfbd2906241b2495cee3c5acc12bdec5ed66b2d32ab146dbc2b71131a73a7a?context=explore) | | [0.5.2](./0.5.2.md) | 2021-10-19 | [0.5.2](https://github.com/inventree/InvenTree/releases/tag/0.5.2) | [inventree:0.5.2](https://hub.docker.com/layers/inventree/inventree/0.5.2/images/sha256-ff4f435df894c5aa5ea18ee7f3637e81a29ed356ed82dba70ecbd28da3e3d965?context=explore) | | [0.5.1](./0.5.1.md) | 2021-10-11 | [0.5.1](https://github.com/inventree/InvenTree/releases/tag/0.5.1) | [inventree:0.5.1](https://hub.docker.com/layers/inventree/inventree/0.5.1/images/sha256-3dbfb2e1bc73a0ff2bf537b56f7151c98097923cf77f5313a2a914586ab75973?context=explore) | From 229af4b093a553c3f8484c131b55808d5a523909 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 00:22:06 +1100 Subject: [PATCH 11/26] Update 0.6.0.md https://github.com/inventree/InvenTree/pull/2198 --- docs/releases/0.6.0.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/releases/0.6.0.md b/docs/releases/0.6.0.md index 96985b8..b14e03d 100644 --- a/docs/releases/0.6.0.md +++ b/docs/releases/0.6.0.md @@ -54,6 +54,10 @@ PR [#2205](https://github.com/inventree/InvenTree/pull/2205) represents a major PR [#2208](https://github.com/inventree/InvenTree/pull/2208) provides notification emails when the stock level for a particular part falls below the configured "minimum stock" threshold for that part. An email is automatically sent to any users who are subscribed to notifications for that part. +### Stock Item Forms + +PR [#2198](https://github.com/inventree/InvenTree/pull/2198) provides a major refactor of stock item forms, for creating and editing stock items. These forms have been migrated to the REST API, providing a much more responsive user experience. + ## Major Bug Fixes | Pull Request | Description | From c5bac2d5d45dd1b88c1d5552e14454d8aeed107d Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 10:33:50 +1100 Subject: [PATCH 12/26] Improvements to installation instructions --- _includes/config.yaml | 60 --------------------------------------- docs/start/config.md | 20 +++++++++---- docs/start/development.md | 6 ++-- docs/start/docker.md | 9 ++++-- docs/start/docker_prod.md | 10 +++++-- docs/start/install.md | 39 +++++++++++++------------ docs/start/intro.md | 15 ++++++---- docs/start/migrate.md | 6 ++-- docs/start/update.md | 5 +++- mkdocs.yml | 2 +- 10 files changed, 69 insertions(+), 103 deletions(-) diff --git a/_includes/config.yaml b/_includes/config.yaml index 0e6232d..a5e3f34 100644 --- a/_includes/config.yaml +++ b/_includes/config.yaml @@ -68,19 +68,6 @@ currencies: # Email backend configuration # Ref: https://docs.djangoproject.com/en/dev/topics/email/ -# Available options: -# host: Email server host address -# port: Email port -# username: Account username -# password: Account password -# prefix: Email subject prefix -# tls: Enable TLS support -# ssl: Enable SSL support - -# Alternatively, these options can all be set using environment variables, -# with the INVENTREE_EMAIL_ prefix: -# e.g. INVENTREE_EMAIL_HOST / INVENTREE_EMAIL_PORT / INVENTREE_EMAIL_USERNAME -# Refer to the InvenTree documentation for more information email: # backend: 'django.core.mail.backends.smtp.EmailBackend' @@ -96,33 +83,11 @@ email: # Use the environment variable INVENTREE_DEBUG debug: True -# Set debug_toolbar to True to enable a debugging toolbar for InvenTree -# Note: This will only be displayed if DEBUG mode is enabled, -# and only if InvenTree is accessed from a local IP (127.0.0.1) -debug_toolbar: False - # Configure the system logging level # Use environment variable INVENTREE_LOG_LEVEL # Options: DEBUG / INFO / WARNING / ERROR / CRITICAL log_level: WARNING -# Allowed hosts (see ALLOWED_HOSTS in Django settings documentation) -# A list of strings representing the host/domain names that this Django site can serve. -# Default behaviour is to allow all hosts (THIS IS NOT SECURE!) -allowed_hosts: - - '*' - -# Cross Origin Resource Sharing (CORS) settings (see https://github.com/ottoyiu/django-cors-headers) -# Following parameters are -cors: - # CORS_ORIGIN_ALLOW_ALL - If True, the whitelist will not be used and all origins will be accepted. - allow_all: True - - # CORS_ORIGIN_WHITELIST - A list of origins that are authorized to make cross-site HTTP requests. Defaults to [] - # whitelist: - # - https://example.com - # - https://sub.example.com - # MEDIA_ROOT is the local filesystem location for storing uploaded files # By default, it is stored under /home/inventree/data/media # Use environment variable INVENTREE_MEDIA_ROOT @@ -132,28 +97,3 @@ media_root: '/home/inventree/data/media' # By default, it is stored under /home/inventree/data/static # Use environment variable INVENTREE_STATIC_ROOT static_root: '/home/inventree/data/static' - -# Optional URL schemes to allow in URL fields -# By default, only the following schemes are allowed: ['http', 'https', 'ftp', 'ftps'] -# Uncomment the lines below to allow extra schemes -#extra_url_schemes: -# - mailto -# - git -# - ssh - -# Permit custom authentication backends -#authentication_backends: -# - 'django.contrib.auth.backends.ModelBackend' - -# Custom middleware, sometimes needed alongside an authentication backend change. -#middleware: -# - 'django.middleware.security.SecurityMiddleware' -# - 'django.contrib.sessions.middleware.SessionMiddleware' -# - 'django.middleware.locale.LocaleMiddleware' -# - 'django.middleware.common.CommonMiddleware' -# - 'django.middleware.csrf.CsrfViewMiddleware' -# - 'corsheaders.middleware.CorsMiddleware' -# - 'django.contrib.auth.middleware.AuthenticationMiddleware' -# - 'django.contrib.messages.middleware.MessageMiddleware' -# - 'django.middleware.clickjacking.XFrameOptionsMiddleware' -# - 'InvenTree.middleware.AuthRequiredMiddleware' diff --git a/docs/start/config.md b/docs/start/config.md index 91612c0..dc9f0ee 100644 --- a/docs/start/config.md +++ b/docs/start/config.md @@ -19,7 +19,7 @@ The default InvenTree config file is located at `./InvenTree/config.yaml` However, the config file can be placed elsewhere, and specified with the `INVENTREE_CONFIG_FILE` environment variable. -The default configuration file file is shown below: +A short snippet from an example configuration file file is shown below. The entire default configuration file can be found on [GitHub](https://github.com/inventree/InvenTree/blob/master/InvenTree/config_template.yaml) ``` yaml {% include 'config.yaml' %} @@ -32,10 +32,10 @@ In addition to specifying InvenTree options via the `config.yaml` file, these op - Environment variable settings use the `INVENTREE_` prefix, and are all uppercase. - Config file settings do not use this prefix, and are all lowercase -!!! info Priotity +!!! info "Configuration Priority" Configuration options set via environment variables will take priority over the values set in the `config.yaml` file. -!!! warning Available Variables +!!! warning "Available Variables" Some configuration options cannot be set via environment variables. Refer to the documentation below. ## Basic Options @@ -101,7 +101,13 @@ The following email settings are available: ## Allowed Hosts / CORS -By default, all hosts are allowed, and CORS requests are enabled from any origin. **This is not secure and should be adjusted for your installation**. These options can be changed in the configuration file. +By default, all hosts are allowed, and CORS requests are enabled from any origin. + +!!! danger "Not Secure" + Allowing access from any host is not secure, and should be adjusted for your installation. + +!!! info "Configuration File" + Allowed hosts and CORS options must be changed in the configuration file, and cannot be set via environment variables For further information, refer to the following documentation: @@ -124,13 +130,15 @@ Alternatively this location can be specified with the `INVENTREE_MEDIA_ROOT` env ## Authentication +InvenTree provides allowance for additional sign-in options. The following options are not enabled by default, and care must be taken by the system administrator when configuring these settings. + ### Single Sign on -SSO backends for all wanted providers need to be added to the config file as a list under the key `social_backends`. The correct backend-name can be found in django-allauths [configuration documentation](https://django-allauth.readthedocs.io/en/latest/installation.html#django). +SSO backends for all required authentication providers need to be added to the config file as a list under the key `social_backends`. The correct backend-name can be found in django-allauths [configuration documentation](https://django-allauth.readthedocs.io/en/latest/installation.html#django). If the selected providers need additional settings they must be added as dicts under the key `social_providers`. The correct settings can be found in the django-allauths [provider documentation](https://django-allauth.readthedocs.io/en/latest/providers.html). -!!! note "You are not done" +!!! warning "You are not done" SSO still needs credentials for all providers and has to be enabled in the [global settings](../settings/global.md)! diff --git a/docs/start/development.md b/docs/start/development.md index c4ce785..3c530d3 100644 --- a/docs/start/development.md +++ b/docs/start/development.md @@ -17,7 +17,7 @@ InvenTree includes a simple server application, suitable for use in a developmen To run the development server on a local machine, run the command: ``` -(env) inv server +(env) invoke server ``` This will launch the InvenTree web interface at `http://127.0.0.1:8000`. @@ -25,7 +25,7 @@ This will launch the InvenTree web interface at `http://127.0.0.1:8000`. A different port can be specified using the `-a` flag: ``` -(env) inv server -a 127.0.0.1:8123 +(env) invoke server -a 127.0.0.1:8123 ``` Serving on the address `127.0.0.1` means that InvenTree will only be available *on that computer*. The server will be accessible from a web browser on the same computer, but not from any other computers on the local network. @@ -35,7 +35,7 @@ Serving on the address `127.0.0.1` means that InvenTree will only be available * To enable access to the InvenTree server from other computers on a local network, you need to know the IP of the computer running the server. For example, if the server IP address is `192.168.120.1`: ``` -(env) inv server -a 192.168.120.1:8000 +(env) invoke server -a 192.168.120.1:8000 ``` ## Background Worker diff --git a/docs/start/docker.md b/docs/start/docker.md index 6358e8a..db7756c 100644 --- a/docs/start/docker.md +++ b/docs/start/docker.md @@ -12,14 +12,17 @@ The InvenTree docker image contains all the required system packages, python mod Docker images are available with the following tags: -- **inventree:stable** - represents the most recent stable release version of InvenTree -- **inventree:latest** - represents the most up-to-date *development* version of InvenTree. -- **inventree:tag** - specific tagged images are built for each tagged release of InvenTree +| Tag | Description | +| --- | --- | +| **inventree:stable** | The most recent *stable* release version of InvenTree | +| **inventree:latest** | The most up-to-date *development* version of InvenTree. | +| **inventree:tag** | Specific tagged images are built for each tagged release of InvenTree | ### Docker Compose InvenTree provides sample docker-compose files to get you up and running. +| Compose File | Target | Description | - A *production* compose file is intended to be used in a production environment, running the web server behind a nginx proxy. - A *development* compose file provides a simple way to spin up a development environment diff --git a/docs/start/docker_prod.md b/docs/start/docker_prod.md index 7f749fc..ed78bb8 100644 --- a/docs/start/docker_prod.md +++ b/docs/start/docker_prod.md @@ -13,8 +13,13 @@ Using the [InvenTree docker image](./docker.md) streamlines the setup process fo It is strongly recommended that you use a [docker-compose](https://docs.docker.com/compose/) script to manage your InvenTree docker image. +### Example Script + An example docker compose file can be [found here](https://github.com/inventree/InvenTree/blob/master/docker/docker-compose.yml) - the documentation below will be using this docker compose file. +!!! info "Stable Version" + The example docker-compose file targets `inventree:stable` docker image by default + ### Containers The example docker-compose file launches the following containers: @@ -46,9 +51,10 @@ Nginx working as a reverse proxy, separating requests for static and media files This container uses the official [nginx image](https://hub.docker.com/_/nginx). -An nginx configuration file must be provided to the image. Use the [example configuration file](https://github.com/inventree/InvenTree/blob/master/docker/nginx.conf) as a starting point. +!!! info "Configuration File" + An nginx configuration file must be provided to the image. Use the [example configuration file](https://github.com/inventree/InvenTree/blob/master/docker/nginx.conf) as a starting point. -*__Note__: You must save this conf file in the same directory as your docker-compose.yml file* + *__Note__: You must save the `nginx.conf` file in the same directory as your docker-compose.yml file* !!! info "Proxy Pass" If you change the name (or port) of the InvenTree web server container, you will need to also adjust the `proxy_pass` setting in the nginx.conf file! diff --git a/docs/start/install.md b/docs/start/install.md index afbca99..c713587 100644 --- a/docs/start/install.md +++ b/docs/start/install.md @@ -63,6 +63,9 @@ Download InvenTree source code, into the `./src` directory: git clone https://github.com/inventree/inventree src ``` +!!! info "Main Branch = Development" + The "main" branch of the InvenTree code base represents the "latest" (development) code. If you would like to use most recent "stable" release, target the `stable` branch. + ### Create Virtual Environment Create a python virtual environment for installing required Python packages and binaries: @@ -89,24 +92,6 @@ This installs all required Python packages using pip package manager. It also cr As part of the initial setup, an empty database needs to be created. Follow the instructions below particular to your database engine of choice: -### SQLite - -SQLite uses a simple portable database file which is easy to use for debug and testing purposes. - -Install required packages as follows: - -!!! info "Sudo Actions" - Perform sudo actions from a separate shell, as 'inventree' user does not have sudo access - -``` -sudo apt-get install sqlite3 -``` - -A `.sqlite3` database file will be automatically created, at the location specified in the configuration options. No further steps necessary. - -!!! warning "SQLite Case Sensitivity" - SQLite has a known [string matching limitation](https://docs.djangoproject.com/en/dev/ref/databases/#substring-matching-and-case-sensitivity) for non ASCII characters. If you are using non ASCII characters (e.g. Cyrillic text), it is recommended that you do not use SQLite, as search functionality will not work correctly. - ### PostgreSQL #### Install PostgreSQL @@ -205,6 +190,24 @@ mysql> EXIT; !!! info "Username / Password" You should change the username and password from the values specified above. This username and password will also be for the InvenTree database connection configuration. +### SQLite + +SQLite uses a simple portable database file which is easy to use for debug and testing purposes. + +Install required packages as follows: + +!!! info "Sudo Actions" + Perform sudo actions from a separate shell, as 'inventree' user does not have sudo access + +``` +sudo apt-get install sqlite3 +``` + +A `.sqlite3` database file will be automatically created, at the location specified in the configuration options. No further steps necessary. + +!!! warning "SQLite Case Sensitivity" + SQLite has a known [string matching limitation](https://docs.djangoproject.com/en/dev/ref/databases/#substring-matching-and-case-sensitivity) for non ASCII characters. If you are using non ASCII characters (e.g. Cyrillic text), it is recommended that you do not use SQLite, as search functionality will not work correctly. + ## Configure InvenTree Options Once the required software packages are installed and the database has been created, the InvenTree server options must be configured. diff --git a/docs/start/intro.md b/docs/start/intro.md index ab39623..d7c3dff 100644 --- a/docs/start/intro.md +++ b/docs/start/intro.md @@ -10,14 +10,14 @@ The InvenTree server ecosystem consists of the following components: ### Database -A persistent database is required to store stock information. The database backend must be installed and configured separately to the InvenTree application. +A persistent database is required for data storage. InvenTree can be used with any of the following database backends: -InvenTree can be used with any of the following database backends: - -* SQLite * PostgreSQL -* MariaDB -* MySQL +* MySQL / MariaDB +* SQLite + +!!! warning "SQLite" + While SQLite provides a simpler setup and is useful for a development environment, we strongly recommend against using it for a production environment. Use PostgreSQL or MySQL instead Database selection should be determined by your particular installation requirements. @@ -44,6 +44,9 @@ The InvenTree documentation assumes that the operating system is a debian based !!! warning "Installing on Windows" Installation on Windows is *not guaranteed* to work (at all). To install on a Windows system, it is highly recommended that you [install WSL](https://docs.microsoft.com/en-us/windows/wsl/install-win10#manual-installation-steps), and then follow installation procedure from within the WSL environment. +!!! success "Docker" + Installation on any OS is simplified by following the [docker setup guide](../docker). + ## Python Requirements InvenTree runs on [Python](https://python.org). diff --git a/docs/start/migrate.md b/docs/start/migrate.md index d41842f..1005395 100644 --- a/docs/start/migrate.md +++ b/docs/start/migrate.md @@ -19,7 +19,7 @@ For example, if you wish to migrate from an SQLite database backend to a MySQL d Export the database contents to a JSON file using the following command: ``` -inv export-records -f data.json +invoke export-records -f data.json ``` This will create JSON file at the specified location which contains all database records. @@ -34,7 +34,7 @@ Configure the new database using the normal processes (see [Configuration](./con Then, ensure that the database schema are correctly initialized in the new database: ``` -inv migrate +invoke migrate ``` This ensures that the required database tables exist, which must be the case before data can be imported. @@ -47,7 +47,7 @@ The new database should now be correctly initialized with the correct table stru If the database is not *empty* (i.e. it contains data records) then the data import process will fail. If errors occur during the import process, run `invoke delete-data` to clear all existing data from the database. ``` -inv import-records -f data.json +invoke import-records -f data.json ``` !!! info "Import Filename" diff --git a/docs/start/update.md b/docs/start/update.md index 1b73a2e..ec78dd9 100644 --- a/docs/start/update.md +++ b/docs/start/update.md @@ -26,12 +26,15 @@ For example, pull down the latest InvenTree sourcecode using Git: git pull origin master ``` +!!! info "Release Versions" + If you are using a particular version of InvenTree, you may wish to target a specific code branch or tag, instead of just pulling down latest master + ### Perform Database Migrations Updating the database is as simple as calling the `update` script: ``` -inv update +invoke update ``` This command performs the following steps: diff --git a/mkdocs.yml b/mkdocs.yml index cb607f0..83d9d02 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -169,4 +169,4 @@ extra: name: InvenTree on Docker use_directory_urls: true -strict: true +strict: false From 63386b2457d98915ca734b6bc31193b811215da3 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 16:24:22 +1100 Subject: [PATCH 13/26] Adds documentation for notifications --- .../images/part/category_notification.png | Bin 0 -> 12121 bytes .../assets/images/part/part_subscribe_off.png | Bin 0 -> 8469 bytes docs/assets/images/part/part_subscribe_on.png | Bin 0 -> 8745 bytes docs/part/notification.md | 65 ++++++++++++++++++ mkdocs.yml | 3 +- 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 docs/assets/images/part/category_notification.png create mode 100644 docs/assets/images/part/part_subscribe_off.png create mode 100644 docs/assets/images/part/part_subscribe_on.png create mode 100644 docs/part/notification.md diff --git a/docs/assets/images/part/category_notification.png b/docs/assets/images/part/category_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..3de3a74d19e1bf45455c125c55949d14095f6aa6 GIT binary patch literal 12121 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 literal 0 HcmV?d00001 diff --git a/docs/part/notification.md b/docs/part/notification.md new file mode 100644 index 0000000..e6ff528 --- /dev/null +++ b/docs/part/notification.md @@ -0,0 +1,65 @@ +--- +title: Part Notifications +--- + +## Notifications + +Users can select to receive email notifications when certain events occur. + +!!! warning "Email Configuration Required" + Notifications require correct [email configuration](../../start/config/#email-settings) + +!!! warning "Valid Email Address" + Each user must have a valid email address associated with their account to receive email notifications + +### Low Stock Notification + +If the *minimum stock* threshold is set for a *Part*, then a "low stock" notification can be generated when the stock level for that part falls below the configured level. + +Any users who are subscribed to notifications for the part in question will receive a low stock notification via email. + +### Build Order Notification + +When a new [Build Order](../../build/build/) is created, the InvenTree software checks to see if any of the parts required to complete the order are low on stock. + +If there are any parts with low stock, a notification is generated for any users subscribed to notifications for the part being built. + +## Subscribing to Notifications + +Users can "subscribe" to either a *Part* or *Part Category*, to receive notifications. + +### Part + +When subscribed to a *Part*, a user will receive notifications when events occur which pertain to: + +- That particular part +- Any variant parts + +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 %} + +If the user is not subscibed, 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 %} + +Clicking on this icon will toggle the subscription status for this part. + +### Part Category + +When subscribed to a *Part Category*, a user will receive notifications when particular events occur which pertain to: + +- That particular category +- Any sub-categories at lower levels +- Any parts contained in the category +- Any parts contained in the lower level categories + +Subscribing to a part category operates in the same manner as for a part - simply click on the notification icon: + +{% with id="cat_sub", url="part/category_notification.png", description="Subscribe to part category" %} +{% include 'img.html' %} +{% endwith %} diff --git a/mkdocs.yml b/mkdocs.yml index 83d9d02..4fd2375 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -66,6 +66,7 @@ nav: - Templates: part/template.md - Tests: part/test.md - Pricing: part/pricing.md + - Notification: part/notification.md - Stock: - Stock Items: stock/stock.md - Stock Status: stock/status.md @@ -169,4 +170,4 @@ extra: name: InvenTree on Docker use_directory_urls: true -strict: false +strict: true From 16d35fafef4f6269f5c97b92828762d59b5f3d70 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 16:27:20 +1100 Subject: [PATCH 14/26] more --- docs/assets/images/part/cat_subs.png | Bin 0 -> 35768 bytes docs/part/notification.md | 8 ++++++++ mkdocs.yml | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 docs/assets/images/part/cat_subs.png diff --git a/docs/assets/images/part/cat_subs.png b/docs/assets/images/part/cat_subs.png new file mode 100644 index 0000000000000000000000000000000000000000..271b33e1194a7acf2d64a7949fdbffefe853db3c GIT binary patch literal 35768 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
YpxDb;YRO79TcKYa9Z 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%0DMx$mrpL9^7CFeRQ9q0eG9U`as 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 aJ;kN%4NXk!*Db@0>@!iBC)tm6JpKnXUrMO} literal 0 HcmV?d00001 diff --git a/docs/part/notification.md b/docs/part/notification.md index e6ff528..8fb1e9a 100644 --- a/docs/part/notification.md +++ b/docs/part/notification.md @@ -63,3 +63,11 @@ Subscribing to a part category operates in the same manner as for a part - simpl {% with id="cat_sub", url="part/category_notification.png", description="Subscribe to part category" %} {% include 'img.html' %} {% endwith %} + +## Subscription List + +Users can view the parts and categories they are subscribed to on the InvenTree home page: + +{% with id="cat_subs", url="part/cat_subs.png", description="Category subscription list" %} +{% include 'img.html' %} +{% endwith %} diff --git a/mkdocs.yml b/mkdocs.yml index 4fd2375..46dfe5c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -66,7 +66,7 @@ nav: - Templates: part/template.md - Tests: part/test.md - Pricing: part/pricing.md - - Notification: part/notification.md + - Notifications: part/notification.md - Stock: - Stock Items: stock/stock.md - Stock Status: stock/status.md From 37c9c49112eb9af5dd4d993ac3a321ba17dcd765 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 16:28:56 +1100 Subject: [PATCH 15/26] wording fixes --- docs/part/notification.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/part/notification.md b/docs/part/notification.md index 8fb1e9a..fccbfb6 100644 --- a/docs/part/notification.md +++ b/docs/part/notification.md @@ -2,7 +2,7 @@ title: Part Notifications --- -## Notifications +## Notification Events Users can select to receive email notifications when certain events occur. @@ -33,7 +33,7 @@ Users can "subscribe" to either a *Part* or *Part Category*, to receive notifica When subscribed to a *Part*, a user will receive notifications when events occur which pertain to: - That particular part -- Any variant parts +- Any parts which are variants of that part If a user is subscribed to a particular part, it will be indicated as shown below: From f39c54be8d6891e09a3d4179f14c4b7031cb888c Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 20:28:25 +1100 Subject: [PATCH 16/26] Add a .github workflow to check that "strict" mode is always set --- .github/workflows/check_config.yaml | 26 ++++++++++++++++++++++++++ ci/check_mkdocs_config.py | 13 +++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 .github/workflows/check_config.yaml create mode 100644 ci/check_mkdocs_config.py diff --git a/.github/workflows/check_config.yaml b/.github/workflows/check_config.yaml new file mode 100644 index 0000000..77ea5c2 --- /dev/null +++ b/.github/workflows/check_config.yaml @@ -0,0 +1,26 @@ +name: Config Checks + +on: + push: + branches-ignore: + - l10* + + pull_request: + branches-ignore: + - l10* + +jobs: + + mkdocs: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v2 + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Run Checks + run: | + \ No newline at end of file diff --git a/ci/check_mkdocs_config.py b/ci/check_mkdocs_config.py new file mode 100644 index 0000000..0e243d9 --- /dev/null +++ b/ci/check_mkdocs_config.py @@ -0,0 +1,13 @@ +import os +import yaml + +here = os.path.dirname(__file__) + +tld = os.path.abspath(os.path.join(here, '..')) + +config_file = os.path.join(tld, 'mkdocs.yml') + +with open(config_file, 'r') as f: + data = yaml.safe_load(f) + + assert data['strict'] == True \ No newline at end of file From ce3ec5a88873e450627f54c9fed2bc7078f05d0a Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 20:33:16 +1100 Subject: [PATCH 17/26] Actually run the workflow --- .github/workflows/check_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check_config.yaml b/.github/workflows/check_config.yaml index 77ea5c2..254dbc9 100644 --- a/.github/workflows/check_config.yaml +++ b/.github/workflows/check_config.yaml @@ -23,4 +23,4 @@ jobs: python-version: 3.7 - name: Run Checks run: | - \ No newline at end of file + python ci/check_mkdocs_config.py From 11c9aadd1b0c0eebd08ce5c5fe75b65381507811 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 20:36:44 +1100 Subject: [PATCH 18/26] install yaml --- .github/workflows/check_config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check_config.yaml b/.github/workflows/check_config.yaml index 254dbc9..3acb17a 100644 --- a/.github/workflows/check_config.yaml +++ b/.github/workflows/check_config.yaml @@ -23,4 +23,5 @@ jobs: python-version: 3.7 - name: Run Checks run: | + pip install yaml python ci/check_mkdocs_config.py From f5b421251e8baddc9e7c528cba4395691a8c9d01 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 5 Nov 2021 20:39:39 +1100 Subject: [PATCH 19/26] wrong package name --- .github/workflows/check_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check_config.yaml b/.github/workflows/check_config.yaml index 3acb17a..6081b97 100644 --- a/.github/workflows/check_config.yaml +++ b/.github/workflows/check_config.yaml @@ -23,5 +23,5 @@ jobs: python-version: 3.7 - name: Run Checks run: | - pip install yaml + pip install pyyaml python ci/check_mkdocs_config.py From 566e4fd2c1284dbfd7b6a7ec6103f8c3983aafb5 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 6 Nov 2021 07:55:43 +1100 Subject: [PATCH 20/26] Add link to demo instance --- _includes/overrides/home.html | 11 +++++++---- docs/{start => }/demo.md | 29 ++++++++++++++++++----------- mkdocs.yml | 3 +-- 3 files changed, 26 insertions(+), 17 deletions(-) rename docs/{start => }/demo.md (87%) diff --git a/_includes/overrides/home.html b/_includes/overrides/home.html index 8aabcfb..2ea2565 100644 --- a/_includes/overrides/home.html +++ b/_includes/overrides/home.html @@ -25,18 +25,21 @@ Features + + Demo + Install - - Source Code - - Get the App + Mobile App Translate + + Source Code + diff --git a/docs/start/demo.md b/docs/demo.md similarity index 87% rename from docs/start/demo.md rename to docs/demo.md index 50810ae..12041a0 100644 --- a/docs/start/demo.md +++ b/docs/demo.md @@ -1,19 +1,14 @@ --- -title: Demo Dataset +title: InvenTree Demo --- -## Demo Dataset +## InvenTree Demo -A demonstration dataset is [available on GitHub](https://github.com/inventree/demo-dataset). +A working demo of InvenTree is available online at: -This dataset can be used to populate an empty database for demonstration purposes, to test and evaluate various InvenTree features. +[https://demo.inventree.org](https://demo.inventree.org) -It may also be useful to developers who need a dataset for developing and/or testing new InvenTree features. - -!!! warning "Empty Database" - Loading demo data will cause errors if the database is not empty. Run `invoke delete-data` prior to importing the demo dataset if there are records existing in the database! - -## Login Details +### Login Details The default *superuser* login details for the demo dataset are: @@ -21,7 +16,19 @@ The default *superuser* login details for the demo dataset are: | --- | --- | | admin | inventree | -## Setup +!!! warning "Database Reset" + The demo databaset resets once per day + +## Demo Dataset + +The dataset used for the demo instance is [available on GitHub](https://github.com/inventree/demo-dataset). + +This dataset can be used to populate an empty database for demonstration purposes, to test and evaluate various InvenTree features. + +It may also be useful to developers who need a dataset for developing and/or testing new InvenTree features. + +!!! warning "Empty Database" + Loading demo data will cause errors if the database is not empty. Run `invoke delete-data` prior to importing the demo dataset if there are records existing in the database! Follow these instructions to setup an InvenTree instance with the demo data: diff --git a/mkdocs.yml b/mkdocs.yml index 46dfe5c..059ceef 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -44,8 +44,8 @@ extra_javascript: nav: - InvenTree: - Features: features.md - - In Development: upcoming.md - Release Notes: releases/release_notes.md + - Demo: demo.md - FAQ: faq.md - Contribute: contribute.md - Credits: credits.md @@ -56,7 +56,6 @@ nav: - Bare Metal Setup: start/install.md - Updating: start/update.md - Migrating: start/migrate.md - - Demo Dataset: start/demo.md - Parts: - Parts: part/part.md - Creating Parts: part/create.md From 84221823e0a470b3c379790b2ec3aa6a1938ea2b Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 6 Nov 2021 07:58:38 +1100 Subject: [PATCH 21/26] Fix URL --- docs/demo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/demo.md b/docs/demo.md index 12041a0..91fc150 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -47,7 +47,7 @@ git clone git@github.com:inventree/demo-dataset.git ~/inventree-data You will need to configure an *empty* database before importing the data fixtures. -Follow the [installation instructions](./intro.md) to initialize a database using your backend of choice. +Follow the [installation instructions](./start/intro.md) to initialize a database using your backend of choice. ### Configure InvenTree Settings From f2b8ac85dc0203be6edcf9d9bc0a8230a31666a4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 8 Nov 2021 09:52:05 +1100 Subject: [PATCH 22/26] Update demo.md --- docs/demo.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/demo.md b/docs/demo.md index 91fc150..f4ed444 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -10,11 +10,13 @@ A working demo of InvenTree is available online at: ### Login Details -The default *superuser* login details for the demo dataset are: +Multiple default accounts are provided, as detailed below. Each account is afforded a different set of permissions, so users can see the InvenTree roles/permission system in action -| Username | Password | -| --- | --- | -| admin | inventree | +| Username | Password | Description | +| --- | --- | --- | +| admin | inventree | Admin / superuser account - access to all system components | +| reader | readonly | Can view all pages but cannot create, edit or delete database records | +| engineer | partsonly | Can manage parts, view stock, but no access to purchase orders or sales orders | !!! warning "Database Reset" The demo databaset resets once per day From a80ba8fbd722fc9483bfeee02d77f8a8907854b2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 8 Nov 2021 09:54:31 +1100 Subject: [PATCH 23/26] Update demo.md --- docs/demo.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/demo.md b/docs/demo.md index f4ed444..f862819 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -18,8 +18,14 @@ Multiple default accounts are provided, as detailed below. Each account is affor | reader | readonly | Can view all pages but cannot create, edit or delete database records | | engineer | partsonly | Can manage parts, view stock, but no access to purchase orders or sales orders | -!!! warning "Database Reset" - The demo databaset resets once per day +### Data Persistence + +The InvenTree demo database resets to a known state once per day. + +- Database records are reset to the latest state of the [demo dataset](https://github.com/inventree/demo-dataset) +- InvenTree software is kept up to date with the latest `inventree:master` available via docker + +During the update period, the demo server may be inaccessible for a few minutes. ## Demo Dataset From a2a32c4e0f3f0134f1e5b79fd48c01ba02e70750 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 8 Nov 2021 14:42:12 +1100 Subject: [PATCH 24/26] Update demo.md --- docs/demo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/demo.md b/docs/demo.md index f862819..9dc8501 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -14,7 +14,7 @@ Multiple default accounts are provided, as detailed below. Each account is affor | Username | Password | Description | | --- | --- | --- | -| admin | inventree | Admin / superuser account - access to all system components | +| allacess | nolimits | View / create / edit all pages and items | | reader | readonly | Can view all pages but cannot create, edit or delete database records | | engineer | partsonly | Can manage parts, view stock, but no access to purchase orders or sales orders | From 70907667c18a91ce0fc492f7db88ac5f84588c3b Mon Sep 17 00:00:00 2001 From: Matthias Mair <66015116+matmair@users.noreply.github.com> Date: Mon, 8 Nov 2021 18:48:47 +0100 Subject: [PATCH 25/26] add upcoming back in --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 059ceef..53fe68f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -45,6 +45,7 @@ nav: - InvenTree: - Features: features.md - Release Notes: releases/release_notes.md + - Upcoming: upcoming.md - Demo: demo.md - FAQ: faq.md - Contribute: contribute.md From e72b7cf44e807c3d2e341fc5fe1858bf2fb1fd54 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 11 Nov 2021 08:40:38 +1100 Subject: [PATCH 26/26] Update demo.md --- docs/demo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/demo.md b/docs/demo.md index 9dc8501..a44dbc4 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -17,6 +17,7 @@ Multiple default accounts are provided, as detailed below. Each account is affor | allacess | nolimits | View / create / edit all pages and items | | reader | readonly | Can view all pages but cannot create, edit or delete database records | | engineer | partsonly | Can manage parts, view stock, but no access to purchase orders or sales orders | +| admin | inventree | Superuser account, access all areas plus administrator actions | ### Data Persistence