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 search_results(req, id): access = AccessData(req) user = users.getUserFromRequest(req) if "search" in users.getHideMenusForUser(user): req.writeTAL("web/edit/edit.html", {}, macro="access_error") return "" if "Reset" in req.params: return search_form(req, id, "edit_search_reset_msg") try: searchvalues = req.session["esearchvals"] except: req.session["esearchvals"] = searchvalues = {} node = tree.getNode(id) objtype = req.params["objtype"] type = getMetaType(objtype) query = "" if "full" in req.params: value = req.params["full"] searchvalues[objtype + ".full"] = value for word in value.split(" "): if word: if query: query += " and " query += "full=" + protect(word) for field in type.getMetaFields(): if field.Searchfield(): name = field.getName() if name in req.params and req.params.get(name, "").replace( "'", '').replace('"', '').strip() != "": value = req.params[name].strip() if value: searchvalues[objtype + "." + field.getName()] = value if field.getFieldtype() == "list" or field.getFieldtype( ) == "ilist" or field.getFieldtype() == "mlist": if query: query += " and " query += name + "=" + protect(value) else: query += name + "=" + protect(value) query += ' and schema="' + req.params.get("objtype", "*") + '"' utrace.info(access.user.name + " search for " + query) nodes = node.search(query) req.session["nodelist"] = EditorNodeList(nodes) if len(nodes): return req.getTAL("web/edit/modules/search.html", {"id": id}, macro="start_new_search") + shownodelist(req, nodes) return search_form(req, id, "edit_search_noresult_msg")
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 search_results(req,id): access = AccessData(req) user = users.getUserFromRequest(req) if "search" in users.getHideMenusForUser(user): req.writeTAL("web/edit/edit.html", {}, macro="access_error") return "" if "Reset" in req.params: return search_form(req, id, "edit_search_reset_msg") try: searchvalues = req.session["esearchvals"] except: req.session["esearchvals"] = searchvalues = {} node = tree.getNode(id) objtype = req.params["objtype"] type = getMetaType(objtype) query = "" if "full" in req.params: value = req.params["full"] searchvalues[objtype + ".full"] = value for word in value.split(" "): if word: if query: query += " and " query += "full=" + protect(word) for field in type.getMetaFields(): if field.Searchfield(): name=field.getName() if name in req.params and req.params.get(name,"").replace("'",'').replace('"','').strip()!="": value = req.params[name].strip() if value: searchvalues[objtype + "." + field.getName()] = value if field.getFieldtype()=="list" or field.getFieldtype()=="ilist" or field.getFieldtype()=="mlist": if query: query += " and " query += name + "=" + protect(value) else: query += name + "=" + protect(value) query += ' and schema="'+req.params.get("objtype","*")+'"' utrace.info(access.user.name + " search for "+query) nodes = node.search(query) req.session["nodelist"] = EditorNodeList(nodes) if len(nodes): return req.getTAL("web/edit/modules/search.html", {"id":id}, macro="start_new_search") + shownodelist(req, nodes) return search_form(req, id, "edit_search_noresult_msg")
def filterMenu(menuitems, user): hide = users.getHideMenusForUser(user) ret = [] for menu in parseMenuString(menuitems): i = [] for item in menu.getItemList(): if item not in hide: i.append(item) menu.item = i ret.append(menu) return ret
def getContent(req, ids): if req.params.get("style","")=="popup": req.write(objlist(req)) return "" user = users.getUserFromRequest(req) if "license" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") node = tree.getNode(ids[0]) return req.getTAL("web/edit/modules/license.html", {"node":node, "nodes": [node]}, macro="edit_license_info")
def getContent(req, ids): if len(ids) > 0: ids = ids[0] user = users.getUserFromRequest(req) node = tree.getNode(ids) access = acl.AccessData(req) if "statsfiles" in users.getHideMenusForUser( user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if "update_stat" in req.params.keys(): # reset stored statistics data msg = "user %r requests update of of system.statscontent for node %r (%r, %r)" % ( user.getName(), node.id, node.name, node.type) logger.info(msg) logging.getLogger('editor').info(msg) node.removeAttribute("system.statscontent") node.removeAttribute("system.statsdate") # content if req.params.get("style", "") == "popup": statstring = node.get("system.statscontent") if statstring == "": # load stats from objects/renew stat data = StatTypes() for n in node.getAllChildren(): found_dig = 0 or len([ file for file in n.getFiles() if file.type in ["image", "document", "video"] ]) data.addItem(n.getContentType(), n.getSchema(), found_dig) node.set("system.statscontent", str(data)) node.set("system.statsdate", str(format_date())) statstring = str(data) v = {} v["data"] = StatTypes(statstring) v["stand"] = node.get("system.statsdate") req.writeTAL("web/edit/modules/statsfiles.html", v, macro="edit_stats_popup") return "" return req.getTAL("web/edit/modules/statsfiles.html", {"id": ids}, macro="edit_stats")
def getContent(req, ids): if len(ids) > 0: ids = ids[0] user = users.getUserFromRequest(req) node = tree.getNode(ids) access = acl.AccessData(req) if "statsaccess" in users.getHideMenusForUser( user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get("style", "") == "popup": getPopupWindow(req, ids) return "" node = tree.getNode(ids) statfiles = {} p = "" for file in node.getFiles(): if file.getType() == "statistic": period, type = getPeriod(file.retrieveFile()) if period > p: p = period if type not in statfiles.keys(): statfiles[type] = {} if period not in statfiles[type].keys(): statfiles[type][period] = [] statfiles[type][period].append(file) v = {} v["id"] = ids v["files"] = statfiles v["current_period"] = req.params.get("select_period", "frontend_" + p) if len(statfiles) > 0: v["current_file"] = StatisticFile(statfiles[v["current_period"].split( "_")[0]][v["current_period"].split("_")[1]][0]) else: v["current_file"] = StatisticFile(None) v["nodename"] = tree.getNode items = v["current_file"].getProgress('country') return req.getTAL("web/edit/modules/statsaccess.html", v, macro="edit_stats")
def getContent(req, ids): if len(ids) > 0: ids = ids[0] user = users.getUserFromRequest(req) node = tree.getNode(ids) access = acl.AccessData(req) if "statsaccess" in users.getHideMenusForUser(user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get("style", "") == "popup": getPopupWindow(req, ids) return "" node = tree.getNode(ids) statfiles = {} p = "" for file in node.getFiles(): if file.getType() == "statistic": period, type = getPeriod(file.retrieveFile()) if period > p: p = period if type not in statfiles.keys(): statfiles[type] = {} if period not in statfiles[type].keys(): statfiles[type][period] = [] statfiles[type][period].append(file) v = {} v["id"] = ids v["files"] = statfiles v["current_period"] = req.params.get("select_period", "frontend_" + p) if len(statfiles) > 0: v["current_file"] = StatisticFile(statfiles[v["current_period"].split("_")[0]][v["current_period"].split("_")[1]][0]) else: v["current_file"] = StatisticFile(None) v["nodename"] = tree.getNode items = v["current_file"].getProgress('country') return req.getTAL("web/edit/modules/statsaccess.html", v, macro="edit_stats")
def getContent(req, ids): if len(ids) > 0: ids = ids[0] user = users.getUserFromRequest(req) node = tree.getNode(ids) access = acl.AccessData(req) if "statsfiles" in users.getHideMenusForUser(user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if "update_stat" in req.params.keys(): # reset stored statistics data msg = "user %r requests update of of system.statscontent for node %r (%r, %r)" % ( user.getName(), node.id, node.name, node.type) logger.info(msg) logging.getLogger('editor').info(msg) node.removeAttribute("system.statscontent") node.removeAttribute("system.statsdate") # content if req.params.get("style", "") == "popup": statstring = node.get("system.statscontent") if statstring == "": # load stats from objects/renew stat data = StatTypes() for n in node.getAllChildren(): found_dig = 0 or len( [file for file in n.getFiles() if file.type in["image", "document", "video"]]) data.addItem(n.getContentType(), n.getSchema(), found_dig) node.set("system.statscontent", str(data)) node.set("system.statsdate", str(format_date())) statstring = str(data) v = {} v["data"] = StatTypes(statstring) v["stand"] = node.get("system.statsdate") req.writeTAL( "web/edit/modules/statsfiles.html", v, macro="edit_stats_popup") return "" return req.getTAL("web/edit/modules/statsfiles.html", {"id": ids}, macro="edit_stats")
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) if "ftp" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") ids = ids[0] # use only first selected node node = tree.getNode(ids) error = "" def processFile(node, file, ftype): nname = file.retrieveFile().split("/") nname = "/".join(nname[:-1]) + "/" + nname[-1][4:] try: os.rename(file.retrieveFile(), nname) except: nname = file.retrieveFile() fnode = tree.Node(nname.split("/")[-1], ftype) node.removeFile(file) file._path = file._path.replace(config.get("paths.datadir"), "") file._path = "/".join( file._path.split("/")[:-1]) + "/" + fnode.getName() fnode.addFile(file) fnode.event_files_changed() node.addChild(fnode) return fnode for key in req.params.keys(): if key.startswith("process|"): # process selected file (single) fname = key[:-2].split("|")[-1] ftype = req.params.get("schema").replace(";", "") if ftype != "": for f in node.getFiles(): if f.getName() == fname: processFile(node, f, ftype) break break else: error = "edit_ftp_error1" elif key.startswith("del|"): for f in node.getFiles(): if f.getName() == key[4:-2]: node.removeFile(f) break break elif key.startswith("delall"): # delete all selected files delfiles = [ f.split("|")[-1] for f in req.params.get("selfiles").split(";") ] for f in node.getFiles(): if f.getName() in delfiles: node.removeFile(f) break elif key.startswith("processall"): # process all selected files for file in req.params.get("selfiles", "").split(";"): if file: ftype, fname = file.split("|") if "multschema|" + ftype in req.params and req.params.get( "multschema|" + ftype) != "": for f in node.getFiles(): if f.getName() == fname: print "use", ftype + "/" + req.params.get( "multschema|" + ftype) processFile( node, f, ftype + "/" + req.params.get("multschema|" + ftype)) break else: error = "edit_ftp_error2" break break files = filter(lambda x: x.getName().startswith("ftp_"), node.getFiles()) types = [] for f in files: if f.getType() not in types: if f.getType() != "other": types.append(f.getType()) dtypes = {} for scheme in filter(lambda x: x.isActive(), acl.AccessData(req).filter(loadTypesFromDB())): for dtype in scheme.getDatatypes(): if dtype not in dtypes.keys(): dtypes[dtype] = [] if scheme not in dtypes[dtype]: dtypes[dtype].append(scheme) for t in dtypes: dtypes[t].sort(lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower())) access = acl.AccessData(req) if not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") v = {} v['error'] = error v['files'] = files v['node'] = node v['schemes'] = dtypes # schemes v['usedtypes'] = types v['tab'] = req.params.get("tab", "") v['ids'] = ids v["script"] = "<script> parent.reloadTree('" + req.params.get( "id") + "');</script>" return req.getTAL("web/edit/modules/ftp.html", v, macro="edit_ftp")
def getContent(req, ids): user = users.getUserFromRequest(req) if "ftp" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") ids = ids[0] # use only first selected node node = tree.getNode(ids) error = "" def processFile(node, file, ftype): nname = file.retrieveFile().split("/") nname = "/".join(nname[:-1]) + "/" + nname[-1][4:] try: os.rename(file.retrieveFile(), nname) except: nname = file.retrieveFile() fnode = tree.Node(nname.split("/")[-1], ftype) node.removeFile(file) file._path = file._path.replace(config.get("paths.datadir"), "") file._path = "/".join(file._path.split("/")[:-1]) + "/" + fnode.getName() fnode.addFile(file) fnode.event_files_changed() node.addChild(fnode) return fnode for key in req.params.keys(): if key.startswith("process|"): # process selected file (single) fname = key[:-2].split("|")[-1] ftype = req.params.get("schema").replace(";", "") if ftype != "": for f in node.getFiles(): if f.getName() == fname: processFile(node, f, ftype) break break else: error = "edit_ftp_error1" elif key.startswith("del|"): for f in node.getFiles(): if f.getName() == key[4:-2]: node.removeFile(f) break break elif key.startswith("delall"): # delete all selected files delfiles = [f.split("|")[-1] for f in req.params.get("selfiles").split(";")] for f in node.getFiles(): if f.getName() in delfiles: node.removeFile(f) break elif key.startswith("processall"): # process all selected files for file in req.params.get("selfiles", "").split(";"): if file: ftype, fname = file.split("|") if "multschema|" + ftype in req.params and req.params.get("multschema|" + ftype) != "": for f in node.getFiles(): if f.getName() == fname: print "use", ftype + "/" + req.params.get("multschema|" + ftype) processFile(node, f, ftype + "/" + req.params.get("multschema|" + ftype)) break else: error = "edit_ftp_error2" break break files = filter(lambda x: x.getName().startswith("ftp_"), node.getFiles()) types = [] for f in files: if f.getType() not in types: if f.getType() != "other": types.append(f.getType()) dtypes = {} for scheme in filter(lambda x: x.isActive(), acl.AccessData(req).filter(loadTypesFromDB())): for dtype in scheme.getDatatypes(): if dtype not in dtypes.keys(): dtypes[dtype] = [] if scheme not in dtypes[dtype]: dtypes[dtype].append(scheme) for t in dtypes: dtypes[t].sort( lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower() ) ) access = acl.AccessData(req) if not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") v = {} v["error"] = error v["files"] = files v["node"] = node v["schemes"] = dtypes # schemes v["usedtypes"] = types v["tab"] = req.params.get("tab", "") v["ids"] = ids v["script"] = "<script> parent.reloadTree('" + req.params.get("id") + "');</script>" return req.getTAL("web/edit/modules/ftp.html", v, macro="edit_ftp")
def getContent(req, ids): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = acl.AccessData(req) if "logo" in users.getHideMenusForUser(user) or not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") # delete logo file if "action" in req.params and req.params.get('action') == "delete": file = req.params.get('file').split("/")[-1] for f in node.getFiles(): if f.retrieveFile().endswith(file): node.removeFile(f) req.write('ok') return None req.write('not found') return None # add logo file if "addfile" in req.params.keys(): file = req.params.get("updatefile") if file: mimetype = "application/x-download" type = "file" mimetype, type = getMimeType(file.filename.lower()) if mimetype not in ("image/jpeg", "image/gif", "image/png"): # wrong file type (jpeg, jpg, gif, png) req.setStatus(httpstatus.HTTP_INTERNAL_SERVER_ERROR) return req.getTAL("web/edit/modules/logo.html", {}, macro="filetype_error") else: file = importFile(file.filename, file.tempname) node.addFile(file) # save logo if "logo_save" in req.params.keys(): # save url if req.params.get("logo_link", "") == "": node.removeAttribute("url") else: node.set('url', req.params.get("logo_link")) # save filename if req.params.get('logo') == "/img/empty.gif": # remove logo from current node node.set("system.logo", "") msg = "%s cleared logo for node %r (%r, %r)" % (user.getName(), node.id, node.name, node.type) logger.info(msg) logger_e.info(msg) else: node.set("system.logo", req.params.get("logo").split("/")[-1]) msg = "%s set logo for node %r (%r, %r) to %r" % (user.getName(), node.id, node.name, node.type, node.get("system.logo")) logger.info(msg) logger_e.info(msg) logofiles = [] for f in node.getFiles(): if f.getType() == "image": logofiles.append(splitpath(f.retrieveFile())) v = { "id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "logofiles": logofiles, "logo": node.getLogoPath(), "language": lang(req), "t": translation_t } return req.getTAL("web/edit/modules/logo.html", v, macro="edit_logo")
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) access = acl.AccessData(req) for id in ids: if not access.hasWriteAccess(tree.getNode(id)) or "acls" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") idstr = ",".join(ids) if "save" in req.params: # save acl level userdir = users.getHomeDir(user) logging.getLogger('usertracing').info(access.user.name + " change access " + idstr) if req.params.get("type") == "acl": for type in acl_types: rights = req.params.get("left" + type, "").replace(";", ",") for id in ids: node = tree.getNode(id) error = 0 if access.hasWriteAccess(node) and userdir.id != node.id: node.setAccess(type, rights) else: error = 1 if error: req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") # save userlevel elif req.params.get("type") == "user": for type in acl_types: for id in ids: node = tree.getNode(id) error = 0 if access.hasWriteAccess(node) and userdir.id != node.id: r = [] r_acls = [] if req.params.get("leftuser" + type, "") != "": for right in req.params.get("leftuser" + type, "").split(";"): if len(right.split(": ")) == 2: r.append("(user " + right.split(": ")[1] + ")") else: r_acls.append(right) if len(r) > 0: rstr = "{" + " OR ".join(r) + "}" else: rstr = req.params.get("leftuser" + type, "") if len(rstr) > 0: rstr += "," for x in r_acls: rstr += x + "," rstr = rstr[:-1] else: rstr = "" node.setAccess(type, rstr) else: error = 1 if error: req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") runsubmit = "\nfunction runsubmit(){\n" retacl = "" rights = {} parent_rights = {} overload = {} for type in acl_types: s = None parent_rights[type] = {} overload[type] = 0 runsubmit += "\tmark(document.myform.left" + type + ");\n" runsubmit += "\tmark(document.myform.leftuser" + type + ");\n" if type in ("read", "data"): overload[type] = 1 for id in ids: node = tree.getNode(id) r = node.getAccess(type) if r is None: r = "" log.debug(node.name + " " + type + " " + r) if not s or r == s: s = r else: s = "" def addNode(node): for p in node.getParents(): aclright = p.getAccess(type) for right in removeEmptyStrings((aclright or "").split(",")): parent_rights[type][right] = None if aclright and overload[type]: return else: addNode(p) addNode(node) rights[type] = removeEmptyStrings(s.split(",")) for type in acl_types: retacl += req.getTAL("web/edit/modules/acls.html", makeList(req, type, rights[type], parent_rights[type].keys(), overload[type], type=type), macro="edit_acls_selectbox") if "action" in req.params.keys(): # load additional rights by ajax retuser = "" for type in acl_types: retuser += req.getTAL("web/edit/modules/acls.html", makeUserList(req, type, rights[type], parent_rights[type].keys(), overload[type], type=type), macro="edit_acls_userselectbox") req.write(retuser) return "" runsubmit += "\tdocument.myform.submit();\n}\n" return req.getTAL("web/edit/modules/acls.html", {"runsubmit": runsubmit, "idstr": idstr, "contentacl": retacl, "adminuser": access.getUser().isAdmin()}, macro="edit_acls")
def getContent(req, ids): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = acl.AccessData(req) if not access.hasWriteAccess( node) or "changeschema" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") error = req.params.get("error") currentContentType = node.getContentType() try: currentSchema = node.type.split('/')[1] # string except: currentSchema = '' currentCategoryName = node.getCategoryName() currentTypeAlias = node.getTypeAlias() schemes = AccessData(req).filter(loadTypesFromDB()) _schemes = [] for scheme in schemes: if scheme.isActive(): _schemes.append(scheme) schemes = _schemes schemeNames2LongNames = {'': ''} for s in schemes: schemeNames2LongNames[s.getName()] = s.getLongName() try: currentSchemaLongName = schemeNames2LongNames[currentSchema] except KeyError: currentSchemaLongName = '' # find out which schema allows which datatype, and hence, # which overall data types we should display dtypes = [] datatypes = loadAllDatatypes() for scheme in schemes: for dtype in scheme.getDatatypes(): if dtype not in dtypes: for t in datatypes: if t.getName() == dtype and not elemInList( dtypes, t.getName()): dtypes.append(t) dtypes.sort(lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower())) admissible_objtypes = getTypes(datatypes) admissible_datatypes = [ n for n in admissible_objtypes if tree.Node('', n.name).getCategoryName() in ['document', 'image', 'video', 'audio'] ] admissible_containers = [ n for n in admissible_objtypes if tree.Node('', n.name).getCategoryName() in ['container'] ] admissible_objtypes.sort(lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower())) admissible_datatypes.sort(lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower())) admissible_containers.sort(lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower())) available_schemes = [ s for s in schemes if currentContentType in s.getDatatypes() ] # filter schemes for special datatypes if req.params.get("objtype", "") != "": _schemes = [] for scheme in schemes: if req.params.get("objtype", "") in scheme.getDatatypes(): _schemes.append(scheme) schemes = _schemes schemes.sort(lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower())) newObjectType = req.params.get("objtype") newSchema = req.params.get("schema") if not newSchema: newSchema = '' newType = newObjectType if newSchema: newType += '/' + newSchema oldType = currentContentType if currentSchema: oldType = oldType + '/' + currentSchema if newType != oldType: node.setTypeName(newType) msg = "%s changed node schema for node %s '%s' from '%s' to '%s'" % ( user.name, node.id, node.name, oldType, newType) logger.info(msg) logging.getLogger('usertracing').info(msg) node.setDirty() # cache clean / reload because object type changed tree.remove_from_nodecaches(node) node = tree.getNode(node.id) currentContentType = node.getContentType() currentSchema = newSchema currentSchemaLongName = schemeNames2LongNames[currentSchema] currentCategoryName = node.getCategoryName() currentTypeAlias = node.getTypeAlias() available_schemes = [ s for s in schemes if newObjectType in s.getDatatypes() ] isContainer = False if hasattr(node, "isContainer"): isContainer = node.isContainer() if "action" in req.params.keys(): if req.params.get("action").startswith("get_schemes_for_"): newObjectType = req.params.get("action").replace( "get_schemes_for_", "") available_schemes = [ s for s in schemes if newObjectType in s.getDatatypes() ] req.writeTAL("web/edit/modules/changeschema.html", { 'schemes': available_schemes, 'currentSchema': currentSchema }, macro="changeschema_selectscheme") return "" containers = getContainers(datatypes) d = {"id": req.params.get("id"), "error": error, "node": node} d['currentContentType'] = currentContentType d['currentSchema'] = currentSchema d['currentSchemaLongName'] = currentSchemaLongName d['currentCategoryName'] = currentCategoryName d['currentTypeAlias'] = currentTypeAlias d['isContainer'] = int(isContainer) d['nodes'] = [node] if currentContentType in [dtype.name for dtype in containers]: d['schemes'] = [] d['datatypes'] = admissible_containers # containers else: d['schemes'] = available_schemes d['datatypes'] = admissible_datatypes # dtypes return req.getTAL("web/edit/modules/changeschema.html", d, macro="changeschema_popup")
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) update_error = False access = acl.AccessData(req) msg = "%s|web.edit.modules.files.getContend|req.fullpath=%r|req.path=%r|req.params=%r|ids=%r" % (get_user_id(req), req.fullpath, req.path, req.params, ids) log.debug(msg) if not access.hasWriteAccess(node) or "files" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if 'data' in req.params: if req.params.get('data') == 'children': # get formated list of childnodes of selected directory excludeid = req.params.get('excludeid', None) if excludeid: grandchildren = [] for child in node.getChildren(): for grandchild in child.getChildren(): if not grandchild.isContainer(): grandchildren.append(grandchild) req.writeTAL("web/edit/modules/files.html", {'children': [c for c in node.getChildren() if str(c.id) != excludeid], 'grandchildren': grandchildren}, macro="edit_files_popup_children") else: grandchildren = [] for child in node.getChildren(): for grandchild in child.getChildren(): if not grandchild.isContainer(): grandchildren.append(grandchild) req.writeTAL("web/edit/modules/files.html", {'children': [c for c in node.getChildren() if str(c.id) != excludeid], 'grandchildren': grandchildren}, macro="edit_files_popup_children") elif req.params.get('data') =='grandchildren': grandchildren = [] for child in node.getChildren(): if not child.isContainer(): for grandchild in child.getChildren(): if not grandchild.isContainer(): if not grandchild.isContainer(): grandchildren.append(grandchild) if len(node.getChildren())==0: req.writeTAL("web/edit/modules/files.html", {'grandchildren': []}, macro="edit_files_popup_grandchildren") else: req.writeTAL("web/edit/modules/files.html", {'grandchildren': grandchildren}, macro="edit_files_popup_grandchildren") if req.params.get('data') == 'additems': # add selected node as children for childid in req.params.get('items').split(";"): if childid.strip() != "": childnode = tree.getNode(childid.strip()) for p in childnode.getParents(): if p.isContainer(): logging.getLogger('editor').info("Removed childnode: {} from node: {}. - caused by adding".format(childnode.id, node.id)) p.removeChild(childnode) node.addChild(childnode) req.writeTAL("web/edit/modules/files.html", {'children': node.getChildren(), 'node': node}, macro="edit_files_children_list") if req.params.get('data') == 'removeitem': # remove selected childnode node try: remnode = tree.getNode(req.params.get('remove')) if len(remnode.getParents()) == 1: users.getUploadDir(user).addChild(remnode) node.removeChild(remnode) except: # node not found pass req.writeTAL("web/edit/modules/files.html", {'children': node.getChildren(), 'node': node}, macro="edit_files_children_list") if req.params.get('data') == 'reorder': i = 0 for id in req.params.get('order').split(","): if id != "": n = tree.getNode(id) n.setOrderPos(i) i += 1 if req.params.get('data') == 'translate': req.writeTALstr('<tal:block i18n:translate="" tal:content="msgstr"/>', {'msgstr': req.params.get('msgstr')}) return "" if req.params.get("style") == "popup": v = {"basedirs": [tree.getRoot('home'), tree.getRoot('collections')]} id = req.params.get("id", tree.getRoot().id) v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s';\nvar node = %s;" %(id, req.params.get('parent'), id) v["idstr"] = ",".join(ids) v["node"] = node if node.type != 'directory': try: if v['current_id'] == None: v['current_id'] = node.id except KeyError: pass req.writeTAL("web/edit/modules/files.html", v, macro="edit_files_popup_selection") return "" if "operation" in req.params: op = req.params.get("operation") if op == "delete": for key in req.params.keys(): # delete file if key.startswith("del|"): filename = key[4:-2].split("|") for file in node.getFiles(): if file.getName() == filename[1] and file.type == filename[0]: # remove all files in directory if file.getMimeType() == "inode/directory": for root, dirs, files in os.walk(file.retrieveFile()): for name in files: try: os.remove(root + "/" + name) except: pass os.removedirs(file.retrieveFile()+"/") if len([f for f in node.getFiles() if f.getName()==filename[1] and f.type==filename[0]]) > 1: # remove single file from database if there are duplicates node.removeFile(file, single=True) else: # remove single file node.removeFile(file) try: os.remove(file.retrieveFile()) except: pass break break elif key.startswith("delatt|"): for file in node.getFiles(): if file.getMimeType() == "inode/directory": try: os.remove(file.retrieveFile() + "/" + key.split("|")[2][:-2]) except: pass break break elif op=="change": uploadfile = req.params.get("updatefile") if uploadfile: create_version_error = False # Create new version when change file if (req.params.get('generate_new_version') and not hasattr(node, "metaFields")): if (req.params.get('version_comment', '').strip()=='' or req.params.get('version_comment', '').strip()==' '): create_version_error = True req.setStatus(httpstatus.HTTP_INTERNAL_SERVER_ERROR) ret += req.getTAL("web/edit/modules/files.html", {}, macro="version_error") else: current = node node = node.createNewVersion(user) for attr, value in current.items(): if node.get(attr)!="": # do not overwrite attributes pass else: node.set(attr, value) req.setStatus(httpstatus.HTTP_MOVED_TEMPORARILY) ret += req.getTAL("web/edit/modules/metadata.html", {'url':'?id='+node.id+'&tab=files', 'pid':None}, macro="redirect") if req.params.get("change_file")=="yes" and not create_version_error: # remove old files if uploadfile.filename: if getMimeType(uploadfile.filename)[0] == 'other': return '<h2 style="width:100%; text-align:center ;color:red">file-format is not supported (upload canceled / use attachment)</h2>' for f in node.getFiles(): if f.getType() in node.getSysFiles(): node.removeFile(f) node.set("system.version.comment", '('+t(req, "edit_files_new_version_exchanging_comment")+')\n'+req.params.get('version_comment', '')) if req.params.get("change_file")=="no" and not create_version_error: node.set("system.version.comment", '('+t(req, "edit_files_new_version_adding_comment")+')\n'+req.params.get('version_comment', '')) if req.params.get("change_file") in ["yes", "no"] and not create_version_error: if uploadfile.filename: if getMimeType(uploadfile.filename)[0] == 'other': return '<h2 style="width:100%; text-align:center ;color:red">file-format is not supported (upload canceled / use attachment)</h2>' file = importFile(uploadfile.filename, uploadfile.tempname) # add new file node.addFile(file) logging.getLogger('usertracing').info(user.name+" changed file of node "+node.id+" to "+uploadfile.filename+" ("+uploadfile.tempname+")") attpath = "" for f in node.getFiles(): if f.getMimeType()=="inode/directory": attpath = f.getName() break if req.params.get("change_file")=="attdir" and not create_version_error: # add attachmentdir dirname = req.params.get("inputname") if attpath=="": # add attachment directory attpath = req.params.get("inputname") if not os.path.exists(getImportDir() + "/" + attpath): os.mkdir(getImportDir() + "/" + attpath) node.addFile(tree.FileNode(name=getImportDir() + "/" + attpath, mimetype="inode/directory", type="attachment")) file = importFileIntoDir(getImportDir() + "/" + attpath, uploadfile.tempname) # add new file node.set("system.version.comment", '('+t(req, "edit_files_new_version_attachment_directory_comment")+')\n'+req.params.get('version_comment', '')) pass if req.params.get("change_file")=="attfile" and not create_version_error: # add file as attachment if attpath=="": # no attachment directory existing file = importFile(uploadfile.filename, uploadfile.tempname) # add new file file.mimetype = "inode/file" file.type = "attachment" node.addFile(file) else: # import attachment file into existing attachment directory file = importFileIntoDir(getImportDir() + "/" + attpath, uploadfile.tempname) # add new file node.set("system.version.comment", '('+t(req, "edit_files_new_version_attachment_comment")+')\n'+req.params.get('version_comment', '')) pass elif op == "addthumb": # create new thumbanil from uploaded file uploadfile = req.params.get("updatefile") if uploadfile: thumbname = os.path.join(getImportDir(), hashlib.md5(str(random.random())).hexdigest()[0:8]) + ".thumb" file = importFile(thumbname, uploadfile.tempname) # add new file makeThumbNail(file.retrieveFile(), thumbname) makePresentationFormat(file.retrieveFile(), thumbname + "2") if os.path.exists(file.retrieveFile()): # remove uploaded original os.remove(file.retrieveFile()) for f in node.getFiles(): if f.type in ["thumb", "presentation", "presentati"]: if os.path.exists(f.retrieveFile()): os.remove(f.retrieveFile()) node.removeFile(f) node.addFile(tree.FileNode(name=thumbname, type="thumb", mimetype="image/jpeg")) node.addFile(tree.FileNode(name=thumbname + "2", type="presentation", mimetype="image/jpeg")) logging.getLogger('usertracing').info(user.name + " changed thumbnail of node " + node.id) elif op == "postprocess": if hasattr(node, "event_files_changed"): try: node.event_files_changed() logging.getLogger('usertracing').info(user.name + " postprocesses node " + node.id) except: update_error = True v = {"id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "update_error": update_error, "user": user, "files": filter(lambda x: x.type != 'statistic', node.getFiles()), "statfiles": filter(lambda x: x.type == 'statistic', node.getFiles()), "attfiles": filter(lambda x: x.type == 'attachment', node.getFiles()), "att": [], "nodes": [node], "access": access} for f in v["attfiles"]: # collect all files in attachment directory if f.getMimeType() == "inode/directory": for root, dirs, files in os.walk(f.retrieveFile()): for name in files: af = tree.FileNode(root + "/" + name, "attachmentfile", getMimeType(name)[0]) v["att"].append(af) return req.getTAL("web/edit/modules/files.html", v, macro="edit_files_file")
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) access = acl.AccessData(req) for id in ids: if not access.hasWriteAccess( tree.getNode(id)) or "acls" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") idstr = ",".join(ids) if "save" in req.params: # save acl level userdir = users.getHomeDir(user) logging.getLogger('usertracing').info(access.user.name + " change access " + idstr) if req.params.get("type") == "acl": for type in acl_types: rights = req.params.get("left" + type, "").replace(";", ",") for id in ids: node = tree.getNode(id) error = 0 if access.hasWriteAccess(node) and userdir.id != node.id: node.setAccess(type, rights) else: error = 1 if error: req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") # save userlevel elif req.params.get("type") == "user": for type in acl_types: for id in ids: node = tree.getNode(id) error = 0 if access.hasWriteAccess(node) and userdir.id != node.id: r = [] r_acls = [] if req.params.get("leftuser" + type, "") != "": for right in req.params.get("leftuser" + type, "").split(";"): if len(right.split(": ")) == 2: r.append("(user " + right.split(": ")[1] + ")") else: r_acls.append(right) if len(r) > 0: rstr = "{" + " OR ".join(r) + "}" else: rstr = req.params.get( "leftuser" + type, "") if len(rstr) > 0: rstr += "," for x in r_acls: rstr += x + "," rstr = rstr[:-1] else: rstr = "" node.setAccess(type, rstr) else: error = 1 if error: req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") runsubmit = "\nfunction runsubmit(){\n" retacl = "" rights = {} parent_rights = {} overload = {} for type in acl_types: s = None parent_rights[type] = {} overload[type] = 0 runsubmit += "\tmark(document.myform.left" + type + ");\n" runsubmit += "\tmark(document.myform.leftuser" + type + ");\n" if type in ("read", "data"): overload[type] = 1 for id in ids: node = tree.getNode(id) r = node.getAccess(type) if r is None: r = "" log.debug(node.name + " " + type + " " + r) if not s or r == s: s = r else: s = "" def addNode(node): for p in node.getParents(): aclright = p.getAccess(type) for right in removeEmptyStrings((aclright or "").split(",")): parent_rights[type][right] = None if aclright and overload[type]: return else: addNode(p) addNode(node) rights[type] = removeEmptyStrings(s.split(",")) for type in acl_types: retacl += req.getTAL("web/edit/modules/acls.html", makeList(req, type, rights[type], parent_rights[type].keys(), overload[type], type=type), macro="edit_acls_selectbox") if "action" in req.params.keys(): # load additional rights by ajax retuser = "" for type in acl_types: retuser += req.getTAL("web/edit/modules/acls.html", makeUserList(req, type, rights[type], parent_rights[type].keys(), overload[type], type=type), macro="edit_acls_userselectbox") req.write(retuser) return "" runsubmit += "\tdocument.myform.submit();\n}\n" return req.getTAL("web/edit/modules/acls.html", { "runsubmit": runsubmit, "idstr": idstr, "contentacl": retacl, "adminuser": access.getUser().isAdmin() }, macro="edit_acls")
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) 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): 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) if "lza" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") v = {} v['error'] = "" nodes = [] for id in ids: node = tree.getNode(id) access = acl.AccessData(req) if not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") nodes.append(node) if "createlza" in req.params: # remove old file if existing for f in node.getFiles(): if f.getType()=="lza": node.removeFile(f) # create new file for f in node.getFiles(): if f.getType() in ("original", "document"): try: archive = l.LZA(f.retrieveFile()) schema = node.getSchema() # test for lza export mask if (getMetaType(schema).getMask("lza")): m = getMetaType(schema).getMask("lza") meta = l.LZAMetadata(m.getViewHTML([node], 8)) else: # generate error message meta = l.LZAMetadata(""" <?xpacket begin="\xef\xbb\xbf" id="mediatum_metadata"?> <lza:data> <lza:error>-definition missing-</lza:error> </lza:data><?xpacket end="w"?> """) archive.writeMediatumData(meta) node.addFile(tree. FileNode(archive.buildLZAName(),"lza", f.getMimeType())) except l.FiletypeNotSupported: v['error'] = "edit_lza_wrongfiletype" elif "removelza" in req.params: for f in node.getFiles(): if f.getType()=="lza": node.removeFile(f) v['id'] = req.params.get("id","0") v['tab'] = req.params.get("tab", "") v['ids'] = ids v['nodes'] = nodes v['t'] = t v['language'] = lang(req) meta = {} for id in ids: node = tree.getNode(id) for f in node.getFiles(): if f.getType()=="lza": try: archive = l.LZA(f.retrieveFile(), f.getMimeType()) meta[id] = archive.getMediatumData() except IOError: v['error'] = "edit_lza_ioerror" v['meta'] = meta return req.getTAL("web/edit/modules/lza.html", v, macro="edit_lza")
def getContent(req, ids): reload(su) language = lang(req) user = users.getUserFromRequest(req) username = user.getName() #access = acl.AccessData(user=user) access = acl.AccessData(req=req) if "schedule" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") errors = [] error = '' if "action" in req.params.keys(): action = req.params.get("action") if action.startswith("get_fields_for_"): schedule_func = req.params.get("action").replace( "get_fields_for_", "") fields = su.fc_dict[schedule_func].getMetafields(lang(req)) fieldDicts = su.fc_dict[schedule_func].getMetafieldDicts(lang(req)) field_errors = [] for i, field in enumerate(fields): field_errors.append(False) d = { 'fields': fields, 'fieldDicts': fieldDicts, 'currentField': fields[0], 'field_errors': field_errors, 'currentFunction': schedule_func, 'explain_func': su.fc_dict[schedule_func].getExplanation(language) } req.writeTAL("web/edit/modules/schedule.html", d, macro="schedule_func_show_fields_and_explanation") return "" elif action.startswith("load_schedule_"): schedule_id = action.replace("load_schedule_", "") try: schedule = tree.getNode(schedule_id) except: errors.append("edit_schedule_no_such_node_error") return "no such schedule error" if not schedule.type == "schedule" and access and access.hasWriteAccess( schedule): return "schedule access error" schedule_func = schedule.get("function") if schedule_func: fields = su.fc_dict[schedule_func].getMetafields(lang(req)) fieldDicts = su.fc_dict[schedule_func].getMetafieldDicts( lang(req)) d['explain_func'] = su.fc_dict[schedule_func].getExplanation( language) else: fields = [] fieldDicts = [] d['explain_func'] = "" field_errors = [] for i, field in enumerate(fields): field_errors.append(False) has_evaluation_errors = False for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] field_value = schedule.get(field_name) dfield['value'] = field_value field_validator_func = dfield['field_validator_func'] if field_validator_func and not field_validator_func( field_value): dfield['evaluation_error'] = True has_evaluation_errors = True else: dfield['evaluation_error'] = False if has_evaluation_errors: error = "\n<br/>\n".join([ error, t(language, 'edit_schedule_field_validation_error') ]) d = { 'fields': fields, 'fieldDicts': fieldDicts, 'currentField': fields[0], 'field_errors': field_errors, 'currentFunction': schedule_func, } req.writeTAL("web/edit/modules/schedule.html", d, macro="schedule_func_show_fields_and_explanation") return "" elif action == "delete_node_from_schedule": node_id = req.params.get('node_id', None) if node_id: pass else: errors.append("edit_schedule_unexpected_no_such_node") schedule_id = req.params.get('schedule_id', None) if schedule_id: try: schedule = tree.getNode(schedule_id) except: errors.append( "edit_schedule_unexpected_no_such_schedule_node") else: errors.append("edit_schedule_unexpected_no_such_schedule_node") delete_errors = su.deleteNodeIDsFromSchedule([node_id], schedule_id, access=access) if not delete_errors: msg = "user '%s' removed node %s from schedule '%s' (%s)" % ( username, node_id, schedule.name, schedule_id) logging.getLogger("backend").info(msg) else: error_msg = ", ".join([t(language, e) for e in delete_errors]) msg = "user '%s' tried to remove node %s from schedule '%s' (%s): %s" % ( username, node_id, schedule.name, schedule_id, error_msg) logging.getLogger("backend").error(msg) errors += delete_errors s = {} s['errors'] = errors s['delete_errors'] = delete_errors s['delete_table_rows'] = ['sid_%s' % schedule_id] res_msg = req.params.get("jsoncallback") + "(%s)" % json.dumps( s, indent=4) req.write(res_msg) return "" elif action == "delete_schedule": schedule_id = req.params.get('schedule_id', None) if schedule_id: try: schedule = tree.getNode(schedule_id) except: errors.append( "edit_schedule_unexpected_no_such_schedule_node") else: errors.append("edit_schedule_unexpected_no_such_schedule_node") delete_errors = su.deleteSchedule(schedule_id, access=access) if not delete_errors: msg = "user '%s' removed schedule %s (%s)" % ( username, schedule.name, schedule_id) logging.getLogger("backend").info(msg) else: error_msg = ", ".join([t(language, e) for e in delete_errors]) msg = "user '%s' tried to remove schedule '%s' (%s): %s" % ( username, schedule.name, schedule_id, error_msg) logging.getLogger("backend").error(msg) errors += delete_errors s = {} s['errors'] = errors s['delete_errors'] = delete_errors s['delete_table_rows'] = ['sid_%s' % schedule_id] res_msg = req.params.get("jsoncallback") + "(%s)" % json.dumps( s, indent=4) req.write(res_msg) return "" elif action == "load_table_nid2schedules": nid2schedules, schedule2nids, nid2active_schedules = su.getSchedulesForIds( ids, access=access, language=language) nid2schedules_attrs = {} for nid in nid2schedules: nid2schedules_attrs[nid] = [[ s.id, s.name, s.get("single_trigger") ] for s in nid2schedules[nid]['schedule_list']] d = {} d['nid2schedules'] = nid2schedules d['nid2active_schedules'] = nid2active_schedules d['errors'] = ['testerror1', 'testerror1'] d['date'] = datetime.now().isoformat() d['isActive'] = su.isActive req.writeTAL("web/edit/modules/schedule.html", d, macro="table_nid2schedules") return "" elif action == "load_table_schedule2nids": nid2schedules, schedule2nids, nid2active_schedules = su.getSchedulesForIds( ids, access=access, language=language) nid2schedules_attrs = {} for nid in nid2schedules: nid2schedules_attrs[nid] = [[ s.id, s.name, s.get("single_trigger") ] for s in nid2schedules[nid]['schedule_list']] d = {} d['nid2schedules'] = nid2schedules d['schedule2nids'] = schedule2nids d['nid2active_schedules'] = nid2active_schedules d['errors'] = ['testerror1', 'testerror1'] d['date'] = datetime.now().isoformat() d['isActive'] = su.isActive req.writeTAL("web/edit/modules/schedule.html", d, macro="table_schedule2nids") return "" nid2schedules, schedule2nids, nid2active_schedules = su.getSchedulesForIds( ids, access=access, language=language) datetime_str = req.params.get("datetime", "").strip() datetime_error = False has_evaluation_errors = False if datetime_str: patter = "^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$" if not re.match(patter, datetime_str): error = t( language, "edit_schedule_input_datetime_format_error") % datetime_str datetime_error = True else: try: parser_test_result = datetime.strptime( datetime_str, "%Y-%m-%dT%H:%M") # "%Y-%m-%dT%H:%M:%S.%f" except: parser_test_result = None error = t( language, "edit_schedule_input_datetime_format_error") % datetime_str datetime_error = True if parser_test_result and datetime_str <= datetime.now().isoformat( ): error = t(language, "edit_schedule_input_datetime_already_past_error" ) % datetime_str datetime_error = True elif "submit" in req.params: error = t(language, "edit_schedule_input_datetime_format_error") % datetime_str datetime_error = True schedule_id = req.params.get("schedule_id", "") if schedule_id: schedule = tree.getNode(schedule_id) if access and not access.hasWriteAccess(schedule): errors.append("edit_schedule_no_access_error") schedule = None current_function = req.params.get('schedule_function', '') else: current_function = schedule.get("function") else: schedule = None current_function = req.params.get('schedule_function', '') if "submit" in req.params or "submit_run_now" in req.params: current_function = req.params.get('schedule_function', '') if current_function in su.fc_dict: field_descriptors = su.fc_dict[ current_function].getFieldDescriptors() field_errors = [] else: # should not happen msg = "-> unexpected error: 'non-existant schedule function' requested in module %s: :s" % ( str(__file__), str(inspect.currentframe().f_lineno)) print msg logging.getLogger("backend").error(msg) d = {"id": req.params.get("id")} # nodes list is used to display icons in upper part of page # additional nodes should not / will not be shown there nodes = [] for nid in ids: node = tree.getNode(nid) nodes.append(node) d['nodes'] = nodes if current_function in su.fc_dict: fields = su.fc_dict[current_function].getMetafields(lang(req)) fieldDicts = su.fc_dict[current_function].getMetafieldDicts(lang(req)) d['explain_func'] = su.fc_dict[current_function].getExplanation( language) else: fields = [] fieldDicts = [] d['explain_func'] = "" if not "submit_run_now" in req.params: has_evaluation_errors = datetime_error if schedule and not "submit" in req.params and not "submit_run_now" in req.params: for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] field_value = schedule.get(field_name) dfield['value'] = field_value field_validator_func = dfield['field_validator_func'] if field_validator_func and not field_validator_func(field_value): dfield['evaluation_error'] = True has_evaluation_errors = True else: dfield['evaluation_error'] = False else: for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] # m_* classes from metadata/ are not multilingual for schedules # their getEditorHTML methods are used to display schedule node # attributes field_value = req.params.get( getDefaultLanguage() + '__' + field_name, '') dfield['value'] = field_value field_validator_func = dfield['field_validator_func'] if field_validator_func and not field_validator_func(field_value): dfield['evaluation_error'] = True has_evaluation_errors = True else: dfield['evaluation_error'] = False additional_nodes_str = req.params.get("additional_nodes", "") additional_nodes_error = False additional_nodes_bad_ids = [] try: additional_nodes_id_list = [ str(int(nid.strip())) for nid in additional_nodes_str.strip().split(";") if nid.strip() ] except: has_evaluation_errors = True additional_nodes_error = True additional_nodes_id_list = [] errors.append( "edit_schedule_additional_nodes_list_not_semikolon_separated_list_of_integers" ) if not additional_nodes_error: collections_root = tree.getRoot("collections") for nid in additional_nodes_id_list: n = None try: n = tree.getNode(nid) except tree.NoSuchNodeError as e: has_evaluation_errors = True additional_nodes_error = True if nid not in additional_nodes_bad_ids: additional_nodes_bad_ids.append(nid) if n and (not isDescendantOf(n, collections_root) or not access.hasWriteAccess(n)): # to do? discussion: override collections rectriction for # admins ? has_evaluation_errors = True additional_nodes_error = True if nid not in additional_nodes_bad_ids: additional_nodes_bad_ids.append(nid) if additional_nodes_bad_ids: has_evaluation_errors = True additional_nodes_error = True errors.append( t(language, "edit_schedule_additional_nodes_bad_ids") + (";".join(additional_nodes_bad_ids))) if has_evaluation_errors: errors.append('edit_schedule_field_validation_error') error = "\n<br/>\n".join( map(lambda x: t(language, x), [error] + errors)) d['fields'] = fields d['fieldDicts'] = fieldDicts d['field_errors'] = [False] * len(fields) d['currentField'] = None d['currentFunction'] = current_function d['error'] = error d['fc_dict'] = su.filter_access(su.fc_dict, access) d['input_datetime'] = datetime_str d['input_datetime_error'] = datetime_error d['nid2schedules'] = nid2schedules d['schedule2nids'] = schedule2nids d['nid2active_schedules'] = nid2active_schedules d['loaded_schedule'] = schedule if schedule: d['loaded_schedule_id'] = str(schedule.id) else: d['loaded_schedule_id'] = None d['mklink'] = su.mklink d['language'] = language d['t'] = t d['isActive'] = su.isActive d['result'] = '' d['created_new_schedule'] = False d['additional_nodes'] = additional_nodes_str d['additional_nodes_error'] = additional_nodes_error d['submitbutton_run_now_label'] = t(language, 'edit_schedule_submit_run_now_button') d['edit_schedule_submit_run_now_button_confirm'] = t( language, 'edit_schedule_submit_run_now_button_confirm') d['edit_schedule_delete_schedule_confirm'] = t( language, 'edit_schedule_delete_schedule_confirm') if has_evaluation_errors and not ('submit_run_now' in req.params): return req.getTAL("web/edit/modules/schedule.html", d, macro="schedule_popup") new_schedule = None if (not schedule and "submit" in req.params) or "submit_run_now" in req.params: new_schedule_name = user.name + \ "_created_at_" + datetime.now().isoformat() new_schedule = tree.Node(new_schedule_name, 'schedule') username = user.getName() new_schedule.setAccess("write", "{user %s}" % username) if not "submit_run_now" in req.params: schedules = tree.getRoot("schedules") schedules.addChild(new_schedule) msg = "user '%s' created new schedule '%s' (%s), trigger='%s', function='%s', nodelist='%s'" % ( username, new_schedule.name, str( new_schedule.id), datetime_str, d['currentFunction'], new_schedule.get('nodelist')) logging.getLogger("backend").info(msg) d['result'] = t(language, 'edit_schedule_result_new_schedule_created') d['created_new_schedule'] = True else: msg = "user '%s' created temporary schedule '%s' (%s), trigger='%s', function='%s', nodelist='%s'" % ( username, new_schedule.name, str( new_schedule.id), datetime_str, d['currentFunction'], new_schedule.get('nodelist')) logging.getLogger("backend").info(msg) d['result'] = t(language, 'edit_schedule_result_temporary_schedule_created') d['created_temporary_schedule'] = True elif (schedule) and ("submit" in req.params): new_schedule = schedule msg = "user '%s' is editing schedule '%s' (%s), trigger='%s', function='%s', nodelist='%s'" % ( username, new_schedule.name, str(new_schedule.id), datetime_str, d['currentFunction'], new_schedule.get('nodelist')) logging.getLogger("backend").info(msg) new_schedule.set("system.edited", datetime.now().isoformat()) d['result'] = t(language, 'edit_schedule_result_existing_schedule_edited') if new_schedule: for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] field_value = dfield['value'] new_schedule.set(field_name, field_value) ids_plus_additional_nodes = ids for nid in additional_nodes_id_list: if nid not in ids_plus_additional_nodes: ids_plus_additional_nodes.append(nid) new_schedule.set('function', d['currentFunction']) new_schedule.set('nodelist', ",".join(ids_plus_additional_nodes)) new_schedule.set('single_trigger', datetime_str) if datetime.now().isoformat() < datetime_str: new_schedule.set('single_trigger_status', '') if "submit_run_now" in req.params: new_schedule.set("single_trigger", datetime.now().isoformat()) has_fired, has_error, TT = su.handle_single_trigger( new_schedule, datetime.now().isoformat(), su.OUT) if has_error: _error1 = d['error'] _error2 = "<br/>\n".join( map(lambda x: (t(language, str(x))), TT)) _error = "<br/>\n".join([_error1, _error2]) d['error'] = _error return req.getTAL("web/edit/modules/schedule.html", d, macro="schedule_popup")
def getContent(req, ids): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = acl.AccessData(req) if not access.hasWriteAccess(node) or "admin" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get('action') == 'getsearchdata': req.writeTAL("web/edit/modules/admin.html", {'searchdata': node.search('searchcontent=%s' % node.id), 'node': node}, macro="searchdata") return '' if req.params.get("type", "") == "addattr" and req.params.get("new_name", "") != "" and req.params.get("new_value", "") != "": node.set(req.params.get("new_name", ""), req.params.get("new_value", "")) logging.getLogger('editor').info("new attribute %s for node %s added" % (req.params.get("new_name", ""), node.id)) for key in req.params.keys(): # update localread value of current node if key.startswith("del_localread"): node.resetLocalRead() logging.getLogger('editor').info("localread attribute of node %s updated" % node.id) break # set current node 'dirty' (reindex for search) if key.startswith("set_dirty"): node.setDirty() logging.getLogger('editor').info("set node %s dirty" % node.id) if node.isContainer(): for child_node in node.getChildren(): child_node.setDirty() logging.getLogger('editor').info("set node %s dirty" % child_node.id) break # delete node from cache (e.g. after changes in db) if key.startswith("del_cache"): for n in node.getAllChildren(): remove_from_nodecaches(n) break # remove attribute if key.startswith("attr_"): node.removeAttribute(key[5:-2]) logging.getLogger('editor').info("attribute %s of node %s removed" % (key[5:-2], node.id)) break fields = node.getType().getMetaFields() fieldnames = [] for field in fields: fieldnames += [field.name] attrs = node.items() metafields = {} technfields = {} obsoletefields = {} tattr = {} try: tattr = node.getTechnAttributes() except AttributeError: pass tattr = formatTechAttrs(tattr) for key, value in attrs: if key in fieldnames: metafields[key] = formatdate(value, getFormat(fields, key)) elif key in tattr.keys(): technfields[key] = formatdate(value) else: obsoletefields[key] = value # remove all technical attributes if req.params.get("type", "") == "technical": for key in technfields: node.removeAttribute(key) technfields = {} logging.getLogger('editor').info("technical attributes of node %s removed" % node.id) return req.getTAL("web/edit/modules/admin.html", {"id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "obsoletefields": obsoletefields, "metafields": metafields, "fields": fields, "technfields": technfields, "tattr": tattr, "fd": formatdate, "gf": getFormat, "adminuser": user.isAdmin(), "canedit": access.hasWriteAccess(node)}, macro="edit_admin_file")
def getContent(req, ids): """ The standard method, which has to be implemented by every module. It's called in edit.py, where all the modules will be identified. """ user = users.getUserFromRequest(req) access = acl.AccessData(req) node = tree.getNode(ids[0]) access_nobody = 'nicht Jeder' # first prove if the user has the required rights to call this module 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') if node.isContainer(): nodes = ', '.join(node.getChildren().getIDs()) else: nodes = node.get('node.id') v = { 'msg': '', 'urn_institutionid': config.get('urn.institutionid'), 'urn_pubtypes': config.get('urn.pubtypes').split(';'), 'namespaces': config.get('urn.namespace').split(';'), 'user': user, 'nodes': nodes, 'type': req.params.get('id_type'), 'show_form': True, 'namespace': req.params.get('namespace'), 'urn_type': req.params.get('urn_type'), 'host': config.get('host.name'), 'creator': users.getUser(node.get('creator')) } if user.isAdmin(): if 'id_type' in req.params: if req.params.get('id_type') == 'hash': createHash(node) if req.params.get('id_type') == 'urn': createUrn(node, req.params.get('namespace'), req.params.get('urn_type')) if req.params.get('id_type') == 'doi': try: createDOI(node) except: return req.error(500, "doi was not successfully registered") if any(identifier in node.attributes for identifier in ('hash', 'urn', 'doi')): if not node.get('system.identifierdate'): node.set('system.identifierdate', date.now()) if node.get('system.identifierstate') != '2': node.set('system.identifierstate', '2') # add nobody rule if not set if node.getAccess('write') is None: node.setAccess('write', access_nobody) else: if access_nobody not in node.getAccess('write'): node.setAccess( 'write', ','.join( [node.getAccess('write'), access_nobody])) try: mailtext = req.getTAL( 'web/edit/modules/identifier.html', v, macro='generate_identifier_usr_mail_2') mail.sendmail( config.get('email.admin'), users.getUser(node.get('creator')).get('email'), 'Vergabe eines Idektifikators / Generation of an Identifier', mailtext) except mail.SocketError: logging.getLogger('backend').error( 'failed to send Autorenvertrag mail to user %s' % node.get('creator')) v['msg'] = t(lang(req), 'edit_identifier_mail_fail') if node.get('system.identifierstate') != '2': v['msg'] = t(lang(req), 'edit_identifier_state_0_1_admin') else: v['msg'] = t(lang(req), 'edit_identifier_state_2_admin') else: if pathutils.isDescendantOf(node, tree.getRoot('collections')): if not node.get('system.identifierstate'): if 'id_type' in req.params: try: # fetch autorenvertrag attachment = [] autorenvertrag_name = 'formular_autorenvertrag.pdf' autorenvertrag_path = os.path.join( config.get('paths.tempdir'), autorenvertrag_name) if not os.path.isfile(autorenvertrag_path): logging.getLogger('backend').error( "Unable to attach Autorenvergrag. Attachment file not found: '%s'" % autorenvertrag_path) raise IOError( 'Autorenvertrag was not located on disk at %s. Please send this error message to %s' % (autorenvertrag_path, config.get('email.admin'))) else: attachment.append( (autorenvertrag_path, 'Autorenvertrag.pdf')) # notify user mailtext_user = req.getTAL( 'web/edit/modules/identifier.html', v, macro='generate_identifier_usr_mail_1_' + lang(req)) mail.sendmail( config.get('email.admin'), user.get('email'), t(lang(req), 'edit_identifier_mail_title_usr_1'), mailtext_user, attachments_paths_and_filenames=attachment) # notify admin mailtext_admin = req.getTAL( 'web/edit/modules/identifier.html', v, macro='generate_identifier_admin_mail') mail.sendmail( config.get('email.admin'), config.get('email.admin'), 'Antrag auf Vergabe eines Identifikators', mailtext_admin) node.set('system.identifierstate', '1') # add nobody rule print node.getAccess('write') if node.getAccess('write') is None: node.setAccess('write', access_nobody) else: if access_nobody not in node.getAccess('write'): node.setAccess( 'write', ','.join([ node.getAccess('write'), access_nobody ])) except mail.SocketError: logging.getLogger('backend').error( 'failed to send identifier request mail') v['msg'] = t(lang(req), 'edit_identifier_mail_fail') else: v['msg'] = t(lang(req), 'edit_identifier_state_0_usr') if node.get('system.identifierstate') == '1': v['show_form'] = False v['msg'] = t(lang(req), 'edit_identifier_state_1_usr') else: v['show_form'] = False v['msg'] = t(lang(req), 'edit_identifier_state_published') v['hash_val'] = node.get('hash') v['urn_val'] = node.get('urn') v['doi_val'] = node.get('doi') # hides form if all identifier types are already set if all(idents != '' for idents in (v['hash_val'], v['urn_val'], v['doi_val'])): v['show_form'] = False v['msg'] = t(lang(req), 'edit_identifier_all_types_set') return req.getTAL('web/edit/modules/identifier.html', v, macro='set_identifier')
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): 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): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = acl.AccessData(req) if not access.hasWriteAccess(node) or "changeschema" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") error = req.params.get("error") currentContentType = node.getContentType() try: currentSchema = node.type.split("/")[1] # string except: currentSchema = "" currentCategoryName = node.getCategoryName() currentTypeAlias = node.getTypeAlias() schemes = AccessData(req).filter(loadTypesFromDB()) _schemes = [] for scheme in schemes: if scheme.isActive(): _schemes.append(scheme) schemes = _schemes schemeNames2LongNames = {"": ""} for s in schemes: schemeNames2LongNames[s.getName()] = s.getLongName() try: currentSchemaLongName = schemeNames2LongNames[currentSchema] except KeyError: currentSchemaLongName = "" # find out which schema allows which datatype, and hence, # which overall data types we should display dtypes = [] datatypes = loadAllDatatypes() for scheme in schemes: for dtype in scheme.getDatatypes(): if dtype not in dtypes: for t in datatypes: if t.getName() == dtype and not elemInList(dtypes, t.getName()): dtypes.append(t) dtypes.sort( lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower() ) ) admissible_objtypes = getTypes(datatypes) admissible_datatypes = [ n for n in admissible_objtypes if tree.Node("", n.name).getCategoryName() in ["document", "image", "video", "audio"] ] admissible_containers = [n for n in admissible_objtypes if tree.Node("", n.name).getCategoryName() in ["container"]] admissible_objtypes.sort( lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower() ) ) admissible_datatypes.sort( lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower() ) ) admissible_containers.sort( lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower() ) ) available_schemes = [s for s in schemes if currentContentType in s.getDatatypes()] # filter schemes for special datatypes if req.params.get("objtype", "") != "": _schemes = [] for scheme in schemes: if req.params.get("objtype", "") in scheme.getDatatypes(): _schemes.append(scheme) schemes = _schemes schemes.sort( lambda x, y: cmp( translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower() ) ) newObjectType = req.params.get("objtype") newSchema = req.params.get("schema") if not newSchema: newSchema = "" newType = newObjectType if newSchema: newType += "/" + newSchema oldType = currentContentType if currentSchema: oldType = oldType + "/" + currentSchema if newType != oldType: node.setTypeName(newType) msg = "%s changed node schema for node %s '%s' from '%s' to '%s'" % ( user.name, node.id, node.name, oldType, newType, ) logger.info(msg) logging.getLogger("usertracing").info(msg) node.setDirty() # cache clean / reload because object type changed tree.remove_from_nodecaches(node) node = tree.getNode(node.id) currentContentType = node.getContentType() currentSchema = newSchema currentSchemaLongName = schemeNames2LongNames[currentSchema] currentCategoryName = node.getCategoryName() currentTypeAlias = node.getTypeAlias() available_schemes = [s for s in schemes if newObjectType in s.getDatatypes()] isContainer = False if hasattr(node, "isContainer"): isContainer = node.isContainer() if "action" in req.params.keys(): if req.params.get("action").startswith("get_schemes_for_"): newObjectType = req.params.get("action").replace("get_schemes_for_", "") available_schemes = [s for s in schemes if newObjectType in s.getDatatypes()] req.writeTAL( "web/edit/modules/changeschema.html", {"schemes": available_schemes, "currentSchema": currentSchema}, macro="changeschema_selectscheme", ) return "" containers = getContainers(datatypes) d = {"id": req.params.get("id"), "error": error, "node": node} d["currentContentType"] = currentContentType d["currentSchema"] = currentSchema d["currentSchemaLongName"] = currentSchemaLongName d["currentCategoryName"] = currentCategoryName d["currentTypeAlias"] = currentTypeAlias d["isContainer"] = int(isContainer) d["nodes"] = [node] if currentContentType in [dtype.name for dtype in containers]: d["schemes"] = [] d["datatypes"] = admissible_containers # containers else: d["schemes"] = available_schemes d["datatypes"] = admissible_datatypes # dtypes return req.getTAL("web/edit/modules/changeschema.html", d, macro="changeschema_popup")
def getContent(req, ids): reload(su) language = lang(req) user = users.getUserFromRequest(req) username = user.getName() #access = acl.AccessData(user=user) access = acl.AccessData(req=req) if "schedule" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") errors = [] error = '' if "action" in req.params.keys(): action = req.params.get("action") if action.startswith("get_fields_for_"): schedule_func = req.params.get( "action").replace("get_fields_for_", "") fields = su.fc_dict[schedule_func].getMetafields(lang(req)) fieldDicts = su.fc_dict[schedule_func].getMetafieldDicts(lang(req)) field_errors = [] for i, field in enumerate(fields): field_errors.append(False) d = { 'fields': fields, 'fieldDicts': fieldDicts, 'currentField': fields[0], 'field_errors': field_errors, 'currentFunction': schedule_func, 'explain_func': su.fc_dict[schedule_func].getExplanation(language) } req.writeTAL("web/edit/modules/schedule.html", d, macro="schedule_func_show_fields_and_explanation") return "" elif action.startswith("load_schedule_"): schedule_id = action.replace("load_schedule_", "") try: schedule = tree.getNode(schedule_id) except: errors.append("edit_schedule_no_such_node_error") return "no such schedule error" if not schedule.type == "schedule" and access and access.hasWriteAccess(schedule): return "schedule access error" schedule_func = schedule.get("function") if schedule_func: fields = su.fc_dict[schedule_func].getMetafields(lang(req)) fieldDicts = su.fc_dict[ schedule_func].getMetafieldDicts(lang(req)) d['explain_func'] = su.fc_dict[ schedule_func].getExplanation(language) else: fields = [] fieldDicts = [] d['explain_func'] = "" field_errors = [] for i, field in enumerate(fields): field_errors.append(False) has_evaluation_errors = False for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] field_value = schedule.get(field_name) dfield['value'] = field_value field_validator_func = dfield['field_validator_func'] if field_validator_func and not field_validator_func(field_value): dfield['evaluation_error'] = True has_evaluation_errors = True else: dfield['evaluation_error'] = False if has_evaluation_errors: error = "\n<br/>\n".join([error, t(language, 'edit_schedule_field_validation_error')]) d = { 'fields': fields, 'fieldDicts': fieldDicts, 'currentField': fields[0], 'field_errors': field_errors, 'currentFunction': schedule_func, } req.writeTAL("web/edit/modules/schedule.html", d, macro="schedule_func_show_fields_and_explanation") return "" elif action == "delete_node_from_schedule": node_id = req.params.get('node_id', None) if node_id: pass else: errors.append("edit_schedule_unexpected_no_such_node") schedule_id = req.params.get('schedule_id', None) if schedule_id: try: schedule = tree.getNode(schedule_id) except: errors.append( "edit_schedule_unexpected_no_such_schedule_node") else: errors.append("edit_schedule_unexpected_no_such_schedule_node") delete_errors = su.deleteNodeIDsFromSchedule( [node_id], schedule_id, access=access) if not delete_errors: msg = "user '%s' removed node %s from schedule '%s' (%s)" % ( username, node_id, schedule.name, schedule_id) logging.getLogger("backend").info(msg) else: error_msg = ", ".join([t(language, e) for e in delete_errors]) msg = "user '%s' tried to remove node %s from schedule '%s' (%s): %s" % ( username, node_id, schedule.name, schedule_id, error_msg) logging.getLogger("backend").error(msg) errors += delete_errors s = {} s['errors'] = errors s['delete_errors'] = delete_errors s['delete_table_rows'] = ['sid_%s' % schedule_id] res_msg = req.params.get( "jsoncallback") + "(%s)" % json.dumps(s, indent=4) req.write(res_msg) return "" elif action == "delete_schedule": schedule_id = req.params.get('schedule_id', None) if schedule_id: try: schedule = tree.getNode(schedule_id) except: errors.append( "edit_schedule_unexpected_no_such_schedule_node") else: errors.append("edit_schedule_unexpected_no_such_schedule_node") delete_errors = su.deleteSchedule(schedule_id, access=access) if not delete_errors: msg = "user '%s' removed schedule %s (%s)" % ( username, schedule.name, schedule_id) logging.getLogger("backend").info(msg) else: error_msg = ", ".join([t(language, e) for e in delete_errors]) msg = "user '%s' tried to remove schedule '%s' (%s): %s" % ( username, schedule.name, schedule_id, error_msg) logging.getLogger("backend").error(msg) errors += delete_errors s = {} s['errors'] = errors s['delete_errors'] = delete_errors s['delete_table_rows'] = ['sid_%s' % schedule_id] res_msg = req.params.get( "jsoncallback") + "(%s)" % json.dumps(s, indent=4) req.write(res_msg) return "" elif action == "load_table_nid2schedules": nid2schedules, schedule2nids, nid2active_schedules = su.getSchedulesForIds( ids, access=access, language=language) nid2schedules_attrs = {} for nid in nid2schedules: nid2schedules_attrs[nid] = [ [s.id, s.name, s.get("single_trigger")] for s in nid2schedules[nid]['schedule_list']] d = {} d['nid2schedules'] = nid2schedules d['nid2active_schedules'] = nid2active_schedules d['errors'] = ['testerror1', 'testerror1'] d['date'] = datetime.now().isoformat() d['isActive'] = su.isActive req.writeTAL( "web/edit/modules/schedule.html", d, macro="table_nid2schedules") return "" elif action == "load_table_schedule2nids": nid2schedules, schedule2nids, nid2active_schedules = su.getSchedulesForIds( ids, access=access, language=language) nid2schedules_attrs = {} for nid in nid2schedules: nid2schedules_attrs[nid] = [ [s.id, s.name, s.get("single_trigger")] for s in nid2schedules[nid]['schedule_list']] d = {} d['nid2schedules'] = nid2schedules d['schedule2nids'] = schedule2nids d['nid2active_schedules'] = nid2active_schedules d['errors'] = ['testerror1', 'testerror1'] d['date'] = datetime.now().isoformat() d['isActive'] = su.isActive req.writeTAL( "web/edit/modules/schedule.html", d, macro="table_schedule2nids") return "" nid2schedules, schedule2nids, nid2active_schedules = su.getSchedulesForIds( ids, access=access, language=language) datetime_str = req.params.get("datetime", "").strip() datetime_error = False has_evaluation_errors = False if datetime_str: patter = "^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$" if not re.match(patter, datetime_str): error = t( language, "edit_schedule_input_datetime_format_error") % datetime_str datetime_error = True else: try: parser_test_result = datetime.strptime( datetime_str, "%Y-%m-%dT%H:%M") # "%Y-%m-%dT%H:%M:%S.%f" except: parser_test_result = None error = t( language, "edit_schedule_input_datetime_format_error") % datetime_str datetime_error = True if parser_test_result and datetime_str <= datetime.now().isoformat(): error = t( language, "edit_schedule_input_datetime_already_past_error") % datetime_str datetime_error = True elif "submit" in req.params: error = t( language, "edit_schedule_input_datetime_format_error") % datetime_str datetime_error = True schedule_id = req.params.get("schedule_id", "") if schedule_id: schedule = tree.getNode(schedule_id) if access and not access.hasWriteAccess(schedule): errors.append("edit_schedule_no_access_error") schedule = None current_function = req.params.get('schedule_function', '') else: current_function = schedule.get("function") else: schedule = None current_function = req.params.get('schedule_function', '') if "submit" in req.params or "submit_run_now" in req.params: current_function = req.params.get('schedule_function', '') if current_function in su.fc_dict: field_descriptors = su.fc_dict[ current_function].getFieldDescriptors() field_errors = [] else: # should not happen msg = "-> unexpected error: 'non-existant schedule function' requested in module %s: :s" % ( str(__file__), str(inspect.currentframe().f_lineno)) print msg logging.getLogger("backend").error(msg) d = { "id": req.params.get("id") } # nodes list is used to display icons in upper part of page # additional nodes should not / will not be shown there nodes = [] for nid in ids: node = tree.getNode(nid) nodes.append(node) d['nodes'] = nodes if current_function in su.fc_dict: fields = su.fc_dict[current_function].getMetafields(lang(req)) fieldDicts = su.fc_dict[current_function].getMetafieldDicts(lang(req)) d['explain_func'] = su.fc_dict[ current_function].getExplanation(language) else: fields = [] fieldDicts = [] d['explain_func'] = "" if not "submit_run_now" in req.params: has_evaluation_errors = datetime_error if schedule and not "submit" in req.params and not "submit_run_now" in req.params: for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] field_value = schedule.get(field_name) dfield['value'] = field_value field_validator_func = dfield['field_validator_func'] if field_validator_func and not field_validator_func(field_value): dfield['evaluation_error'] = True has_evaluation_errors = True else: dfield['evaluation_error'] = False else: for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] # m_* classes from metadata/ are not multilingual for schedules # their getEditorHTML methods are used to display schedule node # attributes field_value = req.params.get( getDefaultLanguage() + '__' + field_name, '') dfield['value'] = field_value field_validator_func = dfield['field_validator_func'] if field_validator_func and not field_validator_func(field_value): dfield['evaluation_error'] = True has_evaluation_errors = True else: dfield['evaluation_error'] = False additional_nodes_str = req.params.get("additional_nodes", "") additional_nodes_error = False additional_nodes_bad_ids = [] try: additional_nodes_id_list = [ str(int(nid.strip())) for nid in additional_nodes_str.strip().split(";") if nid.strip()] except: has_evaluation_errors = True additional_nodes_error = True additional_nodes_id_list = [] errors.append( "edit_schedule_additional_nodes_list_not_semikolon_separated_list_of_integers") if not additional_nodes_error: collections_root = tree.getRoot("collections") for nid in additional_nodes_id_list: n = None try: n = tree.getNode(nid) except tree.NoSuchNodeError as e: has_evaluation_errors = True additional_nodes_error = True if nid not in additional_nodes_bad_ids: additional_nodes_bad_ids.append(nid) if n and (not isDescendantOf(n, collections_root) or not access.hasWriteAccess(n)): # to do? discussion: override collections rectriction for # admins ? has_evaluation_errors = True additional_nodes_error = True if nid not in additional_nodes_bad_ids: additional_nodes_bad_ids.append(nid) if additional_nodes_bad_ids: has_evaluation_errors = True additional_nodes_error = True errors.append(t(language, "edit_schedule_additional_nodes_bad_ids") + (";".join(additional_nodes_bad_ids))) if has_evaluation_errors: errors.append('edit_schedule_field_validation_error') error = "\n<br/>\n".join(map(lambda x: t(language, x), [error] + errors)) d['fields'] = fields d['fieldDicts'] = fieldDicts d['field_errors'] = [False] * len(fields) d['currentField'] = None d['currentFunction'] = current_function d['error'] = error d['fc_dict'] = su.filter_access(su.fc_dict, access) d['input_datetime'] = datetime_str d['input_datetime_error'] = datetime_error d['nid2schedules'] = nid2schedules d['schedule2nids'] = schedule2nids d['nid2active_schedules'] = nid2active_schedules d['loaded_schedule'] = schedule if schedule: d['loaded_schedule_id'] = str(schedule.id) else: d['loaded_schedule_id'] = None d['mklink'] = su.mklink d['language'] = language d['t'] = t d['isActive'] = su.isActive d['result'] = '' d['created_new_schedule'] = False d['additional_nodes'] = additional_nodes_str d['additional_nodes_error'] = additional_nodes_error d['submitbutton_run_now_label'] = t( language, 'edit_schedule_submit_run_now_button') d['edit_schedule_submit_run_now_button_confirm'] = t( language, 'edit_schedule_submit_run_now_button_confirm') d['edit_schedule_delete_schedule_confirm'] = t( language, 'edit_schedule_delete_schedule_confirm') if has_evaluation_errors and not ('submit_run_now' in req.params): return req.getTAL("web/edit/modules/schedule.html", d, macro="schedule_popup") new_schedule = None if (not schedule and "submit" in req.params) or "submit_run_now" in req.params: new_schedule_name = user.name + \ "_created_at_" + datetime.now().isoformat() new_schedule = tree.Node(new_schedule_name, 'schedule') username = user.getName() new_schedule.setAccess("write", "{user %s}" % username) if not "submit_run_now" in req.params: schedules = tree.getRoot("schedules") schedules.addChild(new_schedule) msg = "user '%s' created new schedule '%s' (%s), trigger='%s', function='%s', nodelist='%s'" % ( username, new_schedule.name, str(new_schedule.id), datetime_str, d['currentFunction'], new_schedule.get('nodelist')) logging.getLogger("backend").info(msg) d['result'] = t( language, 'edit_schedule_result_new_schedule_created') d['created_new_schedule'] = True else: msg = "user '%s' created temporary schedule '%s' (%s), trigger='%s', function='%s', nodelist='%s'" % ( username, new_schedule.name, str(new_schedule.id), datetime_str, d['currentFunction'], new_schedule.get('nodelist')) logging.getLogger("backend").info(msg) d['result'] = t( language, 'edit_schedule_result_temporary_schedule_created') d['created_temporary_schedule'] = True elif (schedule) and ("submit" in req.params): new_schedule = schedule msg = "user '%s' is editing schedule '%s' (%s), trigger='%s', function='%s', nodelist='%s'" % ( username, new_schedule.name, str(new_schedule.id), datetime_str, d['currentFunction'], new_schedule.get('nodelist')) logging.getLogger("backend").info(msg) new_schedule.set("system.edited", datetime.now().isoformat()) d['result'] = t( language, 'edit_schedule_result_existing_schedule_edited') if new_schedule: for i, dfield in enumerate(fieldDicts): field_name = dfield['field_name'] field_value = dfield['value'] new_schedule.set(field_name, field_value) ids_plus_additional_nodes = ids for nid in additional_nodes_id_list: if nid not in ids_plus_additional_nodes: ids_plus_additional_nodes.append(nid) new_schedule.set('function', d['currentFunction']) new_schedule.set('nodelist', ",".join(ids_plus_additional_nodes)) new_schedule.set('single_trigger', datetime_str) if datetime.now().isoformat() < datetime_str: new_schedule.set('single_trigger_status', '') if "submit_run_now" in req.params: new_schedule.set("single_trigger", datetime.now().isoformat()) has_fired, has_error, TT = su.handle_single_trigger( new_schedule, datetime.now().isoformat(), su.OUT) if has_error: _error1 = d['error'] _error2 = "<br/>\n".join(map(lambda x: (t(language, str(x))), TT)) _error = "<br/>\n".join([_error1, _error2]) d['error'] = _error return req.getTAL("web/edit/modules/schedule.html", d, macro="schedule_popup")
def getContent(req, ids): ret = "" user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) update_error = False access = acl.AccessData(req) msg = "%s|web.edit.modules.files.getContend|req.fullpath=%r|req.path=%r|req.params=%r|ids=%r" % ( get_user_id(req), req.fullpath, req.path, req.params, ids) log.debug(msg) if not access.hasWriteAccess(node) or "files" in users.getHideMenusForUser( user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if 'data' in req.params: if req.params.get( 'data' ) == 'children': # get formated list of childnodes of selected directory req.writeTAL("web/edit/modules/files.html", {'children': node.getChildren()}, macro="edit_files_popup_children") if req.params.get( 'data') == 'additems': # add selected node as children for childid in req.params.get('items').split(";"): if childid.strip() != "": childnode = tree.getNode(childid.strip()) for p in childnode.getParents(): p.removeChild(childnode) node.addChild(childnode) req.writeTAL("web/edit/modules/files.html", { 'children': node.getChildren(), 'node': node }, macro="edit_files_children_list") if req.params.get( 'data') == 'removeitem': # remove selected childnode node try: remnode = tree.getNode(req.params.get('remove')) if len(remnode.getParents()) == 1: users.getUploadDir(user).addChild(remnode) node.removeChild(remnode) except: # node not found pass req.writeTAL("web/edit/modules/files.html", { 'children': node.getChildren(), 'node': node }, macro="edit_files_children_list") if req.params.get('data') == 'reorder': i = 0 for id in req.params.get('order').split(","): if id != "": n = tree.getNode(id) n.setOrderPos(i) i += 1 if req.params.get('data') == 'translate': req.writeTALstr( '<tal:block i18n:translate="" tal:content="msgstr"/>', {'msgstr': req.params.get('msgstr')}) return "" if req.params.get("style") == "popup": v = {"basedirs": [tree.getRoot('home'), tree.getRoot('collections')]} id = req.params.get("id", tree.getRoot().id) v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s';\nvar node = %s;" % ( id, req.params.get('parent'), id) v["idstr"] = ",".join(ids) v["node"] = node req.writeTAL("web/edit/modules/files.html", v, macro="edit_files_popup_selection") return "" if "operation" in req.params: op = req.params.get("operation") if op == "delete": for key in req.params.keys(): # delete file if key.startswith("del|"): filename = key[4:-2].split("|") for file in node.getFiles(): if file.getName( ) == filename[1] and file.type == filename[0]: # remove all files in directory if file.getMimeType() == "inode/directory": for root, dirs, files in os.walk( file.retrieveFile()): for name in files: try: os.remove(root + "/" + name) except: pass os.removedirs(file.retrieveFile() + "/") if len([ f for f in node.getFiles() if f.getName() == filename[1] and f.type == filename[0] ]) > 1: # remove single file from database if there are duplicates node.removeFile(file, single=True) else: # remove single file node.removeFile(file) try: os.remove(file.retrieveFile()) except: pass break break elif key.startswith("delatt|"): for file in node.getFiles(): if file.getMimeType() == "inode/directory": try: os.remove(file.retrieveFile() + "/" + key.split("|")[2][:-2]) except: pass break break elif op == "change": uploadfile = req.params.get("updatefile") if uploadfile: create_version_error = False # Create new version when change file if (req.params.get('generate_new_version') and not hasattr(node, "metaFields")): if (req.params.get('version_comment', '').strip() == '' or req.params.get('version_comment', '').strip() == ' '): create_version_error = True req.setStatus(httpstatus.HTTP_INTERNAL_SERVER_ERROR) ret += req.getTAL("web/edit/modules/files.html", {}, macro="version_error") else: current = node node = node.createNewVersion(user) for attr, value in current.items(): if node.get( attr) != "": # do not overwrite attributes pass else: node.set(attr, value) req.setStatus(httpstatus.HTTP_MOVED_TEMPORARILY) ret += req.getTAL("web/edit/modules/metadata.html", { 'url': '?id=' + node.id + '&tab=files', 'pid': None }, macro="redirect") if req.params.get( "change_file" ) == "yes" and not create_version_error: # remove old files for f in node.getFiles(): if f.getType() in node.getSysFiles(): node.removeFile(f) node.set( "system.version.comment", '(' + t(req, "edit_files_new_version_exchanging_comment") + ')\n' + req.params.get('version_comment', '')) if req.params.get( "change_file") == "no" and not create_version_error: node.set( "system.version.comment", '(' + t(req, "edit_files_new_version_adding_comment") + ')\n' + req.params.get('version_comment', '')) if req.params.get("change_file") in [ "yes", "no" ] and not create_version_error: file = importFile(uploadfile.filename, uploadfile.tempname) # add new file node.addFile(file) logging.getLogger('usertracing').info( user.name + " changed file of node " + node.id + " to " + uploadfile.filename + " (" + uploadfile.tempname + ")") attpath = "" for f in node.getFiles(): if f.getMimeType() == "inode/directory": attpath = f.getName() break if req.params.get( "change_file" ) == "attdir" and not create_version_error: # add attachmentdir dirname = req.params.get("inputname") if attpath == "": # add attachment directory attpath = req.params.get("inputname") if not os.path.exists(getImportDir() + "/" + attpath): os.mkdir(getImportDir() + "/" + attpath) node.addFile( tree.FileNode(name=getImportDir() + "/" + attpath, mimetype="inode/directory", type="attachment")) file = importFileIntoDir( getImportDir() + "/" + attpath, uploadfile.tempname) # add new file node.set( "system.version.comment", '(' + t( req, "edit_files_new_version_attachment_directory_comment" ) + ')\n' + req.params.get('version_comment', '')) pass if req.params.get( "change_file" ) == "attfile" and not create_version_error: # add file as attachment if attpath == "": # no attachment directory existing file = importFile(uploadfile.filename, uploadfile.tempname) # add new file file.mimetype = "inode/file" file.type = "attachment" node.addFile(file) else: # import attachment file into existing attachment directory file = importFileIntoDir( getImportDir() + "/" + attpath, uploadfile.tempname) # add new file node.set( "system.version.comment", '(' + t(req, "edit_files_new_version_attachment_comment") + ')\n' + req.params.get('version_comment', '')) pass elif op == "addthumb": # create new thumbanil from uploaded file uploadfile = req.params.get("updatefile") if uploadfile: thumbname = os.path.join( getImportDir(), hashlib.md5(str( random.random())).hexdigest()[0:8]) + ".thumb" file = importFile(thumbname, uploadfile.tempname) # add new file makeThumbNail(file.retrieveFile(), thumbname) makePresentationFormat(file.retrieveFile(), thumbname + "2") if os.path.exists( file.retrieveFile()): # remove uploaded original os.remove(file.retrieveFile()) for f in node.getFiles(): if f.type in ["thumb", "presentation", "presentati"]: if os.path.exists(f.retrieveFile()): os.remove(f.retrieveFile()) node.removeFile(f) node.addFile( tree.FileNode(name=thumbname, type="thumb", mimetype="image/jpeg")) node.addFile( tree.FileNode(name=thumbname + "2", type="presentation", mimetype="image/jpeg")) logging.getLogger('usertracing').info( user.name + " changed thumbnail of node " + node.id) elif op == "postprocess": if hasattr(node, "event_files_changed"): try: node.event_files_changed() logging.getLogger('usertracing').info( user.name + " postprocesses node " + node.id) except: update_error = True v = { "id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "update_error": update_error, "user": user, "files": filter(lambda x: x.type != 'statistic', node.getFiles()), "statfiles": filter(lambda x: x.type == 'statistic', node.getFiles()), "attfiles": filter(lambda x: x.type == 'attachment', node.getFiles()), "att": [], "nodes": [node], "access": access } for f in v["attfiles"]: # collect all files in attachment directory if f.getMimeType() == "inode/directory": for root, dirs, files in os.walk(f.retrieveFile()): for name in files: af = tree.FileNode(root + "/" + name, "attachmentfile", getMimeType(name)[0]) v["att"].append(af) return req.getTAL("web/edit/modules/files.html", v, macro="edit_files_file")
def getContent(req, ids): user = users.getUserFromRequest(req) if "lza" in users.getHideMenusForUser(user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") v = {} v['error'] = "" nodes = [] for id in ids: node = tree.getNode(id) access = acl.AccessData(req) if not access.hasWriteAccess(node): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") nodes.append(node) if "createlza" in req.params: # remove old file if existing for f in node.getFiles(): if f.getType() == "lza": node.removeFile(f) # create new file for f in node.getFiles(): if f.getType() in ("original", "document"): try: archive = l.LZA(f.retrieveFile()) schema = node.getSchema() # test for lza export mask if (getMetaType(schema).getMask("lza")): m = getMetaType(schema).getMask("lza") meta = l.LZAMetadata(m.getViewHTML([node], 8)) else: # generate error message meta = l.LZAMetadata(""" <?xpacket begin="\xef\xbb\xbf" id="mediatum_metadata"?> <lza:data> <lza:error>-definition missing-</lza:error> </lza:data><?xpacket end="w"?> """) archive.writeMediatumData(meta) node.addFile( tree.FileNode(archive.buildLZAName(), "lza", f.getMimeType())) except l.FiletypeNotSupported: v['error'] = "edit_lza_wrongfiletype" elif "removelza" in req.params: for f in node.getFiles(): if f.getType() == "lza": node.removeFile(f) v['id'] = req.params.get("id", "0") v['tab'] = req.params.get("tab", "") v['ids'] = ids v['nodes'] = nodes v['t'] = t v['language'] = lang(req) meta = {} for id in ids: node = tree.getNode(id) for f in node.getFiles(): if f.getType() == "lza": try: archive = l.LZA(f.retrieveFile(), f.getMimeType()) meta[id] = archive.getMediatumData() except IOError: v['error'] = "edit_lza_ioerror" v['meta'] = meta return req.getTAL("web/edit/modules/lza.html", v, macro="edit_lza")
def getContent(req, ids): user = users.getUserFromRequest(req) node = tree.getNode(ids[0]) access = acl.AccessData(req) if not access.hasWriteAccess(node) or "admin" in users.getHideMenusForUser( user): req.setStatus(httpstatus.HTTP_FORBIDDEN) return req.getTAL("web/edit/edit.html", {}, macro="access_error") if req.params.get('action') == 'getsearchdata': req.writeTAL("web/edit/modules/admin.html", { 'searchdata': node.search('searchcontent=%s' % node.id), 'node': node }, macro="searchdata") return '' if req.params.get("type", "") == "addattr" and req.params.get( "new_name", "") != "" and req.params.get("new_value", "") != "": node.set(req.params.get("new_name", ""), req.params.get("new_value", "")) logging.getLogger('editor').info( "new attribute %s for node %s added" % (req.params.get("new_name", ""), node.id)) for key in req.params.keys(): # update localread value of current node if key.startswith("del_localread"): node.resetLocalRead() logging.getLogger('editor').info( "localread attribute of node %s updated" % node.id) break # set current node 'dirty' (reindex for search) if key.startswith("set_dirty"): node.setDirty() logging.getLogger('editor').info("set node %s dirty" % node.id) if node.isContainer(): for child_node in node.getChildren(): child_node.setDirty() logging.getLogger('editor').info("set node %s dirty" % child_node.id) break # delete node from cache (e.g. after changes in db) if key.startswith("del_cache"): for n in node.getAllChildren(): remove_from_nodecaches(n) break # remove attribute if key.startswith("attr_"): node.removeAttribute(key[5:-2]) logging.getLogger('editor').info( "attribute %s of node %s removed" % (key[5:-2], node.id)) break fields = node.getType().getMetaFields() fieldnames = [] for field in fields: fieldnames += [field.name] attrs = node.items() metafields = {} technfields = {} obsoletefields = {} tattr = {} try: tattr = node.getTechnAttributes() except AttributeError: pass tattr = formatTechAttrs(tattr) for key, value in attrs: if key in fieldnames: metafields[key] = formatdate(value, getFormat(fields, key)) elif key in tattr.keys(): technfields[key] = formatdate(value) else: obsoletefields[key] = value # remove all technical attributes if req.params.get("type", "") == "technical": for key in technfields: node.removeAttribute(key) technfields = {} logging.getLogger('editor').info( "technical attributes of node %s removed" % node.id) return req.getTAL("web/edit/modules/admin.html", { "id": req.params.get("id", "0"), "tab": req.params.get("tab", ""), "node": node, "obsoletefields": obsoletefields, "metafields": metafields, "fields": fields, "technfields": technfields, "tattr": tattr, "fd": formatdate, "gf": getFormat, "adminuser": user.isAdmin(), "canedit": access.hasWriteAccess(node) }, macro="edit_admin_file")
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): """ The standard method, which has to be implemented by every module. It's called in edit.py, where all the modules will be identified. """ user = users.getUserFromRequest(req) access = acl.AccessData(req) node = tree.getNode(ids[0]) access_nobody = 'nicht Jeder' # first prove if the user has the required rights to call this module 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') if node.isContainer(): nodes = ', '.join(node.getChildren().getIDs()) else: nodes = node.get('node.id') v = {'msg': '', 'urn_institutionid': config.get('urn.institutionid'), 'urn_pubtypes': config.get('urn.pubtypes').split(';'), 'namespaces': config.get('urn.namespace').split(';'), 'user': user, 'nodes': nodes, 'type': req.params.get('id_type'), 'show_form': True, 'namespace': req.params.get('namespace'), 'urn_type': req.params.get('urn_type'), 'host': config.get('host.name'), 'creator': users.getUser(node.get('creator')) } if user.isAdmin(): if 'id_type' in req.params: if req.params.get('id_type') == 'hash': createHash(node) if req.params.get('id_type') == 'urn': createUrn(node, req.params.get('namespace'), req.params.get('urn_type')) if req.params.get('id_type') == 'doi': try: createDOI(node) except: return req.error(500, "doi was not successfully registered") if any(identifier in node.attributes for identifier in ('hash', 'urn', 'doi')): if not node.get('system.identifierdate'): node.set('system.identifierdate', date.now()) if node.get('system.identifierstate') != '2': node.set('system.identifierstate', '2') # add nobody rule if not set if node.getAccess('write') is None: node.setAccess('write', access_nobody) else: if access_nobody not in node.getAccess('write'): node.setAccess('write', ','.join([node.getAccess('write'), access_nobody])) try: mailtext = req.getTAL('web/edit/modules/identifier.html', v, macro='generate_identifier_usr_mail_2') mail.sendmail(config.get('email.admin'), users.getUser(node.get('creator')).get('email'), 'Vergabe eines Idektifikators / Generation of an Identifier', mailtext) except mail.SocketError: logging.getLogger('backend').error('failed to send Autorenvertrag mail to user %s' % node.get('creator')) v['msg'] = t(lang(req), 'edit_identifier_mail_fail') if node.get('system.identifierstate') != '2': v['msg'] = t(lang(req), 'edit_identifier_state_0_1_admin') else: v['msg'] = t(lang(req), 'edit_identifier_state_2_admin') else: if pathutils.isDescendantOf(node, tree.getRoot('collections')): if not node.get('system.identifierstate'): if 'id_type' in req.params: try: # fetch autorenvertrag attachment = [] autorenvertrag_name = 'formular_autorenvertrag.pdf' autorenvertrag_path = os.path.join(config.get('paths.tempdir'), autorenvertrag_name) if not os.path.isfile(autorenvertrag_path): logging.getLogger('backend').error( "Unable to attach Autorenvergrag. Attachment file not found: '%s'" % autorenvertrag_path) raise IOError('Autorenvertrag was not located on disk at %s. Please send this error message to %s' % (autorenvertrag_path, config.get('email.admin'))) else: attachment.append((autorenvertrag_path, 'Autorenvertrag.pdf')) # notify user mailtext_user = req.getTAL( 'web/edit/modules/identifier.html', v, macro='generate_identifier_usr_mail_1_' + lang(req)) mail.sendmail(config.get('email.admin'), user.get('email'), t(lang(req), 'edit_identifier_mail_title_usr_1'), mailtext_user, attachments_paths_and_filenames=attachment) # notify admin mailtext_admin = req.getTAL('web/edit/modules/identifier.html', v, macro='generate_identifier_admin_mail') mail.sendmail(config.get('email.admin'), config.get('email.admin'), 'Antrag auf Vergabe eines Identifikators', mailtext_admin) node.set('system.identifierstate', '1') # add nobody rule print node.getAccess('write') if node.getAccess('write') is None: node.setAccess('write', access_nobody) else: if access_nobody not in node.getAccess('write'): node.setAccess('write', ','.join([node.getAccess('write'), access_nobody])) except mail.SocketError: logging.getLogger('backend').error('failed to send identifier request mail') v['msg'] = t(lang(req), 'edit_identifier_mail_fail') else: v['msg'] = t(lang(req), 'edit_identifier_state_0_usr') if node.get('system.identifierstate') == '1': v['show_form'] = False v['msg'] = t(lang(req), 'edit_identifier_state_1_usr') else: v['show_form'] = False v['msg'] = t(lang(req), 'edit_identifier_state_published') v['hash_val'] = node.get('hash') v['urn_val'] = node.get('urn') v['doi_val'] = node.get('doi') # hides form if all identifier types are already set if all(idents != '' for idents in (v['hash_val'], v['urn_val'], v['doi_val'])): v['show_form'] = False v['msg'] = t(lang(req), 'edit_identifier_all_types_set') return req.getTAL('web/edit/modules/identifier.html', v, macro='set_identifier')