Пример #1
0
 def test_actions(self):
     field = FieldConf(datatype="string", id="field", name="Field")
     action1 = Conf(id="action1", name="Action 1", cls="btn", hidden=False)
     action2 = Conf(id="action2", name="Action 2", cls="btn", hidden=True)
     nodes, buttons = SchemaFactory(testform(), [field], [action1, action2],
                                    force=False)
     self.assert_(len(buttons) == 1)
Пример #2
0
    def __init__(self, path, app, rootDef):
        self.__name__ = str(path)
        self.__parent__ = app
        self.id = 0
        # unique root id generated from name . negative integer.
        self.idhash = abs(hash(self.__name__)) * -1
        self.path = path
        self.configuration = rootDef
        self.queryRestraints = {}, {}

        self.meta = Conf(pool_type=rootDef["id"],
                         title=translate(rootDef["name"]),
                         pool_state=1,
                         pool_filename=path,
                         pool_wfa=u"",
                         pool_change=datetime.now(),
                         pool_changedby=u"",
                         pool_create=datetime.now(),
                         pool_createdby=u"")
        self.data = Conf()
        self.files = Conf()

        # load security
        acl = SetupRuntimeAcls(rootDef.acl, self)
        if acl:
            # omit if empty. acls will be loaded from parent object
            self.__acl__ = acl

        self.Signal("init")
Пример #3
0
    def test_newform_noajax(self):
        user = User(u"test")
        user.groups.append("group:manager")
        r = self.root

        view = APIv1(r, self.request)
        view.__configuration__ = lambda: Conf(assets=(), views=())
        view.GetViewConf = lambda: Conf(
            settings={
                "form": {
                    "fields": ("comment", ),
                    "use_ajax": False
                },
                "includeAssets": False
            })

        self.request.POST = {
            "pool_type": "bookmark",
            "link": u"the link",
            "comment": u"some text"
        }
        result = view.newItemForm()
        self.assert_(self.request.response.headers["X-Result"])

        objs = len(r.GetObjsList(fields=["id"]))
        self.request.POST = {
            "pool_type": "bookmark",
            "link": u"the link",
            "comment": u"some text",
            "create$": "1"
        }
        result = view.newItemForm()
        self.assert_(self.request.response.headers["X-Result"])
        self.assert_(result["content"])
        self.assert_(objs + 1 == len(r.GetObjsList(fields=["id"])))
Пример #4
0
 def test_tmplmail(self):
     data = Conf(activationID="1234567890")
     form = Conf(activationUrl="http://123.com", mailtext="header", mailfooter="footer")
     html = render("nive_newsuser:activationmail.pt", {"data": data, "form": form, "view": BaseView(None,None)})
     self.assert_(html)
     self.assert_(html.find(data.activationID)!=-1)
     self.assert_(html.find(form.activationUrl)!=-1)
Пример #5
0
 def test_confencoder(self):
     self.assert_(ConfEncoder().encode(Conf()))
     self.assert_(ConfEncoder().encode(Conf(**{"a": "a", "b": 1})))
     self.assert_(ConfEncoder().encode(ObjectConf()))
     self.assert_(ConfEncoder().encode(
         ObjectConf(**{
             "id": "a",
             "name": "1"
         })))
Пример #6
0
 def GetAdminWidgets(self):
     url = self.FolderUrl(self.context.dataroot)
     confs = [
         Conf(id="admin.root",
              viewmapper=url + "list",
              name=_(u"List users")),
         Conf(id="admin.add", viewmapper=url + "add", name=_(u"Add user"))
     ]
     return confs
Пример #7
0
 def test_replace(self):
     alist = [
         Conf(id="1", value=123),
         Conf(id="2", value=456),
         Conf(id="3", value=789)
     ]
     repl = Conf(id="2", value=999)
     new = ReplaceInListByID(alist, repl)
     self.assert_(new != alist)
     self.assert_(new[1].value == 999)
Пример #8
0
 def setUp(self):
     values = {"name":"user1", 
               "email": "*****@*****.**", 
               "surname": "The", 
               "lastname": "User", 
               "groups": ("here", "there"), 
               "lastlogin": time.time()}
     values2 = {"id": 1, "pool_state": 1}
     self.user = SessionUser("user1", 1, Conf(**values), Conf(**values2))
     pass
