2
0
mirror of https://github.com/inventree/inventree-app.git synced 2025-04-29 14:06:47 +00:00

Merge branch 'master' into create-part

This commit is contained in:
Oliver 2021-08-09 12:37:30 +10:00
commit f8e007e07d
8 changed files with 75 additions and 28 deletions

View File

@ -1,6 +1,11 @@
## InvenTree App Release Notes ## InvenTree App Release Notes
--- ---
### 0.4.3 - August 2021
---
- Multiple bug fixes, mostly related to API calls
### 0.4.2 - August 2021 ### 0.4.2 - August 2021
--- ---

View File

@ -6,8 +6,8 @@ export "COCOAPODS_PARALLEL_CODE_SIGN=true"
export "FLUTTER_TARGET=lib\main.dart" export "FLUTTER_TARGET=lib\main.dart"
export "FLUTTER_BUILD_DIR=build" export "FLUTTER_BUILD_DIR=build"
export "SYMROOT=${SOURCE_ROOT}/../build\ios" export "SYMROOT=${SOURCE_ROOT}/../build\ios"
export "FLUTTER_BUILD_NAME=0.4.2" export "FLUTTER_BUILD_NAME=0.4.3"
export "FLUTTER_BUILD_NUMBER=24" export "FLUTTER_BUILD_NUMBER=25"
export "DART_OBFUSCATION=false" export "DART_OBFUSCATION=false"
export "TRACK_WIDGET_CREATION=false" export "TRACK_WIDGET_CREATION=false"
export "TREE_SHAKE_ICONS=false" export "TREE_SHAKE_ICONS=false"

View File

@ -23,7 +23,7 @@ import 'package:inventree/widget/snacks.dart';
*/ */
class APIResponse { class APIResponse {
APIResponse({this.url = "", this.method = "", this.statusCode = -1, this.data = const {}}); APIResponse({this.url = "", this.method = "", this.statusCode = -1, this.error = "", this.data = const {}});
int statusCode = -1; int statusCode = -1;
@ -31,6 +31,10 @@ class APIResponse {
String method = ""; String method = "";
String error = "";
String errorDetail = "";
dynamic data = {}; dynamic data = {};
// Request is "valid" if a statusCode was returned // Request is "valid" if a statusCode was returned
@ -430,9 +434,13 @@ class InvenTreeAPI {
return true; return true;
} }
List<String> perms = List.from(roles[role]); try {
List<String> perms = List.from(roles[role]);
return perms.contains(permission); return perms.contains(permission);
} catch (error, stackTrace) {
sentryReportError(error, stackTrace);
return true;
}
} }
@ -450,6 +458,7 @@ class InvenTreeAPI {
return new APIResponse( return new APIResponse(
url: url, url: url,
method: 'PATCH', method: 'PATCH',
error: "HttpClientRequest is null"
); );
} }
@ -487,6 +496,9 @@ class InvenTreeAPI {
if (response.statusCode >= 500) { if (response.statusCode >= 500) {
// Server error // Server error
if (response.statusCode >= 500) { if (response.statusCode >= 500) {
var data = await response.stream.bytesToString();
sentryReportMessage( sentryReportMessage(
"Server error on file upload", "Server error on file upload",
context: { context: {
@ -494,6 +506,7 @@ class InvenTreeAPI {
"statusCode": "${response.statusCode}", "statusCode": "${response.statusCode}",
"response": response.toString(), "response": response.toString(),
"request": request.fields.toString(), "request": request.fields.toString(),
"data": data,
} }
); );
} }
@ -667,34 +680,43 @@ class InvenTreeAPI {
} else { } else {
response.data = await responseToJson(_response) ?? {}; response.data = await responseToJson(_response) ?? {};
// Expected status code not returned if (statusCode != null) {
if ((statusCode != null) && (statusCode != _response.statusCode)) {
showStatusCodeError(_response.statusCode);
}
// Report any server errors // Expected status code not returned
if (_response.statusCode >= 500) { if (statusCode != _response.statusCode) {
sentryReportMessage( showStatusCodeError(_response.statusCode);
"Server error", }
context: {
"url": request.uri.toString(), // Report any server errors
"method": request.method, if (_response.statusCode >= 500) {
"statusCode": _response.statusCode.toString(), sentryReportMessage(
"requestHeaders": request.headers.toString(), "Server error",
"responseHeaders": _response.headers.toString(), context: {
"responseData": response.data.toString(), "url": request.uri.toString(),
} "method": request.method,
); "statusCode": _response.statusCode.toString(),
"requestHeaders": request.headers.toString(),
"responseHeaders": _response.headers.toString(),
"responseData": response.data.toString(),
}
);
}
} }
} }
} on SocketException catch (error) { } on SocketException catch (error) {
showServerError(L10().connectionRefused, error.toString()); showServerError(L10().connectionRefused, error.toString());
response.error = "SocketException";
response.errorDetail = error.toString();
} on TimeoutException { } on TimeoutException {
showTimeoutError(); showTimeoutError();
response.error = "TimeoutException";
} catch (error, stackTrace) { } catch (error, stackTrace) {
showServerError(L10().serverError, error.toString()); showServerError(L10().serverError, error.toString());
sentryReportError(error, stackTrace); sentryReportError(error, stackTrace);
response.error = "UnknownError";
response.errorDetail = error.toString();
} }
return response; return response;
@ -754,6 +776,7 @@ class InvenTreeAPI {
return new APIResponse( return new APIResponse(
url: url, url: url,
method: 'GET', method: 'GET',
error: "HttpClientRequest is null",
); );
} }

