示例#1
0
def upload_filehandler(req):
    mime = getMimeType(req.params.get('file'))
    scheme_type = {mime[1]: []}
    for scheme in get_permitted_schemas():
        if mime[1] in scheme.getDatatypes():
            scheme_type[mime[1]].append(scheme)
            # break

    return {'files': [req.params.get('file')], 'schemes': scheme_type}
示例#2
0
def upload_to_filetype_filehandler(req):
    datatype = 'file'
    scheme_type = {datatype: []}
    for scheme in get_permitted_schemas():
        if datatype in scheme.getDatatypes():
            scheme_type[datatype].append(scheme)
            # break

    return {'files': [req.params.get('file')], 'schemes': scheme_type}
示例#3
0
def upload_to_filetype_filehandler(req):
    datatype = 'file'
    scheme_type = {datatype: []}
    for scheme in get_permitted_schemas():
        if datatype in scheme.getDatatypes():
            scheme_type[datatype].append(scheme)
            # break

    return {'files': [req.params.get('file')], 'schemes': scheme_type}
示例#4
0
def upload_filehandler(req):
    mime = getMimeType(req.params.get('file'))
    scheme_type = {mime[1]: []}
    for scheme in get_permitted_schemas():
        if mime[1] in scheme.getDatatypes():
            scheme_type[mime[1]].append(scheme)
            # break

    return {'files': [req.params.get('file')], 'schemes': scheme_type}
示例#5
0
def upload_ziphandler(req):
    schemes = get_permitted_schemas()
    files = []
    scheme_type = {}
    basenode = q(Node).get(req.params.get('id'))
    for file in basenode.files:
        if file.abspath.endswith(req.params.get('file')):
            z = zipfile.ZipFile(file.abspath)
            for f in z.namelist():
                #strip unwanted garbage from string
                name = mybasename(f).decode('utf8', 'ignore').encode('utf8')
                random_str = ustr(random.random())[2:]
                if name.startswith("._"):  # ignore Mac OS X junk
                    continue
                if name.split('.')[0] == '':
                    name = random_str + name

                files.append(name.replace(" ", "_"))
                _m = getMimeType(name)

                if random_str in name:
                    newfilename = join_paths(config.get("paths.tempdir"),
                                             name.replace(" ", "_"))
                else:
                    newfilename = join_paths(
                        config.get("paths.tempdir"),
                        random_str + name.replace(" ", "_"))

                with codecs.open(newfilename, "wb") as fi:
                    fi.write(z.read(f))

                fn = importFileToRealname(mybasename(name.replace(" ", "_")),
                                          newfilename)
                basenode.files.append(fn)
                if os.path.exists(newfilename):
                    os.unlink(newfilename)

                if _m[1] not in scheme_type:
                    scheme_type[_m[1]] = []
                    for scheme in schemes:
                        if _m[1] in scheme.getDatatypes():
                            scheme_type[_m[1]].append(scheme)
            try:
                z.close()
                os.remove(file.abspath)
            except:
                pass
            basenode.files.remove(file)
            db.session.commit()
    return {'files': files, 'schemes': scheme_type}
示例#6
0
def upload_ziphandler(req):
    schemes = get_permitted_schemas()
    files = []
    scheme_type = {}
    basenode = q(Node).get(req.params.get('id'))
    for file in basenode.files:
        if file.abspath.endswith(req.params.get('file')):
            z = zipfile.ZipFile(file.abspath)
            for f in z.namelist():
                #strip unwanted garbage from string
                name = mybasename(f).decode('utf8', 'ignore').encode('utf8')
                random_str = ustr(random.random())[2:]
                if name.startswith("._"):  # ignore Mac OS X junk
                    continue
                if name.split('.')[0] == '':
                    name = random_str + name

                files.append(name.replace(" ", "_"))
                _m = getMimeType(name)

                if random_str in name:
                    newfilename = join_paths(config.get("paths.tempdir"), name.replace(" ", "_"))
                else:
                    newfilename = join_paths(config.get("paths.tempdir"),  random_str + name.replace(" ", "_"))

                with codecs.open(newfilename, "wb") as fi:
                    fi.write(z.read(f))

                fn = importFileToRealname(mybasename(name.replace(" ", "_")), newfilename)
                basenode.files.append(fn)
                if os.path.exists(newfilename):
                    os.unlink(newfilename)

                if _m[1] not in scheme_type:
                    scheme_type[_m[1]] = []
                    for scheme in schemes:
                        if _m[1] in scheme.getDatatypes():
                            scheme_type[_m[1]].append(scheme)
            with suppress(Exception, warn=False):
                z.close()
                os.remove(file.abspath)
            basenode.files.remove(file)
            db.session.commit()
    return {'files': files, 'schemes': scheme_type}
