From 349eca4533044d8b6aad214155df2623164175bd Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 9 May 2022 20:51:27 +1000 Subject: [PATCH 1/5] Save datetime since last reload --- lib/inventree/model.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index c39da8fe..c18882e2 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -44,6 +44,9 @@ class InvenTreeModel { // Construct an InvenTreeModel from a JSON data object InvenTreeModel.fromJson(this.jsondata); + // Update whenever the model is loaded from the server + DateTime? lastReload; + // Override the endpoint URL for each subclass String get URL => ""; @@ -287,6 +290,8 @@ class InvenTreeModel { } + lastReload = DateTime.now(); + jsondata = response.asMap(); return true; @@ -357,6 +362,8 @@ class InvenTreeModel { } + lastReload = DateTime.now(); + return createFromJson(response.asMap()); } From da3b668e8c74b5a0a6ebe1672964dbbada0e05cd Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 9 May 2022 20:53:12 +1000 Subject: [PATCH 2/5] Adds class representing global and user settings --- lib/inventree/model.dart | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index c18882e2..b196691f 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -572,6 +572,50 @@ class InvenTreePlugin extends InvenTreeModel { } +/* + * Class representing a 'setting' object on the InvenTree server. + * There are two sorts of settings available from the server, via the API: + * - GlobalSetting (applicable to all users) + * - UserSetting (applicable only to the current user) + */ +class InvenTreeGlobalSetting extends InvenTreeModel { + + InvenTreeGlobalSetting() : super(); + + InvenTreeGlobalSetting.fromJson(Map json) : super.fromJson(json); + + @override + InvenTreeGlobalSetting createFromJson(Map json) { + return InvenTreeGlobalSetting.fromJson(json); + } + + @override + String get URL => "settings/global/"; + + String get key => (jsondata["key"] ?? "") as String; + + String get value => (jsondata["value"] ?? "") as String; + + String get type => (jsondata["type"] ?? "") as String; + +} + +class InvenTreeUserSetting extends InvenTreeGlobalSetting { + + InvenTreeUserSetting() : super(); + + InvenTreeUserSetting.fromJson(Map json) : super.fromJson(json); + + @override + InvenTreeGlobalSetting createFromJson(Map json) { + return InvenTreeGlobalSetting.fromJson(json); + } + + @override + String get URL => "settings/user/"; +} + + class InvenTreeAttachment extends InvenTreeModel { // Class representing an "attachment" file InvenTreeAttachment() : super(); From 059b69ce99a41cd89a0dd743ac41620648e8b888 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 9 May 2022 21:41:34 +1000 Subject: [PATCH 3/5] Adds code to requeest global setting from server - Settings are individually cached for 5 minutes - For now, use it for the purchase order reference prefix --- lib/api.dart | 36 ++++++++++++++++++++++++++- lib/inventree/model.dart | 14 ++++++++++- lib/widget/paginator.dart | 1 - lib/widget/purchase_order_detail.dart | 8 ++++-- lib/widget/purchase_order_list.dart | 9 +++++-- 5 files changed, 61 insertions(+), 7 deletions(-) diff --git a/lib/api.dart b/lib/api.dart index ee8a6132..20cd3b18 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -452,6 +452,10 @@ class InvenTreeAPI { _connecting = false; _token = ""; profile = null; + + // Clear received settings + _globalSettings.clear(); + _userSettings.clear(); } Future connectToServer() async { @@ -488,7 +492,9 @@ class InvenTreeAPI { return _connected; } - + /* + * Request the user roles (permissions) from the InvenTree server + */ Future getUserRoles() async { roles.clear(); @@ -1143,4 +1149,32 @@ class InvenTreeAPI { cacheManager: manager, ); } + + bool get supportsSettings => isConnected() && apiVersion >= 45; + + // Keep a record of which settings we have received from the server + Map _globalSettings = {}; + Map _userSettings = {}; + + Future getGlobalSetting(String key) async { + + if (!supportsSettings) return ""; + + InvenTreeGlobalSetting? setting = _globalSettings[key]; + + if ((setting != null) && setting.reloadedWithin(Duration(minutes: 5))) { + return setting.value; + } + + final response = await InvenTreeGlobalSetting().getModel(key); + + if (response is InvenTreeGlobalSetting) { + response.lastReload = DateTime.now(); + _globalSettings[key] = response; + return response.value; + } else { + return ""; + } + } + } diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index b196691f..1d13d175 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -47,6 +47,14 @@ class InvenTreeModel { // Update whenever the model is loaded from the server DateTime? lastReload; + bool reloadedWithin(Duration d) { + if (lastReload == null) { + return false; + } else { + return lastReload!.add(d).isAfter(DateTime.now()); + } + } + // Override the endpoint URL for each subclass String get URL => ""; @@ -320,7 +328,7 @@ class InvenTreeModel { } // Return the detail view for the associated pk - Future get(int pk, {Map filters = const {}}) async { + Future getModel(String pk, {Map filters = const {}}) async { var url = path.join(URL, pk.toString()); @@ -367,6 +375,10 @@ class InvenTreeModel { return createFromJson(response.asMap()); } + Future get(int pk, {Map filters = const {}}) async { + return getModel(pk.toString(), filters: filters); + } + Future create(Map data) async { if (data.containsKey("pk")) { diff --git a/lib/widget/paginator.dart b/lib/widget/paginator.dart index c3343a77..f1bfbc85 100644 --- a/lib/widget/paginator.dart +++ b/lib/widget/paginator.dart @@ -44,7 +44,6 @@ class PaginatedSearchState extends State { Future requestPage(int limit, int offset, Map params) async { - print("Blank request page"); // Default implementation returns null - must be overridden return null; } diff --git a/lib/widget/purchase_order_detail.dart b/lib/widget/purchase_order_detail.dart index 2a657ec0..27486969 100644 --- a/lib/widget/purchase_order_detail.dart +++ b/lib/widget/purchase_order_detail.dart @@ -37,6 +37,8 @@ class _PurchaseOrderDetailState extends RefreshableState L10().purchaseOrder; @@ -61,6 +63,9 @@ class _PurchaseOrderDetailState extends RefreshableState request(BuildContext context) async { + + _poPrefix = await InvenTreeAPI().getGlobalSetting("PURCHASEORDER_REFERENCE_PREFIX"); + await order.reload(); lines = await order.getLineItems(); @@ -72,7 +77,6 @@ class _PurchaseOrderDetailState extends RefreshableState editOrder(BuildContext context) async { @@ -93,7 +97,7 @@ class _PurchaseOrderDetailState extends RefreshableState filters) : super(filters); + // Purchase order prefix + String _poPrefix = ""; + @override Future requestPage(int limit, int offset, Map params) async { + _poPrefix = await InvenTreeAPI().getGlobalSetting("PURCHASEORDER_REFERENCE_PREFIX"); + params["outstanding"] = "true"; final page = await InvenTreePurchaseOrder().listPaginated(limit, offset, filters: params); @@ -72,9 +77,9 @@ class _PaginatedPurchaseOrderListState extends PaginatedSearchState Date: Mon, 9 May 2022 21:42:46 +1000 Subject: [PATCH 4/5] Adds code for requesting user settings --- lib/api.dart | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/api.dart b/lib/api.dart index 20cd3b18..861ed820 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -1157,7 +1157,6 @@ class InvenTreeAPI { Map _userSettings = {}; Future getGlobalSetting(String key) async { - if (!supportsSettings) return ""; InvenTreeGlobalSetting? setting = _globalSettings[key]; @@ -1177,4 +1176,24 @@ class InvenTreeAPI { } } + Future getUserSetting(String key) async { + if (!supportsSettings) return ""; + + InvenTreeUserSetting? setting = _userSettings[key]; + + if ((setting != null) && setting.reloadedWithin(Duration(minutes: 5))) { + return setting.value; + } + + final response = await InvenTreeGlobalSetting().getModel(key); + + if (response is InvenTreeUserSetting) { + response.lastReload = DateTime.now(); + _userSettings[key] = response; + return response.value; + } else { + return ""; + } + } + } From 97ee07741905442a773221ead784d2d05cf4dc04 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 9 May 2022 21:46:29 +1000 Subject: [PATCH 5/5] Require API version 46 --- lib/api.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/api.dart b/lib/api.dart index 861ed820..04377b97 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -1150,7 +1150,7 @@ class InvenTreeAPI { ); } - bool get supportsSettings => isConnected() && apiVersion >= 45; + bool get supportsSettings => isConnected() && apiVersion >= 46; // Keep a record of which settings we have received from the server Map _globalSettings = {};