2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-10-23 17:37:38 +00:00

refactor(backend): Editorial changes to machine serializer descriptions (#10630)

* improve serializer text

* small type improvs

* more precise text (for API)

* bump api version

* more fixes
This commit is contained in:
Matthias Mair
2025-10-20 00:20:15 +02:00
committed by GitHub
parent c567d60b1e
commit e3ef9e48f6
6 changed files with 53 additions and 26 deletions

View File

@@ -1,12 +1,15 @@
"""InvenTree API version information.""" """InvenTree API version information."""
# InvenTree API version # InvenTree API version
INVENTREE_API_VERSION = 410 INVENTREE_API_VERSION = 411
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about.""" """Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """ INVENTREE_API_TEXT = """
v411 -> 2025-06-19 : https://github.com/inventree/InvenTree/pull/10630
- Editorialy changes to machine api - no functional changes
v410 -> 2025-06-12 : https://github.com/inventree/InvenTree/pull/9761 v410 -> 2025-06-12 : https://github.com/inventree/InvenTree/pull/9761
- Add supplier search and import API endpoints - Add supplier search and import API endpoints
- Add part parameter bulk create API endpoint - Add part parameter bulk create API endpoint

View File

@@ -166,7 +166,7 @@ class MachineTypesList(APIView):
@extend_schema(responses={200: MachineSerializers.MachineTypeSerializer(many=True)}) @extend_schema(responses={200: MachineSerializers.MachineTypeSerializer(many=True)})
def get(self, request): def get(self, request):
"""List all machine types.""" """List of all machine types."""
machine_types = list(registry.get_machine_types()) machine_types = list(registry.get_machine_types())
results = MachineSerializers.MachineTypeSerializer( results = MachineSerializers.MachineTypeSerializer(
machine_types, many=True machine_types, many=True

View File

@@ -48,6 +48,9 @@ class MachineStatus(StatusCode):
""" """
MachinePropertyType = Literal['str', 'bool', 'progress', 'int', 'float']
class MachineProperty(TypedDict, total=False): class MachineProperty(TypedDict, total=False):
"""Type definition for machine properties. """Type definition for machine properties.
@@ -62,7 +65,7 @@ class MachineProperty(TypedDict, total=False):
key: str key: str
value: Union[str, bool, int, float] value: Union[str, bool, int, float]
group: str group: str
type: Literal['str', 'bool', 'progress', 'int', 'float'] type: MachinePropertyType
max_progress: Union[int, None] max_progress: Union[int, None]

View File

@@ -11,6 +11,7 @@ from django.utils.translation import gettext_lazy as _
import common.models import common.models
from machine import registry from machine import registry
from machine.machine_type import BaseMachineType
class MachineConfig(models.Model): class MachineConfig(models.Model):
@@ -83,7 +84,7 @@ class MachineConfig(models.Model):
return machine return machine
@property @property
def machine(self): def machine(self) -> Optional[BaseMachineType]:
"""Machine instance getter.""" """Machine instance getter."""
return registry.get_machine(self.pk) return registry.get_machine(self.pk)

View File

@@ -384,7 +384,7 @@ class MachineRegistry(
return list(self.machine_types.values()) return list(self.machine_types.values())
@machine_registry_entrypoint() @machine_registry_entrypoint()
def get_machine(self, pk: Union[str, UUID]): def get_machine(self, pk: Union[str, UUID]) -> Optional[BaseMachineType]:
"""Get machine from registry by pk.""" """Get machine from registry by pk."""
return self.machines.get(str(pk), None) return self.machines.get(str(pk), None)

View File

@@ -2,16 +2,19 @@
from typing import Union from typing import Union
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from common.serializers import GenericReferencedSettingSerializer from common.serializers import GenericReferencedSettingSerializer
from InvenTree.helpers_mixin import ClassProviderMixin from InvenTree.helpers_mixin import ClassProviderMixin
from machine import registry from machine import registry
from machine.machine_type import MachinePropertyType
from machine.models import MachineConfig, MachineSetting from machine.models import MachineConfig, MachineSetting
class MachinePropertySerializer(serializers.Serializer): class MachinePropertySerializer(serializers.Serializer):
"""Serializer for a MachineProperty.""" """Machine Properties are set by the driver/machine to represent specific state."""
class Meta: class Meta:
"""Meta for serializer.""" """Meta for serializer."""
@@ -19,11 +22,28 @@ class MachinePropertySerializer(serializers.Serializer):
fields = ['key', 'value', 'group', 'type', 'max_progress'] fields = ['key', 'value', 'group', 'type', 'max_progress']
read_only_fields = fields read_only_fields = fields
key = serializers.CharField() key = serializers.CharField(
value = serializers.CharField() label=_('Key'), help_text=_('Key of the property'), required=True
group = serializers.CharField() )
type = serializers.CharField() value = serializers.CharField(
max_progress = serializers.IntegerField() label=_('Value'), help_text=_('Value of the property'), required=True
)
group = serializers.CharField(
label=_('Group'), help_text=_('Grouping of the property'), required=False
)
type = serializers.ChoiceField(
label=_('Type'),
choices=MachinePropertyType.__args__,
help_text=_('Type of the property'),
default='str',
required=False,
)
max_progress = serializers.IntegerField(
label=_('Max Progress'),
help_text=_('Maximum value for progress type, required if type=progress'),
required=False,
allow_null=True,
)
class MachineConfigSerializer(serializers.ModelSerializer): class MachineConfigSerializer(serializers.ModelSerializer):
@@ -66,35 +86,35 @@ class MachineConfigSerializer(serializers.ModelSerializer):
) )
def get_initialized(self, obj: MachineConfig) -> bool: def get_initialized(self, obj: MachineConfig) -> bool:
"""Serializer method for the initialized field.""" """Indicator if machine is initialized."""
return getattr(obj.machine, 'initialized', False) return getattr(obj.machine, 'initialized', False)
def get_status(self, obj: MachineConfig) -> int: def get_status(self, obj: MachineConfig) -> int:
"""Serializer method for the status field.""" """Numerical machine status if available, else -1."""
status = getattr(obj.machine, 'status', None) status = getattr(obj.machine, 'status', None)
if status is not None: if status is not None:
return status.value return status.value
return -1 return -1
def get_status_model(self, obj: MachineConfig) -> Union[str, None]: def get_status_model(self, obj: MachineConfig) -> Union[str, None]:
"""Serializer method for the status model field.""" """Textual machine status name if available, else None."""
if obj.machine and obj.machine.MACHINE_STATUS: if obj.machine and obj.machine.MACHINE_STATUS:
return obj.machine.MACHINE_STATUS.__name__ return obj.machine.MACHINE_STATUS.__name__
def get_status_text(self, obj: MachineConfig) -> str: def get_status_text(self, obj: MachineConfig) -> str:
"""Serializer method for the status text field.""" """Current status text for machine."""
return getattr(obj.machine, 'status_text', '') return getattr(obj.machine, 'status_text', '')
def get_errors(self, obj: MachineConfig) -> list[str]: def get_errors(self, obj: MachineConfig) -> list[str]:
"""Serializer method for the errors field.""" """List of machine errors."""
return [str(err) for err in obj.errors] return [str(err) for err in obj.errors]
def get_is_driver_available(self, obj: MachineConfig) -> bool: def get_is_driver_available(self, obj: MachineConfig) -> bool:
"""Serializer method for the is_driver_available field.""" """Indicator if driver for machine is available."""
return obj.is_driver_available() return obj.is_driver_available()
def get_restart_required(self, obj: MachineConfig) -> bool: def get_restart_required(self, obj: MachineConfig) -> bool:
"""Serializer method for the restart_required field.""" """Indicator if machine restart is required."""
return getattr(obj.machine, 'restart_required', False) return getattr(obj.machine, 'restart_required', False)
@@ -148,11 +168,11 @@ class BaseMachineClassSerializer(serializers.Serializer):
is_builtin = serializers.SerializerMethodField('get_is_builtin') is_builtin = serializers.SerializerMethodField('get_is_builtin')
def get_provider_file(self, obj: ClassProviderMixin) -> str: def get_provider_file(self, obj: ClassProviderMixin) -> str:
"""Serializer method for the provider_file field.""" """File that contains the class definition."""
return obj.get_provider_file() return obj.get_provider_file()
def get_provider_plugin(self, obj: ClassProviderMixin) -> Union[dict, None]: def get_provider_plugin(self, obj: ClassProviderMixin) -> Union[dict, None]:
"""Serializer method for the provider_plugin field.""" """Plugin(s) that contain(s) the class definition."""
plugin = obj.get_provider_plugin() plugin = obj.get_provider_plugin()
if plugin: if plugin:
return { return {
@@ -163,12 +183,12 @@ class BaseMachineClassSerializer(serializers.Serializer):
return None return None
def get_is_builtin(self, obj: ClassProviderMixin) -> bool: def get_is_builtin(self, obj: ClassProviderMixin) -> bool:
"""Serializer method for the is_builtin field.""" """Indicates if the machine type is build into the InvenTree source code."""
return obj.get_is_builtin() return obj.get_is_builtin()
class MachineTypeSerializer(BaseMachineClassSerializer): class MachineTypeSerializer(BaseMachineClassSerializer):
"""Serializer for a BaseMachineType class.""" """Available machine types."""
class Meta(BaseMachineClassSerializer.Meta): class Meta(BaseMachineClassSerializer.Meta):
"""Meta for a serializer.""" """Meta for a serializer."""
@@ -177,7 +197,7 @@ class MachineTypeSerializer(BaseMachineClassSerializer):
class MachineDriverSerializer(BaseMachineClassSerializer): class MachineDriverSerializer(BaseMachineClassSerializer):
"""Serializer for a BaseMachineDriver class.""" """Machine drivers."""
class Meta(BaseMachineClassSerializer.Meta): class Meta(BaseMachineClassSerializer.Meta):
"""Meta for a serializer.""" """Meta for a serializer."""
@@ -189,7 +209,7 @@ class MachineDriverSerializer(BaseMachineClassSerializer):
driver_errors = serializers.SerializerMethodField('get_errors') driver_errors = serializers.SerializerMethodField('get_errors')
def get_errors(self, obj) -> list[str]: def get_errors(self, obj) -> list[str]:
"""Serializer method for the errors field.""" """Errors registered against driver."""
driver_instance = registry.get_driver_instance(obj.SLUG) driver_instance = registry.get_driver_instance(obj.SLUG)
if driver_instance is None: if driver_instance is None:
@@ -198,7 +218,7 @@ class MachineDriverSerializer(BaseMachineClassSerializer):
class MachineRegistryErrorSerializer(serializers.Serializer): class MachineRegistryErrorSerializer(serializers.Serializer):
"""Serializer for a machine registry error.""" """Machine registry error."""
class Meta: class Meta:
"""Meta for a serializer.""" """Meta for a serializer."""
@@ -209,7 +229,7 @@ class MachineRegistryErrorSerializer(serializers.Serializer):
class MachineRegistryStatusSerializer(serializers.Serializer): class MachineRegistryStatusSerializer(serializers.Serializer):
"""Serializer for machine registry status.""" """Machine registry status, showing all errors that were registered."""
class Meta: class Meta:
"""Meta for a serializer.""" """Meta for a serializer."""