source: trunk/packages/invirt-web/code/webcommon.py @ 1613

Last change on this file since 1613 was 1612, checked in by broder, 16 years ago

Move CodeError? and InvalidInput? into invirt.common

File size: 1.5 KB
RevLine 
[209]1"""Exceptions for the web interface."""
2
[535]3import time
[874]4from invirt import database
[864]5from invirt.database import Machine, MachineAccess
[209]6
7import controls
8
[261]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
[572]20class State(object):
21    """State for a request"""
[867]22    def __init__(self, user, isadmin=False):
[572]23        self.username = user
[867]24        self.isadmin = isadmin
[209]25
[632]26    def getMachines(self):
[867]27        if self.isadmin:
[1169]28            return Machine.query().join('acl').filter(
29                database.or_(MachineAccess.user==self.username,
30                             Machine.adminable==True))
[632]31        else:
[1001]32            return Machine.query().join('acl').filter_by(user=self.username)
[632]33
34    machines = cachedproperty(getMachines)
[554]35    xmlist_raw = cachedproperty(lambda self: controls.getList())
[535]36    xmlist = cachedproperty(lambda self:
[554]37                                dict((m, self.xmlist_raw[m.name])
38                                     for m in self.machines
39                                     if m.name in self.xmlist_raw))
[535]40
[209]41    def clear(self):
42        """Clear the state so future accesses reload it."""
[264]43        for attr in list(self.__dict__):
[261]44            if attr.startswith('__cache_'):
[209]45                delattr(self, attr)
Note: See TracBrowser for help on using the repository browser.