2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-05-01 06:56:50 +00:00

Catch some subtle errors (#202)

- Prevent API requests for invalid PK values
- Perform checks for invalid PK values at multiple points
- Change order of operations in StockDetail widget
This commit is contained in:
Oliver 2022-08-04 13:23:29 +10:00 committed by GitHub
parent 61bacefd36
commit e7c5186823
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 13 deletions

View File

@ -7,6 +7,7 @@
- Allow serial numbers to be specified when creating new stock items - Allow serial numbers to be specified when creating new stock items
- Allow serial numbers to be edited for existing stock items - Allow serial numbers to be edited for existing stock items
- Allow app locale to be changed manually - Allow app locale to be changed manually
- Improved handling of certain errors
### 0.8.1 - August 2022 ### 0.8.1 - August 2022
--- ---

View File

@ -276,6 +276,12 @@ class InvenTreeModel {
/// Delete the instance on the remote server /// Delete the instance on the remote server
/// Returns true if the operation was successful, else false /// Returns true if the operation was successful, else false
Future<bool> delete() async { Future<bool> delete() async {
// Return if we do not have a valid pk
if (pk < 0) {
return false;
}
var response = await api.delete(url); var response = await api.delete(url);
if (!response.isValid() || response.data == null || (response.data is! Map)) { if (!response.isValid() || response.data == null || (response.data is! Map)) {
@ -303,18 +309,35 @@ class InvenTreeModel {
*/ */
Future<bool> reload() async { Future<bool> 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); 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( // Returned data was not a valid JSON object
"InvenTreeModel.reload() returned invalid response", if (response.data == null || response.data is! Map) {
response, reportModelError(
context: { "InvenTreeModel.reload() returned invalid response",
"pk": pk.toString(), response,
} context: {
); "pk": pk.toString(),
}
);
showServerError(
url,
L10().serverError,
L10().responseInvalid,
);
return false;
}
} else {
showServerError( showServerError(
url, url,
L10().serverError, L10().serverError,
@ -322,7 +345,6 @@ class InvenTreeModel {
); );
return false; return false;
} }
lastReload = DateTime.now(); lastReload = DateTime.now();
@ -337,6 +359,13 @@ class InvenTreeModel {
var url = path.join(URL, pk.toString()); 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("/")) { if (!url.endsWith("/")) {
url += "/"; url += "/";
} }
@ -396,6 +425,11 @@ class InvenTreeModel {
} }
Future<InvenTreeModel?> get(int pk, {Map<String, String> filters = const {}}) async { Future<InvenTreeModel?> get(int pk, {Map<String, String> filters = const {}}) async {
if (pk < 0) {
return null;
}
return getModel(pk.toString(), filters: filters); return getModel(pk.toString(), filters: filters);
} }

View File

@ -109,13 +109,13 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
@override @override
Future<void> request(BuildContext context) async { Future<void> request(BuildContext context) async {
final bool result = await item.reload();
stockShowHistory = await InvenTreeSettingsManager().getValue(INV_STOCK_SHOW_HISTORY, false) as bool; 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 // Could not load this stock item for some reason
// Perhaps it has been depleted? // Perhaps it has been depleted?
if (!result || item.pk == -1) { if (!result) {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }

View File

@ -31,7 +31,9 @@ class _StockNotesState extends RefreshableState<StockNotesWidget> {
@override @override
Future<void> request(BuildContext context) async { Future<void> request(BuildContext context) async {
await item.reload(); if (item.pk > 0) {
await item.reload();
}
} }
@override @override