Пример #1
0
def getSchemesforType(access, datatype):
    schemes = access.filter(loadTypesFromDB())
    ret = []
    for scheme in filter(lambda x: x.isActive(), schemes):
        if datatype in scheme.getDatatypes():
            ret.append(scheme)
    return ret
Пример #2
0
def adduseropts(user):
    ret = []

    dtypes = {}
    for scheme in filter(lambda x: x.isActive(), acl.AccessData(user=user).filter(loadTypesFromDB())):
        for dtype in scheme.getDatatypes():
            if dtype not in dtypes.keys():
                dtypes[dtype] = []
            if scheme not in dtypes[dtype]:
                dtypes[dtype].append(scheme)

    i = [x.getLongName() for x in dtypes["image"]]
    i.sort()

    field = tree.Node("ftp.type_image", "metafield")
    field.set("label", "ftp_image_schema")
    field.set("type", "list")
    field.set("valuelist", "\r\n".join(i))
    ret.append(field)

    d = [x.getLongName() for x in dtypes["document"]]
    d.sort()

    field = tree.Node("ftp.type_document", "metafield")
    field.set("label", "ftp_document_schema")
    field.set("type", "list")
    field.set("valuelist", "\r\n".join(d))
    ret.append(field)

    return ret
Пример #3
0
def _makeMetadataNumbers():
    print "Making Metadatafield-Index"
    import schema.schema as schema
    m = schema.loadTypesFromDB()
    for metatype in m:
        for field in metatype.getMetaFields():
            if field.getFieldtype() in ["list", "mlist"] and field.Searchfield():
                # print metatype.getName(),"->",field.getName()
                nstr = ""
                for v in field.getValueList():
                    v = UTF8ToLatin(v)
                    num = 0
                    for collection in tree.getRoot("collections").getChildren():
                        if collection.type == "collection":
                            try:
                                query = "%s=%s and schema=%s" % (field.getName(), v, metatype.getName())
                                n = len(collection.search(query))
                            except:
                                n = 0
                            num += n
                            # print "\t", collection.name, field.getName(), v,"->",n
                    if len(nstr):
                        nstr += ";"
                    nstr += str(num)
                field.setFieldValueNum(nstr)
Пример #4
0
def _makeMetadataNumbers():
    print "Making Metadatafield-Index"
    import schema.schema as schema
    m = schema.loadTypesFromDB()
    for metatype in m:
        for field in metatype.getMetaFields():
            if field.getFieldtype() in ["list", "mlist"
                                        ] and field.Searchfield():
                # print metatype.getName(),"->",field.getName()
                nstr = ""
                for v in field.getValueList():
                    v = UTF8ToLatin(v)
                    num = 0
                    for collection in tree.getRoot(
                            "collections").getChildren():
                        if collection.type == "collection":
                            try:
                                query = "%s=%s and schema=%s" % (
                                    field.getName(), v, metatype.getName())
                                n = len(collection.search(query))
                            except:
                                n = 0
                            num += n
                            # print "\t", collection.name, field.getName(), v,"->",n
                    if len(nstr):
                        nstr += ";"
                    nstr += str(num)
                field.setFieldValueNum(nstr)
Пример #5
0
def adduseropts(user):
    ret = []

    dtypes = {}
    for scheme in filter(lambda x: x.isActive(),
                         acl.AccessData(user=user).filter(loadTypesFromDB())):
        for dtype in scheme.getDatatypes():
            if dtype not in dtypes.keys():
                dtypes[dtype] = []
            if scheme not in dtypes[dtype]:
                dtypes[dtype].append(scheme)

    i = [x.getLongName() for x in dtypes['image']]
    i.sort()

    field = tree.Node("ftp.type_image", "metafield")
    field.set("label", "ftp_image_schema")
    field.set("type", "list")
    field.set("valuelist", "\r\n".join(i))
    ret.append(field)

    d = [x.getLongName() for x in dtypes['document']]
    d.sort()

    field = tree.Node("ftp.type_document", "metafield")
    field.set("label", "ftp_document_schema")
    field.set("type", "list")
    field.set("valuelist", "\r\n".join(d))
    ret.append(field)

    return ret
Пример #6
0
 def getSchemas(self):
     schemas = filter(lambda x: x.isActive(), loadTypesFromDB())
     schemalist = {}
     for user in self.getChildren():
         try:
             for schema in AccessData(user=user).filter(schemas):
                 schemalist[schema.getName()] = "."
         except:
             pass
     schemalist = sorted(schemalist.keys())
     return schemalist