示例#7
0
def getContent(req, ids):
    user = current_user
    node = q(Node).get(ids[0])
    if not node.has_write_access() or "changeschema" in current_user.hidden_edit_functions:
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    # nobody should be able to change the type/schema of his home directory
    if node.id == user.home_dir_id:
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    error = req.params.get("error")

    schemes = get_permitted_schemas()
    long_scheme_names = {scheme.name: scheme.getLongName() for scheme in schemes}


    if isinstance(node, Container):
        admissible_containers = [s.__name__.lower()
                                 for s
                                 in Container.get_all_subclasses(filter_classnames=["container", "collections", "home", "root"])]
    else:
        admissible_content_types = [s.__name__.lower()
                                    for s
                                    in Content.get_all_subclasses(filter_classnames=["content"])]

    # filter schemes for special datatypes
    if req.params.get("objtype", "") != "":
        new_type = req.params.get('objtype', '')
        new_schema = req.params.get('schema', '')

        if not new_schema:
            return _redirect_to_view(req)

        if new_type != node.type or new_schema != node.schema:


            if isinstance(node, Container):
                if not new_type in admissible_containers:
                    logg.warn(u"changeschema: illegal container type %s", new_type)
                    return httpstatus.HTTP_BAD_REQUEST
            else:
                if not new_type in admissible_content_types:
                    logg.warn(u"changeschema: illegal content type %s", new_type)
                    return httpstatus.HTTP_BAD_REQUEST

            available_schema_names = [s.name for s in schemes if new_type in s.getDatatypes()]

            if not new_schema in available_schema_names:
                    logg.warn(u"changeschema: illegal schema %s", new_schema)
                    return httpstatus.HTTP_BAD_REQUEST

            logg.info(u"{} changed node schema for node {} '{}' from '{}' to '{}'".format(user.login_name,
                                                                                         node.id,
                                                                                         node.name,
                                                                                         node.type,
                                                                                         new_type))
            node.type = new_type
            node.schema = new_schema

            db.session.commit()

            return _redirect_to_view(req)

    elif "action" in req.params.keys():
        available_schemes = [s for s in schemes if node.type in s.getDatatypes()]
        if req.params.get("action").startswith("get_schemes_for_"):
            new_type = req.params.get("action").replace("get_schemes_for_", "").lower()
            available_schemes = [s for s in schemes if new_type in s.getDatatypes()]

            req.writeTAL("web/edit/modules/changeschema.html",
                         {'schemes': available_schemes,
                          'current_schema': node.schema},
                         macro="changeschema_selectscheme")
        return ""

    else:
        d = {'id': req.params.get('id'),
             'error': error,
             'node': node,
             'current_type': node.type,
             'current_schema': node.schema,
             # XXX: this is the only line that uses getTypeAlias. What is the real meaning?
             'type_alias': node.getTypeAlias(),
             'is_container': int(node.isContainer()),
             'nodes': [node]}

        d['long_current_schema'] = long_scheme_names.get(node.schema)

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

        if isinstance(node, Container):
            admissible_containers.sort(key=lambda x: translate(x, request=req).lower())
            d['schemes'] = available_schemes
            d['datatypes'] = admissible_containers
        else:
            admissible_content_types.sort(key=lambda x: translate(x, request=req).lower())
            d['schemes'] = available_schemes
            d['datatypes'] = admissible_content_types
        
        d["csrf"] = req.csrf_token.current_token
        return req.getTAL("web/edit/modules/changeschema.html", d, macro="changeschema_popup")
