2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-05-01 21:16:46 +00:00

Add metadata endpoints for SalesOrder and PurchaseOrder models

This commit is contained in:
Oliver Walters 2022-05-16 21:40:10 +10:00
parent 5582c8ba43
commit bd17458f37
6 changed files with 43 additions and 14 deletions

View File

@ -354,7 +354,7 @@ class PurchaseOrderMetadata(generics.RetrieveUpdateAPIView):
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
return MetadataSerializer(models.PurchaseOrder, *args, **kwargs) return MetadataSerializer(models.PurchaseOrder, *args, **kwargs)
queryset = models.PurchaseOrder.objects.all() queryset = models.PurchaseOrder.objects.all()
@ -932,7 +932,7 @@ class SalesOrderMetadata(generics.RetrieveUpdateAPIView):
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
return MetadataSerializer(models.SalesOrder, *args, **kwargs) return MetadataSerializer(models.SalesOrder, *args, **kwargs)
queryset = models.SalesOrder.objects.all() queryset = models.SalesOrder.objects.all()

View File

@ -306,6 +306,22 @@ class PurchaseOrderTest(OrderTest):
self.assertEqual(po.status, PurchaseOrderStatus.PLACED) self.assertEqual(po.status, PurchaseOrderStatus.PLACED)
def test_po_metadata(self):
url = reverse('api-po-metadata', kwargs={'pk': 1})
self.patch(
url,
{
'metadata': {
'yam': 'yum',
}
},
expected_code=200
)
order = models.PurchaseOrder.objects.get(pk=1)
self.assertEqual(order.get_metadata('yam'), 'yum')
class PurchaseOrderReceiveTest(OrderTest): class PurchaseOrderReceiveTest(OrderTest):
""" """
@ -875,6 +891,22 @@ class SalesOrderTest(OrderTest):
self.assertEqual(so.status, SalesOrderStatus.CANCELLED) self.assertEqual(so.status, SalesOrderStatus.CANCELLED)
def test_so_metadata(self):
url = reverse('api-so-metadata', kwargs={'pk': 1})
self.patch(
url,
{
'metadata': {
'xyz': 'abc',
}
},
expected_code=200
)
order = models.SalesOrder.objects.get(pk=1)
self.assertEqual(order.get_metadata('xyz'), 'abc')
class SalesOrderAllocateTest(OrderTest): class SalesOrderAllocateTest(OrderTest):
""" """

View File

@ -199,7 +199,7 @@ class PartTest(TestCase):
with self.assertRaises(ValidationError): with self.assertRaises(ValidationError):
part_2.validate_unique() part_2.validate_unique()
def test_metadata(self): def test_attributes(self):
self.assertEqual(self.r1.name, 'R_2K2_0805') self.assertEqual(self.r1.name, 'R_2K2_0805')
self.assertEqual(self.r1.get_absolute_url(), '/part/3/') self.assertEqual(self.r1.get_absolute_url(), '/part/3/')

View File

@ -45,16 +45,16 @@ class MetadataMixin(models.Model):
Args: Args:
key: String key for requesting metadata. e.g. if a plugin is accessing the metadata, the plugin slug should be used key: String key for requesting metadata. e.g. if a plugin is accessing the metadata, the plugin slug should be used
Returns: Returns:
Python dict object containing requested metadata. If no matching metadata is found, returns None Python dict object containing requested metadata. If no matching metadata is found, returns None
""" """
if self.metadata is None: if self.metadata is None:
return backup_value return backup_value
return self.metadata.get(key, backup_value) return self.metadata.get(key, backup_value)
def set_metadata(self, key: str, data, commit=True): def set_metadata(self, key: str, data, commit=True):
""" """
Save the provided metadata under the provided key. Save the provided metadata under the provided key.
@ -68,9 +68,9 @@ class MetadataMixin(models.Model):
if self.metadata is None: if self.metadata is None:
# Handle a null field value # Handle a null field value
self.metadata = {} self.metadata = {}
self.metadata[key] = data self.metadata[key] = data
if commit: if commit:
self.save() self.save()

View File

@ -15,8 +15,6 @@ from django.utils import timezone
from rest_framework import serializers from rest_framework import serializers
from InvenTree.helpers import str2bool
from plugin.models import PluginConfig, PluginSetting, NotificationUserSetting from plugin.models import PluginConfig, PluginSetting, NotificationUserSetting
from common.serializers import GenericReferencedSettingSerializer from common.serializers import GenericReferencedSettingSerializer
@ -37,7 +35,7 @@ class MetadataSerializer(serializers.ModelSerializer):
fields = [ fields = [
'metadata', 'metadata',
] ]
def update(self, instance, data): def update(self, instance, data):
if self.partial: if self.partial:

View File

@ -1384,7 +1384,7 @@ class LocationMetadata(generics.RetrieveUpdateAPIView):
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
return MetadataSerializer(StockLocation, *args, **kwargs) return MetadataSerializer(StockLocation, *args, **kwargs)
queryset = StockLocation.objects.all() queryset = StockLocation.objects.all()
@ -1412,8 +1412,7 @@ stock_api_urls = [
re_path(r'^.*$', LocationDetail.as_view(), name='api-location-detail'), re_path(r'^.*$', LocationDetail.as_view(), name='api-location-detail'),
])), ])),
re_path(r'^.*$', StockLocationList.as_view(), name='api-location-list'), re_path(r'^.*$', StockLocationList.as_view(), name='api-location-list'),
])), ])),