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)
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")
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"])))
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)
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" })))
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
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)
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
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>" ""
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
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"öäüß")
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)
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)
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)
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() }
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)
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"])))
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"])))
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")
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")
def test_user(self): u = UserListener() u.app = testobj() u.app.usercache = SessionUserCache() u.identity = "user1" u.data = Conf() u.id = 1 u.InvalidateCache()
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"])))
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)
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")
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)
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
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)
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)
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)
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)
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
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")
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