From 56553a70a1e5a92f1e06febf0b19c931ab632f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Tue, 26 May 2020 21:29:39 +0200 Subject: [PATCH] minor fixes for 2.2 version --- server/src/uds/REST/methods/services_pools.py | 204 +++++++++--------- server/src/uds/REST/model.py | 24 ++- server/src/uds/models/CalendarAction.py | 3 +- server/src/uds/web/views/index.py | 11 +- 4 files changed, 137 insertions(+), 105 deletions(-) diff --git a/server/src/uds/REST/methods/services_pools.py b/server/src/uds/REST/methods/services_pools.py index 24fccb0a..80eb207c 100644 --- a/server/src/uds/REST/methods/services_pools.py +++ b/server/src/uds/REST/methods/services_pools.py @@ -92,6 +92,10 @@ class ServicesPools(ModelHandler): custom_methods = [('setFallbackAccess', True), ('actionsList', True)] + def getItems(self, *args, **kwargs): + return super(ServicesPools, self).getItems(overview=kwargs.get('overview', True), prefetch=['service', 'service__provider', 'servicesPoolGroup', 'image', 'tags']) + # return super(ServicesPools, self).getItems(overview) + def item_as_dict(self, item): summary = 'summarize' in self._params # if item does not have an associated service, hide it (the case, for example, for a removed service) @@ -162,106 +166,106 @@ class ServicesPools(ModelHandler): g = self.addDefaultFields([], ['name', 'short_name', 'comments', 'tags']) for f in [{ - 'name': 'service_id', - 'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([gui.choiceItem(v.uuid, v.provider.name + '\\' + v.name) for v in Service.objects.all()]), - 'label': ugettext('Base service'), - 'tooltip': ugettext('Service used as base of this service pool'), - 'type': gui.InputField.CHOICE_TYPE, - 'rdonly': True, - 'order': 100, # Ensueres is At end - }, { - 'name': 'osmanager_id', - 'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([gui.choiceItem(v.uuid, v.name) for v in OSManager.objects.all()]), - 'label': ugettext('OS Manager'), - 'tooltip': ugettext('OS Manager used as base of this service pool'), - 'type': gui.InputField.CHOICE_TYPE, - 'rdonly': True, - 'order': 101, - }, { - 'name': 'show_transports', - 'value': True, - 'label': ugettext('Show transports'), - 'tooltip': ugettext('If active, alternative transports for user will be shown'), - 'type': gui.InputField.CHECKBOX_TYPE, - 'order': 110, - 'tab': ugettext('Advanced'), - }, { - 'name': 'allow_users_remove', - 'value': False, - 'label': ugettext('Allow removal by users'), - 'tooltip': ugettext('If active, the user will be allowed to remove the service "manually". Be careful with this, because the user will have the "power" to delete it\'s own service'), - 'type': gui.InputField.CHECKBOX_TYPE, - 'order': 111, - 'tab': ugettext('Advanced'), - }, { - 'name': 'allow_users_reset', - 'value': False, - 'label': ugettext('Allow reset by users'), - 'tooltip': ugettext('If active, the user will be allowed to reset the service'), - 'type': gui.InputField.CHECKBOX_TYPE, - 'order': 112, - 'tab': ugettext('Advanced'), - }, { - 'name': 'ignores_unused', - 'value': False, - 'label': ugettext('Ignores unused'), - 'tooltip': ugettext('If the option is enabled, UDS will not attempt to detect and remove the user services assigned but not in use.'), - 'type': gui.InputField.CHECKBOX_TYPE, - 'order': 113, - 'tab': ugettext('Advanced'), - }, { - 'name': 'image_id', - 'values': [gui.choiceImage(-1, '--------', DEFAULT_THUMB_BASE64)] + gui.sortedChoices([gui.choiceImage(v.uuid, v.name, v.thumb64) for v in Image.objects.all()]), - 'label': ugettext('Associated Image'), - 'tooltip': ugettext('Image assocciated with this service'), - 'type': gui.InputField.IMAGECHOICE_TYPE, - 'order': 120, - 'tab': ugettext('Display'), - }, { - 'name': 'servicesPoolGroup_id', - 'values': [gui.choiceImage(-1, _('Default'), DEFAULT_THUMB_BASE64)] + gui.sortedChoices([gui.choiceImage(v.uuid, v.name, v.thumb64) for v in ServicesPoolGroup.objects.all()]), - 'label': ugettext('Pool group'), - 'tooltip': ugettext('Pool group for this pool (for pool classify on display)'), - 'type': gui.InputField.IMAGECHOICE_TYPE, - 'order': 121, - 'tab': ugettext('Display'), - }, { - 'name': 'initial_srvs', - 'value': '0', - 'minValue': '0', - 'label': ugettext('Initial available services'), - 'tooltip': ugettext('Services created initially for this service pool'), - 'type': gui.InputField.NUMERIC_TYPE, - 'order': 130, - 'tab': ugettext('Availability'), - }, { - 'name': 'cache_l1_srvs', - 'value': '0', - 'minValue': '0', - 'label': ugettext('Services to keep in cache'), - 'tooltip': ugettext('Services kept in cache for improved user service assignation'), - 'type': gui.InputField.NUMERIC_TYPE, - 'order': 131, - 'tab': ugettext('Availability'), - }, { - 'name': 'cache_l2_srvs', - 'value': '0', - 'minValue': '0', - 'label': ugettext('Services to keep in L2 cache'), - 'tooltip': ugettext('Services kept in cache of level2 for improved service generation'), - 'type': gui.InputField.NUMERIC_TYPE, - 'order': 132, - 'tab': ugettext('Availability'), - }, { - 'name': 'max_srvs', - 'value': '0', - 'minValue': '1', - 'label': ugettext('Maximum number of services to provide'), - 'tooltip': ugettext('Maximum number of service (assigned and L1 cache) that can be created for this service'), - 'type': gui.InputField.NUMERIC_TYPE, - 'order': 133, - 'tab': ugettext('Availability'), - }]: + 'name': 'service_id', + 'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([gui.choiceItem(v.uuid, v.provider.name + '\\' + v.name) for v in Service.objects.all()]), + 'label': ugettext('Base service'), + 'tooltip': ugettext('Service used as base of this service pool'), + 'type': gui.InputField.CHOICE_TYPE, + 'rdonly': True, + 'order': 100, # Ensueres is At end + }, { + 'name': 'osmanager_id', + 'values': [gui.choiceItem(-1, '')] + gui.sortedChoices([gui.choiceItem(v.uuid, v.name) for v in OSManager.objects.all()]), + 'label': ugettext('OS Manager'), + 'tooltip': ugettext('OS Manager used as base of this service pool'), + 'type': gui.InputField.CHOICE_TYPE, + 'rdonly': True, + 'order': 101, + }, { + 'name': 'show_transports', + 'value': True, + 'label': ugettext('Show transports'), + 'tooltip': ugettext('If active, alternative transports for user will be shown'), + 'type': gui.InputField.CHECKBOX_TYPE, + 'order': 110, + 'tab': ugettext('Advanced'), + }, { + 'name': 'allow_users_remove', + 'value': False, + 'label': ugettext('Allow removal by users'), + 'tooltip': ugettext('If active, the user will be allowed to remove the service "manually". Be careful with this, because the user will have the "power" to delete it\'s own service'), + 'type': gui.InputField.CHECKBOX_TYPE, + 'order': 111, + 'tab': ugettext('Advanced'), + }, { + 'name': 'allow_users_reset', + 'value': False, + 'label': ugettext('Allow reset by users'), + 'tooltip': ugettext('If active, the user will be allowed to reset the service'), + 'type': gui.InputField.CHECKBOX_TYPE, + 'order': 112, + 'tab': ugettext('Advanced'), + }, { + 'name': 'ignores_unused', + 'value': False, + 'label': ugettext('Ignores unused'), + 'tooltip': ugettext('If the option is enabled, UDS will not attempt to detect and remove the user services assigned but not in use.'), + 'type': gui.InputField.CHECKBOX_TYPE, + 'order': 113, + 'tab': ugettext('Advanced'), + }, { + 'name': 'image_id', + 'values': [gui.choiceImage(-1, '--------', DEFAULT_THUMB_BASE64)] + gui.sortedChoices([gui.choiceImage(v.uuid, v.name, v.thumb64) for v in Image.objects.all()]), + 'label': ugettext('Associated Image'), + 'tooltip': ugettext('Image assocciated with this service'), + 'type': gui.InputField.IMAGECHOICE_TYPE, + 'order': 120, + 'tab': ugettext('Display'), + }, { + 'name': 'servicesPoolGroup_id', + 'values': [gui.choiceImage(-1, _('Default'), DEFAULT_THUMB_BASE64)] + gui.sortedChoices([gui.choiceImage(v.uuid, v.name, v.thumb64) for v in ServicesPoolGroup.objects.all()]), + 'label': ugettext('Pool group'), + 'tooltip': ugettext('Pool group for this pool (for pool classify on display)'), + 'type': gui.InputField.IMAGECHOICE_TYPE, + 'order': 121, + 'tab': ugettext('Display'), + }, { + 'name': 'initial_srvs', + 'value': '0', + 'minValue': '0', + 'label': ugettext('Initial available services'), + 'tooltip': ugettext('Services created initially for this service pool'), + 'type': gui.InputField.NUMERIC_TYPE, + 'order': 130, + 'tab': ugettext('Availability'), + }, { + 'name': 'cache_l1_srvs', + 'value': '0', + 'minValue': '0', + 'label': ugettext('Services to keep in cache'), + 'tooltip': ugettext('Services kept in cache for improved user service assignation'), + 'type': gui.InputField.NUMERIC_TYPE, + 'order': 131, + 'tab': ugettext('Availability'), + }, { + 'name': 'cache_l2_srvs', + 'value': '0', + 'minValue': '0', + 'label': ugettext('Services to keep in L2 cache'), + 'tooltip': ugettext('Services kept in cache of level2 for improved service generation'), + 'type': gui.InputField.NUMERIC_TYPE, + 'order': 132, + 'tab': ugettext('Availability'), + }, { + 'name': 'max_srvs', + 'value': '0', + 'minValue': '1', + 'label': ugettext('Maximum number of services to provide'), + 'tooltip': ugettext('Maximum number of service (assigned and L1 cache) that can be created for this service'), + 'type': gui.InputField.NUMERIC_TYPE, + 'order': 133, + 'tab': ugettext('Availability'), + }]: self.addField(g, f) return g diff --git a/server/src/uds/REST/model.py b/server/src/uds/REST/model.py index 89bc3fd6..7adf6b99 100644 --- a/server/src/uds/REST/model.py +++ b/server/src/uds/REST/model.py @@ -732,8 +732,28 @@ class ModelHandler(BaseModelHandler): return method() - def getItems(self, overview=True, *args, **kwargs): - for item in self.model.objects.filter(*args, **kwargs): + def getItems(self, *args, **kwargs): + if 'overview' in kwargs: + overview = kwargs['overview'] + del kwargs['overview'] + else: + overview = False + + if 'prefetch' in kwargs: + prefetch = kwargs['prefetch'] + logger.debug('Prefetching %s', prefetch) + del kwargs['prefetch'] + else: + prefetch = [] + + if 'query' in kwargs: + query = kwargs['query'] + del kwargs['query'] + else: + logger.debug('Args: %s, kwargs: %s', args, kwargs) + query = self.model.objects.filter(*args, **kwargs).prefetch_related(*prefetch) + + for item in query: try: if permissions.checkPermissions(self._user, item, permissions.PERMISSION_READ) is False: continue diff --git a/server/src/uds/models/CalendarAction.py b/server/src/uds/models/CalendarAction.py index 994f59f6..332dd9bd 100644 --- a/server/src/uds/models/CalendarAction.py +++ b/server/src/uds/models/CalendarAction.py @@ -115,7 +115,8 @@ class CalendarAction(UUIDModel): self.service_pool.save() def save(self, *args, **kwargs): - self.next_execution = calendar.CalendarChecker(self.calendar).nextEvent(checkFrom=self.last_execution, startEvent=self.at_start, offset=self.offset) + lastExecution = self.last_execution or getSqlDatetime() + self.next_execution = calendar.CalendarChecker(self.calendar).nextEvent(checkFrom=lastExecution-self.offset, startEvent=self.at_start) + self.offset return UUIDModel.save(self, *args, **kwargs) diff --git a/server/src/uds/web/views/index.py b/server/src/uds/web/views/index.py index 3b9ee6dc..1ffd1007 100644 --- a/server/src/uds/web/views/index.py +++ b/server/src/uds/web/views/index.py @@ -191,10 +191,17 @@ def index(request): else: tbrt = '' + left = '' + # try: + # if svr.max_srvs > 0: + # left = ' (max {})'.format(svr.max_srvs - svr.assignedUserServices().filter(UserServiceManager.getStateFilter()).count()) + # except Exception: + # logger.exception('Error') + services.append({ 'id': 'F' + svr.uuid, - 'name': svr.name, - 'visual_name': svr.visual_name, + 'name': svr.name + left, + 'visual_name': svr.visual_name + left, 'description': svr.comments, 'group': group, 'transports': trans,