示例#8
0
def getContent(req, ids):

    user = users.getUserFromRequest(req)
    language = lang(req)

    def get_ids_from_query():
        ids = get_ids_from_req(req)
        return ",".join(ids)

    if "action" in req.params:
        state = 'ok'

        if req.params.get('action') == "removefiles":
            basenode = q(Node).get(req.params.get('id'))
            for f in basenode.files:
                try:
                    os.remove(f.abspath)
                    pass
                except:
                    state = "error"
            basenode.files = []
            db.session.commit()
            req.write(json.dumps({'state': state}, ensure_ascii=False))
            return None

        if req.params.get('action') == "buildnode":  # create nodes
            basenode = q(Node).get(req.params.get('id'))
            newnodes = []
            errornodes = []
            basenodefiles_processed = []
            if req.params.get('uploader', '') == 'plupload':
                filename2scheme = {}
                for k in req.params:
                    if k.startswith("scheme_"):
                        filename2scheme[k.replace('scheme_', '',
                                                  1)] = req.params.get(k)

                for f in basenode.files:
                    filename = f.name
                    if filename in filename2scheme:
                        mimetype = getMimeType(filename)

                        if mimetype[1] == "bibtex":  # bibtex import handler
                            try:
                                new_node = importBibTeX(f.abspath, basenode)
                                newnodes.append(new_node.id)
                                basenodefiles_processed.append(f)
                            except ValueError, e:
                                errornodes.append((filename, unicode(e)))

                        logg.debug("filename: %s, mimetype: %s", filename,
                                   mimetype)
                        logg.debug("__name__=%s, func=%s; _m=%s, _m[1]=%s",
                                   __name__, funcname(), mimetype, mimetype[1])

                        content_class = Node.get_class_for_typestring(
                            mimetype[1])
                        node = content_class(name=filename,
                                             schema=filename2scheme[filename])

                        basenode.children.append(node)
                        node.set("creator", user.login_name)
                        node.set(
                            "creationtime",
                            unicode(
                                time.strftime('%Y-%m-%dT%H:%M:%S',
                                              time.localtime(time.time()))))
                        # set filetype for uploaded file as requested by the content class
                        f.filetype = content_class.get_upload_filetype()
                        node.files.append(f)
                        node.event_files_changed()
                        newnodes.append(node.id)
                        basenodefiles_processed.append(f)
                        basenode.files.remove(f)
                        db.session.commit()
                        logg.info(
                            "%s created new node id=%s (name=%s, type=%s) by uploading file %s, "
                            "node is child of base node id=%s (name=%s, type=%s)",
                            user.login_name, node.id, node.name, node.type,
                            filename, basenode.id, basenode.name,
                            basenode.type)

            else:
                for filename in req.params.get('files').split('|'):
                    mimetype = getMimeType(filename)
                    logg.debug("... in %s.%s: getMimeType(filename=%s)=%s",
                               __name__, funcname(), filename, mimetype)
                    if mimetype[1] == req.params.get('type') or req.params.get(
                            'type') == 'file':
                        for f in basenode.files:
                            # ambiguity here ?
                            if f.abspath.endswith(filename):
                                # bibtex import handler
                                if mimetype[
                                        1] == "bibtex" and not req.params.get(
                                            'type') == 'file':
                                    try:
                                        new_node = importBibTeX(
                                            f.abspath, basenode)
                                        newnodes.append(new_node.id)
                                        basenodefiles_processed.append(f)
                                    except ValueError, e:
                                        errornodes.append(
                                            (filename, unicode(e)))
                                    db.session.commit()
                                else:

                                    logg.debug(
                                        "creating new node: filename: %s",
                                        filename)
                                    logg.debug("files at basenode: %s",
                                               [(x.getName(), x.abspath)
                                                for x in basenode.files])

                                    content_class = Node.get_class_for_typestring(
                                        req.params.get('type'))
                                    node = content_class(
                                        name=filename,
                                        schema=req.params.get('value'))

                                    basenode.children.append(node)
                                    node.set("creator", user.login_name)
                                    node.set(
                                        "creationtime",
                                        unicode(
                                            time.strftime(
                                                '%Y-%m-%dT%H:%M:%S',
                                                time.localtime(time.time()))))

                                    # clones to a file with random name
                                    cloned_file = importFileRandom(f.abspath)
                                    # set filetype for uploaded file as requested by the content class
                                    cloned_file.filetype = content_class.get_upload_filetype(
                                    )
                                    node.files.append(cloned_file)
                                    node.event_files_changed()
                                    newnodes.append(node.id)
                                    basenodefiles_processed.append(f)

                                    logg.info(
                                        "%s created new node id=%s (name=%s, type=%s) by uploading file %s, "
                                        "node is child of base node id=%s (name=%s, type=%s)",
                                        user.login_name, node.id, node.name,
                                        node.type, filename, basenode.id,
                                        basenode.name, basenode.type)

                                    break  # filename may not be unique

            new_tree_labels = [{
                'id': basenode.id,
                'label': getTreeLabel(basenode, lang=language)
            }]
            for f in basenodefiles_processed:
                basenode.files.remove(f)
                f_path = f.abspath
                if os.path.exists(f_path):
                    logg.debug("%s going to remove file %s from disk",
                               user.login_name, f_path)
                    os.remove(f_path)

            mime = getMimeType(filename)
            scheme_type = {mime[1]: []}
            for scheme in get_permitted_schemas():
                if mime[1] in scheme.getDatatypes():
                    scheme_type[mime[1]].append(scheme)
                    # break

            db.session.commit()
            # standard file
            content = req.getTAL('web/edit/modules/upload.html', {
                'files': [filename],
                'schemes': scheme_type
            },
                                 macro="uploadfileok")

            res = {
                'state': state,
                'newnodes': newnodes,
                'errornodes': errornodes,
                'new_tree_labels': new_tree_labels,
                'ret': content
            }
            res = json.dumps(res, ensure_ascii=False)
            req.write(res)
            return None
示例#9
0
                                 macro="uploadfileok")

            res = {
                'state': state,
                'newnodes': newnodes,
                'errornodes': errornodes,
                'new_tree_labels': new_tree_labels,
                'ret': content
            }
            res = json.dumps(res, ensure_ascii=False)
            req.write(res)
            return None

        # add new object, only metadata
        if req.params.get('action') == "addmeta":
            schemes = get_permitted_schemas()
            dtypes = getDatatypes(req, schemes)
            if len(dtypes) == 1:  # load schemes for type
                schemes = get_permitted_schemas_for_datatype(
                    dtypes[0].__name__.lower())
            content = req.getTAL(
                'web/edit/modules/upload.html', {
                    "datatypes": dtypes,
                    "schemes": schemes,
                    "language": lang(req),
                    "identifier_importers": identifier_importers.values()
                },
                macro="addmeta")

            req.write(json.dumps({'content': content}, ensure_ascii=False))
            return None
