source: package_branches/invirt-web/cherrypy-rebased/code/webcommon.py @ 2678

Last change on this file since 2678 was 1644, checked in by broder, 15 years ago

I still want to see all VMs, even the ones without an ACL

File size: 1.3 KB
Line 
1"""Exceptions for the web interface."""
2
3import time
4from invirt import database
5from invirt.database import Machine, MachineAccess
6
7import controls
8
9def cachedproperty(func):
10    name = '__cache_' + func.__name__ + '_' + str(id(func))
11    def getter(self):
12        try:
13            return getattr(self, name)
14        except AttributeError:
15            value = func(self)
16            setattr(self, name, value)
17            return value
18    return property(getter)
19
20class State(object):
21    """State for a request"""
22    def __init__(self, user, isadmin=False):
23        self.username = user
24        self.isadmin = isadmin
25
26    def getMachines(self):
27        if self.isadmin:
28            return Machine.query().all()
29        else:
30            return Machine.query().join('acl').filter_by(user=self.username)
31
32    machines = cachedproperty(getMachines)
33    xmlist_raw = cachedproperty(lambda self: controls.getList())
34    xmlist = cachedproperty(lambda self:
35                                dict((m, self.xmlist_raw[m.name])
36                                     for m in self.machines
37                                     if m.name in self.xmlist_raw))
38
39    def clear(self):
40        """Clear the state so future accesses reload it."""
41        for attr in list(self.__dict__):
42            if attr.startswith('__cache_'):
43                delattr(self, attr)
Note: See TracBrowser for help on using the repository browser.