def getContent(req, ids): user = users.getUserFromRequest(req) access = AccessData(req) node = tree.getNode(ids[0]) if "sortfiles" in users.getHideMenusForUser(user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") c = getCollection(node) if "globalsort" in req.params: c.set("sortfield", req.params["globalsort"]) collection_sortfield = c.get("sortfield") class SortChoice: def __init__(self, label, value): self.label = label self.value = value sortfields = [SortChoice(t(req, "off"), "")] for ntype, num in c.getAllOccurences(AccessData(req)).items(): if ntype.getSortFields(): for sortfield in ntype.getSortFields(): sortfields += [SortChoice(sortfield.getLabel(), sortfield.getName())] sortfields += [SortChoice(sortfield.getLabel() + t(req, "descending"), "-" + sortfield.getName())] break return req.getTAL("web/edit/modules/sortfiles.html", {"node": node, "collection_sortfield": collection_sortfield, "sortchoices": sortfields, "name": c.getName()}, macro="edit_sortfiles")
def getContent(req, ids): user = users.getUserFromRequest(req) access = AccessData(req) language = lang(req) node = tree.getNode(ids[0]) if "sort" in users.getHideMenusForUser(user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") msg_t = (user.getName(), node.id, node.name, node.type, req.params) msg = "%s sorting subfolders of node %r (%r, %r): %r" % msg_t logger.info(msg) if "order" in req.params: # do reorder ids = req.params.get('order').split(',') children = [] for n in ids: child = tree.getNode(n) child.setOrderPos(ids.index(n)) children.append(child) req.writeTAL('web/edit/modules/subfolder.html', {'nodelist': children, "language": language}, macro="ordered_list") return "" elif "sortdirection" in req.params: # do automatic re-order i = 0 sort_dir = "" if req.params.get("sortdirection", "up") == "up" else "-" sorted_children = node.getContainerChildren().sort_by_fields(sort_dir + req.params.get("sortattribute")) for child in sorted_children: child.setOrderPos(i) i += 1 req.writeTAL('web/edit/modules/subfolder.html', {'nodelist': sorted_children, "language": language}, macro="ordered_list") return "" nodelist = [] attributes = [] fields = {} i = 0 for child in list(node.getContainerChildren().sort_by_orderpos()): i += 1 # count container children nodelist.append(child) if getMetaType(child.getSchema()): for field in getMetaType(child.getSchema()).getMetaFields(): if not field in fields.keys(): fields[field] = 0 fields[field] += 1 for field in fields: if i == fields[field]: attributes.append(field) ctx = { "node": node, "nodelist": nodelist, "sortattributes": sorted(attributes, lambda x, y: cmp(x.getLabel().lower(), y.getLabel().lower())), "language": language, } return req.getTAL("web/edit/modules/subfolder.html", ctx, macro="edit_subfolder")
def objlist(req): node = tree.getNode(req.params["id"]) access = AccessData(req) if node.id==tree.getRoot().id or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") return req.getTAL("web/edit/modules/license.html", {"node":node}, macro="edit_license")
def getContent(req, ids): user = users.getUserFromRequest(req) access = AccessData(user=user) language = lang(req) node = tree.getNode(ids[0]) if not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get("upload")=="uploadfile": # try to import file return import_new(req) v = {"error":req.params.get("error")} class SortChoice: def __init__(self, label, value): self.label = label self.value = value col = node if "globalsort" in req.params: col.set("sortfield", req.params.get("globalsort")) v['collection_sortfield'] = col.get("sortfield") sortfields = [SortChoice(t(req,"off"),"")] if col.type not in ["root", "collections", "home"]: for ntype, num in col.getAllOccurences(acl.AccessData(req)).items(): if ntype.getSortFields(): for sortfield in ntype.getSortFields(): sortfields += [SortChoice(sortfield.getLabel(), sortfield.getName())] sortfields += [SortChoice(sortfield.getLabel()+t(req,"descending"), "-"+sortfield.getName())] break v['sortchoices'] = sortfields v['ids'] = ids v['count'] = len(node.getContentChildren()) v['nodelist'] = showdir(req, node) v['language'] = lang(req) v['t'] = t _html = req.getTAL("web/edit/modules/imports.html", v, macro="upload_form") return _html
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) access = AccessData(req) nodes = [] for id in ids: if not access.hasWriteAccess(tree.getNode(id)): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") nodes += [tree.getNode(id)] if "classes" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") v = {} v["basedirs"] = [tree.getRoot('home'), tree.getRoot('collections')] id = req.params.get("id", tree.getRoot().id) v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s'" % (id, id) v["idstr"] = ",".join(ids) v["nodes"] = nodes v["t"] = t v["language"] = lang(req) return req.getTAL("web/edit/modules/classes.html", v, macro="classtree")
def getContent(req, ids): user = users.getUserFromRequest(req) publishdir = tree.getNode(ids[0]) explicit = tree.getNodesByAttribute("writeaccess", user.getName()) ret = "" actionerror = [] changes = [] if "dopublish" in req.params.keys(): access = AccessData(req) objlist = [] for key in req.params.keys(): if key.isdigit(): objlist.append(key) src = tree.getNode(req.params.get("id")) for obj_id in objlist: faultylist = [] obj = tree.getNode(obj_id) for mask in obj.getType().getMasks( type="edit"): # check required fields if access.hasReadAccess(mask) and mask.getName() == obj.get( "edit.lastmask"): for f in mask.validateNodelist([obj]): faultylist.append(f) if len(faultylist) > 0: # object faulty actionerror.append(obj_id) continue for dest_id in req.params.get("destination", "").split(","): if dest_id == "": # no destination given continue dest = tree.getNode(dest_id) if dest != src and access.hasReadAccess( src) and access.hasWriteAccess( dest) and access.hasWriteAccess( obj) and isDirectory(dest): if not nodeIsChildOfNode(dest, obj): dest.addChild(obj) src.removeChild(obj) if dest.id not in changes: changes.append(dest.id) if src.id not in changes: changes.append(src.id) log.info( "%s published %s (%r, %r) from src %s (%r, %r) to dest %s (%r, %r)" % ( user.getName(), obj.id, obj.name, obj.type, src.id, src.name, src.type, dest.id, dest.name, dest.type, )) else: actionerror.append(obj.id) log.error( "Error in publishing of node %r: Destination node %r is child of node." % (obj_id, dest.id)) if not access.hasReadAccess(src): log.error( "Error in publishing of node %r: source position %r has no read access." % (obj.id, src.id)) if not access.hasWriteAccess(dest): log.error( "Error in publishing of node %r: destination %r has no write access." % (obj.id, dest.id)) if not access.hasWriteAccess(obj): log.error( "Error in publishing of node %r: object has no write access." % obj.id) if not isDirectory(dest): log.error( "Error in publishing of node %r: destination %r is not a directory." % (obj.id, dest.id)) v = {} v["id"] = publishdir.id v["change"] = changes ret += req.getTAL("web/edit/modules/publish.html", v, macro="reload") # build normal window stddir = "" stdname = "" l = [] for n in explicit: if str(getHomeDir(user).id) != str(n): l.append(n) if len(l) == 1: stddir = str(l[0]) + "," stdname = "- " + tree.getNode(l[0]).getName() #v = {"id":publishdir.id,"stddir":stddir, "stdname":stdname, "showdir":showdir(req, publishdir, publishwarn=0, markunpublished=1, nodes=[])} v = { "id": publishdir.id, "stddir": stddir, "stdname": stdname, "showdir": showdir(req, publishdir, publishwarn=None, markunpublished=1, nodes=[]) } v["basedir"] = tree.getRoot('collections') v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s'" % ( publishdir.id, publishdir.id) v["idstr"] = ids v["faultylist"] = actionerror ret += req.getTAL("web/edit/modules/publish.html", v, macro="publish_form") return ret
def action(req): global editModules access = AccessData(req) language = lang(req) user = users.getUserFromRequest(req) trashdir = users.getTrashDir(user) uploaddir = users.getUploadDir(user) faultydir = users.getFaultyDir(user) importdir = users.getImportDir(user) trashdir_parents = trashdir.getParents() action = req.params.get("action", "") changednodes = {} if not access.user.isEditor(): req.write("""permission denied""") req.setStatus(httpstatus.HTTP_FORBIDDEN) return if "tab" in req.params: tab = req.params.get("tab").split("_")[-1] return editModules[tab].getContent(req, [req.params.get("id")]) if action == "getlabels": nids = req.params.get("ids", []) nids = [nid.strip() for nid in nids.split(",") if nid.strip()] for nid in set(nids + [_n.id for _n in [trashdir, uploaddir, importdir, faultydir]]): try: changednodes[nid] = getTreeLabel(tree.getNode(nid), lang=language) except: msg = "could not make fancytree label for node %r" % nid logger.error(msg) res_dict = {"changednodes": changednodes} req.write(json.dumps(res_dict, indent=4)) return else: # all 'action's except 'getlabels' require a base dir (src) srcid = req.params.get("src") try: src = tree.getNode(srcid) except: req.writeTAL("web/edit/edit.html", {"edit_action_error": srcid}, macro="edit_action_error") return if req.params.get("action") == "addcontainer": node = tree.getNode(srcid) if not access.hasWriteAccess(node): # deliver errorlabel req.writeTALstr('<tal:block i18n:translate="edit_nopermission"/>', {}) return # create new container newnode_type = req.params.get("type") if newnode_type in ["bare_collection", "bare_directory"]: newnode_type = newnode_type.replace("bare_", "") translated_label = t(lang(req), "edit_add_" + newnode_type) if translated_label.startswith("edit_add_"): translated_label = t(lang(req), "edit_add_container_default") + newnode_type newnode = node.addChild(tree.Node(name=translated_label, type=newnode_type)) newnode.set("creator", user.getName()) newnode.set("creationtime", str(time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime(time.time())))) clearFromCache(node) req.params["dest"] = newnode.id # try: # label = newnode.getLabel() # except: # label = newnode.getName() # # c = len(newnode.getContentChildren()) # if c>0: # label += ' <small>(%s)</small>' %(c) label = getTreeLabel(newnode, lang=language) fancytree_nodedata = { "title": label, "key": newnode.id, "isLazy": False, "isFolder": True, "icon": getEditorIconPath(newnode), "readonly": 0, "tooltip": "%s (%s)" % (label, newnode.id), "children": [], } req.write(json.dumps(fancytree_nodedata)) msg = "%s adding new container %r (%r) to %r (%r, %r)" % ( access.user.name, newnode.id, newnode.type, node.id, node.name, node.type, ) logging.getLogger("usertracing").info(msg) logger.info(msg) return try: destid = req.params.get("dest", None) dest = tree.getNode(destid) folderid = destid except: destid = None dest = None folderid = srcid idlist = getIDs(req) mysrc = None errorobj = None # try: if action == "clear_trash": for n in trashdir.getChildren(): # if trashdir is it's sole parent, remove file from disk # attn: this will not touch files from children of deleted # containers if len(n.getParents()) == 1: logger.info( "%s going to remove files from disk for node %r (%r, %r)" % (user.getName(), n.id, n.name, n.type) ) for f in n.getFiles(): # dangerous ??? check this f_path = f.retrieveFile() if os.path.exists(f_path): logger.info("%s going to remove file %r from disk" % (user.getName(), f_path)) os.remove(f_path) trashdir.removeChild(n) dest = trashdir clearFromCache(trashdir) changednodes[trashdir.id] = 1 _parent_descr = [(p.name, p.id, p.type) for p in trashdir_parents] msg = "%s cleared trash folder with id %s, child of %r" % (user.getName(), trashdir.id, _parent_descr) logger.info(msg) logging.getLogger("usertracing").info(msg) # return else: for id in idlist: obj = tree.getNode(id) mysrc = src if isDirectory(obj): mysrc = obj.getParents()[0] if action == "delete": if access.hasWriteAccess(mysrc) and access.hasWriteAccess(obj): if mysrc.id != trashdir.id: mysrc.removeChild(obj) changednodes[mysrc.id] = 1 trashdir.addChild(obj) changednodes[trashdir.id] = 1 clearFromCache(mysrc) logger.info( "%s moved to trash bin %s (%r, %r) from %s (%r, %r)" % (user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type) ) logging.getLogger("usertracing").info( "%s removed %s (%r, %r) from %s (%r, %r)" % (user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type) ) dest = mysrc else: logger.info("%s has no write access for node %s" % (user.getName(), mysrc.id)) req.writeTALstr('<tal:block i18n:translate="edit_nopermission"/>', {}) dest = mysrc elif action in ["move", "copy"]: if ( dest != mysrc and access.hasWriteAccess(mysrc) and access.hasWriteAccess(dest) and access.hasWriteAccess(obj) and isDirectory(dest) ): if not nodeIsChildOfNode(dest, obj): if action == "move": mysrc.removeChild(obj) changednodes[mysrc.id] = 1 # getLabel(mysrc) dest.addChild(obj) changednodes[dest.id] = 1 # getLabel(dest) clearFromCache(dest) _what = "%s %s %r (%r, %r) " % (access.user.name, action, obj.id, obj.name, obj.type) _from = "from %r (%r, %r) " % (mysrc.id, mysrc.name, mysrc.type) _to = "to %r (%r, %r)" % (dest.id, dest.name, dest.type) msg = _what + _from + _to logging.getLogger("usertracing").info(msg) logger.info(msg) else: logger.error( "%s could not %s %s from %s to %s" % (user.getName(), action, obj.id, mysrc.id, dest.id) ) else: return mysrc = None if not mysrc: mysrc = src if action in ["move", "copy", "delete", "clear_trash"]: for nid in changednodes: try: changednodes[nid] = getTreeLabel(tree.getNode(nid), lang=language) except: msg = "could not make fancytree label for node %r" % nid logger.error(msg) res_dict = {"changednodes": changednodes} req.write(json.dumps(res_dict, indent=4)) else: try: req.write(dest.id) except: req.write("no-node-id-specified (web.edit.edit.action)") logger.warning("no-node-id-specified (web.edit.edit.action)") return
def edit_tree(req): access = AccessData(req) language = lang(req) user = users.getUserFromRequest(req) home_dir = users.getHomeDir(user) match_result = "" match_error = False if req.params.get("key") == "root": nodes = core.tree.getRoot("collections").getContainerChildren().sort_by_orderpos() elif req.params.get("key") == "home": if not user.isAdmin(): nodes = [home_dir] else: homenodefilter = req.params.get("homenodefilter", "") if homenodefilter: nodes = [] try: pattern = re.compile(homenodefilter) nodes = tree.getRoot("home").getContainerChildren().sort_by_orderpos() # filter out shoppingbags etc. nodes = [n for n in nodes if n.isContainer()] # filter user name - after first "(" nodes = filter(lambda n: re.match(homenodefilter, n.getLabel(language).split("(", 1)[-1]), nodes) match_result = "#=%d" % len(nodes) except Exception as e: logger.warning("pattern matching for home nodes: %r" % e) match_result = '<span style="color:red">Error: %r</span>' % str(e) match_error = True if home_dir not in nodes: if not match_error: match_result = "#=%d+1" % len(nodes) nodes.append(home_dir) nodes = tree.NodeList(nodes).sort_by_orderpos() else: nodes = [home_dir] else: nodes = core.tree.getNode(req.params.get("key")).getContainerChildren().sort_by_orderpos() # filter out shoppingbags etc. nodes = [n for n in nodes if n.isContainer()] data = [] # wn 2014-03-14 # special directories may be handled in a special way by the editor special_dir_ids = {} special_dir_ids[home_dir.id] = "userhomedir" for dir_type in ["upload", "import", "faulty", "trash"]: special_dir_ids[users.getSpecialDir(user, dir_type).id] = dir_type spec_dirs = ["userhomedir", "upload", "import", "faulty", "trash"] spec_dir_icons = ["homeicon.gif", "uploadicon.gif", "importicon.gif", "faultyicon.gif", "trashicon.gif"] for node in nodes: if not access.hasReadAccess(node): continue # try: # label = node.getLabel() # except: # label = node.getName() # # c = len(node.getContentChildren()) # if c>0: # label += ' <small>(%s)</small>' %(c) label = getTreeLabel(node, lang=language) nodedata = { "title": label, "key": node.id, "lazy": True, "folder": True, "readonly": 0, "tooltip": "%s (%s)" % (node.getLabel(lang=language), node.id), } nodedata["icon"] = getEditorIconPath(node, req) if len(node.getContainerChildren()) == 0: nodedata["lazy"] = False nodedata["children"] = [] if not access.hasWriteAccess(node): if req.params.get("key") == "home": continue nodedata["readonly"] = 1 nodedata["noLink"] = True nodedata["extraClasses"] = "readonly" # fancytree else: nodedata["readonly"] = 0 nodedata["this_node_is_special"] = [] if node.id in special_dir_ids: nodedata["this_node_is_special"] = nodedata["this_node_is_special"] + [special_dir_ids[node.id]] if node.id == home_dir.id: nodedata["match_result"] = match_result data.append(nodedata) return req.write(json.dumps(data, indent=4))
def action(req): global editModules access = AccessData(req) language = lang(req) user = users.getUserFromRequest(req) trashdir = users.getTrashDir(user) uploaddir = users.getUploadDir(user) faultydir = users.getFaultyDir(user) importdir = users.getImportDir(user) trashdir_parents = trashdir.getParents() action = req.params.get("action", "") changednodes = {} if not access.user.isEditor(): req.write("""permission denied""") req.setStatus(httpstatus.HTTP_FORBIDDEN) return if "tab" in req.params: tab = req.params.get("tab").split("_")[-1] return editModules[tab].getContent(req, [req.params.get("id")]) if action == "getlabels": nids = req.params.get('ids', []) nids = [nid.strip() for nid in nids.split(',') if nid.strip()] for nid in set(nids + [_n.id for _n in [trashdir, uploaddir, importdir, faultydir]]): try: changednodes[nid] = getTreeLabel( tree.getNode(nid), lang=language) except: msg = "could not make fancytree label for node %r" % nid logger.error(msg) res_dict = {'changednodes': changednodes} req.write(json.dumps(res_dict, indent=4)) return else: # all 'action's except 'getlabels' require a base dir (src) srcid = req.params.get("src") try: src = tree.getNode(srcid) except: req.writeTAL( "web/edit/edit.html", {"edit_action_error": srcid}, macro="edit_action_error") return if req.params.get('action') == 'addcontainer': node = tree.getNode(srcid) if not access.hasWriteAccess(node): # deliver errorlabel req.writeTALstr( '<tal:block i18n:translate="edit_nopermission"/>', {}) return # create new container newnode_type = req.params.get('type') if newnode_type in ['bare_collection', 'bare_directory']: newnode_type = newnode_type.replace('bare_', '') translated_label = t(lang(req), 'edit_add_' + newnode_type) if translated_label.startswith('edit_add_'): translated_label = t( lang(req), 'edit_add_container_default') + newnode_type newnode = node.addChild( tree.Node(name=translated_label, type=newnode_type)) newnode.set("creator", user.getName()) newnode.set("creationtime", str( time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime(time.time())))) clearFromCache(node) req.params["dest"] = newnode.id # try: # label = newnode.getLabel() # except: # label = newnode.getName() # # c = len(newnode.getContentChildren()) # if c>0: # label += ' <small>(%s)</small>' %(c) label = getTreeLabel(newnode, lang=language) fancytree_nodedata = { 'title': label, 'key': newnode.id, 'isLazy': False, 'isFolder': True, 'icon': getEditorIconPath(newnode), 'readonly': 0, 'tooltip': '%s (%s)' % (label, newnode.id), 'children': [], } req.write(json.dumps(fancytree_nodedata)) msg = "%s adding new container %r (%r) to %r (%r, %r)" % ( access.user.name, newnode.id, newnode.type, node.id, node.name, node.type) logging.getLogger('usertracing').info(msg) logger.info(msg) return try: destid = req.params.get("dest", None) dest = tree.getNode(destid) folderid = destid except: destid = None dest = None folderid = srcid idlist = getIDs(req) mysrc = None errorobj = None # try: if action == "clear_trash": for n in trashdir.getChildren(): # if trashdir is it's sole parent, remove file from disk # attn: this will not touch files from children of deleted # containers if len(n.getParents()) == 1: logger.info("%s going to remove files from disk for node %r (%r, %r)" % ( user.getName(), n.id, n.name, n.type)) for f in n.getFiles(): # dangerous ??? check this f_path = f.retrieveFile() if os.path.exists(f_path): logger.info( "%s going to remove file %r from disk" % (user.getName(), f_path)) os.remove(f_path) trashdir.removeChild(n) dest = trashdir clearFromCache(trashdir) changednodes[trashdir.id] = 1 _parent_descr = [(p.name, p.id, p.type) for p in trashdir_parents] msg = "%s cleared trash folder with id %s, child of %r" % ( user.getName(), trashdir.id, _parent_descr) logger.info(msg) logging.getLogger('usertracing').info(msg) # return else: for id in idlist: obj = tree.getNode(id) mysrc = src if isDirectory(obj): mysrc = obj.getParents()[0] if action == "delete": if access.hasWriteAccess(mysrc) and access.hasWriteAccess(obj): if mysrc.id != trashdir.id: mysrc.removeChild(obj) changednodes[mysrc.id] = 1 trashdir.addChild(obj) changednodes[trashdir.id] = 1 clearFromCache(mysrc) logger.info("%s moved to trash bin %s (%r, %r) from %s (%r, %r)" % ( user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type)) logging.getLogger('usertracing').info("%s removed %s (%r, %r) from %s (%r, %r)" % ( user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type)) dest = mysrc else: logger.info( "%s has no write access for node %s" % (user.getName(), mysrc.id)) req.writeTALstr( '<tal:block i18n:translate="edit_nopermission"/>', {}) dest = mysrc elif action in ["move", "copy"]: if dest != mysrc and \ access.hasWriteAccess(mysrc) and \ access.hasWriteAccess(dest) and \ access.hasWriteAccess(obj) and \ isDirectory(dest): if not nodeIsChildOfNode(dest, obj): if action == "move": mysrc.removeChild(obj) changednodes[mysrc.id] = 1 # getLabel(mysrc) dest.addChild(obj) changednodes[dest.id] = 1 # getLabel(dest) clearFromCache(dest) _what = "%s %s %r (%r, %r) " % ( access.user.name, action, obj.id, obj.name, obj.type) _from = "from %r (%r, %r) " % ( mysrc.id, mysrc.name, mysrc.type) _to = "to %r (%r, %r)" % ( dest.id, dest.name, dest.type) msg = _what + _from + _to logging.getLogger('usertracing').info(msg) logger.info(msg) else: logger.error("%s could not %s %s from %s to %s" % ( user.getName(), action, obj.id, mysrc.id, dest.id)) else: return mysrc = None if not mysrc: mysrc = src if action in ["move", "copy", "delete", "clear_trash"]: for nid in changednodes: try: changednodes[nid] = getTreeLabel( tree.getNode(nid), lang=language) except: msg = "could not make fancytree label for node %r" % nid logger.error(msg) res_dict = {'changednodes': changednodes} req.write(json.dumps(res_dict, indent=4)) else: try: req.write(dest.id) except: req.write('no-node-id-specified (web.edit.edit.action)') logger.warning('no-node-id-specified (web.edit.edit.action)') return
def edit_tree(req): access = AccessData(req) language = lang(req) user = users.getUserFromRequest(req) home_dir = users.getHomeDir(user) match_result = '' match_error = False if req.params.get('key') == 'root': nodes = core.tree.getRoot( 'collections').getContainerChildren().sort_by_orderpos() elif req.params.get('key') == 'home': if not user.isAdmin(): nodes = [home_dir] else: homenodefilter = req.params.get('homenodefilter', '') if homenodefilter: nodes = [] try: pattern = re.compile(homenodefilter) nodes = tree.getRoot('home').getContainerChildren().sort_by_orderpos() # filter out shoppingbags etc. nodes = [n for n in nodes if n.isContainer()] # filter user name - after first "(" nodes = filter(lambda n: re.match(homenodefilter, n.getLabel(language).split('(', 1)[-1]), nodes) match_result = '#=%d' % len(nodes) except Exception as e: logger.warning('pattern matching for home nodes: %r' % e) match_result = '<span style="color:red">Error: %r</span>' % str(e) match_error = True if home_dir not in nodes: if not match_error: match_result = '#=%d+1' % len(nodes) nodes.append(home_dir) nodes = tree.NodeList(nodes).sort_by_orderpos() else: nodes = [home_dir] else: nodes = core.tree.getNode( req.params.get('key')).getContainerChildren().sort_by_orderpos() # filter out shoppingbags etc. nodes = [n for n in nodes if n.isContainer()] data = [] # wn 2014-03-14 # special directories may be handled in a special way by the editor special_dir_ids = {} special_dir_ids[home_dir.id] = 'userhomedir' for dir_type in ['upload', 'import', 'faulty', 'trash']: special_dir_ids[users.getSpecialDir(user, dir_type).id] = dir_type spec_dirs = ['userhomedir', 'upload', 'import', 'faulty', 'trash'] spec_dir_icons = ["homeicon.gif", "uploadicon.gif", "importicon.gif", "faultyicon.gif", "trashicon.gif"] for node in nodes: if not access.hasReadAccess(node): continue # try: # label = node.getLabel() # except: # label = node.getName() # # c = len(node.getContentChildren()) # if c>0: # label += ' <small>(%s)</small>' %(c) label = getTreeLabel(node, lang=language) nodedata = {'title': label, 'key': node.id, 'lazy': True, 'folder': True, 'readonly': 0, 'tooltip': '%s (%s)' % (node.getLabel(lang=language), node.id)} nodedata['icon'] = getEditorIconPath(node, req) if len(node.getContainerChildren()) == 0: nodedata['lazy'] = False nodedata['children'] = [] if not access.hasWriteAccess(node): if req.params.get('key') == 'home': continue nodedata['readonly'] = 1 nodedata['noLink'] = True nodedata['extraClasses'] = 'readonly' # fancytree else: nodedata['readonly'] = 0 nodedata['this_node_is_special'] = [] if node.id in special_dir_ids: nodedata['this_node_is_special'] = nodedata[ 'this_node_is_special'] + [special_dir_ids[node.id]] if node.id == home_dir.id: nodedata['match_result'] = match_result data.append(nodedata) return req.write(json.dumps(data, indent=4))
def getContent(req, ids): node = tree.getNode(ids[0]) user = users.getUserFromRequest(req) access = AccessData(req) if not access.hasWriteAccess( node) or "editor" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get('file') == "config": # configuration file for ckeditor req.reply_headers['Content-Type'] = "application/javascript" return req.writeTAL("web/edit/modules/startpages.html", { 'id': ids[0], 'lang': lang(req) }, macro="ckconfig") if "action" in req.params: if req.params.get('action') == "getfile": # deliver filecontent data = "" for f in [f for f in node.getFiles() if f.mimetype == "text/html"]: filepath = f.retrieveFile().replace( config.get("paths.datadir"), '') if req.params.get('filename') == filepath and os.path.exists( config.get("paths.datadir") + filepath): with open(config.get("paths.datadir") + filepath, "r") as fil: data = fil.read() msg = "%s opened startpage %r for node %s (%r, %r)" % ( user.name, filepath, node.id, node.name, node.type) logger.info(msg) break req.write(json.dumps({'filecontent': data})) if req.params.get('action') == "save": # save filedata if req.params.get('filename') == "add": # add new file maxid = 0 for f in [f for f in node.getFiles() if f.type == "content"]: try: if int(f.retrieveFile()[:-5].split("_")[-1]) >= maxid: maxid = int( f.retrieveFile()[:-5].split("_")[-1]) + 1 except ValueError: pass filename = 'html/%s_%s.html' % (req.params.get('id'), maxid) while os.path.exists(config.get("paths.datadir") + filename): maxid = maxid + 1 filename = 'html/%s_%s.html' % (req.params.get('id'), maxid) with open(config.get("paths.datadir") + filename, "w") as fil: fil.write(req.params.get('data')) node.addFile(FileNode(filename, "content", "text/html")) req.write(json.dumps({'filename': '', 'state': 'ok'})) msg = "%s added startpage %r for node %s (%r, %r)" % ( user.name, filename, node.id, node.name, node.type) logger.info(msg) return None else: for f in [ f for f in node.getFiles() if f.mimetype == "text/html" ]: filepath = f.retrieveFile().replace( config.get("paths.datadir"), '') if req.params.get( 'filename') == filepath and os.path.exists( config.get("paths.datadir") + filepath): with open(config.get("paths.datadir") + filepath, "w") as fil: fil.write(req.params.get('data')) req.write( json.dumps({ 'filesize': format_filesize( os.path.getsize( config.get("paths.datadir") + filepath)), 'filename': req.params.get('filename'), 'state': 'ok' })) msg = "%s saved startpage %r for node %s (%r, %r)" % ( user.name, filepath, node.id, node.name, node.type) logger.info(msg) break return None if "option" in req.params: if req.params.get("option") == "filebrowser": # open filebrowser msg = "%s opening ckeditor filebrowser for node %s (%r, %r)" % ( user.name, node.id, node.name, node.type) logger.info(msg) req.write(send_nodefile_tal(req)) return "" if req.params.get("option") == "htmlupload": # use fileupload msg = "%s going to use ckeditor fileupload (htmlupload) for node %s (%r, %r)" % ( user.name, node.id, node.name, node.type) logger.info(msg) req.write(upload_for_html(req)) return "" if "delete" in req.params: # delete file via CKeditor for f in node.getFiles(): if f.retrieveFile().endswith(req.params.get('option')): filepath = f.retrieveFile().replace( config.get("paths.datadir"), '') msg = "%s going to delete ckeditor filebrowser file %r for node %s (%r, %r)" % ( user.name, filepath, node.id, node.name, node.type) logger.info(msg) if os.path.exists(f.retrieveFile()): os.remove(f.retrieveFile()) node.removeFile(f) break return "" for key in req.params.keys(): if key.startswith("delete_"): # delete page page = key[7:-2] try: file_shortpath = page.replace(config.get("paths.datadir"), "") fullpath = os.path.join(config.get("paths.datadir"), page) if os.path.exists(fullpath): os.remove(fullpath) logger.info("%s removed file %r from disk" % (user.name, fullpath)) else: logger.warning( "%s could not remove file %r from disk: not existing" % (user.name, fullpath)) filenode = FileNode(page, "", "text/html") node.removeAttribute("startpagedescr." + file_shortpath) node.set( "startpage.selector", node.get("startpage.selector").replace(file_shortpath, "")) node.removeFile(filenode) logger.info( user.name + " - startpages - deleted FileNode and file for node %s (%s): %s, %s, %s, %s" % (node.id, node.name, page, filenode.getName(), filenode.type, filenode.mimetype)) except: logger.error( user.name + " - startpages - error while delete FileNode and file for " + page) logger.error("%s - %s" % (sys.exc_info()[0], sys.exc_info()[1])) break if "save_page" in req.params: # save page content = "" for key in req.params.keys(): if key.startswith("page_content"): content = req.params.get(key, "") break with open(req.params.get('file_path'), "w") as fi: fi.writelines(content) del req.params['save_page'] del req.params['file_to_edit'] req.params['tab'] = 'startpages' return getContent(req, [node.id]) if "cancel_page" in req.params: del req.params['file_to_edit'] del req.params['cancel_page'] return getContent(req, [node.id]) filelist = [] for f in node.getFiles(): if f.mimetype == 'text/html' and f.getType() in ['content']: filelist.append(f) languages = [ language.strip() for language in config.get("i18n.languages").split(",") ] if "startpages_save" in req.params.keys( ): # user saves startpage configuration msg = "%s going to save startpage configuration for node %s (%r, %r): %r" % ( user.name, node.id, node.name, node.type, req.params) logger.info(msg) sidebar = "" for k in [k for k in req.params if k.startswith('sidebar_')]: sidebar += "%s:%s;" % (k[8:], req.params[k]) node.set('system.sidebar', sidebar) for k in [k for k in req.params if k.startswith('descr.')]: node.set('startpage' + k, req.params[k]) # build startpage_selector startpage_selector = "" for language in languages: startpage_selector += "%s:%s;" % ( language, req.params.get('radio_' + language)) node.set('startpage.selector', startpage_selector[0:-1]) named_filelist = [] for f in filelist: long_path = f.retrieveFile() short_path = long_path.replace(config.get("paths.datadir"), '') file_exists = os.path.isfile(long_path) file_size = "-" if file_exists: file_size = os.path.getsize(long_path) langlist = [] sidebar = [] for language in languages: spn = node.getStartpageFileNode(language) if spn and spn.retrieveFile() == long_path: langlist.append(language) if node.get('system.sidebar').find(language + ":" + short_path) >= 0: sidebar.append(language) named_filelist.append( (short_path, node.get('startpagedescr.' + short_path), f.type, f, file_exists, format_filesize(file_size), long_path, langlist, "/file/%s/%s" % (req.params.get("id", "0"), short_path.split('/')[-1]), sidebar)) lang2file = node.getStartpageDict() # compatibility: there may be old startpages in the database that # are not described by node attributes initial = filelist and not lang2file # node may not have startpage set for some language # compatibilty: node may not have attribute startpage.selector # build startpage_selector and wriote back to node startpage_selector = "" for language in languages: if initial: lang2file[language] = named_filelist[0][0] else: lang2file[language] = lang2file.setdefault(language, '') startpage_selector += "%s:%s;" % (language, lang2file[language]) node.set('startpage.selector', startpage_selector[0:-1]) v = { "id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "named_filelist": named_filelist, "languages": languages, "lang2file": lang2file, "types": ['content'], "d": lang2file and True } return req.getTAL("web/edit/modules/startpages.html", v, macro="edit_startpages")
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) if "metadata" in users.getHideMenusForUser(user): print "error 1" req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") access = AccessData(req) faultydir = users.getFaultyDir(user) metatypes = [] nodes = [] masklist = [] err = 0 # flag indicating change of node.name (fancytree node may have to be updated) # keep as integer # negative -> no change # else -> id of changed node flag_nodename_changed = -1 for id in ids: node = tree.getNode(id) if not access.hasWriteAccess(node): print "error 2" req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") schema = node.getSchema() if schema not in metatypes: metatypes.append(schema) if len(nodes) == 0 or nodes[0].getSchema() == schema: nodes += [node] idstr = ",".join(ids) action = req.params.get('action', '').strip() logger.info("%s in editor metadata (action=%r): %r" % (user.getName(), action, [[n.id, n.name, n.type]for n in nodes])) for m in node.getType().getMasks(type="edit"): if access.hasReadAccess(m): masklist.append(m) if hasattr(node, "metaFields"): class SystemMask: def __init__(self, name, description, fields): self.name, self.description, self.fields = name, description, fields def getName(self): return self.name def getDescription(self): return self.description def getDefaultMask(self): return False def metaFields(self, lang=None): return self.fields def i_am_not_a_mask(): pass masklist = [SystemMask( "settings", t(req, "settings"), node.metaFields(lang(req)))] + masklist default = None for m in masklist: if m.getDefaultMask(): default = m break if not default and len(masklist): default = masklist[0] maskname = req.params.get("mask", node.get("edit.lastmask") or "editmask") if maskname == "": maskname = default.getName() mask = None for m in masklist: if maskname == m.getName(): mask = m break if not mask and default: mask = default maskname = default.getName() for n in nodes: n.set("edit.lastmask", maskname) if not mask: return req.getTAL("web/edit/modules/metadata.html", {}, macro="no_mask") # context default for TAL interpreter ctx = {} ctx["user"] = user ctx["access"] = access ctx["metatypes"] = metatypes ctx["idstr"] = idstr ctx["node"] = nodes[0] # ? ctx["flag_nodename_changed"] = flag_nodename_changed ctx["nodes"] = nodes ctx["masklist"] = masklist ctx["maskname"] = maskname ctx["language"] = lang(req) ctx["t"] = t if action == 'restore': vid = req.params.get('vid', '0') node = nodes[0].getActiveVersion() if (vid != '0' and vid != node.id): n = tree.getNode(vid) # Not active version if n.next_nid != '0': next = tree.getNode(n.next_nid) if next.prev_nid != '0': next.removeChild(tree.getNode(next.prev_nid)) next.setPrevID(n.prev_nid) if n.prev_nid != '0': prev = tree.getNode(n.prev_nid) prev.setNextID(n.next_nid) n.removeChild(prev) next.addChild(prev) node.setNextID(n.id) n.setPrevID(node.id) n.setNextID('0') for pid in db.getParents(node.id): parentNode = tree.getNode(pid) parentNode.addChild(n) parentNode.removeChild(node) n.addChild(node) nodes = [n] ids = [n.id] node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {'url': '?id=' + n.id + '&tab=metadata', 'pid': None, 'flag_nodename_changed': flag_nodename_changed} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields(nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) return req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") if action == 'delete': vid = req.params.get('vid', '0') if (vid != '0'): node = nodes[0].getActiveVersion() n = tree.getNode(vid) if (vid != node.id): n.set("deleted", "true") for pid in db.getParents(n.id): parentNode = tree.getNode(pid) parentNode.removeChild(n) for cid in db.getChildren(n.id): n.removeChild(tree.getNode(cid)) if n.next_nid != '0' and n.prev_nid != '0': _next = tree.getNode(n.next_nid) _next.addChild(tree.getNode(n.prev_nid)) if n.next_nid != '0': _next = tree.getNode(n.next_nid) if n.prev_nid != '0': _next.setPrevID(n.prev_nid) if n.prev_nid != '0': _prev = tree.getNode(n.prev_nid) if n.next_nid != '0': _prev.setNextID(n.next_nid) else: pids = db.getParents(n.id) # Active version prev = None if n.prev_nid != '0': prev = tree.getNode(n.prev_nid) while prev.prev_nid != None and prev.prev_nid != '0' and prev.get("deleted") == "true": prev = tree.getNode(prev.prev_nid) if prev != None and prev.get("deleted") != "true": prev.setNextID('0') for pid in pids: parentNode = tree.getNode(pid) parentNode.addChild(prev) nodes = [prev] ids = [prev.id] n.set("deleted", "true") for pid in pids: parentNode = tree.getNode(pid) parentNode.removeChild(n) for cid in db.getChildren(n.id): n.removeChild(tree.getNode(cid)) if n.next_nid != '0' and n.prev_nid != '0': _next = tree.getNode(n.next_nid) _next.addChild(tree.getNode(n.prev_nid)) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {'url': '?id=' + prev.id + '&tab=metadata', 'pid': None, 'flag_nodename_changed': flag_nodename_changed} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields( nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) return req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") else: # Version 0 # Move node to trash trashdir = users.getTrashDir(user) trashdir.addChild(n) for pid in pids: parentNode = tree.getNode(pid) parentNode.removeChild(n) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {'url': '?id=' + pids[0] + '&tab=content', 'pid': pids[ 0], 'flag_nodename_changed': flag_nodename_changed} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields( nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) return req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") if "edit_metadata" in req.params: # check and save items userdir = users.getHomeDir(users.getUserFromRequest(req)) for node in nodes: if not access.hasWriteAccess(node) or node.id == userdir.id: print "error 3" req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") logging.getLogger('usertracing').info( access.user.name + " change metadata " + idstr) logging.getLogger('editor').info( access.user.name + " change metadata " + idstr) logging.getLogger('editor').debug(pf(req.params)) for node in nodes: node.set("updateuser", user.getName()) if node.get('updatetime') < str(now()): node.set("updatetime", str(format_date())) if not hasattr(mask, "i_am_not_a_mask"): if (req.params.get('generate_new_version')): # Create new node version _ids = [] _nodes = [] for node in nodes: n = node.createNewVersion(user) n.set("system.version.comment", '(' + t(req, "document_new_version_comment") + ')\n' + req.params.get('version_comment', '')) # add all existing attributes to the new version node for attr, value in node.items(): # do not overwrite existing attributes # do not copy system attributes if n.get(attr) != "" or attr.startswith("system."): pass else: n.set(attr, value) _nodes.append(n) _ids.append(n.id) ids = _ids idstr = ",".join(ids) nodes = _nodes nodes = mask.updateNode(nodes, req) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = { 'url': '?id=' + nodes[0].id + '&tab=metadata', 'pid': None, } data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields( nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) ret += req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") else: if nodes: old_nodename = nodes[0].name nodes = mask.updateNode(nodes, req) if nodes: new_nodename = nodes[0].name if (old_nodename != new_nodename) and hasattr(nodes[0], 'isContainer') and nodes[0].isContainer(): # for updates of node label in editor tree flag_nodename_changed = str(node.id) else: for field in mask.metaFields(): msg = "in %s.%s: (hasattr(mask,'i_am_not_a_mask')) field: %r, field.id: %r, field.name: %r, mask: %r, maskname: %r" % ( __name__, funcname(), field, field.id, field.getName(), mask, maskname) logger.debug(msg) field_name = field.getName() if field_name == 'nodename' and maskname == 'settings': if '__nodename' in req.params: field_name = '__nodename' # no multilang here ! elif getDefaultLanguage() + '__nodename' in req.params: # no multilang here ! field_name = getDefaultLanguage() + '__nodename' value = req.params.get(field_name, None) if value: if value != node.name: flag_nodename_changed = str(node.id) for node in nodes: node.setName(value) elif field_name in ('repec.code', 'repec.provider') and maskname == 'settings': if '__' + field_name in req.params: field_name = '__' + field_name # no multilang here! elif getDefaultLanguage() + '__' + field_name in req.params: field_name = getDefaultLanguage() + '__' + field_name # no multilang here! value = req.params.get(field_name, None) if value is not None: for node in nodes: node.set(field.getName(), value) else: node.set(field.getName(), "") if "edit_metadata" in req.params or node.get("faulty") == "true": if not hasattr(mask, "i_am_not_a_mask"): req.params["errorlist"] = mask.validate(nodes) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date data["err"] = err _maskform, _fields = get_maskform_and_fields(nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) data["flag_nodename_changed"] = flag_nodename_changed ret += req.getTAL("web/edit/modules/metadata.html", data, macro="edit_metadata") return ret
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) if "metadata" in users.getHideMenusForUser(user): print "error 1" req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") access = AccessData(req) faultydir = users.getFaultyDir(user) metatypes = [] nodes = [] masklist = [] err = 0 # flag indicating change of node.name (fancytree node may have to be updated) # keep as integer # negative -> no change # else -> id of changed node flag_nodename_changed = -1 for id in ids: node = tree.getNode(id) if not access.hasWriteAccess(node): print "error 2" req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") schema = node.getSchema() if schema not in metatypes: metatypes.append(schema) if len(nodes) == 0 or nodes[0].getSchema() == schema: nodes += [node] idstr = ",".join(ids) action = req.params.get('action', '').strip() logger.info("%s in editor metadata (action=%r): %r" % (user.getName(), action, [[n.id, n.name, n.type]for n in nodes])) for m in node.getType().getMasks(type="edit"): if access.hasReadAccess(m): masklist.append(m) if hasattr(node, "metaFields"): class SystemMask: def __init__(self, name, description, fields): self.name, self.description, self.fields = name, description, fields def getName(self): return self.name def getDescription(self): return self.description def getDefaultMask(self): return False def metaFields(self, lang=None): return self.fields def i_am_not_a_mask(): pass masklist = [SystemMask( "settings", t(req, "settings"), node.metaFields(lang(req)))] + masklist default = None for m in masklist: if m.getDefaultMask(): default = m break if not default and len(masklist): default = masklist[0] maskname = req.params.get("mask", node.get("edit.lastmask") or "editmask") if maskname == "": maskname = default.getName() mask = None for m in masklist: if maskname == m.getName(): mask = m break if not mask and default: mask = default maskname = default.getName() for n in nodes: n.set("edit.lastmask", maskname) if not mask: return req.getTAL("web/edit/modules/metadata.html", {}, macro="no_mask") # context default for TAL interpreter ctx = {} ctx["user"] = user ctx["access"] = access ctx["metatypes"] = metatypes ctx["idstr"] = idstr ctx["node"] = nodes[0] # ? ctx["flag_nodename_changed"] = flag_nodename_changed ctx["nodes"] = nodes ctx["masklist"] = masklist ctx["maskname"] = maskname ctx["language"] = lang(req) ctx["t"] = t if action == 'restore': vid = req.params.get('vid', '0') node = nodes[0].getActiveVersion() if (vid != '0' and vid != node.id): n = tree.getNode(vid) # Not active version if n.next_nid != '0': next = tree.getNode(n.next_nid) if next.prev_nid != '0': next.removeChild(tree.getNode(next.prev_nid)) next.setPrevID(n.prev_nid) if n.prev_nid != '0': prev = tree.getNode(n.prev_nid) prev.setNextID(n.next_nid) n.removeChild(prev) next.addChild(prev) node.setNextID(n.id) n.setPrevID(node.id) n.setNextID('0') for pid in db.getParents(node.id): parentNode = tree.getNode(pid) parentNode.addChild(n) parentNode.removeChild(node) n.addChild(node) nodes = [n] ids = [n.id] node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {'url': '?id=' + n.id + '&tab=metadata', 'pid': None, 'flag_nodename_changed': flag_nodename_changed} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields(nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) return req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") if action == 'delete': vid = req.params.get('vid', '0') if (vid != '0'): node = nodes[0].getActiveVersion() n = tree.getNode(vid) if (vid != node.id): n.set("deleted", "true") for pid in db.getParents(n.id): parentNode = tree.getNode(pid) parentNode.removeChild(n) for cid in db.getChildren(n.id): n.removeChild(tree.getNode(cid)) if n.next_nid != '0' and n.prev_nid != '0': _next = tree.getNode(n.next_nid) _next.addChild(tree.getNode(n.prev_nid)) if n.next_nid != '0': _next = tree.getNode(n.next_nid) if n.prev_nid != '0': _next.setPrevID(n.prev_nid) if n.prev_nid != '0': _prev = tree.getNode(n.prev_nid) if n.next_nid != '0': _prev.setNextID(n.next_nid) else: pids = db.getParents(n.id) # Active version prev = None if n.prev_nid != '0': prev = tree.getNode(n.prev_nid) while prev.prev_nid != None and prev.prev_nid != '0' and prev.get("deleted") == "true": prev = tree.getNode(prev.prev_nid) if prev != None and prev.get("deleted") != "true": prev.setNextID('0') for pid in pids: parentNode = tree.getNode(pid) parentNode.addChild(prev) nodes = [prev] ids = [prev.id] n.set("deleted", "true") for pid in pids: parentNode = tree.getNode(pid) parentNode.removeChild(n) for cid in db.getChildren(n.id): n.removeChild(tree.getNode(cid)) if n.next_nid != '0' and n.prev_nid != '0': _next = tree.getNode(n.next_nid) _next.addChild(tree.getNode(n.prev_nid)) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {'url': '?id=' + prev.id + '&tab=metadata', 'pid': None, 'flag_nodename_changed': flag_nodename_changed} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields( nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) return req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") else: # Version 0 # Move node to trash trashdir = users.getTrashDir(user) trashdir.addChild(n) for pid in pids: parentNode = tree.getNode(pid) parentNode.removeChild(n) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {'url': '?id=' + pids[0] + '&tab=content', 'pid': pids[ 0], 'flag_nodename_changed': flag_nodename_changed} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields( nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) return req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") if "edit_metadata" in req.params: # check and save items userdir = users.getHomeDir(users.getUserFromRequest(req)) for node in nodes: if not access.hasWriteAccess(node) or node.id == userdir.id: print "error 3" req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") logging.getLogger('usertracing').info( access.user.name + " change metadata " + idstr) logging.getLogger('editor').info( access.user.name + " change metadata " + idstr) logging.getLogger('editor').debug(pf(req.params)) for node in nodes: node.set("updateuser", user.getName()) if node.get('updatetime') < str(now()): node.set("updatetime", str(format_date())) if not hasattr(mask, "i_am_not_a_mask"): if (req.params.get('generate_new_version')): # Create new node version _ids = [] _nodes = [] for node in nodes: n = node.createNewVersion(user) n.set("system.version.comment", '(' + t(req, "document_new_version_comment") + ')\n' + req.params.get('version_comment', '')) # add all existing attributes to the new version node for attr, value in node.items(): # do not overwrite existing attributes # do not copy system attributes if n.get(attr) != "" or attr.startswith("system."): pass else: n.set(attr, value) _nodes.append(n) _ids.append(n.id) ids = _ids idstr = ",".join(ids) nodes = _nodes nodes = mask.updateNode(nodes, req) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = { 'url': '?id=' + nodes[0].id + '&tab=metadata', 'pid': None, } data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date _maskform, _fields = get_maskform_and_fields( nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) ret += req.getTAL("web/edit/modules/metadata.html", data, macro="redirect") else: if nodes: old_nodename = nodes[0].name nodes = mask.updateNode(nodes, req) if nodes: new_nodename = nodes[0].name if (old_nodename != new_nodename) and hasattr(nodes[0], 'isContainer') and nodes[0].isContainer(): # for updates of node label in editor tree flag_nodename_changed = str(node.id) else: for field in mask.metaFields(): msg = "in %s.%s: (hasattr(mask,'i_am_not_a_mask')) field: %r, field.id: %r, field.name: %r, mask: %r, maskname: %r" % ( __name__, funcname(), field, field.id, field.getName(), mask, maskname) logger.debug(msg) field_name = field.getName() if field_name == 'nodename' and maskname == 'settings': if '__nodename' in req.params: field_name = '__nodename' # no multilang here ! elif getDefaultLanguage() + '__nodename' in req.params: # no multilang here ! field_name = getDefaultLanguage() + '__nodename' value = req.params.get(field_name, None) if value: if value != node.name: flag_nodename_changed = str(node.id) for node in nodes: node.setName(value) value = req.params.get(field_name, None) if value is not None: for node in nodes: node.set(field.getName(), value) else: node.set(field.getName(), "") if "edit_metadata" in req.params or node.get("faulty") == "true": if not hasattr(mask, "i_am_not_a_mask"): req.params["errorlist"] = mask.validate(nodes) node_versions = nodes[0].getVersionList() update_date, creation_date = get_datelists(nodes) data = {} data["versions"] = node_versions data["creation_date"] = creation_date data["update_date"] = update_date data["err"] = err _maskform, _fields = get_maskform_and_fields(nodes, mask, req) data["maskform"] = _maskform data["fields"] = _fields data.update(ctx) data["flag_nodename_changed"] = flag_nodename_changed ret += req.getTAL("web/edit/modules/metadata.html", data, macro="edit_metadata") return ret
def getContent(req, ids): user = users.getUserFromRequest(req) publishdir = tree.getNode(ids[0]) explicit = tree.getNodesByAttribute("writeaccess", user.getName()) ret = "" actionerror = [] changes = [] if "dopublish" in req.params.keys(): access = AccessData(req) objlist = [] for key in req.params.keys(): if key.isdigit(): objlist.append(key) src = tree.getNode(req.params.get("id")) for obj_id in objlist: faultylist = [] obj = tree.getNode(obj_id) for mask in obj.getType().getMasks(type="edit"): # check required fields if access.hasReadAccess(mask) and mask.getName()==obj.get("edit.lastmask"): for f in mask.validateNodelist([obj]): faultylist.append(f) if len(faultylist)>0: # object faulty actionerror.append(obj_id) continue for dest_id in req.params.get("destination", "").split(","): if dest_id=="": # no destination given continue dest = tree.getNode(dest_id) if dest != src and access.hasReadAccess(src) and access.hasWriteAccess(dest) and access.hasWriteAccess(obj) and isDirectory(dest): if not nodeIsChildOfNode(dest,obj): dest.addChild(obj) src.removeChild(obj) if dest.id not in changes: changes.append(dest.id) if src.id not in changes: changes.append(src.id) log.info("%s published %s (%r, %r) from src %s (%r, %r) to dest %s (%r, %r)" % ( user.getName(), obj.id, obj.name, obj.type, src.id, src.name, src.type, dest.id, dest.name, dest.type,)) else: actionerror.append(obj.id) log.error("Error in publishing of node %r: Destination node %r is child of node." % (obj_id, dest.id)) if not access.hasReadAccess(src): log.error("Error in publishing of node %r: source position %r has no read access." % (obj.id, src.id)) if not access.hasWriteAccess(dest): log.error("Error in publishing of node %r: destination %r has no write access." % (obj.id, dest.id)) if not access.hasWriteAccess(obj): log.error("Error in publishing of node %r: object has no write access." % obj.id) if not isDirectory(dest): log.error("Error in publishing of node %r: destination %r is not a directory." % (obj.id, dest.id)) v = {} v["id"] = publishdir.id v["change"] = changes ret += req.getTAL("web/edit/modules/publish.html", v, macro="reload") # build normal window stddir = "" stdname = "" l = [] for n in explicit: if str(getHomeDir(user).id)!=str(n): l.append(n) if len(l)==1: stddir = str(l[0])+"," stdname = "- " + tree.getNode(l[0]).getName() #v = {"id":publishdir.id,"stddir":stddir, "stdname":stdname, "showdir":showdir(req, publishdir, publishwarn=0, markunpublished=1, nodes=[])} v = {"id":publishdir.id,"stddir":stddir, "stdname":stdname, "showdir":showdir(req, publishdir, publishwarn=None, markunpublished=1, nodes=[])} v["basedir"] = tree.getRoot('collections') v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s'" %(publishdir.id, publishdir.id) v["idstr"] = ids v["faultylist"] = actionerror ret += req.getTAL("web/edit/modules/publish.html", v, macro="publish_form") return ret
def getData(req): access = AccessData(req) pid = req.params.get("parentId") style = req.params.get("style", "edittree") ret = [] for c in tree.getNode(pid).getChildren().sort_by_orderpos(): if not access.hasReadAccess(c): continue try: if c.isContainer(): cnum = len(c.getContainerChildren()) inum = len(c.getContentChildren()) label = c.getLabel() title = c.getLabel() + " (" + str(c.id) + ")" cls = "folder" itemcls = "" if not access.hasWriteAccess(c): itemcls = "read" if c.type == "collection": # or "collection" in c.type: cls = "collection" if hasattr(c, 'treeiconclass'): cls = c.treeiconclass() if c.getName().startswith(translate('user_trash', request=req)): cls = "trashicon" elif c.getName().startswith(translate('user_upload', request=req)): cls = "uploadicon" elif c.getName().startswith(translate('user_import', request=req)): cls = "importicon" elif c.getName().startswith(translate('user_faulty', request=req)): cls = "faultyicon" elif c.getName().startswith(translate('user_directory', request=req)): cls = "homeicon" if style == "edittree": # standard tree for edit area if inum > 0: label += " <small>(" + str(inum) + ")</small>" ret.append('<li class="' + cls + '.gif" id="Node' + c.id + '">') ret.append('<a href="#" title="' + title + '" id="' + c.id + '" class="' + itemcls + '">' + label + '</a>') if cnum > 0: ret.append('<ul><li parentId="' + c.id + '" class="spinner.gif"><a href="#"> </a></li></ul>') ret.append('</li>') elif style == "classification": # style for classification ret.append('<li class="' + cls + '.gif" id="Node' + c.id + '">') ret.append('<a href="#" title="' + title + '" id="' + c.id + '" class="' + itemcls + '">' + label + ' <input type="image" src="/img/ftree/uncheck.gif"/></a>') if cnum > 0: ret.append('<ul><li parentId="' + c.id + '" class="spinner.gif"><a href="#"> </a></li></ul>') ret.append('</li>') except: pass req.write("\n".join(ret)) return
def getContent(req, ids): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = AccessData(req) if not access.hasWriteAccess( node) or "searchmask" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") p2 = {} for k, v in req.params.items(): if k.endswith(".x") or k.endswith(".y"): p2[k[:-2]] = v else: p2[k] = v req.params = p2 openfield = None delfield = None delsubfield = None for k, v in req.params.items(): if k.startswith("open_"): openfield = k[5:] if k.startswith("del_"): delfield = k[4:] if k.startswith("delsub_"): delsubfield = k[7:] try: root = tree.getRoot("searchmasks") except tree.NoSuchNodeError: root = tree.Node("searchmasks", type="searchmasks") tree.getRoot().addChild(root) searchtype = req.params.get("searchtype", None) if not searchtype: searchtype = node.get("searchtype") if not searchtype: searchtype = "none" # if a parent has a search mask, use 'inherit' n = node while len(n.getParents()): n = n.getParents()[0] if n.get("searchtype") == "own": searchtype = "parent" node.set("searchtype", searchtype) try: myschema = tree.getNode(req.params.get("schema", None)) except tree.NoSuchNodeError: if req.params.get("schema", None) and req.params.get("schema").endswith(";"): myschema = tree.getNode(req.params.get("schema")[:-1]) else: myschema = None try: schemafield = tree.getNode(req.params.get("schemafield", None)) except tree.NoSuchNodeError: if req.params.get( "schemafield", None) and req.params.get("schemafield").endswith(";"): schemafield = tree.getNode(req.params.get("schemafield")[:-1]) else: schemafield = None if myschema and schemafield and schemafield not in myschema.getChildren(): schemafield = None if schemafield and schemafield.type != "metafield": schemafield = None fields = None selectedfield = None isnewfield = False createsub = False closefield = False if searchtype == "own": maskname = node.get("searchmaskname") if not maskname or root.hasChild(maskname) == 0: mask = searchmask.generateMask(node) else: mask = root.getChild(maskname) selectedfieldid = req.params.get("selectedfield", None) if selectedfieldid: # edit selectedfield = tree.getNode(selectedfieldid) assert selectedfield in mask.getChildren() selectedfield.setName(req.params["fieldname"]) if "createsub" in req.params and schemafield: createsub = True selectedfield.addChild(schemafield) if delsubfield: selectedfield.removeChild(tree.getNode(delsubfield)) if req.params.get("isnewfield", "") == "yes": # create a new field isnewfield = True l = mask.getNumChildren() mask.addChild(tree.Node("Suchfeld %s" % l, type="searchmaskitem")) elif delfield: # del a field delfield = tree.getNode(delfield) assert delfield in mask.getChildren() mask.removeChild(delfield) elif openfield: # unfold a new field selectedfieldid = openfield elif "close" in req.params: # fold a field closefield = True selectedfieldid = None if selectedfieldid: selectedfield = tree.getNode(selectedfieldid) if selectedfield not in mask.getChildren( ): # this usually happens if the field was just deleted selectedfield = None else: selectedfield = None if mask is None: print "no parent searchmask found, empty mask created" mask = tree.Node(name=maskname, type="searchmask") fields = mask.getChildren() data = { "idstr": ",".join(ids), "node": node, "searchtype": searchtype, "schemas": schema.loadTypesFromDB(), "searchfields": fields, "selectedfield": selectedfield, "newfieldlink": "edit_content?id=%s&tab=searchmask" % node.id, "defaultschemaid": None, "defaultfieldid": None, "id": req.params.get("id") } if myschema: data["defaultschemaid"] = myschema.id if schemafield: data["defaultfieldid"] = schemafield.id data["schema"] = myschema def display(schemafield): if not schemafield or schemafield.type != 'metafield': return 0 if not schemafield.Searchfield(): return 0 if schemafield.get('type') == 'union': return 0 return 1 data["display"] = display searchtypechanged = False if req.params.get("searchtypechanged", "") == "true": searchtypechanged = True if any([ openfield, isnewfield, delfield, delsubfield, createsub, myschema, searchtypechanged, closefield ]): content = req.getTAL("web/edit/modules/searchmask.html", data, macro="edit_search") s = json.dumps({'content': content}) req.write(s) return None return req.getTAL("web/edit/modules/searchmask.html", data, macro="edit_search")
def getContent(req, ids): node = tree.getNode(ids[0]) user = users.getUserFromRequest(req) access = AccessData(req) if not access.hasWriteAccess(node) or "editor" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get('file') == "config": # configuration file for ckeditor req.reply_headers['Content-Type'] = "application/javascript" return req.writeTAL("web/edit/modules/startpages.html", {'id': ids[0], 'lang': lang(req)}, macro="ckconfig") if "action" in req.params: if req.params.get('action') == "getfile": # deliver filecontent data = "" for f in [f for f in node.getFiles() if f.mimetype == "text/html"]: filepath = f.retrieveFile().replace(config.get("paths.datadir"), '') if req.params.get('filename') == filepath and os.path.exists(config.get("paths.datadir") + filepath): with open(config.get("paths.datadir") + filepath, "r") as fil: data = fil.read() msg = "%s opened startpage %r for node %s (%r, %r)" % (user.name, filepath, node.id, node.name, node.type) logger.info(msg) break req.write(json.dumps({'filecontent': data})) if req.params.get('action') == "save": # save filedata if req.params.get('filename') == "add": # add new file maxid = 0 for f in [f for f in node.getFiles() if f.type == "content"]: try: if int(f.retrieveFile()[:-5].split("_")[-1]) >= maxid: maxid = int(f.retrieveFile()[:-5].split("_")[-1]) + 1 except ValueError: pass filename = 'html/%s_%s.html' % (req.params.get('id'), maxid) while os.path.exists(config.get("paths.datadir") + filename): maxid = maxid + 1 filename = 'html/%s_%s.html' % (req.params.get('id'), maxid) with open(config.get("paths.datadir") + filename, "w") as fil: fil.write(req.params.get('data')) node.addFile(FileNode(filename, "content", "text/html")) req.write(json.dumps({'filename': '', 'state': 'ok'})) msg = "%s added startpage %r for node %s (%r, %r)" % (user.name, filename, node.id, node.name, node.type) logger.info(msg) return None else: for f in [f for f in node.getFiles() if f.mimetype == "text/html"]: filepath = f.retrieveFile().replace(config.get("paths.datadir"), '') if req.params.get('filename') == filepath and os.path.exists(config.get("paths.datadir") + filepath): with open(config.get("paths.datadir") + filepath, "w") as fil: fil.write(req.params.get('data')) req.write(json.dumps( {'filesize': format_filesize(os.path.getsize(config.get("paths.datadir") + filepath)), 'filename': req.params.get('filename'), 'state': 'ok'})) msg = "%s saved startpage %r for node %s (%r, %r)" % (user.name, filepath, node.id, node.name, node.type) logger.info(msg) break return None if "option" in req.params: if req.params.get("option") == "filebrowser": # open filebrowser msg = "%s opening ckeditor filebrowser for node %s (%r, %r)" % (user.name, node.id, node.name, node.type) logger.info(msg) req.write(send_nodefile_tal(req)) return "" if req.params.get("option") == "htmlupload": # use fileupload msg = "%s going to use ckeditor fileupload (htmlupload) for node %s (%r, %r)" % (user.name, node.id, node.name, node.type) logger.info(msg) req.write(upload_for_html(req)) return "" if "delete" in req.params: # delete file via CKeditor for f in node.getFiles(): if f.retrieveFile().endswith(req.params.get('option')): filepath = f.retrieveFile().replace(config.get("paths.datadir"), '') msg = "%s going to delete ckeditor filebrowser file %r for node %s (%r, %r)" % (user.name, filepath, node.id, node.name, node.type) logger.info(msg) if os.path.exists(f.retrieveFile()): os.remove(f.retrieveFile()) node.removeFile(f) break return "" for key in req.params.keys(): if key.startswith("delete_"): # delete page page = key[7:-2] try: file_shortpath = page.replace(config.get("paths.datadir"), "") fullpath = os.path.join(config.get("paths.datadir"), page) if os.path.exists(fullpath): os.remove(fullpath) logger.info("%s removed file %r from disk" % (user.name, fullpath)) else: logger.warning("%s could not remove file %r from disk: not existing" % (user.name, fullpath)) filenode = FileNode(page, "", "text/html") node.removeAttribute("startpagedescr." + file_shortpath) node.set("startpage.selector", node.get("startpage.selector").replace(file_shortpath, "")) node.removeFile(filenode) logger.info( user.name + " - startpages - deleted FileNode and file for node %s (%s): %s, %s, %s, %s" % ( node.id, node.name, page, filenode.getName(), filenode.type, filenode.mimetype)) except: logger.error(user.name + " - startpages - error while delete FileNode and file for " + page) logger.error("%s - %s" % (sys.exc_info()[0], sys.exc_info()[1])) break if "save_page" in req.params: # save page content = "" for key in req.params.keys(): if key.startswith("page_content"): content = req.params.get(key, "") break with open(req.params.get('file_path'), "w") as fi: fi.writelines(content) del req.params['save_page'] del req.params['file_to_edit'] req.params['tab'] = 'startpages' return getContent(req, [node.id]) if "cancel_page" in req.params: del req.params['file_to_edit'] del req.params['cancel_page'] return getContent(req, [node.id]) filelist = [] for f in node.getFiles(): if f.mimetype == 'text/html' and f.getType() in ['content']: filelist.append(f) languages = [language.strip() for language in config.get("i18n.languages").split(",")] if "startpages_save" in req.params.keys(): # user saves startpage configuration msg = "%s going to save startpage configuration for node %s (%r, %r): %r" % (user.name, node.id, node.name, node.type, req.params) logger.info(msg) sidebar = "" for k in [k for k in req.params if k.startswith('sidebar_')]: sidebar += "%s:%s;" % (k[8:], req.params[k]) node.set('system.sidebar', sidebar) for k in [k for k in req.params if k.startswith('descr.')]: node.set('startpage' + k, req.params[k]) # build startpage_selector startpage_selector = "" for language in languages: startpage_selector += "%s:%s;" % (language, req.params.get('radio_' + language)) node.set('startpage.selector', startpage_selector[0:-1]) named_filelist = [] for f in filelist: long_path = f.retrieveFile() short_path = long_path.replace(config.get("paths.datadir"), '') file_exists = os.path.isfile(long_path) file_size = "-" if file_exists: file_size = os.path.getsize(long_path) langlist = [] sidebar = [] for language in languages: spn = node.getStartpageFileNode(language) if spn and spn.retrieveFile() == long_path: langlist.append(language) if node.get('system.sidebar').find(language + ":" + short_path) >= 0: sidebar.append(language) named_filelist.append((short_path, node.get('startpagedescr.' + short_path), f.type, f, file_exists, format_filesize(file_size), long_path, langlist, "/file/%s/%s" % (req.params.get("id", "0"), short_path.split('/')[-1]), sidebar)) lang2file = node.getStartpageDict() # compatibility: there may be old startpages in the database that # are not described by node attributes initial = filelist and not lang2file # node may not have startpage set for some language # compatibilty: node may not have attribute startpage.selector # build startpage_selector and wriote back to node startpage_selector = "" for language in languages: if initial: lang2file[language] = named_filelist[0][0] else: lang2file[language] = lang2file.setdefault(language, '') startpage_selector += "%s:%s;" % (language, lang2file[language]) node.set('startpage.selector', startpage_selector[0:-1]) v = {"id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "named_filelist": named_filelist, "languages": languages, "lang2file": lang2file, "types": ['content'], "d": lang2file and True} return req.getTAL("web/edit/modules/startpages.html", v, macro="edit_startpages")
def getContent(req, ids): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = AccessData(req) if not access.hasWriteAccess(node) or "searchmask" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") p2 = {} for k, v in req.params.items(): if k.endswith(".x") or k.endswith(".y"): p2[k[:-2]] = v else: p2[k] = v req.params = p2 openfield = None delfield = None delsubfield = None for k, v in req.params.items(): if k.startswith("open_"): openfield = k[5:] if k.startswith("del_"): delfield = k[4:] if k.startswith("delsub_"): delsubfield = k[7:] try: root = tree.getRoot("searchmasks") except tree.NoSuchNodeError: root = tree.Node("searchmasks", type="searchmasks") tree.getRoot().addChild(root) searchtype = req.params.get("searchtype", None) if not searchtype: searchtype = node.get("searchtype") if not searchtype: searchtype = "none" # if a parent has a search mask, use 'inherit' n = node while len(n.getParents()): n = n.getParents()[0] if n.get("searchtype") == "own": searchtype = "parent" node.set("searchtype", searchtype) try: myschema = tree.getNode(req.params.get("schema", None)) except tree.NoSuchNodeError: if req.params.get("schema", None) and req.params.get("schema").endswith(";"): myschema = tree.getNode(req.params.get("schema")[:-1]) else: myschema = None try: schemafield = tree.getNode(req.params.get("schemafield", None)) except tree.NoSuchNodeError: if req.params.get("schemafield", None) and req.params.get("schemafield").endswith(";"): schemafield = tree.getNode(req.params.get("schemafield")[:-1]) else: schemafield = None if myschema and schemafield and schemafield not in myschema.getChildren(): schemafield = None if schemafield and schemafield.type != "metafield": schemafield = None fields = None selectedfield = None isnewfield = False createsub = False closefield = False if searchtype == "own": maskname = node.get("searchmaskname") if not maskname or root.hasChild(maskname) == 0: mask = searchmask.generateMask(node) else: mask = root.getChild(maskname) selectedfieldid = req.params.get("selectedfield", None) if selectedfieldid: # edit selectedfield = tree.getNode(selectedfieldid) assert selectedfield in mask.getChildren() selectedfield.setName(req.params["fieldname"]) if "createsub" in req.params and schemafield: createsub = True selectedfield.addChild(schemafield) if delsubfield: selectedfield.removeChild(tree.getNode(delsubfield)) if req.params.get("isnewfield", "") == "yes": # create a new field isnewfield = True l = mask.getNumChildren() mask.addChild(tree.Node("Suchfeld %s" % l, type="searchmaskitem")) elif delfield: # del a field delfield = tree.getNode(delfield) assert delfield in mask.getChildren() mask.removeChild(delfield) elif openfield: # unfold a new field selectedfieldid = openfield elif "close" in req.params: # fold a field closefield = True selectedfieldid = None if selectedfieldid: selectedfield = tree.getNode(selectedfieldid) if selectedfield not in mask.getChildren(): # this usually happens if the field was just deleted selectedfield = None else: selectedfield = None if mask is None: print "no parent searchmask found, empty mask created" mask = tree.Node(name=maskname, type="searchmask") fields = mask.getChildren() data = {"idstr": ",".join(ids), "node": node, "searchtype": searchtype, "schemas": schema.loadTypesFromDB(), "searchfields": fields, "selectedfield": selectedfield, "newfieldlink": "edit_content?id=%s&tab=searchmask" % node.id, "defaultschemaid": None, "defaultfieldid": None, "id": req.params.get("id")} if myschema: data["defaultschemaid"] = myschema.id if schemafield: data["defaultfieldid"] = schemafield.id data["schema"] = myschema def display(schemafield): if not schemafield or schemafield.type != 'metafield': return 0 if not schemafield.Searchfield(): return 0 if schemafield.get('type') == 'union': return 0 return 1 data["display"] = display searchtypechanged = False if req.params.get("searchtypechanged", "") == "true": searchtypechanged = True if any([openfield, isnewfield, delfield, delsubfield, createsub, myschema, searchtypechanged, closefield]): content = req.getTAL("web/edit/modules/searchmask.html", data, macro="edit_search") s = json.dumps({'content': content}) req.write(s) return None return req.getTAL("web/edit/modules/searchmask.html", data, macro="edit_search")
def edit_tree(req): access = AccessData(req) language = lang(req) user = users.getUserFromRequest(req) home_dir = users.getHomeDir(user) match_result = '' match_error = False if req.params.get('key') == 'root': nodes = core.tree.getRoot( 'collections').getContainerChildren().sort_by_orderpos() elif req.params.get('key') == 'home': if not user.isAdmin(): nodes = [home_dir] else: homenodefilter = req.params.get('homenodefilter', '') if homenodefilter: nodes = [] try: pattern = re.compile(homenodefilter) nodes = tree.getRoot('home').getContainerChildren().sort_by_orderpos() # filter out shoppingbags etc. nodes = [n for n in nodes if n.isContainer()] # filter user name - after first "(" nodes = filter(lambda n: re.match(homenodefilter, n.getLabel(language).split('(', 1)[-1]), nodes) match_result = '#=%d' % len(nodes) except Exception as e: logger.warning('pattern matching for home nodes: %r' % e) match_result = '<span style="color:red">Error: %r</span>' % str(e) match_error = True if home_dir not in nodes: if not match_error: match_result = '#=%d+1' % len(nodes) nodes.append(home_dir) nodes = tree.NodeList(nodes).sort_by_orderpos() else: nodes = [home_dir] else: nodes = core.tree.getNode( req.params.get('key')).getContainerChildren().sort_by_orderpos() # filter out shoppingbags etc. nodes = [n for n in nodes if n.isContainer()] data = [] # wn 2014-03-14 # special directories may be handled in a special way by the editor special_dir_ids = {} special_dir_ids[home_dir.id] = 'userhomedir' for dir_type in ['upload', 'import', 'faulty', 'trash']: special_dir_ids[users.getSpecialDir(user, dir_type).id] = dir_type spec_dirs = ['userhomedir', 'upload', 'import', 'faulty', 'trash'] spec_dir_icons = ["homeicon.gif", "uploadicon.gif", "importicon.gif", "faultyicon.gif", "trashicon.gif"] for node in nodes: if not access.hasReadAccess(node): continue # try: # label = node.getLabel() # except: # label = node.getName() # # c = len(node.getContentChildren()) # if c>0: # label += ' <small>(%s)</small>' %(c) label = getTreeLabel(node, lang=language) nodedata = {'title': label, 'key': node.id, 'lazy': True, 'folder': True, 'readonly': 0, 'tooltip': '%s (%s)' % (node.getLabel(lang=language), node.id)} nodedata['icon'] = getEditorIconPath(node, req) if len(node.getContainerChildren()) == 0: nodedata['lazy'] = False nodedata['children'] = [] if not access.hasWriteAccess(node): if req.params.get('key') == 'home': continue nodedata['readonly'] = 1 nodedata['noLink'] = True nodedata['extraClasses'] = 'readonly' # fancytree else: nodedata['readonly'] = 0 nodedata['this_node_is_special'] = [] if node.id in special_dir_ids: nodedata['this_node_is_special'] = nodedata[ 'this_node_is_special'] + [special_dir_ids[node.id]] if node.id == home_dir.id: nodedata['match_result'] = match_result data.append(nodedata) return req.write(json.dumps(data, indent=4))