Пример #7
0
 def getSchemas(self):
     schemas = filter(lambda x: x.isActive(), loadTypesFromDB())
     schemalist = {}
     for user in self.getChildren():
         try:
             for schema in AccessData(user=user).filter(schemas):
                 schemalist[schema.getName()] = "."
         except:
             pass
     schemalist = sorted(schemalist.keys())
     return schemalist
Пример #8
0
def getSchemes(req):
    schemes = AccessData(req).filter(loadTypesFromDB())
    return filter(lambda x: x.isActive(), schemes)
Пример #9
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")
Пример #10
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    if "ftp" in users.getHideMenusForUser(user):
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    ids = ids[0]  # use only first selected node
    node = tree.getNode(ids)
    error = ""

    def processFile(node, file, ftype):
        nname = file.retrieveFile().split("/")
        nname = "/".join(nname[:-1]) + "/" + nname[-1][4:]
        try:
            os.rename(file.retrieveFile(), nname)
        except:
            nname = file.retrieveFile()
        fnode = tree.Node(nname.split("/")[-1], ftype)
        node.removeFile(file)
        file._path = file._path.replace(config.get("paths.datadir"), "")
        file._path = "/".join(file._path.split("/")[:-1]) + "/" + fnode.getName()
        fnode.addFile(file)
        fnode.event_files_changed()
        node.addChild(fnode)
        return fnode

    for key in req.params.keys():
        if key.startswith("process|"):  # process selected file (single)
            fname = key[:-2].split("|")[-1]
            ftype = req.params.get("schema").replace(";", "")
            if ftype != "":
                for f in node.getFiles():
                    if f.getName() == fname:
                        processFile(node, f, ftype)
                        break
                break
            else:
                error = "edit_ftp_error1"

        elif key.startswith("del|"):
            for f in node.getFiles():
                if f.getName() == key[4:-2]:
                    node.removeFile(f)
                    break
            break

        elif key.startswith("delall"):  # delete all selected files
            delfiles = [f.split("|")[-1] for f in req.params.get("selfiles").split(";")]

            for f in node.getFiles():
                if f.getName() in delfiles:
                    node.removeFile(f)

            break

        elif key.startswith("processall"):  # process all selected files
            for file in req.params.get("selfiles", "").split(";"):
                if file:
                    ftype, fname = file.split("|")
                    if "multschema|" + ftype in req.params and req.params.get("multschema|" + ftype) != "":
                        for f in node.getFiles():
                            if f.getName() == fname:
                                print "use", ftype + "/" + req.params.get("multschema|" + ftype)
                                processFile(node, f, ftype + "/" + req.params.get("multschema|" + ftype))
                                break
                    else:
                        error = "edit_ftp_error2"
                        break
            break

    files = filter(lambda x: x.getName().startswith("ftp_"), node.getFiles())
    types = []
    for f in files:
        if f.getType() not in types:
            if f.getType() != "other":
                types.append(f.getType())

    dtypes = {}
    for scheme in filter(lambda x: x.isActive(), acl.AccessData(req).filter(loadTypesFromDB())):
        for dtype in scheme.getDatatypes():
            if dtype not in dtypes.keys():
                dtypes[dtype] = []
            if scheme not in dtypes[dtype]:
                dtypes[dtype].append(scheme)

    for t in dtypes:
        dtypes[t].sort(
            lambda x, y: cmp(
                translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower()
            )
        )

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

    v = {}
    v["error"] = error
    v["files"] = files
    v["node"] = node
    v["schemes"] = dtypes  # schemes
    v["usedtypes"] = types
    v["tab"] = req.params.get("tab", "")
    v["ids"] = ids
    v["script"] = "<script> parent.reloadTree('" + req.params.get("id") + "');</script>"

    return req.getTAL("web/edit/modules/ftp.html", v, macro="edit_ftp")
