From 6f5fc1d8a97aaa626a8b4bd78b88e5de73b508f7 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 6 Dec 2024 10:59:49 +1100 Subject: [PATCH] Test result fixes (#564) * Fix association of test results to templates * Fixes * Remove unused vars --- lib/api.dart | 4 ++ lib/api_form.dart | 6 +++ lib/inventree/model.dart | 9 ++-- lib/inventree/stock.dart | 33 +++++++++++-- lib/widget/stock/stock_item_test_results.dart | 46 ++++++++++++------- 5 files changed, 76 insertions(+), 22 deletions(-) diff --git a/lib/api.dart b/lib/api.dart index 0a1e7067..704b7df1 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -316,6 +316,10 @@ class InvenTreeAPI { // Does the server support allocating stock to sales order using barcodes? bool get supportsBarcodeSOAllocateEndpoint => isConnected() && apiVersion >= 160; + // Does the server support the "modern" test results API + // Ref: https://github.com/inventree/InvenTree/pull/6430/ + bool get supportsModernTestResults => isConnected() && apiVersion >= 169; + // Does the server support "null" top-level filtering for PartCategory and StockLocation endpoints? bool get supportsNullTopLevelFiltering => isConnected() && apiVersion < 174; diff --git a/lib/api_form.dart b/lib/api_form.dart index c22877d8..432e49cc 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -657,7 +657,13 @@ class APIFormField { ) : null, leading: extended ? InvenTreeAPI().getThumbnail(part.thumbnail) : null, ); + case "parttesttemplate": + var template = InvenTreePartTestTemplate.fromJson(data); + return ListTile( + title: Text(template.testName), + subtitle: Text(template.description), + ); case "supplierpart": var part = InvenTreeSupplierPart.fromJson(data); diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 852454d1..6d0e890a 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -97,7 +97,6 @@ class InvenTreeModel { if (data.containsKey(key)) { return data[key]; } else { - debug("JSON data does not contain key '$key' (subKey '${subKey}')"); return backup; } } @@ -427,13 +426,17 @@ class InvenTreeModel { } } - Map defaultListFilters() { + Map defaultFilters() { return {}; } + Map defaultListFilters() { + return defaultFilters(); + } + // A map of "default" headers to use when performing a GET request Map defaultGetFilters() { - return {}; + return defaultFilters(); } /* diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index bd7a6cfe..df158031 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -27,19 +27,43 @@ class InvenTreeStockItemTestResult extends InvenTreeModel { List get rolesRequired => ["stock"]; @override - Map> formFields() { + Map defaultFilters() { return { + "user_detail": "true", + "template_detail": "true", + }; + } + + @override + Map> formFields() { + + Map> fields = { "stock_item": {"hidden": true}, "test": {}, + "template": { + "filters": { + "enabled": "true", + } + }, "result": {}, "value": {}, "notes": {}, "attachment": {}, }; + + if (InvenTreeAPI().supportsModernTestResults) { + fields.remove("test"); + } else { + fields.remove("template"); + } + + return fields; } String get key => getString("key"); - + + int get templateId => getInt("template"); + String get testName => getString("test"); bool get result => getBool("result"); @@ -47,7 +71,9 @@ class InvenTreeStockItemTestResult extends InvenTreeModel { String get value => getString("value"); String get attachment => getString("attachment"); - + + String get username => getString("username", subKey: "user_detail"); + String get date => getString("date"); @override @@ -256,6 +282,7 @@ class InvenTreeStockItem extends InvenTreeModel { await InvenTreePartTestTemplate().list( filters: { "part": "${partId}", + "enabled": "true", }, ).then((var templates) { testTemplates.clear(); diff --git a/lib/widget/stock/stock_item_test_results.dart b/lib/widget/stock/stock_item_test_results.dart index c65422d2..d1671e57 100644 --- a/lib/widget/stock/stock_item_test_results.dart +++ b/lib/widget/stock/stock_item_test_results.dart @@ -62,12 +62,19 @@ class _StockItemTestResultDisplayState extends RefreshableState addTestResult(BuildContext context, {String name = "", bool nameIsEditable = true, bool result = false, String value = "", bool valueRequired = false, bool attachmentRequired = false}) async { + Future addTestResult(BuildContext context, {int templateId = 0, String name = "", bool nameIsEditable = true, bool result = false, String value = "", bool valueRequired = false, bool attachmentRequired = false}) async { + + Map> fields = InvenTreeStockItemTestResult().formFields(); + + // Add additional filters + fields["template"]?["filters"]?["part"] = "${item.partId}"; InvenTreeStockItemTestResult().createForm( context, L10().testResultAdd, + fields: fields, data: { + "template": "${templateId}", "stock_item": "${item.pk}", "test": "${name}", }, @@ -98,10 +105,11 @@ class _StockItemTestResultDisplayState extends RefreshableState