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:
parent
5582c8ba43
commit
bd17458f37
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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/')
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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'),
|
||||||
])),
|
])),
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user