Avoid per-request global state.
[invirt/packages/invirt-web.git] / code / webcommon.py
index ee9bb73..9a9453a 100644 (file)
@@ -36,20 +36,21 @@ def cachedproperty(func):
             return value
     return property(getter)
 
-class Global(object):
-    """Global state of the system, to avoid duplicate remctls to get state"""
+class State(object):
+    """State for a request"""
     def __init__(self, user):
-        self.user = user
+        self.username = user
 
     machines = cachedproperty(lambda self:
-                                  Machine.query().join('acl').select_by(user=self.user))
+                                  Machine.query().join('acl').select_by(user=self.username))
+    xmlist_raw = cachedproperty(lambda self: controls.getList())
     xmlist = cachedproperty(lambda self:
-                                controls.getList(self.machines))
+                                dict((m, self.xmlist_raw[m.name])
+                                     for m in self.machines
+                                     if m.name in self.xmlist_raw))
 
     def clear(self):
         """Clear the state so future accesses reload it."""
         for attr in list(self.__dict__):
             if attr.startswith('__cache_'):
                 delattr(self, attr)
-
-g = Global(None)