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}
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}
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}
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}
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")
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
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
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 ""
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")
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
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 = []
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':
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 ""
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 ""