X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/e37dd15bbf8683bab8454ea0eec8e9968ce982b2..2be0969e153ace507ec07b27d156b50e54e00f94:/code/webcommon.py diff --git a/code/webcommon.py b/code/webcommon.py index 4b58e6b..0697a53 100644 --- a/code/webcommon.py +++ b/code/webcommon.py @@ -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)