View File

@ -114,6 +114,8 @@ class BarcodeHandler {
"url": url, "url": url,
"statusCode": response.statusCode.toString(), "statusCode": response.statusCode.toString(),
"valid": response.isValid().toString(), "valid": response.isValid().toString(),
"error": response.error,
"errorDetail": response.errorDetail,
} }
); );
} else if (response.data.containsKey('error')) { } else if (response.data.containsKey('error')) {

View File

@ -162,6 +162,8 @@ class InvenTreeModel {
"statusCode": response.statusCode.toString(), "statusCode": response.statusCode.toString(),
"data": response.data?.toString() ?? "null", "data": response.data?.toString() ?? "null",
"valid": response.isValid().toString(), "valid": response.isValid().toString(),
"error": response.error,
"errorDetail": response.errorDetail,
} }
); );
@ -230,7 +232,9 @@ class InvenTreeModel {
"url": url, "url": url,
"statusCode": response.statusCode.toString(), "statusCode": response.statusCode.toString(),
"data": response.data?.toString() ?? "null", "data": response.data?.toString() ?? "null",
"valid": response.isValid().toString() "valid": response.isValid().toString(),
"error": response.error,
"errorDetail": response.errorDetail,
} }
); );
@ -270,6 +274,8 @@ class InvenTreeModel {
"statusCode": response.statusCode.toString(), "statusCode": response.statusCode.toString(),
"data": response.data?.toString() ?? "null", "data": response.data?.toString() ?? "null",
"valid": response.isValid().toString(), "valid": response.isValid().toString(),
"error": response.error,
"errorDetail": response.errorDetail,
} }
); );

@ -1 +1 @@
Subproject commit dd16aa783769f261d73cb42ea70a831ddde04086 Subproject commit c19a9d9af449f6a36df780c69cf1bd2bb087c252

View File

@ -10,6 +10,9 @@ import 'package:inventree/api.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:inventree/inventree/part.dart'; import 'package:inventree/inventree/part.dart';
import 'package:inventree/widget/refreshable_state.dart'; import 'package:inventree/widget/refreshable_state.dart';
import 'package:inventree/widget/snacks.dart';
import '../l10.dart';
class PartImageWidget extends StatefulWidget { class PartImageWidget extends StatefulWidget {
@ -43,7 +46,11 @@ class _PartImageState extends RefreshableState<PartImageWidget> {
if (pickedImage != null) { if (pickedImage != null) {
File? img = File(pickedImage.path); File? img = File(pickedImage.path);
await part.uploadImage(img); final result = await part.uploadImage(img);
if (!result) {
showSnackIcon(L10().uploadFailed, success: false);
}
refresh(); refresh();
} }
@ -58,7 +65,11 @@ class _PartImageState extends RefreshableState<PartImageWidget> {
if (pickedImage != null) { if (pickedImage != null) {
File? img = File(pickedImage.path); File? img = File(pickedImage.path);
await part.uploadImage(img); final result = await part.uploadImage(img);
if (!result) {
showSnackIcon(L10().uploadFailed, success: false);
}
refresh(); refresh();
} }

View File

@ -7,7 +7,7 @@ description: InvenTree stock management
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 0.4.2+24 version: 0.4.3+25
environment: environment:
sdk: ">=2.12.0 <3.0.0" sdk: ">=2.12.0 <3.0.0"