2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00

Merge branch 'master' of https://github.com/inventree/InvenTree into test-simplify

This commit is contained in:
Matthias Mair 2022-05-20 12:13:31 +02:00
commit 023ff3c85a
9 changed files with 124 additions and 24 deletions

19
.pre-commit-config.yaml Normal file
View 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

View File

@ -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.
@ -90,7 +94,8 @@ 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

View File

@ -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'),

View File

@ -152,10 +152,19 @@ class SettingsTest(InvenTreeTestCate):
""" """
for key, setting in InvenTreeSetting.SETTINGS.items(): for key, setting in InvenTreeSetting.SETTINGS.items():
self.run_settings_check(key, setting)
try:
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():
self.run_settings_check(key, setting) try:
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):
""" """

View File

@ -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>

View File

@ -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',

View File

@ -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

View File

@ -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

View File

@ -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):
""" """
@ -249,7 +266,7 @@ def update(c):
- static - static
- clean_settings - clean_settings
""" """
# Recompile the translation files (.mo) # Recompile the translation files (.mo)
# We do not run 'invoke translate' here, as that will touch the source (.po) files too! # We do not run 'invoke translate' here, as that will touch the source (.po) files too!
manage(c, 'compilemessages', pty=True) manage(c, 'compilemessages', pty=True)