Пример #11
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")
Пример #12
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    node = tree.getNode(ids[0])
    access = acl.AccessData(req)
    if not access.hasWriteAccess(node) or "changeschema" in users.getHideMenusForUser(user):
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    error = req.params.get("error")
    currentContentType = node.getContentType()

    try:
        currentSchema = node.type.split("/")[1]  # string
    except:
        currentSchema = ""

    currentCategoryName = node.getCategoryName()
    currentTypeAlias = node.getTypeAlias()

    schemes = AccessData(req).filter(loadTypesFromDB())
    _schemes = []
    for scheme in schemes:
        if scheme.isActive():
            _schemes.append(scheme)
    schemes = _schemes

    schemeNames2LongNames = {"": ""}
    for s in schemes:
        schemeNames2LongNames[s.getName()] = s.getLongName()

    try:
        currentSchemaLongName = schemeNames2LongNames[currentSchema]
    except KeyError:
        currentSchemaLongName = ""

    # find out which schema allows which datatype, and hence,
    # which overall data types we should display
    dtypes = []
    datatypes = loadAllDatatypes()
    for scheme in schemes:
        for dtype in scheme.getDatatypes():
            if dtype not in dtypes:
                for t in datatypes:
                    if t.getName() == dtype and not elemInList(dtypes, t.getName()):
                        dtypes.append(t)

    dtypes.sort(
        lambda x, y: cmp(
            translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower()
        )
    )

    admissible_objtypes = getTypes(datatypes)
    admissible_datatypes = [
        n
        for n in admissible_objtypes
        if tree.Node("", n.name).getCategoryName() in ["document", "image", "video", "audio"]
    ]
    admissible_containers = [n for n in admissible_objtypes if tree.Node("", n.name).getCategoryName() in ["container"]]

    admissible_objtypes.sort(
        lambda x, y: cmp(
            translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower()
        )
    )
    admissible_datatypes.sort(
        lambda x, y: cmp(
            translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower()
        )
    )
    admissible_containers.sort(
        lambda x, y: cmp(
            translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower()
        )
    )

    available_schemes = [s for s in schemes if currentContentType in s.getDatatypes()]

    # filter schemes for special datatypes
    if req.params.get("objtype", "") != "":
        _schemes = []
        for scheme in schemes:
            if req.params.get("objtype", "") in scheme.getDatatypes():
                _schemes.append(scheme)
        schemes = _schemes
        schemes.sort(
            lambda x, y: cmp(
                translate(x.getLongName(), request=req).lower(), translate(y.getLongName(), request=req).lower()
            )
        )

        newObjectType = req.params.get("objtype")
        newSchema = req.params.get("schema")
        if not newSchema:
            newSchema = ""

        newType = newObjectType
        if newSchema:
            newType += "/" + newSchema

        oldType = currentContentType
        if currentSchema:
            oldType = oldType + "/" + currentSchema

        if newType != oldType:
            node.setTypeName(newType)
            msg = "%s changed node schema for node %s '%s' from '%s' to '%s'" % (
                user.name,
                node.id,
                node.name,
                oldType,
                newType,
            )
            logger.info(msg)
            logging.getLogger("usertracing").info(msg)

            node.setDirty()
            # cache clean / reload because object type changed
            tree.remove_from_nodecaches(node)
            node = tree.getNode(node.id)

            currentContentType = node.getContentType()
            currentSchema = newSchema
            currentSchemaLongName = schemeNames2LongNames[currentSchema]
            currentCategoryName = node.getCategoryName()
            currentTypeAlias = node.getTypeAlias()
            available_schemes = [s for s in schemes if newObjectType in s.getDatatypes()]

    isContainer = False
    if hasattr(node, "isContainer"):
        isContainer = node.isContainer()

    if "action" in req.params.keys():
        if req.params.get("action").startswith("get_schemes_for_"):
            newObjectType = req.params.get("action").replace("get_schemes_for_", "")
            available_schemes = [s for s in schemes if newObjectType in s.getDatatypes()]
            req.writeTAL(
                "web/edit/modules/changeschema.html",
                {"schemes": available_schemes, "currentSchema": currentSchema},
                macro="changeschema_selectscheme",
            )
        return ""

    containers = getContainers(datatypes)

    d = {"id": req.params.get("id"), "error": error, "node": node}
    d["currentContentType"] = currentContentType
    d["currentSchema"] = currentSchema
    d["currentSchemaLongName"] = currentSchemaLongName
    d["currentCategoryName"] = currentCategoryName
    d["currentTypeAlias"] = currentTypeAlias
    d["isContainer"] = int(isContainer)
    d["nodes"] = [node]
    if currentContentType in [dtype.name for dtype in containers]:
        d["schemes"] = []
        d["datatypes"] = admissible_containers  # containers
    else:
        d["schemes"] = available_schemes
        d["datatypes"] = admissible_datatypes  # dtypes

    return req.getTAL("web/edit/modules/changeschema.html", d, macro="changeschema_popup")
