Switch to unified view

a/Allura/allura/lib/utils.py b/Allura/allura/lib/utils.py
...
...
7
from pylons import response
7
from pylons import response
8
from pkg_resources import iter_entry_points
8
from pkg_resources import iter_entry_points
9
from paste.httpheaders import CACHE_CONTROL, EXPIRES
9
from paste.httpheaders import CACHE_CONTROL, EXPIRES
10
10
11
from ming.utils import LazyProperty
11
from ming.utils import LazyProperty
12
13
class exceptionless(object):
14
    '''Decorator making the decorated function return 'error_result' on any
15
    exceptions rather than propagating exceptions up the stack
16
    '''
17
18
    def __init__(self, error_result, log=None):
19
        self.error_result = error_result
20
        self.log = log
21
22
    def __call__(self, fun):
23
        fname = 'exceptionless(%s)' % fun.__name__
24
        def inner(*args, **kwargs):
25
            try:
26
                return fun(*args, **kwargs)
27
            except:
28
                if self.log:
29
                    self.log.exception('Error calling %s', fname)
30
                return self.error_result
31
        inner.__name__ = fname
32
        return inner
33
12
34
def cache_forever():
13
def cache_forever():
35
    headers = [
14
    headers = [
36
        (k,v) for k,v in response.headers.items()
15
        (k,v) for k,v in response.headers.items()
37
        if k.lower() not in ('pragma', 'cache-control') ]
16
        if k.lower() not in ('pragma', 'cache-control') ]
...
...
107
        record.kwpairs = ','.join(
86
        record.kwpairs = ','.join(
108
            '%s=%s' % (k,v) for k,v in sorted(kwpairs.iteritems())
87
            '%s=%s' % (k,v) for k,v in sorted(kwpairs.iteritems())
109
            if v is not None)
88
            if v is not None)
110
        record.exc_info = None # Never put tracebacks in the rtstats log
89
        record.exc_info = None # Never put tracebacks in the rtstats log
111
        WatchedFileHandler.emit(self, record)
90
        WatchedFileHandler.emit(self, record)
112
113
def task(func):
114
    '''Decorator to add some methods to task functions'''
115
    def post(*args, **kwargs):
116
        from allura import model as M
117
        return M.MonQTask.post(func, *args, **kwargs)
118
    func.post = post
119
    return func
120
121
_event_listeners = None
122
def event_listeners(event_type):
123
    global _event_listeners
124
    if _event_listeners is None:
125
        l = defaultdict(list)
126
        for ep in iter_entry_points('allura'):
127
            tool = ep.load()
128
            for name, listeners in tool.event_listeners:
129
                _event_listeners[name] += listeners
130
        _event_listeners = l
131
    return _event_listeners[event_type]