mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 19:46:46 +00:00
Merge branch 'master' of https://github.com/inventree/InvenTree into test-simplify
This commit is contained in:
commit
023ff3c85a
19
.pre-commit-config.yaml
Normal file
19
.pre-commit-config.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# See https://pre-commit.com for more information
|
||||||
|
# See https://pre-commit.com/hooks.html for more hooks
|
||||||
|
repos:
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v4.2.0
|
||||||
|
hooks:
|
||||||
|
- id: trailing-whitespace
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
- id: check-yaml
|
||||||
|
- id: check-added-large-files
|
||||||
|
- id: mixed-line-ending
|
||||||
|
- repo: https://github.com/pycqa/flake8
|
||||||
|
rev: '4.0.1'
|
||||||
|
hooks:
|
||||||
|
- id: flake8
|
||||||
|
- repo: https://github.com/pycqa/isort
|
||||||
|
rev: '5.10.1'
|
||||||
|
hooks:
|
||||||
|
- id: isort
|
@ -1,5 +1,9 @@
|
|||||||
Please read the contribution guidelines below, before submitting your first pull request to the InvenTree codebase.
|
Please read the contribution guidelines below, before submitting your first pull request to the InvenTree codebase.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Please run `invoke setup_dev` in the root directory of your InvenTree code base to set up your development setup before starting to contribute. This will install and set up pre-commit to run some checks before each commit and help reduce the style errors.
|
||||||
|
|
||||||
## Branches and Versioning
|
## Branches and Versioning
|
||||||
|
|
||||||
InvenTree roughly follow the [GitLab flow](https://docs.gitlab.com/ee/topics/gitlab_flow.html) branching style, to allow simple management of multiple tagged releases, short-lived branches, and development on the main branch.
|
InvenTree roughly follow the [GitLab flow](https://docs.gitlab.com/ee/topics/gitlab_flow.html) branching style, to allow simple management of multiple tagged releases, short-lived branches, and development on the main branch.
|
||||||
@ -91,6 +95,7 @@ The various github actions can be found in the `./github/workflows` directory
|
|||||||
## Code Style
|
## Code Style
|
||||||
|
|
||||||
Sumbitted Python code is automatically checked against PEP style guidelines. Locally you can run `invoke style` to ensure the style checks will pass, before submitting the PR.
|
Sumbitted Python code is automatically checked against PEP style guidelines. Locally you can run `invoke style` to ensure the style checks will pass, before submitting the PR.
|
||||||
|
Please write docstrings for each function and class - we follow the [google doc-style](https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings) for python. Docstrings for general javascript code is encouraged! Docstyles are checked by `invoke style`.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
@ -1429,6 +1429,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
|
|||||||
'validator': bool,
|
'validator': bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'SEARCH_HIDE_INACTIVE_PARTS': {
|
||||||
|
'name': _("Hide Inactive Parts"),
|
||||||
|
'description': _('Excluded inactive parts from search preview window'),
|
||||||
|
'default': False,
|
||||||
|
'validator': bool,
|
||||||
|
},
|
||||||
|
|
||||||
'SEARCH_PREVIEW_SHOW_CATEGORIES': {
|
'SEARCH_PREVIEW_SHOW_CATEGORIES': {
|
||||||
'name': _('Search Categories'),
|
'name': _('Search Categories'),
|
||||||
'description': _('Display part categories in search preview window'),
|
'description': _('Display part categories in search preview window'),
|
||||||
@ -1443,6 +1450,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
|
|||||||
'validator': bool,
|
'validator': bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'SEARCH_PREVIEW_HIDE_UNAVAILABLE_STOCK': {
|
||||||
|
'name': _('Hide Unavailable Stock Items'),
|
||||||
|
'description': _('Exclude stock items which are not available from the search preview window'),
|
||||||
|
'validator': bool,
|
||||||
|
'default': False,
|
||||||
|
},
|
||||||
|
|
||||||
'SEARCH_PREVIEW_SHOW_LOCATIONS': {
|
'SEARCH_PREVIEW_SHOW_LOCATIONS': {
|
||||||
'name': _('Search Locations'),
|
'name': _('Search Locations'),
|
||||||
'description': _('Display stock locations in search preview window'),
|
'description': _('Display stock locations in search preview window'),
|
||||||
@ -1464,6 +1478,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
|
|||||||
'validator': bool,
|
'validator': bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'SEARCH_PREVIEW_EXCLUDE_INACTIVE_PURCHASE_ORDERS': {
|
||||||
|
'name': _('Exclude Inactive Purchase Orders'),
|
||||||
|
'description': _('Exclude inactive purchase orders from search preview window'),
|
||||||
|
'default': True,
|
||||||
|
'validator': bool,
|
||||||
|
},
|
||||||
|
|
||||||
'SEARCH_PREVIEW_SHOW_SALES_ORDERS': {
|
'SEARCH_PREVIEW_SHOW_SALES_ORDERS': {
|
||||||
'name': _('Search Sales Orders'),
|
'name': _('Search Sales Orders'),
|
||||||
'description': _('Display sales orders in search preview window'),
|
'description': _('Display sales orders in search preview window'),
|
||||||
@ -1471,6 +1492,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
|
|||||||
'validator': bool,
|
'validator': bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'SEARCH_PREVIEW_EXCLUDE_INACTIVE_SALES_ORDERS': {
|
||||||
|
'name': _('Exclude Inactive Sales Orders'),
|
||||||
|
'description': _('Exclude inactive sales orders from search preview window'),
|
||||||
|
'validator': bool,
|
||||||
|
'default': True,
|
||||||
|
},
|
||||||
|
|
||||||
'SEARCH_PREVIEW_RESULTS': {
|
'SEARCH_PREVIEW_RESULTS': {
|
||||||
'name': _('Search Preview Results'),
|
'name': _('Search Preview Results'),
|
||||||
'description': _('Number of results to show in each section of the search preview window'),
|
'description': _('Number of results to show in each section of the search preview window'),
|
||||||
@ -1478,13 +1506,6 @@ class InvenTreeUserSetting(BaseInvenTreeSetting):
|
|||||||
'validator': [int, MinValueValidator(1)]
|
'validator': [int, MinValueValidator(1)]
|
||||||
},
|
},
|
||||||
|
|
||||||
'SEARCH_HIDE_INACTIVE_PARTS': {
|
|
||||||
'name': _("Hide Inactive Parts"),
|
|
||||||
'description': _('Hide inactive parts in search preview window'),
|
|
||||||
'default': False,
|
|
||||||
'validator': bool,
|
|
||||||
},
|
|
||||||
|
|
||||||
'PART_SHOW_QUANTITY_IN_FORMS': {
|
'PART_SHOW_QUANTITY_IN_FORMS': {
|
||||||
'name': _('Show Quantity in Forms'),
|
'name': _('Show Quantity in Forms'),
|
||||||
'description': _('Display available part quantity in some forms'),
|
'description': _('Display available part quantity in some forms'),
|
||||||
|
@ -152,10 +152,19 @@ class SettingsTest(InvenTreeTestCate):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
for key, setting in InvenTreeSetting.SETTINGS.items():
|
for key, setting in InvenTreeSetting.SETTINGS.items():
|
||||||
|
|
||||||
|
try:
|
||||||
self.run_settings_check(key, setting)
|
self.run_settings_check(key, setting)
|
||||||
|
except Exception as exc:
|
||||||
|
print(f"run_settings_check failed for global setting '{key}'")
|
||||||
|
raise exc
|
||||||
|
|
||||||
for key, setting in InvenTreeUserSetting.SETTINGS.items():
|
for key, setting in InvenTreeUserSetting.SETTINGS.items():
|
||||||
|
try:
|
||||||
self.run_settings_check(key, setting)
|
self.run_settings_check(key, setting)
|
||||||
|
except Exception as exc:
|
||||||
|
print(f"run_settings_check failed for user setting '{key}'")
|
||||||
|
raise exc
|
||||||
|
|
||||||
def test_defaults(self):
|
def test_defaults(self):
|
||||||
"""
|
"""
|
||||||
|
@ -15,16 +15,19 @@
|
|||||||
<table class='table table-striped table-condensed'>
|
<table class='table table-striped table-condensed'>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_PARTS" user_setting=True icon='fa-shapes' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_PARTS" user_setting=True icon='fa-shapes' %}
|
||||||
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_HIDE_INACTIVE_PARTS" user_setting=True icon='fa-eye-slash' %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_CATEGORIES" user_setting=True icon='fa-sitemap' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_CATEGORIES" user_setting=True icon='fa-sitemap' %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_STOCK" user_setting=True icon='fa-boxes' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_STOCK" user_setting=True icon='fa-boxes' %}
|
||||||
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_HIDE_UNAVAILABLE_STOCK" user_setting=True icon='fa-eye-slash' %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_LOCATIONS" user_setting=True icon='fa-sitemap' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_LOCATIONS" user_setting=True icon='fa-sitemap' %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_COMPANIES" user_setting=True icon='fa-building' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_COMPANIES" user_setting=True icon='fa-building' %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_PURCHASE_ORDERS" user_setting=True icon='fa-shopping-cart' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_PURCHASE_ORDERS" user_setting=True icon='fa-shopping-cart' %}
|
||||||
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_EXCLUDE_INACTIVE_PURCHASE_ORDERS" user_setting=True icon='fa-eye-slash' %}
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_SALES_ORDERS" user_setting=True icon='fa-truck' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_SHOW_SALES_ORDERS" user_setting=True icon='fa-truck' %}
|
||||||
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_EXCLUDE_INACTIVE_SALES_ORDERS" user_setting=True icon='fa-eye-slash' %}
|
||||||
|
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_RESULTS" user_setting=True icon='fa-search' %}
|
{% include "InvenTree/settings/setting.html" with key="SEARCH_PREVIEW_RESULTS" user_setting=True icon='fa-search' %}
|
||||||
|
|
||||||
{% include "InvenTree/settings/setting.html" with key="SEARCH_HIDE_INACTIVE_PARTS" user_setting=True icon='fa-eye-slash' %}
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
@ -122,14 +122,22 @@ function updateSearch() {
|
|||||||
|
|
||||||
if (user_settings.SEARCH_PREVIEW_SHOW_STOCK) {
|
if (user_settings.SEARCH_PREVIEW_SHOW_STOCK) {
|
||||||
// Search for matching stock items
|
// Search for matching stock items
|
||||||
|
|
||||||
|
var filters = {
|
||||||
|
part_detail: true,
|
||||||
|
location_detail: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (user_settings.SEARCH_PREVIEW_HIDE_UNAVAILABLE_STOCK) {
|
||||||
|
// Only show 'in stock' items in the preview windoww
|
||||||
|
filters.in_stock = true;
|
||||||
|
}
|
||||||
|
|
||||||
addSearchQuery(
|
addSearchQuery(
|
||||||
'stock',
|
'stock',
|
||||||
'{% trans "Stock Items" %}',
|
'{% trans "Stock Items" %}',
|
||||||
'{% url "api-stock-list" %}',
|
'{% url "api-stock-list" %}',
|
||||||
{
|
filters,
|
||||||
part_detail: true,
|
|
||||||
location_detail: true,
|
|
||||||
},
|
|
||||||
renderStockItem,
|
renderStockItem,
|
||||||
{
|
{
|
||||||
url: '/stock/item',
|
url: '/stock/item',
|
||||||
@ -167,15 +175,21 @@ function updateSearch() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (user_settings.SEARCH_PREVIEW_SHOW_PURCHASE_ORDERS) {
|
if (user_settings.SEARCH_PREVIEW_SHOW_PURCHASE_ORDERS) {
|
||||||
|
|
||||||
|
var filters = {
|
||||||
|
supplier_detail: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (user_settings.SEARCH_PREVIEW_EXCLUDE_INACTIVE_PURCHASE_ORDERS) {
|
||||||
|
filters.outstanding = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Search for matching purchase orders
|
// Search for matching purchase orders
|
||||||
addSearchQuery(
|
addSearchQuery(
|
||||||
'purchaseorder',
|
'purchaseorder',
|
||||||
'{% trans "Purchase Orders" %}',
|
'{% trans "Purchase Orders" %}',
|
||||||
'{% url "api-po-list" %}',
|
'{% url "api-po-list" %}',
|
||||||
{
|
filters,
|
||||||
supplier_detail: true,
|
|
||||||
outstanding: true,
|
|
||||||
},
|
|
||||||
renderPurchaseOrder,
|
renderPurchaseOrder,
|
||||||
{
|
{
|
||||||
url: '/order/purchase-order',
|
url: '/order/purchase-order',
|
||||||
@ -184,15 +198,22 @@ function updateSearch() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (user_settings.SEARCH_PREVIEW_SHOW_SALES_ORDERS) {
|
if (user_settings.SEARCH_PREVIEW_SHOW_SALES_ORDERS) {
|
||||||
|
|
||||||
|
var filters = {
|
||||||
|
customer_detail: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Hide inactive (not "outstanding" orders)
|
||||||
|
if (user_settings.SEARCH_PREVIEW_EXCLUDE_INACTIVE_SALES_ORDERS) {
|
||||||
|
filters.outstanding = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Search for matching sales orders
|
// Search for matching sales orders
|
||||||
addSearchQuery(
|
addSearchQuery(
|
||||||
'salesorder',
|
'salesorder',
|
||||||
'{% trans "Sales Orders" %}',
|
'{% trans "Sales Orders" %}',
|
||||||
'{% url "api-so-list" %}',
|
'{% url "api-so-list" %}',
|
||||||
{
|
filters,
|
||||||
customer_detail: true,
|
|
||||||
outstanding: true,
|
|
||||||
},
|
|
||||||
renderSalesOrder,
|
renderSalesOrder,
|
||||||
{
|
{
|
||||||
url: '/order/sales-order',
|
url: '/order/sales-order',
|
||||||
|
@ -33,12 +33,14 @@ django-weasyprint==1.0.1 # django weasyprint integration
|
|||||||
djangorestframework==3.12.4 # DRF framework
|
djangorestframework==3.12.4 # DRF framework
|
||||||
django-xforwardedfor-middleware==2.0 # IP forwarding metadata
|
django-xforwardedfor-middleware==2.0 # IP forwarding metadata
|
||||||
flake8==3.8.3 # PEP checking
|
flake8==3.8.3 # PEP checking
|
||||||
|
flake8-docstrings==1.6.0 # docstring format testing
|
||||||
gunicorn>=20.1.0 # Gunicorn web server
|
gunicorn>=20.1.0 # Gunicorn web server
|
||||||
importlib_metadata # Backport for importlib.metadata
|
importlib_metadata # Backport for importlib.metadata
|
||||||
inventree # Install the latest version of the InvenTree API python library
|
inventree # Install the latest version of the InvenTree API python library
|
||||||
isort==5.10.1 # DEV: python import sorting
|
isort==5.10.1 # DEV: python import sorting
|
||||||
markdown==3.3.4 # Force particular version of markdown
|
markdown==3.3.4 # Force particular version of markdown
|
||||||
pep8-naming==0.11.1 # PEP naming convention extension
|
pep8-naming==0.11.1 # PEP naming convention extension
|
||||||
|
pre-commit==2.19.0 # Git pre-commit
|
||||||
pillow==9.1.0 # Image manipulation
|
pillow==9.1.0 # Image manipulation
|
||||||
py-moneyed==0.8.0 # Specific version requirement for py-moneyed
|
py-moneyed==0.8.0 # Specific version requirement for py-moneyed
|
||||||
pygments==2.7.4 # Syntax highlighting
|
pygments==2.7.4 # Syntax highlighting
|
||||||
|
@ -15,8 +15,11 @@ ignore =
|
|||||||
N806,
|
N806,
|
||||||
# - N812 - lowercase imported as non-lowercase
|
# - N812 - lowercase imported as non-lowercase
|
||||||
N812,
|
N812,
|
||||||
|
# - D415 - First line should end with a period, question mark, or exclamation point
|
||||||
|
D415,
|
||||||
exclude = .git,__pycache__,*/migrations/*,*/lib/*,*/bin/*,*/media/*,*/static/*,InvenTree/plugins/*
|
exclude = .git,__pycache__,*/migrations/*,*/lib/*,*/bin/*,*/media/*,*/static/*,InvenTree/plugins/*
|
||||||
max-complexity = 20
|
max-complexity = 20
|
||||||
|
docstring-convention=google
|
||||||
|
|
||||||
[coverage:run]
|
[coverage:run]
|
||||||
source = ./InvenTree
|
source = ./InvenTree
|
||||||
|
17
tasks.py
17
tasks.py
@ -94,6 +94,23 @@ def install(c):
|
|||||||
# Install required Python packages with PIP
|
# Install required Python packages with PIP
|
||||||
c.run('pip3 install -U -r requirements.txt')
|
c.run('pip3 install -U -r requirements.txt')
|
||||||
|
|
||||||
|
@task
|
||||||
|
def setup_dev(c):
|
||||||
|
"""
|
||||||
|
Sets up everything needed for the dev enviroment
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Installing required python packages from 'requirements.txt'")
|
||||||
|
|
||||||
|
# Install required Python packages with PIP
|
||||||
|
c.run('pip3 install -U -r requirements.txt')
|
||||||
|
|
||||||
|
# Install pre-commit hook
|
||||||
|
c.run('pre-commit install')
|
||||||
|
|
||||||
|
# Update all the hooks
|
||||||
|
c.run('pre-commit autoupdate')
|
||||||
|
|
||||||
@task
|
@task
|
||||||
def shell(c):
|
def shell(c):
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user