Пример #9
0
class DummyText(object):
    useCache = False
    data = Conf(tcache=u"<p>Cached Text</p>", textblock=u"Markdown text!")
    meta = Conf(title=u"")

    def GetID(self):
        return 1

    def HTML(self):
        return u"<p>Text</p>" ""
Пример #10
0
 def __init__(self, values, ident):
     self.id = 0
     self.data = Conf(**values)
     self.meta = Conf()
     self.identity = ident or str(self.id)
     if values.get("groups"):
         groups = tuple(values.get("groups"))
     else:
         groups = (u"group:admin", )
     self.groups = self.data.groups = groups
Пример #11
0
    def test_load(self):
        storage = self.app.Factory(IModuleConf, "persistence")
        self.assert_(storage)
        storage(self.app, Conf(id="test")).Save({
            "title": u"öäüß",
            "something": 123
        })

        values = Conf(id="test")
        storage(self.app, values).Load()
        self.assert_(values["something"] == 123)
        self.assert_(values["title"] == u"öäüß")
Пример #12
0
    def test_renderjson(self):
        user = User(u"test")
        user.groups.append("group:manager")
        view = APIv1(self.root, self.request)
        r = self.root
        objs = r.GetObjs()
        for o in objs:
            r.Delete(o.id, obj=o, user=user)
        o1 = create_bookmark(r, user)
        self.remove.append(o1.id)
        o3 = create_bookmark(r, user)
        self.remove.append(o3.id)

        o2 = create_bookmark(o1, user)
        create_track(o1, user)
        create_track(o1, user)
        create_track(o3, user)

        values = view.subtree()
        self.assert_(self.request.response.status.startswith("400"))

        self.request.POST = {"profile": "none"}
        values = view.subtree()
        self.assert_(self.request.response.status.startswith("400"))

        profile = {
            "descent": ("nive.definitions.IContainer", ),
            "addContext": True
        }
        view.GetViewConf = lambda: Conf(settings=profile)
        values = view.subtree()
        self.assert_(values != {})
        self.assert_(len(values["items"]) == 2)
        self.assert_(len(values["items"][0]["items"]) == 3)

        profile = {
            "descent": ("nive.definitions.IContainer", ),
            "parameter": {
                "pool_type": "bookmark"
            },
            "addContext": True
        }
        view.GetViewConf = lambda: Conf(settings=profile)
        values = view.subtree()
        self.assert_(values != {})
        self.assert_(len(values["items"]) == 2)
        self.assert_(len(values["items"][0]["items"]) == 1)

        view = APIv1(o1, self.request)
        self.request.POST = {"subtree": "0"}
        values = view.subtree()
        self.assert_(values != {})
        self.assert_(values.get("items") == None)
Пример #13
0
class ConfigurationForm(HTMLForm):
    
    actions = [
        Conf(id=u"default",    method="Start",   name=u"Initialize", hidden=True,  css_class=u"",            html=u"", tag=u""),
        Conf(id=u"edit",       method="Update",  name=u"Save",       hidden=False, css_class=u"btn btn-primary",  html=u"", tag=u""),
    ]
    
    def Start(self, action, **kw):
        """
        Initially load data from object. 
        context = obj
        
        returns bool, html
        """
        conf = self.context
        data = {}
        for f in self.GetFields():
            # data
            if f.id in conf:
                if f.datatype=="password":
                    continue
                data[f.id] = conf.get(f.id,"")
        return data!=None, self.Render(data)


    def Update(self, action, **kw):
        """
        Process request data and update object.
        
        returns bool, html
        """
        redirectSuccess = kw.get("redirectSuccess")
        msgs = []
        conf=self.context
        result,data,errors = self.Validate(self.request)
        if result:
            # lookup persistent manager for configuration
            storage = self.app.Factory(IModuleConf, "persistence")
            if storage:
                storage(app=self.app, configuration=conf).Save(data)
                msgs.append(_(u"OK. Data saved."))
            else:
                msgs.append(_(u"No persistent storage for configurations activated. Nothing saved."))
                result = False
            errors=None
            if self.view and redirectSuccess:
                redirectSuccess = self.view.ResolveUrl(redirectSuccess, obj)
                if self.use_ajax:
                    self.view.Relocate(redirectSuccess, messages=msgs)
                else:
                    self.view.Redirect(redirectSuccess, messages=msgs)
        return result, self.Render(data, msgs=msgs, errors=errors)    
