diff --git a/assets/release_notes.md b/assets/release_notes.md index a8dcf2ed..6b27642f 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -7,6 +7,7 @@ - Allow serial numbers to be specified when creating new stock items - Allow serial numbers to be edited for existing stock items - Allow app locale to be changed manually +- Improved handling of certain errors ### 0.8.1 - August 2022 --- diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 04ce6574..00605212 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -276,6 +276,12 @@ class InvenTreeModel { /// Delete the instance on the remote server /// Returns true if the operation was successful, else false Future delete() async { + + // Return if we do not have a valid pk + if (pk < 0) { + return false; + } + var response = await api.delete(url); if (!response.isValid() || response.data == null || (response.data is! Map)) { @@ -303,18 +309,35 @@ class InvenTreeModel { */ Future reload() async { + // If we do not have a valid pk (for some reason), exit immediately + if (pk < 0) { + return false; + } + var response = await api.get(url, params: defaultGetFilters(), expectedStatusCode: 200); - if (!response.isValid() || response.data == null || (response.data is! Map)) { + // A valid response has been returned + if (response.isValid() && response.statusCode == 200) { - reportModelError( - "InvenTreeModel.reload() returned invalid response", - response, - context: { - "pk": pk.toString(), - } - ); + // Returned data was not a valid JSON object + if (response.data == null || response.data is! Map) { + reportModelError( + "InvenTreeModel.reload() returned invalid response", + response, + context: { + "pk": pk.toString(), + } + ); + showServerError( + url, + L10().serverError, + L10().responseInvalid, + ); + + return false; + } + } else { showServerError( url, L10().serverError, @@ -322,7 +345,6 @@ class InvenTreeModel { ); return false; - } lastReload = DateTime.now(); @@ -337,6 +359,13 @@ class InvenTreeModel { var url = path.join(URL, pk.toString()); + // Return if we do not have a valid pk + if (pk < 0) { + return APIResponse( + url: url, + ); + } + if (!url.endsWith("/")) { url += "/"; } @@ -396,6 +425,11 @@ class InvenTreeModel { } Future get(int pk, {Map filters = const {}}) async { + + if (pk < 0) { + return null; + } + return getModel(pk.toString(), filters: filters); } diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index 3f36055d..bb3afcd1 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -109,13 +109,13 @@ class _StockItemDisplayState extends RefreshableState { @override Future request(BuildContext context) async { - final bool result = await item.reload(); - stockShowHistory = await InvenTreeSettingsManager().getValue(INV_STOCK_SHOW_HISTORY, false) as bool; + final bool result = item.pk > 0 && await item.reload(); + // Could not load this stock item for some reason // Perhaps it has been depleted? - if (!result || item.pk == -1) { + if (!result) { Navigator.of(context).pop(); } diff --git a/lib/widget/stock_notes.dart b/lib/widget/stock_notes.dart index 05cc405b..8ca151f3 100644 --- a/lib/widget/stock_notes.dart +++ b/lib/widget/stock_notes.dart @@ -31,7 +31,9 @@ class _StockNotesState extends RefreshableState { @override Future request(BuildContext context) async { - await item.reload(); + if (item.pk > 0) { + await item.reload(); + } } @override