示例#10
0
def getContent(req, ids):
    def getDatatypes(_req, _schemes):
        _dtypes = []
        datatypes = Data.get_all_datatypes()
        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()))
        return _dtypes

    def get_ids_from_query():
        ids = get_ids_from_req(req)
        return ",".join(ids)

    node = q(Data).get(long(ids[0]))

    if "action" in req.params:
        if req.params.get('action') == "resort":
            field = req.params.get('value', '').strip()
            res = showdir(req, node, sortfield=field)
            res = json.dumps({
                'state': 'ok',
                'values': res
            },
                             ensure_ascii=False)
            req.write(res)
            return None

        elif req.params.get(
                'action') == "save":  # save selection for collection
            field = req.params.get('value')
            if field.strip() == "" or field.strip() == "off":
                if node.get('sortfield'):
                    node.removeAttribute('sortfield')
            else:
                node.set('sortfield', field)
            nodes_per_page = req.params.get('nodes_per_page')
            if nodes_per_page.strip() == "":
                if node.get('nodes_per_page'):
                    node.removeAttribute('nodes_per_page')
            else:
                node.set('nodes_per_page', nodes_per_page)
            req.write(json.dumps({'state': 'ok'}))
            db.session.commit()
        return None

    if node.isContainer():
        schemes = []
        dtypes = []

        item_count = []
        items = showdir(req, node, item_count=item_count)
        nav = shownav(req, node)
        v = {
            "operations": showoperations(req, node),
            "items": items,
            "nav": nav
        }
        if node.has_write_access():
            schemes = get_permitted_schemas()
            dtypes = getDatatypes(req, schemes)

        if "globalsort" in req.params:
            node.set("sortfield", req.params.get("globalsort"))
        if req.params.get("sortfield", "") != "":
            v['collection_sortfield'] = req.params.get("sortfield")
        else:
            v['collection_sortfield'] = node.get("sortfield")

        if req.params.get("nodes_per_page"):
            v['npp_field'] = req.params.get("nodes_per_page",
                                            default_edit_nodes_per_page)
        else:
            v['npp_field'] = node.get("nodes_per_page")
        if not v['npp_field']:
            v['npp_field'] = default_edit_nodes_per_page

        search_html = render_edit_search_box(node, lang(req), req, edit=True)
        searchmode = req.params.get("searchmode")
        navigation_height = searchbox_navlist_height(req, item_count)
        if not isinstance(node, (Root, Collections, Home)):
            sortchoices = _sort.get_sort_choices(container=node,
                                                 off="off",
                                                 t_off=t(req, "off"),
                                                 t_desc=t(req, "descending"))
        else:
            sortchoices = ()

        count = item_count[0] if item_count[0] == item_count[
            1] else "%d from %d" % (item_count[0], item_count[1])
        v['sortchoices'] = tuple(sortchoices)
        v['types'] = dtypes
        v['schemes'] = schemes
        v['id'] = ids[0]
        v['count'] = count
        v['language'] = lang(req)
        v['search'] = search_html
        v['navigation_height'] = navigation_height
        v['parent'] = node.id
        v['query'] = req.query.replace('id=', 'src=')
        searchparams = get_searchparams(req)
        searchparams = {
            k: unicode(v).encode("utf8")
            for k, v in searchparams.items()
        }
        v['searchparams'] = urllib.urlencode(searchparams)
        v['get_ids_from_query'] = get_ids_from_query
        v['edit_all_objects'] = t(lang(req),
                                  "edit_all_objects").format(item_count[1])
        v['t'] = t
        res = req.getTAL("web/edit/modules/content.html",
                         v,
                         macro="edit_content")
        delete_g_nodes_entry(req)
        return res
    if hasattr(node, "editContentDefault"):
        return node.editContentDefault(req)
    return ""
