Ejemplo n.º 1
0
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")
Ejemplo n.º 2
0
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")
Ejemplo n.º 3
0
def objlist(req):
    node = tree.getNode(req.params["id"])
    access = AccessData(req)
    
    if node.id==tree.getRoot().id or not access.hasWriteAccess(node):
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    return req.getTAL("web/edit/modules/license.html", {"node":node}, macro="edit_license")
Ejemplo n.º 4
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    access = AccessData(user=user)
    language = lang(req)
    node = tree.getNode(ids[0])

    if not access.hasWriteAccess(node):
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    if req.params.get("upload")=="uploadfile":
        # try to import file
        return import_new(req)


    v = {"error":req.params.get("error")}

    class SortChoice:
        def __init__(self, label, value):
            self.label = label
            self.value = value

    col = node
    if "globalsort" in req.params:
        col.set("sortfield", req.params.get("globalsort"))
    v['collection_sortfield'] = col.get("sortfield")
    sortfields = [SortChoice(t(req,"off"),"")]
    if col.type not in ["root", "collections", "home"]:
        for ntype, num in col.getAllOccurences(acl.AccessData(req)).items():
            if ntype.getSortFields():
                for sortfield in ntype.getSortFields():
                    sortfields += [SortChoice(sortfield.getLabel(), sortfield.getName())]
                    sortfields += [SortChoice(sortfield.getLabel()+t(req,"descending"), "-"+sortfield.getName())]
                break
    v['sortchoices'] = sortfields
    v['ids'] = ids
    v['count'] = len(node.getContentChildren())
    v['nodelist'] = showdir(req, node)
    v['language'] = lang(req)
    v['t'] = t

    _html = req.getTAL("web/edit/modules/imports.html", v, macro="upload_form")

    return _html
Ejemplo n.º 5
0
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")
Ejemplo n.º 6
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    publishdir = tree.getNode(ids[0])
    explicit = tree.getNodesByAttribute("writeaccess", user.getName())
    ret = ""

    actionerror = []
    changes = []
    if "dopublish" in req.params.keys():
        access = AccessData(req)

        objlist = []
        for key in req.params.keys():
            if key.isdigit():
                objlist.append(key)
                src = tree.getNode(req.params.get("id"))

        for obj_id in objlist:
            faultylist = []
            obj = tree.getNode(obj_id)
            for mask in obj.getType().getMasks(
                    type="edit"):  # check required fields
                if access.hasReadAccess(mask) and mask.getName() == obj.get(
                        "edit.lastmask"):
                    for f in mask.validateNodelist([obj]):
                        faultylist.append(f)

            if len(faultylist) > 0:  # object faulty
                actionerror.append(obj_id)
                continue

            for dest_id in req.params.get("destination", "").split(","):
                if dest_id == "":  # no destination given
                    continue

                dest = tree.getNode(dest_id)
                if dest != src and access.hasReadAccess(
                        src) and access.hasWriteAccess(
                            dest) and access.hasWriteAccess(
                                obj) and isDirectory(dest):
                    if not nodeIsChildOfNode(dest, obj):
                        dest.addChild(obj)
                        src.removeChild(obj)

                        if dest.id not in changes:
                            changes.append(dest.id)
                        if src.id not in changes:
                            changes.append(src.id)
                        log.info(
                            "%s published %s (%r, %r) from src %s (%r, %r) to dest %s (%r, %r)"
                            % (
                                user.getName(),
                                obj.id,
                                obj.name,
                                obj.type,
                                src.id,
                                src.name,
                                src.type,
                                dest.id,
                                dest.name,
                                dest.type,
                            ))
                    else:
                        actionerror.append(obj.id)
                        log.error(
                            "Error in publishing of node %r: Destination node %r is child of node."
                            % (obj_id, dest.id))

                if not access.hasReadAccess(src):
                    log.error(
                        "Error in publishing of node %r: source position %r has no read access."
                        % (obj.id, src.id))
                if not access.hasWriteAccess(dest):
                    log.error(
                        "Error in publishing of node %r: destination %r has no write access."
                        % (obj.id, dest.id))
                if not access.hasWriteAccess(obj):
                    log.error(
                        "Error in publishing of node %r: object has no write access."
                        % obj.id)
                if not isDirectory(dest):
                    log.error(
                        "Error in publishing of node %r: destination %r is not a directory."
                        % (obj.id, dest.id))

        v = {}
        v["id"] = publishdir.id
        v["change"] = changes
        ret += req.getTAL("web/edit/modules/publish.html", v, macro="reload")

    # build normal window
    stddir = ""
    stdname = ""
    l = []
    for n in explicit:
        if str(getHomeDir(user).id) != str(n):
            l.append(n)

    if len(l) == 1:
        stddir = str(l[0]) + ","
        stdname = "- " + tree.getNode(l[0]).getName()

    #v = {"id":publishdir.id,"stddir":stddir, "stdname":stdname, "showdir":showdir(req, publishdir, publishwarn=0, markunpublished=1, nodes=[])}
    v = {
        "id":
        publishdir.id,
        "stddir":
        stddir,
        "stdname":
        stdname,
        "showdir":
        showdir(req, publishdir, publishwarn=None, markunpublished=1, nodes=[])
    }
    v["basedir"] = tree.getRoot('collections')
    v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s'" % (
        publishdir.id, publishdir.id)
    v["idstr"] = ids
    v["faultylist"] = actionerror
    ret += req.getTAL("web/edit/modules/publish.html", v, macro="publish_form")
    return ret
