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