summaryrefslogtreecommitdiff
path: root/repoze/bfg/zodb.py
blob: c13d5fc58c205f5a3a514daaf0b96f16dc668aea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from zope.interface import implements

from repoze.zodbconn.middleware import get_conn

from repoze.bfg.interfaces import IPolicy

class ZODBGetitemPolicy:

    implements(IPolicy)

    def __init__(self, dbname, prefix=()):
        self.dbname = dbname
        self.prefix = prefix
        self.get_conn = get_conn
        
    def __call__(self, environ):
        conn = self.get_conn(environ, self.dbname)
        if conn is None:
            raise ValueError('No such connection %s' % self.dbname)

        path = environ['PATH_INFO'].split('/')
        path = list(self.prefix) + path
        
        ob = conn.open()

        name = ''
        while path:
            element = path.pop(0)
            try:
                ob = ob[element]
            except AttributeError, what:
                raise AttributeError(str(what[0]) + ' (element: '+element+')')
            except KeyError:
                if path:
                    name = path.pop(0)
                break

        return ob, name, path