Ejemplo n.º 7
0
def action(req):
    global editModules
    access = AccessData(req)
    language = lang(req)
    user = users.getUserFromRequest(req)

    trashdir = users.getTrashDir(user)
    uploaddir = users.getUploadDir(user)
    faultydir = users.getFaultyDir(user)
    importdir = users.getImportDir(user)

    trashdir_parents = trashdir.getParents()
    action = req.params.get("action", "")
    changednodes = {}

    if not access.user.isEditor():
        req.write("""permission denied""")
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return

    if "tab" in req.params:
        tab = req.params.get("tab").split("_")[-1]
        return editModules[tab].getContent(req, [req.params.get("id")])

    if action == "getlabels":
        nids = req.params.get("ids", [])
        nids = [nid.strip() for nid in nids.split(",") if nid.strip()]

        for nid in set(nids + [_n.id for _n in [trashdir, uploaddir, importdir, faultydir]]):
            try:
                changednodes[nid] = getTreeLabel(tree.getNode(nid), lang=language)
            except:
                msg = "could not make fancytree label for node %r" % nid
                logger.error(msg)
        res_dict = {"changednodes": changednodes}
        req.write(json.dumps(res_dict, indent=4))
        return

    else:
        # all 'action's except 'getlabels' require a base dir (src)
        srcid = req.params.get("src")
        try:
            src = tree.getNode(srcid)
        except:
            req.writeTAL("web/edit/edit.html", {"edit_action_error": srcid}, macro="edit_action_error")
            return

    if req.params.get("action") == "addcontainer":
        node = tree.getNode(srcid)
        if not access.hasWriteAccess(node):
            # deliver errorlabel
            req.writeTALstr('<tal:block i18n:translate="edit_nopermission"/>', {})
            return
        # create new container
        newnode_type = req.params.get("type")
        if newnode_type in ["bare_collection", "bare_directory"]:
            newnode_type = newnode_type.replace("bare_", "")

        translated_label = t(lang(req), "edit_add_" + newnode_type)
        if translated_label.startswith("edit_add_"):
            translated_label = t(lang(req), "edit_add_container_default") + newnode_type

        newnode = node.addChild(tree.Node(name=translated_label, type=newnode_type))
        newnode.set("creator", user.getName())
        newnode.set("creationtime", str(time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime(time.time()))))
        clearFromCache(node)
        req.params["dest"] = newnode.id

        # try:
        #    label = newnode.getLabel()
        # except:
        #    label = newnode.getName()
        #

        # c = len(newnode.getContentChildren())
        # if c>0:
        #    label += ' <small>(%s)</small>' %(c)

        label = getTreeLabel(newnode, lang=language)

        fancytree_nodedata = {
            "title": label,
            "key": newnode.id,
            "isLazy": False,
            "isFolder": True,
            "icon": getEditorIconPath(newnode),
            "readonly": 0,
            "tooltip": "%s (%s)" % (label, newnode.id),
            "children": [],
        }

        req.write(json.dumps(fancytree_nodedata))
        msg = "%s adding new container %r (%r) to %r (%r, %r)" % (
            access.user.name,
            newnode.id,
            newnode.type,
            node.id,
            node.name,
            node.type,
        )
        logging.getLogger("usertracing").info(msg)
        logger.info(msg)
        return

    try:
        destid = req.params.get("dest", None)
        dest = tree.getNode(destid)
        folderid = destid
    except:
        destid = None
        dest = None
        folderid = srcid

    idlist = getIDs(req)
    mysrc = None
    errorobj = None

    # try:
    if action == "clear_trash":
        for n in trashdir.getChildren():
            # if trashdir is it's sole parent, remove file from disk
            # attn: this will not touch files from children of deleted
            # containers
            if len(n.getParents()) == 1:
                logger.info(
                    "%s going to remove files from disk for node %r (%r, %r)" % (user.getName(), n.id, n.name, n.type)
                )
                for f in n.getFiles():
                    # dangerous ??? check this
                    f_path = f.retrieveFile()
                    if os.path.exists(f_path):
                        logger.info("%s going to remove file %r from disk" % (user.getName(), f_path))
                        os.remove(f_path)
            trashdir.removeChild(n)
            dest = trashdir
        clearFromCache(trashdir)
        changednodes[trashdir.id] = 1
        _parent_descr = [(p.name, p.id, p.type) for p in trashdir_parents]
        msg = "%s cleared trash folder with id %s, child of %r" % (user.getName(), trashdir.id, _parent_descr)
        logger.info(msg)
        logging.getLogger("usertracing").info(msg)
        # return
    else:
        for id in idlist:
            obj = tree.getNode(id)
            mysrc = src

            if isDirectory(obj):
                mysrc = obj.getParents()[0]

            if action == "delete":
                if access.hasWriteAccess(mysrc) and access.hasWriteAccess(obj):
                    if mysrc.id != trashdir.id:
                        mysrc.removeChild(obj)
                        changednodes[mysrc.id] = 1
                        trashdir.addChild(obj)
                        changednodes[trashdir.id] = 1
                        clearFromCache(mysrc)
                        logger.info(
                            "%s moved to trash bin %s (%r, %r) from %s (%r, %r)"
                            % (user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type)
                        )
                        logging.getLogger("usertracing").info(
                            "%s removed %s (%r, %r) from %s (%r, %r)"
                            % (user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type)
                        )
                        dest = mysrc

                else:
                    logger.info("%s has no write access for node %s" % (user.getName(), mysrc.id))
                    req.writeTALstr('<tal:block i18n:translate="edit_nopermission"/>', {})
                dest = mysrc

            elif action in ["move", "copy"]:

                if (
                    dest != mysrc
                    and access.hasWriteAccess(mysrc)
                    and access.hasWriteAccess(dest)
                    and access.hasWriteAccess(obj)
                    and isDirectory(dest)
                ):
                    if not nodeIsChildOfNode(dest, obj):
                        if action == "move":
                            mysrc.removeChild(obj)
                            changednodes[mysrc.id] = 1  # getLabel(mysrc)
                        dest.addChild(obj)
                        changednodes[dest.id] = 1  # getLabel(dest)
                        clearFromCache(dest)

                        _what = "%s %s %r (%r, %r) " % (access.user.name, action, obj.id, obj.name, obj.type)
                        _from = "from %r (%r, %r) " % (mysrc.id, mysrc.name, mysrc.type)
                        _to = "to %r (%r, %r)" % (dest.id, dest.name, dest.type)
                        msg = _what + _from + _to
                        logging.getLogger("usertracing").info(msg)
                        logger.info(msg)

                    else:
                        logger.error(
                            "%s could not %s %s from %s to %s" % (user.getName(), action, obj.id, mysrc.id, dest.id)
                        )
                else:
                    return
                mysrc = None

    if not mysrc:
        mysrc = src

    if action in ["move", "copy", "delete", "clear_trash"]:

        for nid in changednodes:
            try:
                changednodes[nid] = getTreeLabel(tree.getNode(nid), lang=language)
            except:
                msg = "could not make fancytree label for node %r" % nid
                logger.error(msg)
        res_dict = {"changednodes": changednodes}
        req.write(json.dumps(res_dict, indent=4))
    else:
        try:
            req.write(dest.id)
        except:
            req.write("no-node-id-specified (web.edit.edit.action)")
            logger.warning("no-node-id-specified (web.edit.edit.action)")
    return
