mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 19:46:46 +00:00
Fix for "installed in" display (#8480)
* Fix for "installed in" display - Allow "details" field to be passed custom params * Add extra debug to link checking * API: fix for StockTrackingList entry * Display links for stock items in tracking entry table * Generate absolute links for item renderers * Revert "Generate absolute links for item renderers" This reverts commit 878fba91d0d689f49dfdee964827227fe574a66b. * Bump API version * Add playwright tests
This commit is contained in:
parent
ac63b10197
commit
fbe222f6eb
@ -53,6 +53,8 @@ def check_link(url) -> bool:
|
|||||||
if url in cache:
|
if url in cache:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
print(f'Checking external URL: {url}')
|
||||||
|
|
||||||
attempts = 5
|
attempts = 5
|
||||||
|
|
||||||
while attempts > 0:
|
while attempts > 0:
|
||||||
@ -66,6 +68,8 @@ def check_link(url) -> bool:
|
|||||||
|
|
||||||
attempts -= 1
|
attempts -= 1
|
||||||
|
|
||||||
|
print(f' - URL check failed with status code {response.status_code}')
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
"""InvenTree API version information."""
|
"""InvenTree API version information."""
|
||||||
|
|
||||||
# InvenTree API version
|
# InvenTree API version
|
||||||
INVENTREE_API_VERSION = 280
|
INVENTREE_API_VERSION = 281
|
||||||
|
|
||||||
"""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 = """
|
||||||
|
|
||||||
|
v281 - 2024-11-15 : https://github.com/inventree/InvenTree/pull/8480
|
||||||
|
- Fixes StockHistory API data serialization
|
||||||
|
|
||||||
v280 - 2024-11-10 : https://github.com/inventree/InvenTree/pull/8461
|
v280 - 2024-11-10 : https://github.com/inventree/InvenTree/pull/8461
|
||||||
- Makes schema for API information endpoint more informing
|
- Makes schema for API information endpoint more informing
|
||||||
- Removes general not found endpoint
|
- Removes general not found endpoint
|
||||||
|
@ -1397,6 +1397,8 @@ class StockTrackingList(DataExportViewMixin, ListAPI):
|
|||||||
'salesorder': (SalesOrder, SalesOrderSerializer),
|
'salesorder': (SalesOrder, SalesOrderSerializer),
|
||||||
'returnorder': (ReturnOrder, ReturnOrderSerializer),
|
'returnorder': (ReturnOrder, ReturnOrderSerializer),
|
||||||
'buildorder': (Build, BuildSerializer),
|
'buildorder': (Build, BuildSerializer),
|
||||||
|
'item': (StockItem, StockSerializers.StockItemSerializer),
|
||||||
|
'stockitem': (StockItem, StockSerializers.StockItemSerializer),
|
||||||
}
|
}
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
|
@ -425,7 +425,7 @@ class StockItemSerializer(
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
"""Add detail fields."""
|
"""Add detail fields."""
|
||||||
part_detail = kwargs.pop('part_detail', False)
|
part_detail = kwargs.pop('part_detail', True)
|
||||||
location_detail = kwargs.pop('location_detail', False)
|
location_detail = kwargs.pop('location_detail', False)
|
||||||
supplier_part_detail = kwargs.pop('supplier_part_detail', False)
|
supplier_part_detail = kwargs.pop('supplier_part_detail', False)
|
||||||
tests = kwargs.pop('tests', False)
|
tests = kwargs.pop('tests', False)
|
||||||
|
@ -67,6 +67,7 @@ type InternalLinkField = {
|
|||||||
model: ModelType;
|
model: ModelType;
|
||||||
model_field?: string;
|
model_field?: string;
|
||||||
model_formatter?: (value: any) => string;
|
model_formatter?: (value: any) => string;
|
||||||
|
model_filters?: any;
|
||||||
backup_value?: string;
|
backup_value?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -234,7 +235,9 @@ function TableAnchorValue(props: Readonly<FieldProps>) {
|
|||||||
const url = apiUrl(modelDef.api_endpoint, props.field_value);
|
const url = apiUrl(modelDef.api_endpoint, props.field_value);
|
||||||
|
|
||||||
return api
|
return api
|
||||||
.get(url)
|
.get(url, {
|
||||||
|
params: props.field_data.model_filters ?? undefined
|
||||||
|
})
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
switch (response.status) {
|
switch (response.status) {
|
||||||
case 200:
|
case 200:
|
||||||
|
@ -211,10 +211,13 @@ export default function StockDetail() {
|
|||||||
type: 'link',
|
type: 'link',
|
||||||
name: 'belongs_to',
|
name: 'belongs_to',
|
||||||
label: t`Installed In`,
|
label: t`Installed In`,
|
||||||
|
model_filters: {
|
||||||
|
part_detail: true
|
||||||
|
},
|
||||||
model_formatter: (model: any) => {
|
model_formatter: (model: any) => {
|
||||||
let text = model?.part_detail?.full_name ?? model?.name;
|
let text = model?.part_detail?.full_name ?? model?.name;
|
||||||
if (model.serial && model.quantity == 1) {
|
if (model.serial && model.quantity == 1) {
|
||||||
text += `# ${model.serial}`;
|
text += ` # ${model.serial}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
|
@ -50,7 +50,17 @@ export function StockTrackingTable({ itemId }: Readonly<{ itemId: number }>) {
|
|||||||
key: 'stockitem',
|
key: 'stockitem',
|
||||||
details:
|
details:
|
||||||
deltas.stockitem_detail &&
|
deltas.stockitem_detail &&
|
||||||
RenderStockItem({ instance: deltas.stockitem_detail })
|
RenderStockItem({ instance: deltas.stockitem_detail, link: true })
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: t`Stock Item`,
|
||||||
|
key: 'item',
|
||||||
|
details:
|
||||||
|
deltas.item_detail &&
|
||||||
|
RenderStockItem({
|
||||||
|
instance: deltas.item_detail,
|
||||||
|
link: true
|
||||||
|
})
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t`Status`,
|
label: t`Status`,
|
||||||
|
@ -157,3 +157,20 @@ test('Stock - Stock Actions', async ({ page }) => {
|
|||||||
|
|
||||||
await page.waitForTimeout(2500);
|
await page.waitForTimeout(2500);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Stock - Tracking', async ({ page }) => {
|
||||||
|
await doQuickLogin(page);
|
||||||
|
|
||||||
|
// Navigate to the "stock item" page
|
||||||
|
await page.goto(`${baseUrl}/stock/item/176/details/`);
|
||||||
|
await page.getByRole('link', { name: 'Widget Assembly # 2' }).waitFor();
|
||||||
|
|
||||||
|
// Navigate to the "stock tracking" tab
|
||||||
|
await page.getByRole('tab', { name: 'Stock Tracking' }).click();
|
||||||
|
await page.getByText('- - Factory/Office Block/Room').first().waitFor();
|
||||||
|
await page.getByRole('link', { name: 'Widget Assembly' }).waitFor();
|
||||||
|
await page.getByRole('cell', { name: 'Installed into assembly' }).waitFor();
|
||||||
|
|
||||||
|
await page.waitForTimeout(1500);
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user