示例#11
0
def getContent(req, ids):
    user = current_user
    node = q(Node).get(ids[0])
    if not node.has_write_access(
    ) or "changeschema" in current_user.hidden_edit_functions:
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    # nobody should be able to change the type/schema of his home directory
    if node.id == user.home_dir_id:
        req.setStatus(httpstatus.HTTP_FORBIDDEN)
        return req.getTAL("web/edit/edit.html", {}, macro="access_error")

    error = req.params.get("error")

    schemes = get_permitted_schemas()
    long_scheme_names = {
        scheme.name: scheme.getLongName()
        for scheme in schemes
    }

    if isinstance(node, Container):
        admissible_containers = [
            s.__name__.lower() for s in Container.get_all_subclasses(
                filter_classnames=["container", "collections", "home", "root"])
        ]
    else:
        admissible_content_types = [
            s.__name__.lower()
            for s in Content.get_all_subclasses(filter_classnames=["content"])
        ]

    # filter schemes for special datatypes
    if req.params.get("objtype", "") != "":
        new_type = req.params.get('objtype', '')
        new_schema = req.params.get('schema', '')

        if not new_schema:
            return _redirect_to_view(req)

        if new_type != node.type or new_schema != node.schema:

            if isinstance(node, Container):
                if not new_type in admissible_containers:
                    logg.warn(u"changeschema: illegal container type %s",
                              new_type)
                    return httpstatus.HTTP_BAD_REQUEST
            else:
                if not new_type in admissible_content_types:
                    logg.warn(u"changeschema: illegal content type %s",
                              new_type)
                    return httpstatus.HTTP_BAD_REQUEST

            available_schema_names = [
                s.name for s in schemes if new_type in s.getDatatypes()
            ]

            if not new_schema in available_schema_names:
                logg.warn(u"changeschema: illegal schema %s", new_schema)
                return httpstatus.HTTP_BAD_REQUEST

            logg.info(
                u"{} changed node schema for node {} '{}' from '{}' to '{}'".
                format(user.login_name, node.id, node.name, node.type,
                       new_type))
            node.type = new_type
            node.schema = new_schema

            db.session.commit()

            return _redirect_to_view(req)

    elif "action" in req.params.keys():
        available_schemes = [
            s for s in schemes if node.type in s.getDatatypes()
        ]
        if req.params.get("action").startswith("get_schemes_for_"):
            new_type = req.params.get("action").replace(
                "get_schemes_for_", "").lower()
            available_schemes = [
                s for s in schemes if new_type in s.getDatatypes()
            ]

            req.writeTAL("web/edit/modules/changeschema.html", {
                'schemes': available_schemes,
                'current_schema': node.schema
            },
                         macro="changeschema_selectscheme")
        return ""

    else:
        d = {
            'id': req.params.get('id'),
            'error': error,
            'node': node,
            'current_type': node.type,
            'current_schema': node.schema,
            # XXX: this is the only line that uses getTypeAlias. What is the real meaning?
            'type_alias': node.getTypeAlias(),
            'is_container': int(node.isContainer()),
            'nodes': [node]
        }

        d['long_current_schema'] = long_scheme_names.get(node.schema)

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

        if isinstance(node, Container):
            admissible_containers.sort(
                key=lambda x: translate(x, request=req).lower())
            d['schemes'] = available_schemes
            d['datatypes'] = admissible_containers
        else:
            admissible_content_types.sort(
                key=lambda x: translate(x, request=req).lower())
            d['schemes'] = available_schemes
            d['datatypes'] = admissible_content_types

        d["csrf"] = req.csrf_token.current_token
        return req.getTAL("web/edit/modules/changeschema.html",
                          d,
                          macro="changeschema_popup")