Пример #13
0
 def getDatatypes(req):
     dtypes = []
     for scheme in AccessData(req).filter(loadTypesFromDB()):
         dtypes += scheme.getDatatypes()
     return set(dtypes)
Пример #14
0
 def getDatatypes(req):
     dtypes = []
     for scheme in AccessData(req).filter(loadTypesFromDB()):
         dtypes += scheme.getDatatypes()
     return set(dtypes)
Пример #15
0
 def getSchemes(_req):
     return filter(lambda x: x.isActive(),
                   acl.AccessData(_req).filter(loadTypesFromDB()))
Пример #16
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    node = tree.getNode(ids[0])
    access = acl.AccessData(req)
    if not access.hasWriteAccess(
            node) or "changeschema" in users.getHideMenusForUser(user):
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    error = req.params.get("error")
    currentContentType = node.getContentType()

    try:
        currentSchema = node.type.split('/')[1]  # string
    except:
        currentSchema = ''

    currentCategoryName = node.getCategoryName()
    currentTypeAlias = node.getTypeAlias()

    schemes = AccessData(req).filter(loadTypesFromDB())
    _schemes = []
    for scheme in schemes:
        if scheme.isActive():
            _schemes.append(scheme)
    schemes = _schemes

    schemeNames2LongNames = {'': ''}
    for s in schemes:
        schemeNames2LongNames[s.getName()] = s.getLongName()

    try:
        currentSchemaLongName = schemeNames2LongNames[currentSchema]
    except KeyError:
        currentSchemaLongName = ''

    # find out which schema allows which datatype, and hence,
    # which overall data types we should display
    dtypes = []
    datatypes = loadAllDatatypes()
    for scheme in schemes:
        for dtype in scheme.getDatatypes():
            if dtype not in dtypes:
                for t in datatypes:
                    if t.getName() == dtype and not elemInList(
                            dtypes, t.getName()):
                        dtypes.append(t)

    dtypes.sort(lambda x, y: cmp(
        translate(x.getLongName(), request=req).lower(),
        translate(y.getLongName(), request=req).lower()))

    admissible_objtypes = getTypes(datatypes)
    admissible_datatypes = [
        n for n in admissible_objtypes
        if tree.Node('', n.name).getCategoryName() in
        ['document', 'image', 'video', 'audio']
    ]
    admissible_containers = [
        n for n in admissible_objtypes
        if tree.Node('', n.name).getCategoryName() in ['container']
    ]

    admissible_objtypes.sort(lambda x, y: cmp(
        translate(x.getLongName(), request=req).lower(),
        translate(y.getLongName(), request=req).lower()))
    admissible_datatypes.sort(lambda x, y: cmp(
        translate(x.getLongName(), request=req).lower(),
        translate(y.getLongName(), request=req).lower()))
    admissible_containers.sort(lambda x, y: cmp(
        translate(x.getLongName(), request=req).lower(),
        translate(y.getLongName(), request=req).lower()))

    available_schemes = [
        s for s in schemes if currentContentType in s.getDatatypes()
    ]

    # filter schemes for special datatypes
    if req.params.get("objtype", "") != "":
        _schemes = []
        for scheme in schemes:
            if req.params.get("objtype", "") in scheme.getDatatypes():
                _schemes.append(scheme)
        schemes = _schemes
        schemes.sort(lambda x, y: cmp(
            translate(x.getLongName(), request=req).lower(),
            translate(y.getLongName(), request=req).lower()))

        newObjectType = req.params.get("objtype")
        newSchema = req.params.get("schema")
        if not newSchema:
            newSchema = ''

        newType = newObjectType
        if newSchema:
            newType += '/' + newSchema

        oldType = currentContentType
        if currentSchema:
            oldType = oldType + '/' + currentSchema

        if newType != oldType:
            node.setTypeName(newType)
            msg = "%s changed node schema for node %s '%s' from '%s' to '%s'" % (
                user.name, node.id, node.name, oldType, newType)
            logger.info(msg)
            logging.getLogger('usertracing').info(msg)

            node.setDirty()
            # cache clean / reload because object type changed
            tree.remove_from_nodecaches(node)
            node = tree.getNode(node.id)

            currentContentType = node.getContentType()
            currentSchema = newSchema
            currentSchemaLongName = schemeNames2LongNames[currentSchema]
            currentCategoryName = node.getCategoryName()
            currentTypeAlias = node.getTypeAlias()
            available_schemes = [
                s for s in schemes if newObjectType in s.getDatatypes()
            ]

    isContainer = False
    if hasattr(node, "isContainer"):
        isContainer = node.isContainer()

    if "action" in req.params.keys():
        if req.params.get("action").startswith("get_schemes_for_"):
            newObjectType = req.params.get("action").replace(
                "get_schemes_for_", "")
            available_schemes = [
                s for s in schemes if newObjectType in s.getDatatypes()
            ]
            req.writeTAL("web/edit/modules/changeschema.html", {
                'schemes': available_schemes,
                'currentSchema': currentSchema
            },
                         macro="changeschema_selectscheme")
        return ""

    containers = getContainers(datatypes)

    d = {"id": req.params.get("id"), "error": error, "node": node}
    d['currentContentType'] = currentContentType
    d['currentSchema'] = currentSchema
    d['currentSchemaLongName'] = currentSchemaLongName
    d['currentCategoryName'] = currentCategoryName
    d['currentTypeAlias'] = currentTypeAlias
    d['isContainer'] = int(isContainer)
    d['nodes'] = [node]
    if currentContentType in [dtype.name for dtype in containers]:
        d['schemes'] = []
        d['datatypes'] = admissible_containers  # containers
    else:
        d['schemes'] = available_schemes
        d['datatypes'] = admissible_datatypes  # dtypes

    return req.getTAL("web/edit/modules/changeschema.html",
                      d,
                      macro="changeschema_popup")