Ejemplo n.º 8
0
def edit_tree(req):
    access = AccessData(req)
    language = lang(req)
    user = users.getUserFromRequest(req)
    home_dir = users.getHomeDir(user)
    match_result = ""
    match_error = False

    if req.params.get("key") == "root":
        nodes = core.tree.getRoot("collections").getContainerChildren().sort_by_orderpos()
    elif req.params.get("key") == "home":
        if not user.isAdmin():
            nodes = [home_dir]
        else:
            homenodefilter = req.params.get("homenodefilter", "")
            if homenodefilter:
                nodes = []
                try:
                    pattern = re.compile(homenodefilter)
                    nodes = tree.getRoot("home").getContainerChildren().sort_by_orderpos()
                    # filter out shoppingbags etc.
                    nodes = [n for n in nodes if n.isContainer()]
                    # filter user name - after first "("
                    nodes = filter(lambda n: re.match(homenodefilter, n.getLabel(language).split("(", 1)[-1]), nodes)
                    match_result = "#=%d" % len(nodes)
                except Exception as e:
                    logger.warning("pattern matching for home nodes: %r" % e)
                    match_result = '<span style="color:red">Error: %r</span>' % str(e)
                    match_error = True
                if home_dir not in nodes:
                    if not match_error:
                        match_result = "#=%d+1" % len(nodes)
                    nodes.append(home_dir)
                nodes = tree.NodeList(nodes).sort_by_orderpos()
            else:
                nodes = [home_dir]
    else:
        nodes = core.tree.getNode(req.params.get("key")).getContainerChildren().sort_by_orderpos()
        # filter out shoppingbags etc.
        nodes = [n for n in nodes if n.isContainer()]

    data = []

    # wn 2014-03-14
    # special directories may be handled in a special way by the editor
    special_dir_ids = {}
    special_dir_ids[home_dir.id] = "userhomedir"
    for dir_type in ["upload", "import", "faulty", "trash"]:
        special_dir_ids[users.getSpecialDir(user, dir_type).id] = dir_type

    spec_dirs = ["userhomedir", "upload", "import", "faulty", "trash"]
    spec_dir_icons = ["homeicon.gif", "uploadicon.gif", "importicon.gif", "faultyicon.gif", "trashicon.gif"]

    for node in nodes:

        if not access.hasReadAccess(node):
            continue

        # try:
        #    label = node.getLabel()
        # except:
        #    label = node.getName()
        #
        # c = len(node.getContentChildren())
        #  if c>0:
        #     label += ' <small>(%s)</small>' %(c)

        label = getTreeLabel(node, lang=language)

        nodedata = {
            "title": label,
            "key": node.id,
            "lazy": True,
            "folder": True,
            "readonly": 0,
            "tooltip": "%s (%s)" % (node.getLabel(lang=language), node.id),
        }
        nodedata["icon"] = getEditorIconPath(node, req)

        if len(node.getContainerChildren()) == 0:
            nodedata["lazy"] = False
            nodedata["children"] = []

        if not access.hasWriteAccess(node):
            if req.params.get("key") == "home":
                continue
            nodedata["readonly"] = 1
            nodedata["noLink"] = True

            nodedata["extraClasses"] = "readonly"  # fancytree

        else:
            nodedata["readonly"] = 0

        nodedata["this_node_is_special"] = []
        if node.id in special_dir_ids:
            nodedata["this_node_is_special"] = nodedata["this_node_is_special"] + [special_dir_ids[node.id]]
            if node.id == home_dir.id:
                nodedata["match_result"] = match_result

        data.append(nodedata)

    return req.write(json.dumps(data, indent=4))
