main.fcgi: usage, fix a bit of spacing
[invirt/packages/invirt-web.git] / code / webcommon.py
index 4b58e6b..7410523 100644 (file)
@@ -1,26 +1,8 @@
 """Exceptions for the web interface."""
 
-from sipb_xen_database import Machine, MachineAccess
-
-class MyException(Exception):
-    """Base class for my exceptions"""
-    pass
-
-class InvalidInput(MyException):
-    """Exception for user-provided input is invalid but maybe in good faith.
-
-    This would include setting memory to negative (which might be a
-    typo) but not setting an invalid boot CD (which requires bypassing
-    the select box).
-    """
-    def __init__(self, err_field, err_value, expl=None):
-        MyException.__init__(self, expl)
-        self.err_field = err_field
-        self.err_value = err_value
-
-class CodeError(MyException):
-    """Exception for internal errors or bad faith input."""
-    pass
+import time
+from invirt import database
+from invirt.database import Machine, MachineAccess
 
 import controls
 
@@ -35,21 +17,27 @@ def cachedproperty(func):
             return value
     return property(getter)
 
-class Global(object):
-    """Global state of the system, to avoid duplicate remctls to get state"""
-    def __init__(self, user):
-        self.user = user
-    
-    machines = cachedproperty(lambda self: 
-                             [ma.machine for ma in 
-                              MachineAccess.select_by(user=self.user)])
-    uptimes = cachedproperty(lambda self: 
-                             controls.getUptimes(self.machines))
+class State(object):
+    """State for a request"""
+    def __init__(self, user, isadmin=False):
+        self.username = user
+        self.isadmin = isadmin
+
+    def getMachines(self):
+        if self.isadmin:
+            return Machine.query().all()
+        else:
+            return Machine.query().join('acl').filter_by(user=self.username)
+
+    machines = cachedproperty(getMachines)
+    xmlist_raw = cachedproperty(lambda self: controls.getList())
+    xmlist = cachedproperty(lambda self:
+                                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)