2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-07-01 11:10:54 +00:00

Add Metadata to more models (#4898)

* Update models: add MetadataMixin

* Fix name of model in Metadata API definition

* Add API endpoints

* Update API version

* Fix syntax

* Add API endpoint for RO, RO line, RO line extra item

* Add Metadata to Contacts

* Fix link in API version

* Fix name of model

* Fix error?

* Fix error?

* Fix all errors, hopefully..

* Add tests for order, line, extraline metadata

Extend for PO, SO

* Add tests for metadata for Company-related models

* Fix spelling

* Consolidate metadata test for all part models into one test

* Add test for all Stock metadata

* Update stock test_api

* Add all metadata tests for orders

* Fix various errors in tests

* Fix model name

* Add migration files

* Update tests for metadata

* Resolve conflict around API version number

* Rename migration file

* Rename migration file

* Will Contact edit endpoint work better?

* Revert changes in URL definitions

* Remove test, duplicate

* Fix tests with fixed PK, not from fixtures, to use a dynamic PK

* Fix migration overlap
This commit is contained in:
miggland
2023-06-02 11:26:20 +02:00
committed by GitHub
parent c0dafe155f
commit 1d85b70313
21 changed files with 462 additions and 136 deletions

View File

@ -51,3 +51,19 @@
description: 'RMA from a customer'
customer: 5
status: 10 # Pending
# 1 x R_4K7_0603
- model: order.returnorderlineitem
pk: 1
fields:
order: 6
item: 1008
quantity: 1
# An extra line item
- model: order.returnorderextraline
pk: 1
fields:
order: 6
reference: 'Freight cost'
quantity: 1

View File

@ -37,3 +37,26 @@
description: "One sales order, please"
customer: 5
status: 60 # Returned
# 1 x R_4K7_0603
- model: order.salesorderlineitem
pk: 1
fields:
order: 5
part: 5
quantity: 1
# An extra line item
- model: order.salesorderextraline
pk: 1
fields:
order: 5
reference: 'Freight cost'
quantity: 1
# Shipment
- model: order.salesordershipment
pk: 1
fields:
order: 1
reference: "Test Shipment, must be present for metadata test"

View File

@ -509,23 +509,6 @@ class PurchaseOrderTest(OrderTest):
self.assertEqual(po.status, PurchaseOrderStatus.PLACED)
def test_po_metadata(self):
"""Test the 'metadata' endpoint for the PurchaseOrder model"""
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')
def test_po_calendar(self):
"""Test the calendar export endpoint"""
@ -1374,23 +1357,6 @@ class SalesOrderTest(OrderTest):
self.assertEqual(so.status, SalesOrderStatus.CANCELLED)
def test_so_metadata(self):
"""Test the 'metadata' API endpoint for the SalesOrder model"""
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')
def test_so_calendar(self):
"""Test the calendar export endpoint"""
@ -1887,6 +1853,9 @@ class SalesOrderAllocateTest(OrderTest):
"""Test the SalesOrderShipment list API endpoint"""
url = reverse('api-so-shipment-list')
# Count before creation
countbefore = models.SalesOrderShipment.objects.count()
# Create some new shipments via the API
for order in models.SalesOrder.objects.all():
@ -1916,7 +1885,7 @@ class SalesOrderAllocateTest(OrderTest):
# List *all* shipments
response = self.get(url, expected_code=200)
self.assertEqual(len(response.data), 1 + 3 * models.SalesOrder.objects.count())
self.assertEqual(len(response.data), countbefore + 3 * models.SalesOrder.objects.count())
class ReturnOrderTests(InvenTreeAPITestCase):
@ -2212,3 +2181,71 @@ class ReturnOrderTests(InvenTreeAPITestCase):
response = self.get(url, expected_code=200, format=None)
calendar = Calendar.from_ical(response.content)
self.assertIsInstance(calendar, Calendar)
class OrderMetadataAPITest(InvenTreeAPITestCase):
"""Unit tests for the various metadata endpoints of API."""
fixtures = [
'category',
'part',
'company',
'location',
'supplier_part',
'stock',
'order',
'sales_order',
'return_order',
]
roles = [
'purchase_order.change',
'sales_order.change',
'return_order.change',
]
def metatester(self, apikey, model):
"""Generic tester"""
modeldata = model.objects.first()
# Useless test unless a model object is found
self.assertIsNotNone(modeldata)
url = reverse(apikey, kwargs={'pk': modeldata.pk})
# Metadata is initially null
self.assertIsNone(modeldata.metadata)
numstr = f'12{len(apikey)}'
self.patch(
url,
{
'metadata': {
f'abc-{numstr}': f'xyz-{apikey}-{numstr}',
}
},
expected_code=200
)
# Refresh
modeldata.refresh_from_db()
self.assertEqual(modeldata.get_metadata(f'abc-{numstr}'), f'xyz-{apikey}-{numstr}')
def test_metadata(self):
"""Test all endpoints"""
for apikey, model in {
'api-po-metadata': models.PurchaseOrder,
'api-po-line-metadata': models.PurchaseOrderLineItem,
'api-po-extra-line-metadata': models.PurchaseOrderExtraLine,
'api-so-shipment-metadata': models.SalesOrderShipment,
'api-so-metadata': models.SalesOrder,
'api-so-line-metadata': models.SalesOrderLineItem,
'api-so-extra-line-metadata': models.SalesOrderExtraLine,
'api-return-order-metadata': models.ReturnOrder,
'api-return-order-line-metadata': models.ReturnOrderLineItem,
'api-return-order-extra-line-metadata': models.ReturnOrderExtraLine,
}.items():
self.metatester(apikey, model)