Пример #14
0
    def test_actions(self, **kw):
        form = HTMLForm(loadFromType="type1",
                        app=self.app,
                        view=self.view,
                        request=Request())
        form.formUrl = "form/url"
        form.cssID = u"upload"
        form.css_class = u"niveform"

        # create
        form.actions = [
            Conf(
                **{
                    "id": "default",
                    "method": "StartForm",
                    "name": "Initialize",
                    "hidden": True,
                    "description": "",
                    "css_class": "",
                    "html": "",
                    "tag": ""
                }),
            Conf(
                **{
                    "id": "create",
                    "method": "CreateObj",
                    "name": "Create",
                    "hidden": False,
                    "description": "",
                    "css_class": "",
                    "html": "",
                    "tag": ""
                }),
            Conf(
                **{
                    "id": "cancel",
                    "method": "Cancel",
                    "name": "Cancel",
                    "hidden": False,
                    "description": "",
                    "css_class": "",
                    "html": "",
                    "tag": ""
                })
        ]
        form.Setup()
        a = form.GetActions(removeHidden=False)
        self.assert_(len(a) == 3)
        a = form.GetActions(removeHidden=True)
        self.assert_(len(a) == 2)
Пример #15
0
    def delete(self):
        self.ResetFlashMessages()

        class DeleteForm(HTMLForm):
            def Delete(self, action, **kw):
                redirectSuccess = kw.get("redirectSuccess")
                msgs = []
                result, data, errors = self.Validate(self.request)
                if result:
                    obj = self.context
                    user = kw.get("user") or self.view.User()
                    obj = self.context.obj(data.get("id"))
                    if not obj:
                        result = False
                        msgs = [_(u"Object not found")]
                    else:
                        result = self.context.Delete(id, user=user, obj=obj)
                return self._FinishFormProcessing(result, data, msgs, errors,
                                                  **kw)

        form = DeleteForm(view=self)
        form.actions = [
            Conf(id="default",
                 method="StartRequestGET",
                 name=u"Initialize",
                 hidden=True),
            Conf(id="delete",
                 method="Delete",
                 name=_(u"Delete all"),
                 hidden=False),
        ]
        form.fields = [
            FieldConf(id="id",
                      name=u"ids",
                      datatype="number",
                      hidden=True,
                      required=True),
        ]
        form.use_ajax = True
        form.Setup()
        result, data, action = form.Process(redirectSuccess="page_url")
        obj = self.context.obj(self.GetFormValue(u"id"))
        return {
            u"content": data,
            u"result": result,
            u"cmsview": self,
            u"objToDelete": obj,
            u"head": form.HTMLHead()
        }
Пример #16
0
 def test_options(self):
     from nive.components.reform.schema import null
     from nive.definitions import Conf
     field = DummyField()
     widget = self._makeOne(strip=False)
     result = widget.renderOptions(field)
     self.assert_(result)
     widget = self._makeOne(configuration=Conf())
     result = widget.renderOptions(field)
     self.assert_(result)
     opts = {"nothing": "00000"}
     widget = self._makeOne(configuration=Conf(settings={"options":opts}))
     result = widget.renderOptions(field)
     self.assert_(result)
     self.assert_(result.find("nothing")!=-1)
Пример #17
0
    def test_setformfailures(self):
        user = User(u"test")
        user.groups.append("group:manager")
        r = self.root
        o1 = create_bookmark(r, user)
        self.remove.append(o1.id)

        view = APIv1(o1, self.request)
        view.__configuration__ = lambda: Conf(assets=(), views=())

        # wrong subset
        self.request.POST = {
            "subset": "unknown!",
            "pool_type": "bookmark",
            "link": u"the link",
            "comment": u"some text"
        }
        self.assertRaises(ConfigurationError, view.setItemForm)

        # wrong action
        objs = len(r.GetObjsList(fields=["id"]))
        self.request.POST = {
            "pool_type": "bookmark",
            "link": u"the link",
            "comment": u"some text",
            "unknown$": "1"
        }
        result = view.setItemForm()
        self.assert_(self.request.response.headers["X-Result"])
        self.assert_(objs == len(r.GetObjsList(fields=["id"])))