Ejemplo n.º 9
0
def action(req):
    global editModules
    access = AccessData(req)
    language = lang(req)
    user = users.getUserFromRequest(req)

    trashdir = users.getTrashDir(user)
    uploaddir = users.getUploadDir(user)
    faultydir = users.getFaultyDir(user)
    importdir = users.getImportDir(user)

    trashdir_parents = trashdir.getParents()
    action = req.params.get("action", "")
    changednodes = {}

    if not access.user.isEditor():
        req.write("""permission denied""")
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return

    if "tab" in req.params:
        tab = req.params.get("tab").split("_")[-1]
        return editModules[tab].getContent(req, [req.params.get("id")])

    if action == "getlabels":
        nids = req.params.get('ids', [])
        nids = [nid.strip() for nid in nids.split(',') if nid.strip()]

        for nid in set(nids + [_n.id for _n in [trashdir, uploaddir, importdir, faultydir]]):
            try:
                changednodes[nid] = getTreeLabel(
                    tree.getNode(nid), lang=language)
            except:
                msg = "could not make fancytree label for node %r" % nid
                logger.error(msg)
        res_dict = {'changednodes': changednodes}
        req.write(json.dumps(res_dict, indent=4))
        return

    else:
        # all 'action's except 'getlabels' require a base dir (src)
        srcid = req.params.get("src")
        try:
            src = tree.getNode(srcid)
        except:
            req.writeTAL(
                "web/edit/edit.html", {"edit_action_error": srcid}, macro="edit_action_error")
            return

    if req.params.get('action') == 'addcontainer':
        node = tree.getNode(srcid)
        if not access.hasWriteAccess(node):
            # deliver errorlabel
            req.writeTALstr(
                '<tal:block i18n:translate="edit_nopermission"/>', {})
            return
        # create new container
        newnode_type = req.params.get('type')
        if newnode_type in ['bare_collection', 'bare_directory']:
            newnode_type = newnode_type.replace('bare_', '')

        translated_label = t(lang(req), 'edit_add_' + newnode_type)
        if translated_label.startswith('edit_add_'):
            translated_label = t(
                lang(req), 'edit_add_container_default') + newnode_type

        newnode = node.addChild(
            tree.Node(name=translated_label, type=newnode_type))
        newnode.set("creator", user.getName())
        newnode.set("creationtime", str(
            time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime(time.time()))))
        clearFromCache(node)
        req.params["dest"] = newnode.id

        # try:
        #    label = newnode.getLabel()
        # except:
        #    label = newnode.getName()
        #

        # c = len(newnode.getContentChildren())
        # if c>0:
        #    label += ' <small>(%s)</small>' %(c)

        label = getTreeLabel(newnode, lang=language)

        fancytree_nodedata = {
            'title': label,
            'key': newnode.id,
            'isLazy': False,
            'isFolder': True,
            'icon': getEditorIconPath(newnode),
            'readonly': 0,
            'tooltip': '%s (%s)' % (label, newnode.id),
            'children': [],
        }

        req.write(json.dumps(fancytree_nodedata))
        msg = "%s adding new container %r (%r) to %r (%r, %r)" % (
            access.user.name, newnode.id, newnode.type, node.id, node.name, node.type)
        logging.getLogger('usertracing').info(msg)
        logger.info(msg)
        return

    try:
        destid = req.params.get("dest", None)
        dest = tree.getNode(destid)
        folderid = destid
    except:
        destid = None
        dest = None
        folderid = srcid

    idlist = getIDs(req)
    mysrc = None
    errorobj = None

    # try:
    if action == "clear_trash":
        for n in trashdir.getChildren():
            # if trashdir is it's sole parent, remove file from disk
            # attn: this will not touch files from children of deleted
            # containers
            if len(n.getParents()) == 1:
                logger.info("%s going to remove files from disk for node %r (%r, %r)" % (
                    user.getName(), n.id, n.name, n.type))
                for f in n.getFiles():
                    # dangerous ??? check this
                    f_path = f.retrieveFile()
                    if os.path.exists(f_path):
                        logger.info(
                            "%s going to remove file %r from disk" % (user.getName(), f_path))
                        os.remove(f_path)
            trashdir.removeChild(n)
            dest = trashdir
        clearFromCache(trashdir)
        changednodes[trashdir.id] = 1
        _parent_descr = [(p.name, p.id, p.type) for p in trashdir_parents]
        msg = "%s cleared trash folder with id %s, child of %r" % (
            user.getName(), trashdir.id, _parent_descr)
        logger.info(msg)
        logging.getLogger('usertracing').info(msg)
        # return
    else:
        for id in idlist:
            obj = tree.getNode(id)
            mysrc = src

            if isDirectory(obj):
                mysrc = obj.getParents()[0]

            if action == "delete":
                if access.hasWriteAccess(mysrc) and access.hasWriteAccess(obj):
                    if mysrc.id != trashdir.id:
                        mysrc.removeChild(obj)
                        changednodes[mysrc.id] = 1
                        trashdir.addChild(obj)
                        changednodes[trashdir.id] = 1
                        clearFromCache(mysrc)
                        logger.info("%s moved to trash bin %s (%r, %r) from %s (%r, %r)" % (
                            user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type))
                        logging.getLogger('usertracing').info("%s removed %s (%r, %r) from %s (%r, %r)" % (
                            user.getName(), obj.id, obj.name, obj.type, mysrc.id, mysrc.name, mysrc.type))
                        dest = mysrc

                else:
                    logger.info(
                        "%s has no write access for node %s" % (user.getName(), mysrc.id))
                    req.writeTALstr(
                        '<tal:block i18n:translate="edit_nopermission"/>', {})
                dest = mysrc

            elif action in ["move", "copy"]:

                if dest != mysrc and \
                   access.hasWriteAccess(mysrc) and \
                   access.hasWriteAccess(dest) and \
                   access.hasWriteAccess(obj) and \
                   isDirectory(dest):
                    if not nodeIsChildOfNode(dest, obj):
                        if action == "move":
                            mysrc.removeChild(obj)
                            changednodes[mysrc.id] = 1  # getLabel(mysrc)
                        dest.addChild(obj)
                        changednodes[dest.id] = 1  # getLabel(dest)
                        clearFromCache(dest)

                        _what = "%s %s %r (%r, %r) " % (
                            access.user.name, action, obj.id, obj.name, obj.type)
                        _from = "from %r (%r, %r) " % (
                            mysrc.id, mysrc.name, mysrc.type)
                        _to = "to %r (%r, %r)" % (
                            dest.id, dest.name, dest.type)
                        msg = _what + _from + _to
                        logging.getLogger('usertracing').info(msg)
                        logger.info(msg)

                    else:
                        logger.error("%s could not %s %s from %s to %s" % (
                            user.getName(), action, obj.id, mysrc.id, dest.id))
                else:
                    return
                mysrc = None

    if not mysrc:
        mysrc = src

    if action in ["move", "copy", "delete", "clear_trash"]:

        for nid in changednodes:
            try:
                changednodes[nid] = getTreeLabel(
                    tree.getNode(nid), lang=language)
            except:
                msg = "could not make fancytree label for node %r" % nid
                logger.error(msg)
        res_dict = {'changednodes': changednodes}
        req.write(json.dumps(res_dict, indent=4))
    else:
        try:
            req.write(dest.id)
        except:
            req.write('no-node-id-specified (web.edit.edit.action)')
            logger.warning('no-node-id-specified (web.edit.edit.action)')
    return