示例#12
0
def getContent(req, ids):

    user = users.getUserFromRequest(req)
    language = lang(req)

    def get_ids_from_query():
        ids = get_ids_from_req(req)
        return ",".join(ids)

    if "action" in req.params:
        state = 'ok'

        if req.params.get('action') == "removefiles":
            basenode = q(Node).get(req.params.get('id'))
            for f in basenode.files:
                try:
                    os.remove(f.abspath)
                    pass
                except:
                    state = "error"
            basenode.files = []
            db.session.commit()
            req.write(json.dumps({'state': state}, ensure_ascii=False))
            return None

        if req.params.get('action') == "buildnode":  # create nodes
            basenode = q(Node).get(req.params.get('id'))
            newnodes = []
            errornodes = []
            basenodefiles_processed = []
            if req.params.get('uploader', '') == 'plupload':
                filename2scheme = {}
                for k in req.params:
                    if k.startswith("scheme_"):
                        filename2scheme[
                            k.replace('scheme_', '', 1)] = req.params.get(k)

                for f in basenode.files:
                    filename = f.name
                    if filename in filename2scheme:
                        mimetype = getMimeType(filename)

                        if mimetype[1] == "bibtex":  # bibtex import handler
                            try:
                                new_node = importBibTeX(f.abspath, basenode, req=req)
                                newnodes.append(new_node.id)
                                basenodefiles_processed.append(f)
                            except ValueError, e:
                                errornodes.append((filename, unicode(e)))

                        logg.debug("filename: %s, mimetype: %s", filename, mimetype)
                        logg.debug("__name__=%s, func=%s; _m=%s, _m[1]=%s", __name__, funcname(), mimetype, mimetype[1])

                        content_class = Node.get_class_for_typestring(mimetype[1])
                        node = content_class(name=filename, schema=filename2scheme[filename])

                        basenode.children.append(node)
                        node.set("creator", user.login_name)
                        node.set("creationtime",  unicode(time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime(time.time()))))
                        # set filetype for uploaded file as requested by the content class
                        f.filetype = content_class.get_upload_filetype()
                        node.files.append(f)
                        node.event_files_changed()
                        newnodes.append(node.id)
                        basenodefiles_processed.append(f)
                        basenode.files.remove(f)
                        db.session.commit()
                        logg.info("%s created new node id=%s (name=%s, type=%s) by uploading file %s, "
                            "node is child of base node id=%s (name=%s, type=%s)", user.login_name, node.id, node.name, node.type,
                             filename, basenode.id, basenode.name, basenode.type)

            else:
                for filename in req.params.get('files').split('|'):
                    mimetype = getMimeType(filename)
                    logg.debug("... in %s.%s: getMimeType(filename=%s)=%s", __name__, funcname(), filename, mimetype)
                    if mimetype[1] == req.params.get('type') or req.params.get('type') == 'file':
                        for f in basenode.files:
                            # ambiguity here ?
                            if f.abspath.endswith(filename):
                                # bibtex import handler
                                if mimetype[1] == "bibtex" and not req.params.get('type') == 'file':
                                    try:
                                        new_node = importBibTeX(f.abspath, basenode, req=req)
                                        newnodes.append(new_node.id)
                                        basenodefiles_processed.append(f)
                                    except ValueError, e:
                                        errornodes.append((filename, unicode(e)))
                                    db.session.commit()
                                else:

                                    logg.debug("creating new node: filename: %s", filename)
                                    logg.debug("files at basenode: %s", [(x.getName(), x.abspath) for x in basenode.files])

                                    content_class = Node.get_class_for_typestring(req.params.get('type'))
                                    node = content_class(name=filename, schema=req.params.get('value'))

                                    basenode.children.append(node)
                                    node.set("creator", user.login_name)
                                    node.set("creationtime",  unicode(time.strftime('%Y-%m-%dT%H:%M:%S',
                                                                                    time.localtime(time.time()))))

                                    # clones to a file with random name
                                    cloned_file = importFileRandom(f.abspath)
                                    # set filetype for uploaded file as requested by the content class
                                    cloned_file.filetype = content_class.get_upload_filetype()
                                    node.files.append(cloned_file)
                                    node.event_files_changed()
                                    newnodes.append(node.id)
                                    basenodefiles_processed.append(f)

                                    logg.info("%s created new node id=%s (name=%s, type=%s) by uploading file %s, "
                                    "node is child of base node id=%s (name=%s, type=%s)", user.login_name, node.id, node.name, node.type, filename,
                                    basenode.id, basenode.name, basenode.type)

                                    break  # filename may not be unique

            new_tree_labels = [{'id': basenode.id, 'label': getTreeLabel(basenode, lang=language)}]
            for f in basenodefiles_processed:
                basenode.files.remove(f)
                f_path = f.abspath
                if os.path.exists(f_path):
                    logg.debug("%s going to remove file %s from disk", user.login_name, f_path)
                    os.remove(f_path)

            mime = getMimeType(filename)
            scheme_type = {mime[1]: []}
            for scheme in get_permitted_schemas():
                if mime[1] in scheme.getDatatypes():
                    scheme_type[mime[1]].append(scheme)
                    # break

            db.session.commit()
            # standard file
            content = req.getTAL('web/edit/modules/upload.html', {'files': [filename], 'schemes': scheme_type}, macro="uploadfileok")

            res = {'state': state, 'newnodes': newnodes, 'errornodes':
                              errornodes, 'new_tree_labels': new_tree_labels, 'ret': content}
            res = json.dumps(res, ensure_ascii=False)
            req.write(res)
            return None
示例#13
0
                    scheme_type[mime[1]].append(scheme)
                    # break

            db.session.commit()
            # standard file
            content = req.getTAL('web/edit/modules/upload.html', {'files': [filename], 'schemes': scheme_type}, macro="uploadfileok")

            res = {'state': state, 'newnodes': newnodes, 'errornodes':
                              errornodes, 'new_tree_labels': new_tree_labels, 'ret': content}
            res = json.dumps(res, ensure_ascii=False)
            req.write(res)
            return None

        # add new object, only metadata
        if req.params.get('action') == "addmeta":
            schemes = get_permitted_schemas()
            dtypes = getDatatypes(req, schemes)
            if len(dtypes) == 1:  # load schemes for type
                schemes = get_permitted_schemas_for_datatype(dtypes[0].__name__.lower())
            content = req.getTAL('web/edit/modules/upload.html', {"datatypes": dtypes,
                                                                  "schemes": schemes,
                                                                  "language": lang(req),
                                                                  "identifier_importers": identifier_importers.values()},
                                 macro="addmeta")

            req.write(json.dumps({'content': content}, ensure_ascii=False))
            return None

        # deliver schemes for given contenttype
        if req.params.get('action') == 'getschemes':
            ret = []