Пример #18
0
    def test_newform(self):
        user = User(u"test")
        user.groups.append("group:manager")
        r = self.root

        view = APIv1(r, self.request)
        view.__configuration__ = lambda: Conf(assets=(), views=())

        self.request.POST = {
            "pool_type": "bookmark",
            "link": u"the link",
            "comment": u"some text"
        }
        result = view.newItemForm()
        self.assert_(self.request.response.headers["X-Result"])

        objs = len(r.GetObjsList(fields=["id"]))
        self.request.POST = {
            "pool_type": "bookmark",
            "link": u"the link",
            "comment": u"some text",
            "create$": "1"
        }
        try:
            view.newItemForm()
        except ExceptionalResponse, result:
            self.assert_(self.request.response.headers["X-Result"])
            self.assert_(objs + 1 == len(r.GetObjsList(fields=["id"])))
Пример #19
0
    def __init__(self, path, app, rootDef):
        self.__name__ = str(path)
        self.__parent__ = app
        self.id = 0 
        # unique root id generated from name . negative integer.
        self.idhash = abs(hash(self.__name__))*-1
        self.path = path
        self.configuration = rootDef
        self.queryRestraints = {}, {}

        self.meta = Conf(pool_type=rootDef["id"], 
                         title=translate(rootDef["name"]), 
                         pool_state=1, 
                         pool_filename=path, 
                         pool_wfa=u"",
                         pool_change=datetime.now(tz=app.pytimezone),
                         pool_changedby=u"",
                         pool_create=datetime.now(tz=app.pytimezone),
                         pool_createdby=u"")
        self.data = Conf()
        self.files = Conf()

        # load security
        acl = SetupRuntimeAcls(rootDef.acl, self)
        if acl:
            # omit if empty. acls will be loaded from parent object
            self.__acl__ = acl

        self.Signal("init")
Пример #20
0
 def test_conf(self):
     view = BaseView(self.context2, self.request)
     self.assertFalse(view.configuration)
     conf = Conf(id="test")
     newcls = DecorateViewClassWithViewModuleConf(conf, BaseView)
     view = newcls(self.context2, self.request)
     self.assert_(view.configuration.id == "test")
Пример #21
0
 def test_user(self):
     u = UserListener()
     u.app = testobj()
     u.app.usercache = SessionUserCache()
     u.identity = "user1"
     u.data = Conf()
     u.id = 1
     u.InvalidateCache()
Пример #22
0
    def test_setform(self):
        user = User(u"test")
        user.groups.append("group:manager")
        r = self.root
        o1 = create_bookmark(r, user)
        self.remove.append(o1.id)

        view = APIv1(o1, self.request)
        view.__configuration__ = lambda: Conf(assets=(), views=())

        self.request.POST = {}
        result = view.setItemForm()
        self.assert_(self.request.response.headers["X-Result"])

        objs = len(r.GetObjsList(fields=["id"]))
        self.request.POST = {
            "link": u"the new link",
            "comment": u"some new text",
            "create$": "1"
        }
        result = view.setItemForm()
        self.assert_(result["content"])
        self.assert_(self.request.response.headers["X-Result"])
        self.assert_(objs == len(r.GetObjsList(fields=["id"])))

        view = APIv1(o1, self.request)
        view.__configuration__ = lambda: Conf(assets=(), views=())
        view.GetViewConf = lambda: Conf(settings=
                                        {"form": {
                                            "fields": ("comment", )
                                        }})

        self.request.POST = {}
        result = view.setItemForm()
        self.assert_(self.request.response.headers["X-Result"])

        objs = len(r.GetObjsList(fields=["id"]))
        self.request.POST = {
            "link": u"the new link",
            "comment": u"some new text",
            "create$": "1"
        }
        result = view.setItemForm()
        self.assert_(result["content"])
        self.assert_(self.request.response.headers["X-Result"])
        self.assert_(objs == len(r.GetObjsList(fields=["id"])))
Пример #23
0
    def test_root(self):
        r = RootListener()
        r.app = testobj()
        r.app.usercache = SessionUserCache()
        user = r.LookupCache(ident="user1", activeOnly=None)
        self.assertFalse(user)
        r.app.usercache.Add(SessionUser("user1", 1, Conf(), Conf()), "user1")
        self.assertRaises(UserFound, r.LookupCache, ident="user1", activeOnly=None)

        u = UserListener()
        u.app = testobj()
        u.app.usercache = SessionUserCache()
        u.identity = "user1"
        u.data = Conf()
        u.id = 1
        sessionuser = r.SessionUserFactory("user1", u)
        self.assert_(sessionuser)
        r.AddToCache(sessionuser)