Ejemplo n.º 10
0
def edit_tree(req):
    access = AccessData(req)
    language = lang(req)
    user = users.getUserFromRequest(req)
    home_dir = users.getHomeDir(user)
    match_result = ''
    match_error = False

    if req.params.get('key') == 'root':
        nodes = core.tree.getRoot(
            'collections').getContainerChildren().sort_by_orderpos()
    elif req.params.get('key') == 'home':
        if not user.isAdmin():
            nodes = [home_dir]
        else:
            homenodefilter = req.params.get('homenodefilter', '')
            if homenodefilter:
                nodes = []
                try:
                    pattern = re.compile(homenodefilter)
                    nodes = tree.getRoot('home').getContainerChildren().sort_by_orderpos()
                    # filter out shoppingbags etc.
                    nodes = [n for n in nodes if n.isContainer()]
                    # filter user name - after first "("
                    nodes = filter(lambda n: re.match(homenodefilter, n.getLabel(language).split('(', 1)[-1]), nodes)
                    match_result = '#=%d' % len(nodes)
                except Exception as e:
                    logger.warning('pattern matching for home nodes: %r' % e)
                    match_result = '<span style="color:red">Error: %r</span>' % str(e)
                    match_error = True
                if home_dir not in nodes:
                    if not match_error:
                        match_result = '#=%d+1' % len(nodes)
                    nodes.append(home_dir)
                nodes = tree.NodeList(nodes).sort_by_orderpos()
            else:
                nodes = [home_dir]
    else:
        nodes = core.tree.getNode(
            req.params.get('key')).getContainerChildren().sort_by_orderpos()
        # filter out shoppingbags etc.
        nodes = [n for n in nodes if n.isContainer()]

    data = []

    # wn 2014-03-14
    # special directories may be handled in a special way by the editor
    special_dir_ids = {}
    special_dir_ids[home_dir.id] = 'userhomedir'
    for dir_type in ['upload', 'import', 'faulty', 'trash']:
        special_dir_ids[users.getSpecialDir(user, dir_type).id] = dir_type

    spec_dirs = ['userhomedir', 'upload', 'import', 'faulty', 'trash']
    spec_dir_icons = ["homeicon.gif", "uploadicon.gif",
                      "importicon.gif", "faultyicon.gif", "trashicon.gif"]

    for node in nodes:

        if not access.hasReadAccess(node):
            continue

        # try:
        #    label = node.getLabel()
        # except:
        #    label = node.getName()
        #
        # c = len(node.getContentChildren())
        #  if c>0:
        #     label += ' <small>(%s)</small>' %(c)

        label = getTreeLabel(node, lang=language)

        nodedata = {'title': label, 'key': node.id, 'lazy': True, 'folder': True,
                    'readonly': 0, 'tooltip': '%s (%s)' % (node.getLabel(lang=language),
                                                           node.id)}
        nodedata['icon'] = getEditorIconPath(node, req)

        if len(node.getContainerChildren()) == 0:
            nodedata['lazy'] = False
            nodedata['children'] = []

        if not access.hasWriteAccess(node):
            if req.params.get('key') == 'home':
                continue
            nodedata['readonly'] = 1
            nodedata['noLink'] = True

            nodedata['extraClasses'] = 'readonly'  # fancytree

        else:
            nodedata['readonly'] = 0

        nodedata['this_node_is_special'] = []
        if node.id in special_dir_ids:
            nodedata['this_node_is_special'] = nodedata[
                'this_node_is_special'] + [special_dir_ids[node.id]]
            if node.id == home_dir.id:
                nodedata['match_result'] = match_result

        data.append(nodedata)

    return req.write(json.dumps(data, indent=4))
