mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-30 20:55:42 +00:00 
			
		
		
		
	Merge branch 'master' of https://github.com/inventree/InvenTree into test-simplify
This commit is contained in:
		
							
								
								
									
										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. | ||||
|  | ||||
| ## 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 | ||||
|  | ||||
|   | ||||
| @@ -1429,6 +1429,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): | ||||
|             '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': { | ||||
|             'name': _('Search Categories'), | ||||
|             'description': _('Display part categories in search preview window'), | ||||
| @@ -1443,6 +1450,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): | ||||
|             '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': { | ||||
|             'name': _('Search Locations'), | ||||
|             'description': _('Display stock locations in search preview window'), | ||||
| @@ -1464,6 +1478,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): | ||||
|             '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': { | ||||
|             'name': _('Search Sales Orders'), | ||||
|             'description': _('Display sales orders in search preview window'), | ||||
| @@ -1471,6 +1492,13 @@ class InvenTreeUserSetting(BaseInvenTreeSetting): | ||||
|             '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': { | ||||
|             'name': _('Search Preview Results'), | ||||
|             '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)] | ||||
|         }, | ||||
|  | ||||
|         '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': { | ||||
|             'name': _('Show Quantity in Forms'), | ||||
|             'description': _('Display available part quantity in some forms'), | ||||
|   | ||||
| @@ -152,10 +152,19 @@ class SettingsTest(InvenTreeTestCate): | ||||
|         """ | ||||
|  | ||||
|         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(): | ||||
|             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): | ||||
|         """ | ||||
|   | ||||
| @@ -15,16 +15,19 @@ | ||||
|     <table class='table table-striped table-condensed'> | ||||
|         <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_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_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_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_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_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_HIDE_INACTIVE_PARTS" user_setting=True icon='fa-eye-slash' %} | ||||
|         </tbody> | ||||
|     </table> | ||||
| </div> | ||||
|   | ||||
| @@ -122,14 +122,22 @@ function updateSearch() { | ||||
|  | ||||
|     if (user_settings.SEARCH_PREVIEW_SHOW_STOCK) { | ||||
|         // 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( | ||||
|             'stock', | ||||
|             '{% trans "Stock Items" %}', | ||||
|             '{% url "api-stock-list" %}', | ||||
|             { | ||||
|                 part_detail: true, | ||||
|                 location_detail: true, | ||||
|             }, | ||||
|             filters, | ||||
|             renderStockItem, | ||||
|             { | ||||
|                 url: '/stock/item', | ||||
| @@ -167,15 +175,21 @@ function updateSearch() { | ||||
|     } | ||||
|  | ||||
|     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 | ||||
|         addSearchQuery( | ||||
|             'purchaseorder', | ||||
|             '{% trans "Purchase Orders" %}', | ||||
|             '{% url "api-po-list" %}', | ||||
|             { | ||||
|                 supplier_detail: true, | ||||
|                 outstanding: true, | ||||
|             }, | ||||
|             filters, | ||||
|             renderPurchaseOrder, | ||||
|             { | ||||
|                 url: '/order/purchase-order', | ||||
| @@ -184,15 +198,22 @@ function updateSearch() { | ||||
|     } | ||||
|  | ||||
|     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 | ||||
|         addSearchQuery( | ||||
|             'salesorder', | ||||
|             '{% trans "Sales Orders" %}', | ||||
|             '{% url "api-so-list" %}', | ||||
|             { | ||||
|                 customer_detail: true, | ||||
|                 outstanding: true, | ||||
|             }, | ||||
|             filters, | ||||
|             renderSalesOrder, | ||||
|             { | ||||
|                 url: '/order/sales-order', | ||||
|   | ||||
| @@ -33,12 +33,14 @@ django-weasyprint==1.0.1                # django weasyprint integration | ||||
| djangorestframework==3.12.4             # DRF framework | ||||
| django-xforwardedfor-middleware==2.0    # IP forwarding metadata | ||||
| flake8==3.8.3                           # PEP checking | ||||
| flake8-docstrings==1.6.0                # docstring format testing | ||||
| gunicorn>=20.1.0                        # Gunicorn web server | ||||
| importlib_metadata                      # Backport for importlib.metadata | ||||
| inventree                               # Install the latest version of the InvenTree API python library | ||||
| isort==5.10.1                           # DEV: python import sorting | ||||
| markdown==3.3.4                         # Force particular version of markdown | ||||
| pep8-naming==0.11.1                     # PEP naming convention extension | ||||
| pre-commit==2.19.0                      # Git pre-commit | ||||
| pillow==9.1.0                           # Image manipulation | ||||
| py-moneyed==0.8.0                       # Specific version requirement for py-moneyed | ||||
| pygments==2.7.4                         # Syntax highlighting | ||||
|   | ||||
| @@ -15,8 +15,11 @@ ignore = | ||||
| 	N806, | ||||
| 	# - N812 - lowercase imported as non-lowercase | ||||
| 	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/* | ||||
| max-complexity = 20 | ||||
| docstring-convention=google | ||||
|  | ||||
| [coverage:run] | ||||
| source = ./InvenTree | ||||
|   | ||||
							
								
								
									
										17
									
								
								tasks.py
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								tasks.py
									
									
									
									
									
								
							| @@ -94,6 +94,23 @@ def install(c): | ||||
|     # Install required Python packages with PIP | ||||
|     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 | ||||
| def shell(c): | ||||
|     """ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user