Пример #24
0
    def __init__(self, path, app, rootDef):
        self.__name__ = str(path)
        self.__parent__ = app
        self.id = 0
        # unique root id generated from name . negative integer.
        self.idhash = abs(hash(self.__name__)) * -1
        self.path = path
        self.configuration = rootDef
        self.queryRestraints = {}, {}

        self.meta = Conf(
            pool_type=rootDef["id"],
            title=rootDef["name"],
            pool_state=1,
            pool_filename=path,
            pool_wfa=u"",
            pool_change=datetime.now())  # set change time to now by default
        self.data = Conf()
        self.Signal("init")
Пример #25
0
class ContactForm(HTMLForm):
    """
    Contact form
    """
    mail = None
    actions = [
        Conf(id="default", method="StartForm", name=u"Initialize",
             hidden=True),
        Conf(id="sendcontact",
             method="SendForm",
             name=u"Send message",
             hidden=False,
             css_class=u"btn btn-info",
             html=u"",
             tag=u""),
    ]

    def SendForm(self, action, **kw):
        """
        Form action: send the message 
        """
        msgs = []
        result, data, errors = self.Validate(self.request)
        if result:
            user = self.view.User()
            try:
                title = data["topic"] + " - " + self.mail.title
            except:
                title = self.mail.title
            body = self.mail(user=user, data=data, view=self.view)
            tool = self.context.app.portal.userdb.GetTool("sendMail")
            result, value = tool(body=body,
                                 title=title,
                                 recvmails=[self.mail.recv],
                                 force=1)
            if not result:
                msgs.append(
                    "Sorry, a error occurred. The email could not be send.")
            else:
                msgs.append("Thanks. We have received your message.")
                return result, self._Msgs(msgs=msgs)
        return result, self.Render(data, msgs=msgs, errors=errors)
Пример #26
0
 def SessionUserFactory(self, ident, user):
     fields = ("name", "email", "surname", "lastname", "groups", "notify",
               "lastlogin")
     data = Conf()
     for f in fields:
         data[f] = user.data.get(f)
     data.lock()
     fields = ("id", "title", "pool_state")
     meta = Conf()
     for f in fields:
         meta[f] = user.data.get(f)
     meta.lock()
     su = SessionUser(ident, user.id, data, meta)
     return su
Пример #27
0
    def test_setupacls(self):
        acl = [("Allow", "group:reader", "read",
                lambda context: context.pool_state)]

        a = SetupRuntimeAcls(acl, Conf(pool_state=1))
        self.assert_(len(a) == 1)
        self.assert_(len(a[0]) == 3)

        a = SetupRuntimeAcls(acl, Conf(pool_state=0))
        self.assert_(len(a) == 0)

        def check(context):
            return context.pool_state

        acl = [("Allow", "group:reader", "read", check)]

        a = SetupRuntimeAcls(acl, Conf(pool_state=1))
        self.assert_(len(a) == 1)
        self.assert_(len(a[0]) == 3)

        a = SetupRuntimeAcls(acl, Conf(pool_state=0))
        self.assert_(len(a) == 0)
Пример #28
0
    def test_newform_assets(self):
        user = User(u"test")
        user.groups.append("group:manager")
        r = self.root

        view = APIv1(r, self.request)
        view.__configuration__ = lambda: Conf(assets=(("jquery.js", "path"), ),
                                              views=())

        self.request.POST = {"assets": "only"}
        result = view.newItemForm()
        self.assert_(result["content"])
        self.assert_(result["content"].find("<form") == -1)
Пример #29
0
 def SessionUserFactory(self, ident, user):
     default = ("id", "title", "pool_state", "name", "email", "surname",
                "lastname", "groups", "notify", "lastlogin")
     fields = self.app.configuration.get("sessionuser") or default
     data = Conf()
     meta = Conf()
     app = self.app
     for f in fields:
         if app.GetMetaFld(f):
             meta[f] = user.meta.get(f)
         else:
             data[f] = user.data.get(f)
     data.lock()
     meta.lock()
     return SessionUser(ident, user.id, data, meta)
Пример #30
0
    def __init__(self, configuration=None):
        """
        Events:
        - init(configuration)
        """
        self.components = []
        self.groups = [
            Conf(id=u"authenticated", name=_(u"Authenticated"), visible=True)
        ]
        self.__acl__ = [(Allow, "group:admin", ALL_PERMISSIONS)]

        self.configuration = configuration or PortalConf()

        self.Signal("init", configuration=self.configuration)