Пример #17
0
 def getSchemes(_req):
     return filter(lambda x: x.isActive(), acl.AccessData(_req).filter(loadTypesFromDB()))
Пример #18
0
def getContent(req, ids):
    user = users.getUserFromRequest(req)
    if "ftp" in users.getHideMenusForUser(user):
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    ids = ids[0]  # use only first selected node
    node = tree.getNode(ids)
    error = ""

    def processFile(node, file, ftype):
        nname = file.retrieveFile().split("/")
        nname = "/".join(nname[:-1]) + "/" + nname[-1][4:]
        try:
            os.rename(file.retrieveFile(), nname)
        except:
            nname = file.retrieveFile()
        fnode = tree.Node(nname.split("/")[-1], ftype)
        node.removeFile(file)
        file._path = file._path.replace(config.get("paths.datadir"), "")
        file._path = "/".join(
            file._path.split("/")[:-1]) + "/" + fnode.getName()
        fnode.addFile(file)
        fnode.event_files_changed()
        node.addChild(fnode)
        return fnode

    for key in req.params.keys():
        if key.startswith("process|"):  # process selected file (single)
            fname = key[:-2].split("|")[-1]
            ftype = req.params.get("schema").replace(";", "")
            if ftype != "":
                for f in node.getFiles():
                    if f.getName() == fname:
                        processFile(node, f, ftype)
                        break
                break
            else:
                error = "edit_ftp_error1"

        elif key.startswith("del|"):
            for f in node.getFiles():
                if f.getName() == key[4:-2]:
                    node.removeFile(f)
                    break
            break

        elif key.startswith("delall"):  # delete all selected files
            delfiles = [
                f.split("|")[-1] for f in req.params.get("selfiles").split(";")
            ]

            for f in node.getFiles():
                if f.getName() in delfiles:
                    node.removeFile(f)

            break

        elif key.startswith("processall"):  # process all selected files
            for file in req.params.get("selfiles", "").split(";"):
                if file:
                    ftype, fname = file.split("|")
                    if "multschema|" + ftype in req.params and req.params.get(
                            "multschema|" + ftype) != "":
                        for f in node.getFiles():
                            if f.getName() == fname:
                                print "use", ftype + "/" + req.params.get(
                                    "multschema|" + ftype)
                                processFile(
                                    node, f, ftype + "/" +
                                    req.params.get("multschema|" + ftype))
                                break
                    else:
                        error = "edit_ftp_error2"
                        break
            break

    files = filter(lambda x: x.getName().startswith("ftp_"), node.getFiles())
    types = []
    for f in files:
        if f.getType() not in types:
            if f.getType() != "other":
                types.append(f.getType())

    dtypes = {}
    for scheme in filter(lambda x: x.isActive(),
                         acl.AccessData(req).filter(loadTypesFromDB())):
        for dtype in scheme.getDatatypes():
            if dtype not in dtypes.keys():
                dtypes[dtype] = []
            if scheme not in dtypes[dtype]:
                dtypes[dtype].append(scheme)

    for t in dtypes:
        dtypes[t].sort(lambda x, y: cmp(
            translate(x.getLongName(), request=req).lower(),
            translate(y.getLongName(), request=req).lower()))

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

    v = {}
    v['error'] = error
    v['files'] = files
    v['node'] = node
    v['schemes'] = dtypes  # schemes
    v['usedtypes'] = types
    v['tab'] = req.params.get("tab", "")
    v['ids'] = ids
    v["script"] = "<script> parent.reloadTree('" + req.params.get(
        "id") + "');</script>"

    return req.getTAL("web/edit/modules/ftp.html", v, macro="edit_ftp")