Ejemplo n.º 11
0
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")
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    publishdir = tree.getNode(ids[0])
    explicit = tree.getNodesByAttribute("writeaccess", user.getName())
    ret = ""

    actionerror = []
    changes = []
    if "dopublish" in req.params.keys():
        access = AccessData(req)

        objlist = []
        for key in req.params.keys():
            if key.isdigit():
                objlist.append(key)
                src = tree.getNode(req.params.get("id"))

        for obj_id in objlist:
            faultylist = []
            obj = tree.getNode(obj_id)
            for mask in obj.getType().getMasks(type="edit"): # check required fields
                if access.hasReadAccess(mask) and mask.getName()==obj.get("edit.lastmask"):
                    for f in mask.validateNodelist([obj]):
                        faultylist.append(f)

            if len(faultylist)>0: # object faulty
                actionerror.append(obj_id)
                continue

            for dest_id in req.params.get("destination", "").split(","):
                if dest_id=="": # no destination given
                    continue

                dest = tree.getNode(dest_id)
                if dest != src and access.hasReadAccess(src) and access.hasWriteAccess(dest) and access.hasWriteAccess(obj) and isDirectory(dest):
                        if not nodeIsChildOfNode(dest,obj):
                            dest.addChild(obj)
                            src.removeChild(obj)

                            if dest.id not in changes:
                                changes.append(dest.id)
                            if src.id not in changes:
                                changes.append(src.id)
                            log.info("%s published %s (%r, %r) from src %s (%r, %r) to dest %s (%r, %r)" % (
                                      user.getName(),
                                      obj.id, obj.name, obj.type,
                                      src.id, src.name, src.type,
                                      dest.id, dest.name, dest.type,))
                        else:
                            actionerror.append(obj.id)
                            log.error("Error in publishing of node %r: Destination node %r is child of node." % (obj_id, dest.id))

                if not access.hasReadAccess(src):
                    log.error("Error in publishing of node %r: source position %r has no read access." % (obj.id, src.id))
                if not access.hasWriteAccess(dest):
                    log.error("Error in publishing of node %r: destination %r has no write access." % (obj.id, dest.id))
                if not access.hasWriteAccess(obj):
                    log.error("Error in publishing of node %r: object has no write access." % obj.id)
                if not isDirectory(dest):
                    log.error("Error in publishing of node %r: destination %r is not a directory." % (obj.id, dest.id))

        v = {}
        v["id"] = publishdir.id
        v["change"] = changes
        ret += req.getTAL("web/edit/modules/publish.html", v, macro="reload")

    # build normal window
    stddir = ""
    stdname = ""
    l = []
    for n in explicit:
        if str(getHomeDir(user).id)!=str(n):
            l.append(n)

    if len(l)==1:
        stddir = str(l[0])+","
        stdname = "- " + tree.getNode(l[0]).getName()

    #v = {"id":publishdir.id,"stddir":stddir, "stdname":stdname, "showdir":showdir(req, publishdir, publishwarn=0, markunpublished=1, nodes=[])}
    v = {"id":publishdir.id,"stddir":stddir, "stdname":stdname, "showdir":showdir(req, publishdir, publishwarn=None, markunpublished=1, nodes=[])}
    v["basedir"] = tree.getRoot('collections')
    v["script"] = "var currentitem = '%s';\nvar currentfolder = '%s'" %(publishdir.id, publishdir.id)
    v["idstr"] = ids
    v["faultylist"] = actionerror
    ret += req.getTAL("web/edit/modules/publish.html", v, macro="publish_form")
    return ret