Пример #31
0
class DummyNewsuser(object):
    useCache = False
    id=123
    configuration =  newsuser.configuration
    data = Conf(mailtitle=u"a mail", mailtext=u"contact mail", mailfooter=u"no one", newsgroup=u"one.com", notify=1)
    meta = Conf(title=u"a form")
    frontendCodepage = ""
    def GetID(self):
        return 1
    def root(self):
        return self
    def LoadListItems(self, field, context):
        return []
    @property
    def app(self):
        return self
    def GetTool(self, name):
        class DummyTool(object):
            def __call__(self, **kw):
                return True, "value"
        return DummyTool()
    def QueryConfByName(self, a, b):
        return self
Пример #32
0
    def __init__(self, path, app, rootDef):
        self.__name__ = str(path)
        self.__parent__ = app
        self.id = 0 
        # unique root id generated from name . negative integer.
        self.idhash = abs(hash(self.__name__))*-1
        self.path = path
        self.configuration = rootDef
        self.queryRestraints = {}, {}

        self.meta = Conf(pool_type=rootDef["id"], 
                         title=rootDef["name"], 
                         pool_state=1, 
                         pool_filename=path, 
                         pool_wfa=u"",
                         pool_change=datetime.now()) # set change time to now by default
        self.data = Conf()
        self.Signal("init")
Пример #33
0
 def SessionUserFactory(self, ident, user):
     fields = ("name", "email", "surname", "lastname", "groups", "notify", "lastlogin")
     data = Conf()
     for f in fields:
         data[f] = user.data.get(f)
     data.lock()
     fields = ("id", "title", "pool_state")
     meta = Conf()
     for f in fields:
         meta[f] = user.data.get(f)
     meta.lock()
     su = SessionUser(ident, user.id, data, meta)
     return su
Пример #34
0
 def SessionUserFactory(self, ident, user):
     default = ("id", "title", "pool_state", "name", "email", "surname", "lastname", "groups", "notify", "lastlogin")
     fields = self.app.configuration.get("sessionuser") or default
     data = Conf()
     meta = Conf()
     app = self.app
     for f in fields:
         if app.GetMetaFld(f):
             meta[f] = user.meta.get(f)
         else:
             data[f] = user.data.get(f)
     data.lock()
     meta.lock()
     return SessionUser(ident, user.id, data, meta)
