mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 12:06:44 +00:00
Merge pull request #2534 from SchrodingersGat/plugin-enable
Plugin enable
This commit is contained in:
commit
2255619b40
3
.github/workflows/qc_checks.yaml
vendored
3
.github/workflows/qc_checks.yaml
vendored
@ -156,6 +156,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
INVENTREE_DB_NAME: ./inventree.sqlite
|
INVENTREE_DB_NAME: ./inventree.sqlite
|
||||||
INVENTREE_DB_ENGINE: sqlite3
|
INVENTREE_DB_ENGINE: sqlite3
|
||||||
|
INVENTREE_PLUGINS_ENABLED: true
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
@ -204,6 +205,7 @@ jobs:
|
|||||||
INVENTREE_DB_PORT: 5432
|
INVENTREE_DB_PORT: 5432
|
||||||
INVENTREE_DEBUG: info
|
INVENTREE_DEBUG: info
|
||||||
INVENTREE_CACHE_HOST: localhost
|
INVENTREE_CACHE_HOST: localhost
|
||||||
|
INVENTREE_PLUGINS_ENABLED: true
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
@ -259,6 +261,7 @@ jobs:
|
|||||||
INVENTREE_DB_HOST: '127.0.0.1'
|
INVENTREE_DB_HOST: '127.0.0.1'
|
||||||
INVENTREE_DB_PORT: 3306
|
INVENTREE_DB_PORT: 3306
|
||||||
INVENTREE_DEBUG: info
|
INVENTREE_DEBUG: info
|
||||||
|
INVENTREE_PLUGINS_ENABLED: true
|
||||||
|
|
||||||
services:
|
services:
|
||||||
mysql:
|
mysql:
|
||||||
|
@ -52,8 +52,6 @@ with open(cfg_filename, 'r') as cfg:
|
|||||||
# We will place any config files in the same directory as the config file
|
# We will place any config files in the same directory as the config file
|
||||||
config_dir = os.path.dirname(cfg_filename)
|
config_dir = os.path.dirname(cfg_filename)
|
||||||
|
|
||||||
PLUGIN_FILE = get_plugin_file()
|
|
||||||
|
|
||||||
# Default action is to run the system in Debug mode
|
# Default action is to run the system in Debug mode
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = _is_true(get_setting(
|
DEBUG = _is_true(get_setting(
|
||||||
@ -873,6 +871,14 @@ MARKDOWNIFY_BLEACH = False
|
|||||||
# Maintenance mode
|
# Maintenance mode
|
||||||
MAINTENANCE_MODE_RETRY_AFTER = 60
|
MAINTENANCE_MODE_RETRY_AFTER = 60
|
||||||
|
|
||||||
|
# Are plugins enabled?
|
||||||
|
PLUGINS_ENABLED = _is_true(get_setting(
|
||||||
|
'INVENTREE_PLUGINS_ENABLED',
|
||||||
|
CONFIG.get('plugins_enabled', False),
|
||||||
|
))
|
||||||
|
|
||||||
|
PLUGIN_FILE = get_plugin_file()
|
||||||
|
|
||||||
# Plugin Directories (local plugins will be loaded from these directories)
|
# Plugin Directories (local plugins will be loaded from these directories)
|
||||||
PLUGIN_DIRS = ['plugin.builtin', ]
|
PLUGIN_DIRS = ['plugin.builtin', ]
|
||||||
|
|
||||||
|
@ -52,7 +52,14 @@ from users.api import user_urls
|
|||||||
|
|
||||||
admin.site.site_header = "InvenTree Admin"
|
admin.site.site_header = "InvenTree Admin"
|
||||||
|
|
||||||
apipatterns = [
|
apipatterns = []
|
||||||
|
|
||||||
|
if settings.PLUGINS_ENABLED:
|
||||||
|
apipatterns.append(
|
||||||
|
url(r'^plugin/', include(plugin_api_urls))
|
||||||
|
)
|
||||||
|
|
||||||
|
apipatterns += [
|
||||||
url(r'^barcode/', include(barcode_api_urls)),
|
url(r'^barcode/', include(barcode_api_urls)),
|
||||||
url(r'^settings/', include(common_api_urls)),
|
url(r'^settings/', include(common_api_urls)),
|
||||||
url(r'^part/', include(part_api_urls)),
|
url(r'^part/', include(part_api_urls)),
|
||||||
@ -63,7 +70,6 @@ apipatterns = [
|
|||||||
url(r'^order/', include(order_api_urls)),
|
url(r'^order/', include(order_api_urls)),
|
||||||
url(r'^label/', include(label_api_urls)),
|
url(r'^label/', include(label_api_urls)),
|
||||||
url(r'^report/', include(report_api_urls)),
|
url(r'^report/', include(report_api_urls)),
|
||||||
url(r'^plugin/', include(plugin_api_urls)),
|
|
||||||
|
|
||||||
# User URLs
|
# User URLs
|
||||||
url(r'^user/', include(user_urls)),
|
url(r'^user/', include(user_urls)),
|
||||||
@ -162,9 +168,6 @@ frontendpatterns = [
|
|||||||
url(r'^search/', SearchView.as_view(), name='search'),
|
url(r'^search/', SearchView.as_view(), name='search'),
|
||||||
url(r'^stats/', DatabaseStatsView.as_view(), name='stats'),
|
url(r'^stats/', DatabaseStatsView.as_view(), name='stats'),
|
||||||
|
|
||||||
# plugin urls
|
|
||||||
get_plugin_urls(), # appends currently loaded plugin urls = None
|
|
||||||
|
|
||||||
# admin sites
|
# admin sites
|
||||||
url(r'^admin/error_log/', include('error_report.urls')),
|
url(r'^admin/error_log/', include('error_report.urls')),
|
||||||
url(r'^admin/shell/', include('django_admin_shell.urls')),
|
url(r'^admin/shell/', include('django_admin_shell.urls')),
|
||||||
@ -183,6 +186,10 @@ frontendpatterns = [
|
|||||||
url(r'^accounts/', include('allauth.urls')), # included urlpatterns
|
url(r'^accounts/', include('allauth.urls')), # included urlpatterns
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Append custom plugin URLs (if plugin support is enabled)
|
||||||
|
if settings.PLUGINS_ENABLED:
|
||||||
|
frontendpatterns.append(get_plugin_urls())
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url('', include(frontendpatterns)),
|
url('', include(frontendpatterns)),
|
||||||
url('', include(backendpatterns)),
|
url('', include(backendpatterns)),
|
||||||
|
@ -102,6 +102,10 @@ debug: True
|
|||||||
# and only if InvenTree is accessed from a local IP (127.0.0.1)
|
# and only if InvenTree is accessed from a local IP (127.0.0.1)
|
||||||
debug_toolbar: False
|
debug_toolbar: False
|
||||||
|
|
||||||
|
# Set this variable to True to enable InvenTree Plugins
|
||||||
|
# Alternatively, use the environment variable INVENTREE_PLUGINS_ENABLED
|
||||||
|
plugins_enabled: False
|
||||||
|
|
||||||
# Configure the system logging level
|
# Configure the system logging level
|
||||||
# Use environment variable INVENTREE_LOG_LEVEL
|
# Use environment variable INVENTREE_LOG_LEVEL
|
||||||
# Options: DEBUG / INFO / WARNING / ERROR / CRITICAL
|
# Options: DEBUG / INFO / WARNING / ERROR / CRITICAL
|
||||||
|
@ -7,6 +7,7 @@ over and above the built-in Django tags.
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from django.utils.html import format_html
|
from django.utils.html import format_html
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
@ -16,6 +17,7 @@ from django import template
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.templatetags.static import StaticNode
|
from django.templatetags.static import StaticNode
|
||||||
|
|
||||||
from InvenTree import version, settings
|
from InvenTree import version, settings
|
||||||
|
|
||||||
import InvenTree.helpers
|
import InvenTree.helpers
|
||||||
@ -107,6 +109,13 @@ def inventree_docker_mode(*args, **kwargs):
|
|||||||
return djangosettings.DOCKER
|
return djangosettings.DOCKER
|
||||||
|
|
||||||
|
|
||||||
|
@register.simple_tag()
|
||||||
|
def plugins_enabled(*args, **kwargs):
|
||||||
|
""" Return True if plugins are enabled for the server instance """
|
||||||
|
|
||||||
|
return djangosettings.PLUGINS_ENABLED
|
||||||
|
|
||||||
|
|
||||||
@register.simple_tag()
|
@register.simple_tag()
|
||||||
def inventree_db_engine(*args, **kwargs):
|
def inventree_db_engine(*args, **kwargs):
|
||||||
""" Return the InvenTree database backend e.g. 'postgresql' """
|
""" Return the InvenTree database backend e.g. 'postgresql' """
|
||||||
|
@ -1,21 +1,32 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
from maintenance_mode.core import set_maintenance_mode
|
from maintenance_mode.core import set_maintenance_mode
|
||||||
|
|
||||||
from plugin import plugin_registry
|
from plugin import plugin_registry
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger('inventree')
|
||||||
|
|
||||||
|
|
||||||
class PluginAppConfig(AppConfig):
|
class PluginAppConfig(AppConfig):
|
||||||
name = 'plugin'
|
name = 'plugin'
|
||||||
|
|
||||||
def ready(self):
|
def ready(self):
|
||||||
if not plugin_registry.is_loading:
|
|
||||||
# this is the first startup
|
|
||||||
plugin_registry.collect_plugins()
|
|
||||||
plugin_registry.load_plugins()
|
|
||||||
|
|
||||||
# drop out of maintenance
|
if settings.PLUGINS_ENABLED:
|
||||||
# makes sure we did not have an error in reloading and maintenance is still active
|
logger.info('Loading InvenTree plugins')
|
||||||
set_maintenance_mode(False)
|
|
||||||
|
if not plugin_registry.is_loading:
|
||||||
|
# this is the first startup
|
||||||
|
plugin_registry.collect_plugins()
|
||||||
|
plugin_registry.load_plugins()
|
||||||
|
|
||||||
|
# drop out of maintenance
|
||||||
|
# makes sure we did not have an error in reloading and maintenance is still active
|
||||||
|
set_maintenance_mode(False)
|
||||||
|
@ -31,6 +31,10 @@ def trigger_event(event, *args, **kwargs):
|
|||||||
and the worker will respond to it later on.
|
and the worker will respond to it later on.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not settings.PLUGINS_ENABLED:
|
||||||
|
# Do nothing if plugins are not enabled
|
||||||
|
return
|
||||||
|
|
||||||
if not canAppAccessDatabase():
|
if not canAppAccessDatabase():
|
||||||
logger.debug(f"Ignoring triggered event '{event}' - database not ready")
|
logger.debug(f"Ignoring triggered event '{event}' - database not ready")
|
||||||
return
|
return
|
||||||
|
@ -66,6 +66,10 @@ class PluginsRegistry:
|
|||||||
Load and activate all IntegrationPlugins
|
Load and activate all IntegrationPlugins
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not settings.PLUGINS_ENABLED:
|
||||||
|
# Plugins not enabled, do nothing
|
||||||
|
return
|
||||||
|
|
||||||
from plugin.helpers import log_plugin_error
|
from plugin.helpers import log_plugin_error
|
||||||
|
|
||||||
logger.info('Start loading plugins')
|
logger.info('Start loading plugins')
|
||||||
@ -75,15 +79,16 @@ class PluginsRegistry:
|
|||||||
if not _maintenance:
|
if not _maintenance:
|
||||||
set_maintenance_mode(True)
|
set_maintenance_mode(True)
|
||||||
|
|
||||||
registered_sucessfull = False
|
registered_successful = False
|
||||||
blocked_plugin = None
|
blocked_plugin = None
|
||||||
retry_counter = settings.PLUGIN_RETRY
|
retry_counter = settings.PLUGIN_RETRY
|
||||||
while not registered_sucessfull:
|
|
||||||
|
while not registered_successful:
|
||||||
try:
|
try:
|
||||||
# We are using the db so for migrations etc we need to try this block
|
# We are using the db so for migrations etc we need to try this block
|
||||||
self._init_plugins(blocked_plugin)
|
self._init_plugins(blocked_plugin)
|
||||||
self._activate_plugins()
|
self._activate_plugins()
|
||||||
registered_sucessfull = True
|
registered_successful = True
|
||||||
except (OperationalError, ProgrammingError):
|
except (OperationalError, ProgrammingError):
|
||||||
# Exception if the database has not been migrated yet
|
# Exception if the database has not been migrated yet
|
||||||
logger.info('Database not accessible while loading plugins')
|
logger.info('Database not accessible while loading plugins')
|
||||||
@ -122,6 +127,10 @@ class PluginsRegistry:
|
|||||||
Unload and deactivate all IntegrationPlugins
|
Unload and deactivate all IntegrationPlugins
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not settings.PLUGINS_ENABLED:
|
||||||
|
# Plugins not enabled, do nothing
|
||||||
|
return
|
||||||
|
|
||||||
logger.info('Start unloading plugins')
|
logger.info('Start unloading plugins')
|
||||||
|
|
||||||
# Set maintanace mode
|
# Set maintanace mode
|
||||||
@ -162,6 +171,10 @@ class PluginsRegistry:
|
|||||||
Collect integration plugins from all possible ways of loading
|
Collect integration plugins from all possible ways of loading
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if not settings.PLUGINS_ENABLED:
|
||||||
|
# Plugins not enabled, do nothing
|
||||||
|
return
|
||||||
|
|
||||||
self.plugin_modules = [] # clear
|
self.plugin_modules = [] # clear
|
||||||
|
|
||||||
# Collect plugins from paths
|
# Collect plugins from paths
|
||||||
|
@ -39,14 +39,17 @@
|
|||||||
{% include "InvenTree/settings/build.html" %}
|
{% include "InvenTree/settings/build.html" %}
|
||||||
{% include "InvenTree/settings/po.html" %}
|
{% include "InvenTree/settings/po.html" %}
|
||||||
{% include "InvenTree/settings/so.html" %}
|
{% include "InvenTree/settings/so.html" %}
|
||||||
{% include "InvenTree/settings/plugin.html" %}
|
|
||||||
|
|
||||||
|
{% plugins_enabled as plug %}
|
||||||
|
{% if plug %}
|
||||||
|
{% include "InvenTree/settings/plugin.html" %}
|
||||||
{% plugin_list as pl_list %}
|
{% plugin_list as pl_list %}
|
||||||
{% for plugin_key, plugin in pl_list.items %}
|
{% for plugin_key, plugin in pl_list.items %}
|
||||||
{% if plugin.registered_mixins %}
|
{% if plugin.registered_mixins %}
|
||||||
{% include "InvenTree/settings/plugin_settings.html" %}
|
{% include "InvenTree/settings/plugin_settings.html" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
@ -333,9 +336,12 @@ $("#import-part").click(function() {
|
|||||||
launchModalForm("{% url 'api-part-import' %}?reset", {});
|
launchModalForm("{% url 'api-part-import' %}?reset", {});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
{% plugins_enabled as plug %}
|
||||||
|
{% if plug %}
|
||||||
$("#install-plugin").click(function() {
|
$("#install-plugin").click(function() {
|
||||||
installPlugin();
|
installPlugin();
|
||||||
});
|
});
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
enableSidebar('settings');
|
enableSidebar('settings');
|
||||||
|
|
||||||
|
@ -47,15 +47,17 @@
|
|||||||
{% trans "Sales Orders" as text %}
|
{% trans "Sales Orders" as text %}
|
||||||
{% include "sidebar_item.html" with label='sales-order' text=text icon="fa-truck" %}
|
{% include "sidebar_item.html" with label='sales-order' text=text icon="fa-truck" %}
|
||||||
|
|
||||||
|
{% plugins_enabled as plug %}
|
||||||
|
{% if plug %}
|
||||||
{% include "sidebar_header.html" with text="Plugin Settings" %}
|
{% include "sidebar_header.html" with text="Plugin Settings" %}
|
||||||
|
|
||||||
{% include "sidebar_item.html" with label='plugin' text="Plugins" icon="fa-plug" %}
|
{% include "sidebar_item.html" with label='plugin' text="Plugins" icon="fa-plug" %}
|
||||||
|
|
||||||
{% plugin_list as pl_list %}
|
{% plugin_list as pl_list %}
|
||||||
{% for plugin_key, plugin in pl_list.items %}
|
{% for plugin_key, plugin in pl_list.items %}
|
||||||
{% if plugin.registered_mixins %}
|
{% if plugin.registered_mixins %}
|
||||||
{% include "sidebar_item.html" with label='plugin-'|add:plugin_key text=plugin.human_name %}
|
{% include "sidebar_item.html" with label='plugin-'|add:plugin_key text=plugin.human_name %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
@ -34,6 +34,18 @@
|
|||||||
<td>{% trans "Server is deployed using docker" %}</td>
|
<td>{% trans "Server is deployed using docker" %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<tr>
|
||||||
|
<td><span class='fas fa-plug'></span></td>
|
||||||
|
<td>{% trans "Plugin Support" %}</td>
|
||||||
|
<td>
|
||||||
|
{% plugins_enabled as p_en %}
|
||||||
|
{% if p_en %}
|
||||||
|
<span class='badge rounded-pill bg-success'>{% trans "Plugin support enabled" %}</span>
|
||||||
|
{% else %}
|
||||||
|
<span class='badge rounded-pill bg-warning'>{% trans "Plugin support disabled" %}</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
{% if user.is_staff %}
|
{% if user.is_staff %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><span class='fas fa-server'></span></td>
|
<td><span class='fas fa-server'></span></td>
|
||||||
|
@ -12,3 +12,6 @@ INVENTREE_DB_HOST=inventree-dev-db
|
|||||||
INVENTREE_DB_PORT=5432
|
INVENTREE_DB_PORT=5432
|
||||||
INVENTREE_DB_USER=pguser
|
INVENTREE_DB_USER=pguser
|
||||||
INVENTREE_DB_PASSWORD=pgpassword
|
INVENTREE_DB_PASSWORD=pgpassword
|
||||||
|
|
||||||
|
# Enable plugins?
|
||||||
|
INVENTREE_PLUGINS_ENABLED=False
|
||||||
|
@ -14,3 +14,6 @@ INVENTREE_DB_HOST=inventree-db
|
|||||||
INVENTREE_DB_PORT=5432
|
INVENTREE_DB_PORT=5432
|
||||||
INVENTREE_DB_USER=pguser
|
INVENTREE_DB_USER=pguser
|
||||||
INVENTREE_DB_PASSWORD=pgpassword
|
INVENTREE_DB_PASSWORD=pgpassword
|
||||||
|
|
||||||
|
# Enable plugins?
|
||||||
|
INVENTREE_PLUGINS_ENABLED=False
|
||||||
|
Loading…
x
Reference in New Issue
Block a user