Ejemplo n.º 15
0
def getData(req):
    access = AccessData(req)
    pid = req.params.get("parentId")
    style = req.params.get("style", "edittree")
    ret = []

    for c in tree.getNode(pid).getChildren().sort_by_orderpos():
        if not access.hasReadAccess(c):
            continue
        try:
            if c.isContainer():
                cnum = len(c.getContainerChildren())
                inum = len(c.getContentChildren())

                label = c.getLabel()
                title = c.getLabel() + " (" + str(c.id) + ")"

                cls = "folder"

                itemcls = ""
                if not access.hasWriteAccess(c):
                    itemcls = "read"

                if c.type == "collection":  # or "collection" in c.type:
                    cls = "collection"
                if hasattr(c, 'treeiconclass'):
                    cls = c.treeiconclass()

                if c.getName().startswith(translate('user_trash', request=req)):
                    cls = "trashicon"
                elif c.getName().startswith(translate('user_upload', request=req)):
                    cls = "uploadicon"
                elif c.getName().startswith(translate('user_import', request=req)):
                    cls = "importicon"
                elif c.getName().startswith(translate('user_faulty', request=req)):
                    cls = "faultyicon"
                elif c.getName().startswith(translate('user_directory', request=req)):
                    cls = "homeicon"

                if style == "edittree":  # standard tree for edit area
                    if inum > 0:
                        label += " <small>(" + str(inum) + ")</small>"

                    ret.append('<li class="' + cls + '.gif" id="Node' + c.id + '">')
                    ret.append('<a href="#" title="' + title + '" id="' + c.id + '" class="' + itemcls + '">' + label + '</a>')

                    if cnum > 0:
                        ret.append('<ul><li parentId="' + c.id + '" class="spinner.gif"><a href="#">&nbsp;</a></li></ul>')
                    ret.append('</li>')

                elif style == "classification":  # style for classification
                    ret.append('<li class="' + cls + '.gif" id="Node' + c.id + '">')
                    ret.append('<a href="#" title="' + title + '" id="' + c.id + '" class="' + itemcls +
                               '">' + label + ' <input type="image" src="/img/ftree/uncheck.gif"/></a>')

                    if cnum > 0:
                        ret.append('<ul><li parentId="' + c.id + '" class="spinner.gif"><a href="#">&nbsp;</a></li></ul>')

                    ret.append('</li>')
        except:
            pass

    req.write("\n".join(ret))
    return
