mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-18 13:05:42 +00:00
Builtin plugins (#3889)
* Allow loading of "builtin" plugins, even if "plugins" are not explicitly loaded
* Updates for 'admin' buttons:
- Make them work like proper links
- Hidden if 'hide_admin_link' customization option is set
- Check for user staff status
* Cleanup rendering of "plugins" display
* Consolidate InvenTree barcode plugins into single plugin class
* Hide "install plugin" button if plugins are not enabled
* Add info message is external plugins are not enabled
* Fixes for loading plugins
- Always load 'builtin' plugins
- Refactor calls to "is_active" at various points in codebase
* Various tweaks
- Improve builtin plugin descriptions
- Spelling fixes
* Adjust plugin detail for builtin plugins
* Simplify barcode plugin class
* Simplify template rendering
* Bug fix for inventree barcode plugin
* Revert "Simplify template rendering"
This reverts commit 3a6755a659
.
* Re-re-improve template rendering
- Required as the template has been refactored for both "active" and "inactive" plugins
* Fixing unit tests for barcode plugin
* Ensure that barcode scan actions do not take a "long time":
- Add a default timeout of 0.1s to any POST or GET request in the testing framework
- Can be overridden by calling method if desired
* Display plugin "builtin" status in admin panel
* Fix unit tests for plugin API
* Further unit testing fixes
* Version number tweaks
* Further tweaks for unit testing
* Allow longer timeout for report printing via API
* Increase default timeout for API tests
- Sometimes CPU spike can cause the test to fail :|
* label printing can take a bit longer
* Remove timeout requirement from API tester
- Too variable to be reliable for CI
This commit is contained in:
@ -31,6 +31,8 @@
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% plugins_enabled as plug %}
|
||||
|
||||
<div class='panel-heading'>
|
||||
<div class='d-flex flex-wrap'>
|
||||
<h4>{% trans "Plugins" %}</h4>
|
||||
@ -38,78 +40,46 @@
|
||||
<div class='btn-group' role='group'>
|
||||
{% url 'admin:plugin_pluginconfig_changelist' as url %}
|
||||
{% include "admin_button.html" with url=url %}
|
||||
{% if plug %}
|
||||
<button class="btn btn-success" id="install-plugin" title="{% trans 'Install Plugin' %}"><span class='fas fa-plus-circle'></span> {% trans "Install Plugin" %}</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if not plug %}
|
||||
<div class='alert alert-warning alert-block'>
|
||||
{% trans "External plugins are not enabled for this InvenTree installation" %}<br>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class='table-responsive'>
|
||||
<table class='table table-striped table-condensed'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans "Admin" %}</th>
|
||||
<th>{% trans "Name" %}</th>
|
||||
<th>{% trans "Key" %}</th>
|
||||
<th>{% trans "Author" %}</th>
|
||||
<th>{% trans "Date" %}</th>
|
||||
<th>{% trans "Version" %}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{% plugin_list as pl_list %}
|
||||
{% if pl_list %}
|
||||
<tr><td colspan="6"><h6>{% trans 'Active plugins' %}</h6></td></tr>
|
||||
{% for plugin_key, plugin in pl_list.items %}
|
||||
{% mixin_enabled plugin 'urls' as urls %}
|
||||
{% mixin_enabled plugin 'settings' as settings %}
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
{% if user.is_staff and perms.plugin.change_pluginconfig %}
|
||||
{% url 'admin:plugin_pluginconfig_change' plugin.pk as url %}
|
||||
{% include "admin_button.html" with url=url %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ plugin.human_name }}<span class="text-muted"> - {{plugin_key}}</span>
|
||||
{% define plugin.registered_mixins as mixin_list %}
|
||||
|
||||
{% if plugin.is_sample %}
|
||||
<a class='sidebar-selector' id='select-plugin-{{plugin_key}}' data-bs-parent="#sidebar">
|
||||
<span class='badge bg-info rounded-pill badge-right'>{% trans "Sample" %}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if mixin_list %}
|
||||
{% for mixin in mixin_list %}
|
||||
<a class='sidebar-selector' id='select-plugin-{{plugin_key}}' data-bs-parent="#sidebar">
|
||||
<span class='badge bg-dark badge-right rounded-pill'>{{ mixin.human_name }}</span>
|
||||
</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% if plugin.website %}
|
||||
<a href="{{ plugin.website }}"><span class="fas fa-globe"></span></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ plugin.author }}</td>
|
||||
<td>{% render_date plugin.pub_date %}</td>
|
||||
<td>{% if plugin.version %}{{ plugin.version }}{% endif %}</td>
|
||||
</tr>
|
||||
{% include "InvenTree/settings/plugin_details.html" with plugin=plugin plugin_key=plugin_key %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% inactive_plugin_list as in_pl_list %}
|
||||
{% if in_pl_list %}
|
||||
<tr><td colspan="5"></td></tr>
|
||||
<tr><td colspan="5"><h6>{% trans 'Inactive plugins' %}</h6></td></tr>
|
||||
<tr><td colspan="6"><h6>{% trans 'Inactive plugins' %}</h6></td></tr>
|
||||
{% for plugin_key, plugin in in_pl_list.items %}
|
||||
<tr>
|
||||
<td>
|
||||
{% if user.is_staff and perms.plugin.change_pluginconfig %}
|
||||
{% url 'admin:plugin_pluginconfig_change' plugin.pk as url %}
|
||||
{% include "admin_button.html" with url=url %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{plugin.name}}<span class="text-muted"> - {{plugin.key}}</span></td>
|
||||
<td colspan="3"></td>
|
||||
</tr>
|
||||
{% include "InvenTree/settings/plugin_details.html" with plugin=plugin plugin_key=plugin_key %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</tbody>
|
||||
|
75
InvenTree/templates/InvenTree/settings/plugin_details.html
Normal file
75
InvenTree/templates/InvenTree/settings/plugin_details.html
Normal file
@ -0,0 +1,75 @@
|
||||
{% load inventree_extras %}
|
||||
{% load i18n %}
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
{% if plugin.is_active %}
|
||||
<span class='fas fa-check-circle icon-green'></span>
|
||||
{% else %}
|
||||
<span class='fas fa-times-circle icon-red'></span>
|
||||
{% endif %}
|
||||
|
||||
{% if plugin.human_name %}
|
||||
{{ plugin.human_name }}
|
||||
{% elif plugin.title %}
|
||||
{{ plugin.title }}
|
||||
{% elif plugin.name %}
|
||||
{{ plugin.name }}
|
||||
{% endif %}
|
||||
|
||||
{% define plugin.registered_mixins as mixin_list %}
|
||||
|
||||
{% if mixin_list %}
|
||||
{% for mixin in mixin_list %}
|
||||
<a class='sidebar-selector' id='select-plugin-{{plugin_key}}' data-bs-parent="#sidebar">
|
||||
<span class='badge bg-dark badge-right rounded-pill'>{{ mixin.human_name }}</span>
|
||||
</a>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% if plugin.is_builtin %}
|
||||
<a class='sidebar-selector' id='select-plugin-{{ plugin_key }}' data-bs-parent='#sidebar'>
|
||||
<span class='badge bg-success rounded-pill badge-right'>{% trans "Builtin" %}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if plugin.is_sample %}
|
||||
<a class='sidebar-selector' id='select-plugin-{{plugin_key}}' data-bs-parent="#sidebar">
|
||||
<span class='badge bg-info rounded-pill badge-right'>{% trans "Sample" %}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if plugin.website %}
|
||||
<a href="{{ plugin.website }}"><span class="fas fa-globe"></span></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ plugin_key }}</td>
|
||||
{% trans "Unvailable" as no_info %}
|
||||
<td>
|
||||
{% if plugin.author %}
|
||||
{{ plugin.author }}
|
||||
{% else %}
|
||||
<em>{{ no_info }}</em>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if plugin.pub_date %}
|
||||
{% render_date plugin.pub_date %}
|
||||
{% else %}
|
||||
<em>{{ no_info }}</em>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if plugin.version %}
|
||||
{{ plugin.version }}
|
||||
{% else %}
|
||||
<em>{{ no_info }}</em>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if user.is_staff and perms.plugin.change_pluginconfig %}
|
||||
{% url 'admin:plugin_pluginconfig_change' plugin.pk as url %}
|
||||
{% include "admin_button.html" with url=url %}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
@ -23,16 +23,16 @@
|
||||
<td>{% trans "Name" %}</td>
|
||||
<td>{{ plugin.human_name }}{% include "clip.html" %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span class='fas fa-user'></span></span></td>
|
||||
<td>{% trans "Author" %}</td>
|
||||
<td>{{ plugin.author }}{% include "clip.html" %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>{% trans "Description" %}</td>
|
||||
<td>{{ plugin.description }}{% include "clip.html" %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span class='fas fa-user'></span></span></td>
|
||||
<td>{% trans "Author" %}</td>
|
||||
<td>{{ plugin.author }}{% include "clip.html" %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><span class='fas fa-calendar-alt'></span></td>
|
||||
<td>{% trans "Date" %}</td>
|
||||
@ -94,7 +94,14 @@
|
||||
<td>{% trans "Installation path" %}</td>
|
||||
<td>{{ plugin.package_path }}</td>
|
||||
</tr>
|
||||
{% if plugin.is_package == False %}
|
||||
{% if plugin.is_package %}
|
||||
{% elif plugin.is_builtin %}
|
||||
<tr>
|
||||
<td><span class='fas fa-check-circle icon-green'></span></td>
|
||||
<td>{% trans "Builtin" %}</td>
|
||||
<td>{% trans "This is a builtin plugin which cannot be disabled" %}</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td><span class='fas fa-user'></span></td>
|
||||
<td>{% trans "Commit Author" %}</td><td>{{ plugin.package.author }} - {{ plugin.package.mail }}{% include "clip.html" %}</td>
|
||||
|
@ -42,8 +42,6 @@
|
||||
{% include "InvenTree/settings/po.html" %}
|
||||
{% include "InvenTree/settings/so.html" %}
|
||||
|
||||
{% plugins_enabled as plug %}
|
||||
{% if plug %}
|
||||
{% include "InvenTree/settings/plugin.html" %}
|
||||
{% plugin_list as pl_list %}
|
||||
{% for plugin_key, plugin in pl_list.items %}
|
||||
@ -51,7 +49,6 @@
|
||||
{% include "InvenTree/settings/plugin_settings.html" %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
|
@ -51,8 +51,7 @@
|
||||
{% trans "Sales Orders" as text %}
|
||||
{% include "sidebar_item.html" with label='sales-order' text=text icon="fa-truck" %}
|
||||
|
||||
{% plugins_enabled as plug %}
|
||||
{% if plug %}
|
||||
|
||||
{% trans "Plugin Settings" as text %}
|
||||
{% include "sidebar_header.html" with text=text %}
|
||||
{% trans "Plugins" as text %}
|
||||
@ -64,6 +63,5 @@
|
||||
{% include "sidebar_item.html" with label='plugin-'|add:plugin_key text=plugin.human_name %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
|
@ -1,4 +1,12 @@
|
||||
{% load inventree_extras %}
|
||||
{% load i18n %}
|
||||
<button id='admin-button' title='{% trans "View in administration panel" %}' type='button' class='btn btn-primary admin-button' url='{{ url }}'>
|
||||
<span class='fas fa-user-shield'></span>
|
||||
</button>
|
||||
|
||||
{% inventree_customize 'hide_admin_link' as hidden %}
|
||||
|
||||
{% if not hidden and user.is_staff %}
|
||||
<a href='{{ url }}'>
|
||||
<button id='admin-button' href='{{ url }}' title='{% trans "View in administration panel" %}' type='button' class='btn btn-primary admin-button'>
|
||||
<span class='fas fa-user-shield'></span>
|
||||
</button>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
Reference in New Issue
Block a user