2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-02 11:40:58 +00:00

[CI] Enable python autoformat (#6169)

* Squashed commit of the following:

commit f5cf7b2e78
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:36:57 2024 +0100

    fixed reqs

commit 9d845bee98
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:32:35 2024 +0100

    disable autofix/format

commit aff5f27148
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:28:50 2024 +0100

    adjust checks

commit 47271cf1ef
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:28:22 2024 +0100

    reorder order of operations

commit e1bf178b40
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:01:09 2024 +0100

    adapted ruff settings to better fit code base

commit ad7d88a6f4
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 19:59:45 2024 +0100

    auto fixed docstring

commit a2e54a760e
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 19:46:35 2024 +0100

    fix getattr useage

commit cb80c73bc6
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 19:25:09 2024 +0100

    fix requirements file

commit b7780bbd21
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:42:28 2024 +0100

    fix removed sections

commit 71f1681f55
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:41:21 2024 +0100

    fix djlint syntax

commit a0bcf1bcce
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:35:28 2024 +0100

    remove flake8 from code base

commit 22475b31cc
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:34:56 2024 +0100

    remove flake8 from code base

commit 0413350f14
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:24:39 2024 +0100

    moved ruff section

commit d90c48a0bf
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:24:24 2024 +0100

    move djlint config to pyproject

commit c5ce55d511
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:20:39 2024 +0100

    added isort again

commit 42a41d23af
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:19:02 2024 +0100

    move config section

commit 8569233181
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:17:52 2024 +0100

    fix codespell error

commit 2897c6704d
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 17:29:21 2024 +0100

    replaced flake8 with ruff
    mostly for speed improvements

* enable autoformat

* added autofixes

* switched to single quotes everywhere

* switched to ruff for import sorting

* fix wrong url response

* switched to pathlib for lookup

* fixed lookup

* Squashed commit of the following:

commit d3b795824b
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 22:56:17 2024 +0100

    fixed source path

commit 0bac0c19b8
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 22:47:53 2024 +0100

    fixed req

commit 9f61f01d9c
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 22:45:18 2024 +0100

    added missing toml req

commit 91b71ed24a
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:49:50 2024 +0100

    moved isort config

commit 12460b0419
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:43:22 2024 +0100

    remove flake8 section from setup.cfg

commit f5cf7b2e78
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:36:57 2024 +0100

    fixed reqs

commit 9d845bee98
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:32:35 2024 +0100

    disable autofix/format

commit aff5f27148
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:28:50 2024 +0100

    adjust checks

commit 47271cf1ef
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:28:22 2024 +0100

    reorder order of operations

commit e1bf178b40
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 20:01:09 2024 +0100

    adapted ruff settings to better fit code base

commit ad7d88a6f4
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 19:59:45 2024 +0100

    auto fixed docstring

commit a2e54a760e
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 19:46:35 2024 +0100

    fix getattr useage

commit cb80c73bc6
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 19:25:09 2024 +0100

    fix requirements file

commit b7780bbd21
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:42:28 2024 +0100

    fix removed sections

commit 71f1681f55
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:41:21 2024 +0100

    fix djlint syntax

commit a0bcf1bcce
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:35:28 2024 +0100

    remove flake8 from code base

commit 22475b31cc
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:34:56 2024 +0100

    remove flake8 from code base

commit 0413350f14
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:24:39 2024 +0100

    moved ruff section

commit d90c48a0bf
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:24:24 2024 +0100

    move djlint config to pyproject

commit c5ce55d511
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:20:39 2024 +0100

    added isort again

commit 42a41d23af
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:19:02 2024 +0100

    move config section

commit 8569233181
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 18:17:52 2024 +0100

    fix codespell error

commit 2897c6704d
Author: Matthias Mair <code@mjmair.com>
Date:   Sun Jan 7 17:29:21 2024 +0100

    replaced flake8 with ruff
    mostly for speed improvements

* fix coverage souce format

---------

Co-authored-by: Oliver Walters <oliver.henry.walters@gmail.com>
This commit is contained in:
Matthias Mair
2024-01-11 01:28:58 +01:00
committed by GitHub
parent 9715af564f
commit 4b14986591
257 changed files with 13422 additions and 12200 deletions

View File

@ -9,9 +9,4 @@ States can be extended with custom options for each InvenTree instance - those o
from .states import StatusCode
from .transition import StateTransitionMixin, TransitionMethod, storage
__all__ = [
StatusCode,
storage,
TransitionMethod,
StateTransitionMixin,
]
__all__ = [StatusCode, storage, TransitionMethod, StateTransitionMixin]

View File

@ -18,9 +18,7 @@ class StatusView(APIView):
all available 'StockStatus' codes
"""
permission_classes = [
permissions.IsAuthenticated,
]
permission_classes = [permissions.IsAuthenticated]
# Override status_class for implementing subclass
MODEL_REF = 'statusmodel'
@ -30,7 +28,9 @@ class StatusView(APIView):
status_model = self.kwargs.get(self.MODEL_REF, None)
if status_model is None:
raise ValidationError(f"StatusView view called without '{self.MODEL_REF}' parameter")
raise ValidationError(
f"StatusView view called without '{self.MODEL_REF}' parameter"
)
return status_model
@ -39,15 +39,12 @@ class StatusView(APIView):
status_class = self.get_status_model()
if not inspect.isclass(status_class):
raise NotImplementedError("`status_class` not a class")
raise NotImplementedError('`status_class` not a class')
if not issubclass(status_class, StatusCode):
raise NotImplementedError("`status_class` not a valid StatusCode class")
raise NotImplementedError('`status_class` not a valid StatusCode class')
data = {
'class': status_class.__name__,
'values': status_class.dict(),
}
data = {'class': status_class.__name__, 'values': status_class.dict()}
return Response(data)
@ -55,9 +52,7 @@ class StatusView(APIView):
class AllStatusViews(StatusView):
"""Endpoint for listing all defined status models."""
permission_classes = [
permissions.IsAuthenticated,
]
permission_classes = [permissions.IsAuthenticated]
def get(self, request, *args, **kwargs):
"""Perform a GET request to learn information about status codes"""

View File

@ -1,4 +1,5 @@
"""Generic implementation of status for InvenTree models."""
import enum
import re
@ -148,12 +149,10 @@ class StatusCode(BaseEnum):
@classmethod
def dict(cls, key=None):
"""Return a dict representation containing all required information"""
return {x.name: {
'color': x.color,
'key': x.value,
'label': x.label,
'name': x.name,
} for x in cls.values(key)}
return {
x.name: {'color': x.color, 'key': x.value, 'label': x.label, 'name': x.name}
for x in cls.values(key)
}
@classmethod
def list(cls):

View File

@ -35,8 +35,7 @@ class TransitionTests(InvenTreeTestCase):
def test_class(self):
"""Ensure that the class itself works."""
class ErrorImplementation(TransitionMethod):
...
class ErrorImplementation(TransitionMethod): ...
with self.assertRaises(NotImplementedError):
ErrorImplementation()
@ -90,7 +89,6 @@ class TransitionTests(InvenTreeTestCase):
class ValidImplementation(TransitionMethod):
def transition(self, *args, **kwargs):
global raise_function
if raise_function:
@ -103,7 +101,9 @@ class TransitionTests(InvenTreeTestCase):
self.assertIn(ValidImplementation, storage.list)
# Ensure that the function is called
self.assertEqual(StateTransitionMixin.handle_transition(0, 1, self, self, dflt), 1234)
self.assertEqual(
StateTransitionMixin.handle_transition(0, 1, self, self, dflt), 1234
)
_clean_storage([ValidImplementationNoEffect, ValidImplementation])

View File

@ -1,4 +1,5 @@
"""Tests for the generic states module."""
from django.test.client import RequestFactory
from django.utils.translation import gettext_lazy as _
@ -13,9 +14,9 @@ from .states import StatusCode
class GeneralStatus(StatusCode):
"""Defines a set of status codes for tests."""
PENDING = 10, _("Pending"), 'secondary'
PLACED = 20, _("Placed"), 'primary'
COMPLETE = 30, _("Complete"), 'success'
PENDING = 10, _('Pending'), 'secondary'
PLACED = 20, _('Placed'), 'primary'
COMPLETE = 30, _('Complete'), 'success'
ABC = None # This should be ignored
_DEF = None # This should be ignored
jkl = None # This should be ignored
@ -27,6 +28,7 @@ class GeneralStatus(StatusCode):
class GeneralStateTest(InvenTreeTestCase):
"""Test that the StatusCode class works."""
def test_code_definition(self):
"""Test that the status code class has been defined correctly."""
self.assertEqual(GeneralStatus.PENDING, 10)
@ -36,36 +38,84 @@ class GeneralStateTest(InvenTreeTestCase):
def test_code_functions(self):
"""Test that the status code class functions work correctly"""
# render
self.assertEqual(GeneralStatus.render(10), "<span class='badge rounded-pill bg-secondary'>Pending</span>")
self.assertEqual(GeneralStatus.render(20), "<span class='badge rounded-pill bg-primary'>Placed</span>")
self.assertEqual(
GeneralStatus.render(10),
"<span class='badge rounded-pill bg-secondary'>Pending</span>",
)
self.assertEqual(
GeneralStatus.render(20),
"<span class='badge rounded-pill bg-primary'>Placed</span>",
)
# render with invalid key
self.assertEqual(GeneralStatus.render(100), 100)
# list
self.assertEqual(GeneralStatus.list(), [{'color': 'secondary', 'key': 10, 'label': 'Pending', 'name': 'PENDING'}, {'color': 'primary', 'key': 20, 'label': 'Placed', 'name': 'PLACED'}, {'color': 'success', 'key': 30, 'label': 'Complete', 'name': 'COMPLETE'}])
self.assertEqual(
GeneralStatus.list(),
[
{
'color': 'secondary',
'key': 10,
'label': 'Pending',
'name': 'PENDING',
},
{'color': 'primary', 'key': 20, 'label': 'Placed', 'name': 'PLACED'},
{
'color': 'success',
'key': 30,
'label': 'Complete',
'name': 'COMPLETE',
},
],
)
# text
self.assertEqual(GeneralStatus.text(10), 'Pending')
self.assertEqual(GeneralStatus.text(20), 'Placed')
# items
self.assertEqual(list(GeneralStatus.items()), [(10, 'Pending'), (20, 'Placed'), (30, 'Complete')])
self.assertEqual(
list(GeneralStatus.items()),
[(10, 'Pending'), (20, 'Placed'), (30, 'Complete')],
)
# keys
self.assertEqual(list(GeneralStatus.keys()), ([10, 20, 30]))
# labels
self.assertEqual(list(GeneralStatus.labels()), ['Pending', 'Placed', 'Complete'])
self.assertEqual(
list(GeneralStatus.labels()), ['Pending', 'Placed', 'Complete']
)
# names
self.assertEqual(GeneralStatus.names(), {'PENDING': 10, 'PLACED': 20, 'COMPLETE': 30})
self.assertEqual(
GeneralStatus.names(), {'PENDING': 10, 'PLACED': 20, 'COMPLETE': 30}
)
# dict
self.assertEqual(GeneralStatus.dict(), {
'PENDING': {'key': 10, 'name': 'PENDING', 'label': 'Pending', 'color': 'secondary'},
'PLACED': {'key': 20, 'name': 'PLACED', 'label': 'Placed', 'color': 'primary'},
'COMPLETE': {'key': 30, 'name': 'COMPLETE', 'label': 'Complete', 'color': 'success'},
})
self.assertEqual(
GeneralStatus.dict(),
{
'PENDING': {
'key': 10,
'name': 'PENDING',
'label': 'Pending',
'color': 'secondary',
},
'PLACED': {
'key': 20,
'name': 'PLACED',
'label': 'Placed',
'color': 'primary',
},
'COMPLETE': {
'key': 30,
'name': 'COMPLETE',
'label': 'Complete',
'color': 'success',
},
},
)
# label
self.assertEqual(GeneralStatus.label(10), 'Pending')
@ -74,7 +124,10 @@ class GeneralStateTest(InvenTreeTestCase):
"""Test that the status code tag functions."""
from .tags import status_label
self.assertEqual(status_label('general', 10), "<span class='badge rounded-pill bg-secondary'>Pending</span>")
self.assertEqual(
status_label('general', 10),
"<span class='badge rounded-pill bg-secondary'>Pending</span>",
)
# invalid type
with self.assertRaises(ValueError) as e:
@ -87,24 +140,54 @@ class GeneralStateTest(InvenTreeTestCase):
def test_api(self):
"""Test StatusView API view."""
view = StatusView.as_view()
rqst = RequestFactory().get('status/',)
rqst = RequestFactory().get('status/')
force_authenticate(rqst, user=self.user)
# Correct call
resp = view(rqst, **{StatusView.MODEL_REF: GeneralStatus})
self.assertEqual(resp.data, {'class': 'GeneralStatus', 'values': {'COMPLETE': {'key': 30, 'name': 'COMPLETE', 'label': 'Complete', 'color': 'success'}, 'PENDING': {'key': 10, 'name': 'PENDING', 'label': 'Pending', 'color': 'secondary'}, 'PLACED': {'key': 20, 'name': 'PLACED', 'label': 'Placed', 'color': 'primary'}}})
self.assertEqual(
resp.data,
{
'class': 'GeneralStatus',
'values': {
'COMPLETE': {
'key': 30,
'name': 'COMPLETE',
'label': 'Complete',
'color': 'success',
},
'PENDING': {
'key': 10,
'name': 'PENDING',
'label': 'Pending',
'color': 'secondary',
},
'PLACED': {
'key': 20,
'name': 'PLACED',
'label': 'Placed',
'color': 'primary',
},
},
},
)
# No status defined
resp = view(rqst, **{StatusView.MODEL_REF: None})
self.assertEqual(resp.status_code, 400)
self.assertEqual(str(resp.rendered_content, 'utf-8'), '["StatusView view called without \'statusmodel\' parameter"]')
self.assertEqual(
str(resp.rendered_content, 'utf-8'),
'["StatusView view called without \'statusmodel\' parameter"]',
)
# Invalid call - not a class
with self.assertRaises(NotImplementedError) as e:
resp = view(rqst, **{StatusView.MODEL_REF: 'invalid'})
self.assertEqual(str(e.exception), "`status_class` not a class")
self.assertEqual(str(e.exception), '`status_class` not a class')
# Invalid call - not the right class
with self.assertRaises(NotImplementedError) as e:
resp = view(rqst, **{StatusView.MODEL_REF: object})
self.assertEqual(str(e.exception), "`status_class` not a valid StatusCode class")
self.assertEqual(
str(e.exception), '`status_class` not a valid StatusCode class'
)

View File

@ -1,4 +1,5 @@
"""Classes and functions for plugin controlled object state transitions."""
import InvenTree.helpers
@ -15,8 +16,10 @@ class TransitionMethod:
- The needed functions are implemented
"""
# Check if a sending fnc is defined
if (not hasattr(self, 'transition')):
raise NotImplementedError('A TransitionMethod must define a `transition` method')
if not hasattr(self, 'transition'):
raise NotImplementedError(
'A TransitionMethod must define a `transition` method'
)
class TransitionMethodStorageClass:
@ -62,7 +65,9 @@ class StateTransitionMixin:
```
"""
def handle_transition(self, current_state, target_state, instance, default_action, **kwargs):
def handle_transition(
self, current_state, target_state, instance, default_action, **kwargs
):
"""Handle a state transition for an object.
Args:
@ -74,7 +79,9 @@ class StateTransitionMixin:
# Check if there is a custom override function for this transition
for override in storage.list:
rslt = override.transition(current_state, target_state, instance, default_action, **kwargs)
rslt = override.transition(
current_state, target_state, instance, default_action, **kwargs
)
if rslt:
return rslt

View File

@ -5,6 +5,4 @@ from django import template
register = template.Library()
from generic.states.tags import status_label # noqa: E402
__all__ = [
status_label,
]
__all__ = [status_label]