Ejemplo n.º 16
0
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")
Ejemplo n.º 17
0
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")
Ejemplo n.º 18
0
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")
Ejemplo n.º 19
0
def edit_tree(req):
    access = AccessData(req)
    language = lang(req)
    user = users.getUserFromRequest(req)
    home_dir = users.getHomeDir(user)
    match_result = ''
    match_error = False

    if req.params.get('key') == 'root':
        nodes = core.tree.getRoot(
            'collections').getContainerChildren().sort_by_orderpos()
    elif req.params.get('key') == 'home':
        if not user.isAdmin():
            nodes = [home_dir]
        else:
            homenodefilter = req.params.get('homenodefilter', '')
            if homenodefilter:
                nodes = []
                try:
                    pattern = re.compile(homenodefilter)
                    nodes = tree.getRoot('home').getContainerChildren().sort_by_orderpos()
                    # filter out shoppingbags etc.
                    nodes = [n for n in nodes if n.isContainer()]
                    # filter user name - after first "("
                    nodes = filter(lambda n: re.match(homenodefilter, n.getLabel(language).split('(', 1)[-1]), nodes)
                    match_result = '#=%d' % len(nodes)
                except Exception as e:
                    logger.warning('pattern matching for home nodes: %r' % e)
                    match_result = '<span style="color:red">Error: %r</span>' % str(e)
                    match_error = True
                if home_dir not in nodes:
                    if not match_error:
                        match_result = '#=%d+1' % len(nodes)
                    nodes.append(home_dir)
                nodes = tree.NodeList(nodes).sort_by_orderpos()
            else:
                nodes = [home_dir]
    else:
        nodes = core.tree.getNode(
            req.params.get('key')).getContainerChildren().sort_by_orderpos()
        # filter out shoppingbags etc.
        nodes = [n for n in nodes if n.isContainer()]

    data = []

    # wn 2014-03-14
    # special directories may be handled in a special way by the editor
    special_dir_ids = {}
    special_dir_ids[home_dir.id] = 'userhomedir'
    for dir_type in ['upload', 'import', 'faulty', 'trash']:
        special_dir_ids[users.getSpecialDir(user, dir_type).id] = dir_type

    spec_dirs = ['userhomedir', 'upload', 'import', 'faulty', 'trash']
    spec_dir_icons = ["homeicon.gif", "uploadicon.gif",
                      "importicon.gif", "faultyicon.gif", "trashicon.gif"]

    for node in nodes:

        if not access.hasReadAccess(node):
            continue

        # try:
        #    label = node.getLabel()
        # except:
        #    label = node.getName()
        #
        # c = len(node.getContentChildren())
        #  if c>0:
        #     label += ' <small>(%s)</small>' %(c)

        label = getTreeLabel(node, lang=language)

        nodedata = {'title': label, 'key': node.id, 'lazy': True, 'folder': True,
                    'readonly': 0, 'tooltip': '%s (%s)' % (node.getLabel(lang=language),
                                                           node.id)}
        nodedata['icon'] = getEditorIconPath(node, req)

        if len(node.getContainerChildren()) == 0:
            nodedata['lazy'] = False
            nodedata['children'] = []

        if not access.hasWriteAccess(node):
            if req.params.get('key') == 'home':
                continue
            nodedata['readonly'] = 1
            nodedata['noLink'] = True

            nodedata['extraClasses'] = 'readonly'  # fancytree

        else:
            nodedata['readonly'] = 0



        nodedata['this_node_is_special'] = []
        if node.id in special_dir_ids:
            nodedata['this_node_is_special'] = nodedata[
                'this_node_is_special'] + [special_dir_ids[node.id]]
            if node.id == home_dir.id:
                nodedata['match_result'] = match_result

        data.append(nodedata)

    return req.write(json.dumps(data, indent=4))