Пример #35
0
class Root(object):
    """
    The root is a container for objects but does not store any data in the database itself. It
    is the entry point for object access. Roots are only handled by the application. 

    Requires (Container, ContainerFactory, Event)
    """
    
    def __init__(self, path, app, rootDef):
        self.__name__ = str(path)
        self.__parent__ = app
        self.id = 0 
        # unique root id generated from name . negative integer.
        self.idhash = abs(hash(self.__name__))*-1
        self.path = path
        self.configuration = rootDef
        self.queryRestraints = {}, {}

        self.meta = Conf(pool_type=rootDef["id"], 
                         title=translate(rootDef["name"]), 
                         pool_state=1, 
                         pool_filename=path, 
                         pool_wfa=u"",
                         pool_change=datetime.now(tz=app.pytimezone),
                         pool_changedby=u"",
                         pool_create=datetime.now(tz=app.pytimezone),
                         pool_createdby=u"")
        self.data = Conf()
        self.files = Conf()

        # load security
        acl = SetupRuntimeAcls(rootDef.acl, self)
        if acl:
            # omit if empty. acls will be loaded from parent object
            self.__acl__ = acl

        self.Signal("init")


    # Properties -----------------------------------------------------------

    @property
    def dataroot(self):
        """ this will return itself. Used for object compatibility. """
        return self

    @property
    def app(self):
        """ returns the cms application the root is used for """
        return self.__parent__

    @property
    def db(self):
        """ returns the datapool object """
        return self.app.db

    @property
    def parent(self):
        """ this will return None. Used for object compatibility. """
        return None

    # Object Lookup -----------------------------------------------------------

    def LookupObj(self, id, **kw):
        """
        Lookup the object referenced by id *anywhere* in the tree structure. Use obj() to 
        restrain lookup to the first sublevel only. ::
        
            id = number
            **kw = version information
        
        returns the object or None
        """
        try:
            id = long(id)
        except:
            return None
        if id <= 0:
            return self
        if not id:
            return None
            #raise Exception, "NotFound"

        # proxy object
        if kw.has_key("proxyObj") and kw["proxyObj"]:
            obj = self._GetObj(id, parentObj = kw["proxyObj"], **kw)
            if not obj:
                raise ContainmentError, "Proxy object not found"
            return obj

        # load tree structure
        path = self.app.db.GetParentPath(id)
        if path is None:
            return None
            #raise Exception, "NotFound"
        
        # check and adjust root id
        if hasattr(self, "rootID"):
            if self.rootID in path:
                path = path[path.index(self.rootID)+1:]
        if hasattr(self.app, "rootID"):
            if self.app.rootID in path:
                path = path[path.index(self.app.rootID)+1:]

        # reverse lookup of object tree. loads all parent objs.
        path.append(id)
        #opt
        obj = self
        for id in path:
            if id == self.id:
                continue
            obj = obj._GetObj(id, **kw)
            if not obj:
                return None
                #raise Exception, "NotFound"
        return obj


    def ObjQueryRestraints(self, containerObj=None, parameter=None, operators=None):
        """
        The functions returns two dictionaries (parameter, operators) used to restraint
        object lookup in subtree. For example a restraint can be set to ignore all
        objects with meta.pool_state=0. All container get (GetObj, GetObjs, ...) functions 
        use query restraints internally. 
        
        See `nive.search` for parameter and operator usage.
        
        Please note: Setting the wrong values for query restraints can easily crash 
        the application. 
        
        Event:
        - loadRestraints(parameter, operators)
        
        returns parameter dict, operators dict
        """
        p, o = self.queryRestraints
        if parameter:
            parameter.update(p)
            if operators:
                operators.update(o)
            else:
                operators = o.copy()
        else:
            parameter=p.copy()
            operators=o.copy()
        self.Signal("loadRestraints", parameter=parameter, operators=operators)
        return parameter, operators


    # Values ------------------------------------------------------

    def GetID(self):
        """ returns 0. the root id is always zero. """
        return self.id

    def GetTypeID(self):
        """ returns the root type id from configuration """
        return self.configuration.id

    def GetTypeName(self):
        """ returns the root type name from configuration """
        return self.configuration.name

    def GetFieldConf(self, fldId):
        """
        Get the FieldConf for the field with id = fldId. Looks up data, file and meta
        fields.

        returns FieldConf or None
        """
        for f in self.configuration["data"]:
            if f["id"] == fldId:
                return f
        return self.app.GetMetaFld(fldId)

    def GetTitle(self):
        """ returns the root title from configuration. """
        return self.meta.get("title","")

    def GetPath(self):
        """ returns the url path name as string. """
        return self.__name__


    # Parents ----------------------------------------------------

    def IsRoot(self):
        """ returns always True. """
        return True

    def GetParents(self):
        """ returns empty list. Used for object compatibility. """
        return []

    def GetParentIDs(self):
        """ returns empty list. Used for object compatibility. """
        return []

    def GetParentTitles(self):
        """ returns empty list. Used for object compatibility. """
        return []

    def GetParentPaths(self):
        """ returns empty list. Used for object compatibility. """
        return []


    # tools ----------------------------------------------------

    def GetTool(self, name):
        """
        Load a tool in the roots' context. Only works for tools registered for roots or this root type. ::
            
            returns the tool object or None
        
        Event
        - loadToool(tool=toolObj)
        """
        t = self.app.GetTool(name, self)
        self.Signal("loadTool", tool=t)
        return t


    def Close(self):
        """
        Close the root and all contained objects. Currently only used in combination with caches.
        
        Event
        - close()
        """
        self.Signal("close")
        if ICache.providedBy(self):
            #opt
            for o in self.GetAllFromCache():
                o.Close()
        return

    # to be removed in future versions --------------------------------------------

    def root(self):
        """
        bw 0.9.12: use dataroot property instead! 
        this will return itself. Used for object compatibility. 
        """
        return self

    def GetRoot(self):
        """bw 0.9.12: to be removed. returns self. """
        return self

    def GetApp(self):
        """bw 0.9.12: to be removed. returns the cms application. """
        return self.app

    def GetParent(self):
        """bw 0.9.12: to be removed. returns None. """
        return None