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