Пример #19
0
 def getSchemes(req):
     schemes = AccessData(req).filter(loadTypesFromDB())
     return filter(lambda x: x.isActive(), schemes)
Пример #20
0
def view(req):
    mtypes = loadTypesFromDB()
    actfilter = getFilter(req)

    # filter
    if actfilter != "":
        if actfilter in ("all", "*", t(lang(req), "admin_filter_all")):
            None  # all users
        elif actfilter == "0-9":
            num = re.compile(r'([0-9])')
            if req.params.get("filtertype", "") == "id":
                mtypes = filter(lambda x: num.match(x.getName()), mtypes)
            else:
                mtypes = filter(lambda x: num.match(x.getLongName()), mtypes)
        elif actfilter == "else" or actfilter == t(lang(req), "admin_filter_else"):
            all = re.compile(r'([a-z]|[A-Z]|[0-9]|\.)')
            if req.params.get("filtertype", "") == "id":
                mtypes = filter(lambda x: not all.match(x.getName()), mtypes)
            else:
                mtypes = filter(lambda x: not all.match(x.getLongName()), mtypes)
        else:
            if req.params.get("filtertype", "") == "id":
                mtypes = filter(lambda x: x.getName().lower().startswith(actfilter), mtypes)
            else:
                mtypes = filter(lambda x: x.getLongName().lower().startswith(actfilter), mtypes)

    pages = Overview(req, mtypes)
    order = getSortCol(req)

    # sorting
    if order != "":
        if int(order[0:1]) == 0:
            mtypes.sort(lambda x, y: cmp(x.getName().lower(), y.getName().lower()))
        elif int(order[0:1]) == 1:
            mtypes.sort(lambda x, y: cmp(x.getLongName().lower(), y.getLongName().lower()))
        elif int(order[0:1]) == 2:
            mtypes.sort(lambda x, y: cmp(x.getDescription().lower(), y.getDescription().lower()))
        elif int(order[0:1]) == 3:
            mtypes.sort(lambda x, y: cmp(x.getActive(), y.getActive()))
        elif int(order[0:1]) == 4:
            mtypes.sort(lambda x, y: cmp(x.getDatatypeString().lower(), y.getDatatypeString().lower()))
        elif int(order[0:1]) == 5:
            mtypes.sort(lambda x, y: cmp(x.metadatatype.getAccess("read"), y.metadatatype.getAccess("read")))
        elif int(order[0:1]) == 6:
            mtypes.sort(lambda x, y: cmp(x.searchIndexCorrupt(), y.searchIndexCorrupt()))
        elif int(order[0:1]) == 7:
            mtypes.sort(lambda x, y: cmp(len(x.getAllItems()), len(y.getAllItems())))
        if int(order[1:]) == 1:
            mtypes.reverse()
    else:
        mtypes.sort(lambda x, y: cmp(x.getName().lower(), y.getName().lower()))

    v = getAdminStdVars(req)
    v["sortcol"] = pages.OrderColHeader(
        [
            t(
                lang(req), "admin_meta_col_1"), t(
                lang(req), "admin_meta_col_2"), t(
                    lang(req), "admin_meta_col_3"), t(
                        lang(req), "admin_meta_col_4"), t(
                            lang(req), "admin_meta_col_5"), t(
                                lang(req), "admin_meta_col_6")])
    v["metadatatypes"] = mtypes
    v["datatypes"] = loadAllDatatypes()
    v["datatypes"].sort(lambda x, y: cmp(t(lang(req), x.getLongName()), t(lang(req), y.getLongName())))
    v["pages"] = pages
    v["actfilter"] = actfilter
    v["filterattrs"] = [("id", "admin_metatype_filter_id"), ("name", "admin_metatype_filter_name")]
    v["filterarg"] = req.params.get("filtertype", "id")
    return req.getTAL("web/admin/modules/metatype.html", v, macro="view_type")