From 37e0d00dfc5b644d298815f12bce9772c5117752 Mon Sep 17 00:00:00 2001 From: Megan Henning <meganhenning@flywheel.io> Date: Fri, 30 Sep 2016 10:53:58 -0500 Subject: [PATCH] Add endpoint to recalc all projects --- api/api.py | 1 + api/dao/containerstorage.py | 35 ++++++++++++++++++++------------ api/handlers/containerhandler.py | 4 ++-- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/api/api.py b/api/api.py index c51c2708..454490bd 100644 --- a/api/api.py +++ b/api/api.py @@ -172,6 +172,7 @@ routes = [ webapp2.Route(_format(r'/api/users/<uid:{user_id_re}>/<cont_name:{cont_name_re}>'), containerhandler.ContainerHandler, name='user_conts', handler_method='get_all_for_user', methods=['GET']), webapp2.Route(r'/api/projects/groups', containerhandler.ContainerHandler, handler_method='get_groups_with_project', methods=['GET']), + webapp2.Route(r'/api/projects/recalc', containerhandler.ContainerHandler, handler_method='calculate_project_compliance', methods=['POST']), webapp2.Route(_format(r'/api/projects/<cid:{cid_re}>/template'), containerhandler.ContainerHandler, handler_method='set_project_template', methods=['POST']), webapp2.Route(_format(r'/api/projects/<cid:{cid_re}>/template/recalc'), containerhandler.ContainerHandler, handler_method='calculate_project_compliance', methods=['POST']), diff --git a/api/dao/containerstorage.py b/api/dao/containerstorage.py index cf1218ca..2b8d91c6 100644 --- a/api/dao/containerstorage.py +++ b/api/dao/containerstorage.py @@ -166,20 +166,29 @@ class ProjectStorage(ContainerStorage): def __init__(self): super(ProjectStorage,self).__init__('projects', use_object_id=True) - def recalc_sessions_compliance(self, project_id): - project = self.get_container(project_id, get_children=True) - if not project: - raise APINotFoundException('Could not find project {}'.format(project_id)) - template = json.loads(project.get('template',{})) - if not template: - return + def recalc_sessions_compliance(self, project_id=None): + if project_id is None: + # Recalc all projects + projects = self.get_all_el({'template': {'$exists': True}}, None, None) else: - changed_sessions = [] - session_storage = SessionStorage() - for s in project.get('sessions', []): - changed = session_storage.recalc_session_compliance(s['_id'], session=s, template=template) - if changed: - changed_sessions.append(s['_id']) + project = self.get_container(project_id, get_children=True) + if project: + projects = [project] + else: + raise APINotFoundException('Could not find project {}'.format(project_id)) + changed_sessions = [] + + for project in projects: + template = json.loads(project.get('template',{})) + if not template: + return + else: + session_storage = SessionStorage() + for s in project.get('sessions', []): + changed = session_storage.recalc_session_compliance(s['_id'], session=s, template=template) + if changed: + changed_sessions.append(s['_id']) + return changed_sessions class SessionStorage(ContainerStorage): diff --git a/api/handlers/containerhandler.py b/api/handlers/containerhandler.py index ee44a4b6..aebc7c43 100644 --- a/api/handlers/containerhandler.py +++ b/api/handlers/containerhandler.py @@ -509,10 +509,10 @@ class ContainerHandler(base.RequestHandler): self.abort(404, 'Could not find project {}'.format(project_id)) def calculate_project_compliance(self, **kwargs): - project_id = kwargs.pop('cid') + project_id = kwargs.pop('cid', None) self.config = self.container_handler_configurations['projects'] self.storage = self.config['storage'] - return {'sessions_changed': self.storage.recalc_sesssions_compliance(project_id)} + return {'sessions_changed': self.storage.recalc_sessions_compliance(project_id=project_id)} def _get_validators(self): mongo_schema_uri = validators.schema_uri('mongo', self.config.get('storage_schema_file')) -- GitLab