示例#14
0
            res = {
                'state': state,
                'newnodes': newnodes,
                'errornodes': errornodes,
                'new_tree_labels': new_tree_labels,
                'ret': content
            }
            res = json.dumps(res, ensure_ascii=False)
            req.write(res)
            return None

        # add new object, only metadata
        if req.params.get('action') == "addmeta":
            ret = []
            schemes = get_permitted_schemas()
            dtypes = getDatatypes(req, schemes)
            dtypenames = {t.__name__.lower(): t.__name__ for t in dtypes}
            for scheme in get_permitted_schemas():
                datatypes = scheme.getDatatypes()
                for datatype in datatypes:
                    if datatype in dtypenames.keys():
                        ret.append({
                            'id':
                            scheme.name,
                            'name':
                            scheme.getLongName() + ' / ' +
                            translate(dtypenames[datatype], request=req),
                            'description':
                            scheme.getDescription(),
                            'datatype':
示例#15
0
def getContent(req, ids):

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

    def getDatatypes(_req, _schemes):
        _dtypes = []
        datatypes = Data.get_all_datatypes()
        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()))
        return _dtypes

    def get_ids_from_query():
        ids = get_ids_from_req(req)
        return ",".join(ids)

    node = q(Data).get(long(ids[0]))

    if "action" in req.params:
        if req.params.get('action') == "resort":
            field = req.params.get('value', '').strip()
            res = showdir(req, node, sortfield=field)
            res = json.dumps({'state': 'ok', 'values': res}, ensure_ascii=False)
            req.write(res)
            return None

        elif req.params.get('action') == "save":  # save selection for collection
            field = req.params.get('value')
            if field.strip() == "" or field.strip() == "off":
                if node.get('sortfield'):
                    node.removeAttribute('sortfield')
            else:
                node.set('sortfield', field)
            nodes_per_page = req.params.get('nodes_per_page')
            if nodes_per_page.strip() == "":
                if node.get('nodes_per_page'):
                    node.removeAttribute('nodes_per_page')
            else:
                node.set('nodes_per_page', nodes_per_page)
            req.write(json.dumps({'state': 'ok'}))
            db.session.commit()
        return None

    if node.isContainer():
        schemes = []
        dtypes = []

        item_count = []
        items = showdir(req, node, item_count=item_count)
        nav = shownav(req, node)
        v = {"operations": showoperations(req, node), "items": items, "nav": nav}
        if node.has_write_access():
            schemes = get_permitted_schemas()
            dtypes = getDatatypes(req, schemes)

        col = node
        if "globalsort" in req.params:
            col.set("sortfield", req.params.get("globalsort"))
        if req.params.get("sortfield", "") != "":
            v['collection_sortfield'] = req.params.get("sortfield")
        else:
            v['collection_sortfield'] = node.get("sortfield")
        if req.params.get("nodes_per_page"):
            v['npp_field'] = req.params.get("nodes_per_page", default_edit_nodes_per_page)
        else:
            v['npp_field'] = node.get("nodes_per_page")
        if not v['npp_field']:
            v['npp_field'] = default_edit_nodes_per_page
        sort_choices = [SortChoice(t(req, "off"), "off")]
        search_html = render_search_box(node, lang(req), req, edit=True)
        searchmode = req.params.get("searchmode")
        navigation_height = searchbox_navlist_height(req, item_count)
        if not isinstance(col, (Root, Collections, Home)):
            # for node in col.children:
            count = col.content_children_for_all_subcontainers.count()
            # the transformation of content_children_for_all_subcontainers in a list is very expensive if count is high
            # so try a limitation and if no sortfields found then increase limitation
            start_idx = 0
            end_idx = 10
            sortfields = None
            while start_idx < count:
                for node in col.content_children_for_all_subcontainers[start_idx:end_idx]:
                    # XXX: now without acl filtering, do we need this?
                    sortfields = node.getSortFields()
                    if sortfields:
                        for sortfield in sortfields:
                            sort_choices += [SortChoice(sortfield.getLabel(), sortfield.getName())]
                            sort_choices += [SortChoice(sortfield.getLabel() + t(req, "descending"), "-" + sortfield.getName())]
                        break
                if sortfields:
                    break
                start_idx = end_idx
                end_idx *= 10

        count = item_count[0] if item_count[0] == item_count[1] else "%d from %d" % (item_count[0], item_count[1])
        v['sortchoices'] = sort_choices
        v['npp_choices'] = [SortChoice(str(x), x) for x in edit_node_per_page_values]
        v['types'] = dtypes
        v['schemes'] = schemes
        v['id'] = ids[0]
        v['count'] = count
        v['language'] = lang(req)
        v['search'] = search_html
        v['navigation_height'] = navigation_height
        v['parent'] = col.id
        v['query'] = req.query.replace('id=','src=')
        searchparams = get_searchparams(req)
        searchparams = {k: unicode(v).encode("utf8") for k, v in searchparams.items()}
        v['searchparams'] = urllib.urlencode(searchparams)
        v['get_ids_from_query'] = get_ids_from_query
        v['edit_all_objects'] = t(lang(req), "edit_all_objects").format(item_count[1])
        v['t'] = t
        res = req.getTAL("web/edit/modules/content.html", v, macro="edit_content")
        delete_g_nodes_entry(req)
        return res
    if hasattr(node, "editContentDefault"):
        return node.editContentDefault(req)
    return ""
示例#16
0
def getContent(req, ids):
    class SortChoice:
        def __init__(self, label, value):
            self.label = label
            self.value = value

    def getDatatypes(_req, _schemes):
        _dtypes = []
        datatypes = Data.get_all_datatypes()
        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()))
        return _dtypes

    def get_ids_from_query():
        ids = get_ids_from_req(req)
        return ",".join(ids)

    node = q(Data).get(long(ids[0]))

    if "action" in req.params:
        if req.params.get('action') == "resort":
            field = req.params.get('value', '').strip()
            res = showdir(req, node, sortfield=field)
            res = json.dumps({
                'state': 'ok',
                'values': res
            },
                             ensure_ascii=False)
            req.write(res)
            return None

        elif req.params.get(
                'action') == "save":  # save selection for collection
            field = req.params.get('value')
            if field.strip() == "" or field.strip() == "off":
                if node.get('sortfield'):
                    node.removeAttribute('sortfield')
            else:
                node.set('sortfield', field)
            nodes_per_page = req.params.get('nodes_per_page')
            if nodes_per_page.strip() == "":
                if node.get('nodes_per_page'):
                    node.removeAttribute('nodes_per_page')
            else:
                node.set('nodes_per_page', nodes_per_page)
            req.write(json.dumps({'state': 'ok'}))
            db.session.commit()
        return None

    if node.isContainer():
        schemes = []
        dtypes = []

        item_count = []
        items = showdir(req, node, item_count=item_count)
        nav = shownav(req, node)
        v = {
            "operations": showoperations(req, node),
            "items": items,
            "nav": nav
        }
        if node.has_write_access():
            schemes = get_permitted_schemas()
            dtypes = getDatatypes(req, schemes)

        col = node
        if "globalsort" in req.params:
            col.set("sortfield", req.params.get("globalsort"))
        if req.params.get("sortfield", "") != "":
            v['collection_sortfield'] = req.params.get("sortfield")
        else:
            v['collection_sortfield'] = node.get("sortfield")
        if req.params.get("nodes_per_page"):
            v['npp_field'] = req.params.get("nodes_per_page",
                                            default_edit_nodes_per_page)
        else:
            v['npp_field'] = node.get("nodes_per_page")
        if not v['npp_field']:
            v['npp_field'] = default_edit_nodes_per_page
        sort_choices = [SortChoice(t(req, "off"), "off")]
        search_html = render_search_box(node, lang(req), req, edit=True)
        searchmode = req.params.get("searchmode")
        navigation_height = searchbox_navlist_height(req, item_count)
        if not isinstance(col, (Root, Collections, Home)):
            # for node in col.children:
            count = col.content_children_for_all_subcontainers.count()
            # the transformation of content_children_for_all_subcontainers in a list is very expensive if count is high
            # so try a limitation and if no sortfields found then increase limitation
            start_idx = 0
            end_idx = 10
            sortfields = None
            while start_idx < count:
                for node in col.content_children_for_all_subcontainers[
                        start_idx:end_idx]:
                    # XXX: now without acl filtering, do we need this?
                    sortfields = node.getSortFields()
                    if sortfields:
                        for sortfield in sortfields:
                            sort_choices += [
                                SortChoice(sortfield.getLabel(),
                                           sortfield.getName())
                            ]
                            sort_choices += [
                                SortChoice(
                                    sortfield.getLabel() +
                                    t(req, "descending"),
                                    "-" + sortfield.getName())
                            ]
                        break
                if sortfields:
                    break
                start_idx = end_idx
                end_idx *= 10

        count = item_count[0] if item_count[0] == item_count[
            1] else "%d from %d" % (item_count[0], item_count[1])
        v['sortchoices'] = sort_choices
        v['npp_choices'] = [
            SortChoice(str(x), x) for x in edit_node_per_page_values
        ]
        v['types'] = dtypes
        v['schemes'] = schemes
        v['id'] = ids[0]
        v['count'] = count
        v['language'] = lang(req)
        v['search'] = search_html
        v['navigation_height'] = navigation_height
        v['parent'] = col.id
        v['query'] = req.query.replace('id=', 'src=')
        searchparams = get_searchparams(req)
        searchparams = {
            k: unicode(v).encode("utf8")
            for k, v in searchparams.items()
        }
        v['searchparams'] = urllib.urlencode(searchparams)
        v['get_ids_from_query'] = get_ids_from_query
        v['edit_all_objects'] = t(lang(req),
                                  "edit_all_objects").format(item_count[1])
        v['t'] = t
        res = req.getTAL("web/edit/modules/content.html",
                         v,
                         macro="edit_content")
        delete_g_nodes_entry(req)
        return res
    if hasattr(node, "editContentDefault"):
        return node.editContentDefault(req)
    return ""