def upload_helper(request, namespace, configuration=None, mode=None): if not mode: mode = settings.DEFAULTMODE if not configuration: configuration = settings.DEFAULTCONFIGURATION if mode not in dict(settings.MODES): return fatalerror(request, "Invalid mode", 403) if configuration not in settings.CONFIGURATIONS: return fatalerror(request, "Invalid configuration", 403) if 'inputformat' in request.POST and request.POST['inputformat'] != 'folia': #we need to convert the input converter = None for cv in get_converters(request): if request.POST['inputformat'] == cv.id: converter = cv if not converter: return fatalerror(request, "Converter not found or specified", 404) try: parameters = converter.parse_parameters(request, 'parameters') except: return fatalerror(request, "Invalid syntax for conversion parameters", 403) if 'TMPDIR' in os.environ: tmpdir = os.environ['TMPDIR'] else: tmpdir = '/tmp' tmpinfile = os.path.join(tmpdir, request.FILES['file'].name) with open(tmpinfile, 'wb') as f_tmp: for chunk in request.FILES['file'].chunks(): f_tmp.write(chunk) tmpoutfile = converter.get_output_name( os.path.join(tmpdir, request.FILES['file'].name)) success, msg = converter.convert(tmpinfile, tmpoutfile, **parameters) if not success: return fatalerror(request, "Input conversion failed: " + msg, 403) #removing temporary input file os.unlink(tmpinfile) #reading temporary output file f_folia = open(tmpoutfile, 'rb') else: f_folia = request.FILES['file'] #if sys.version < '3': # data = unicode(request.FILES['file'].read(),'utf-8') #pylint: disable=undefined-variable #else: # data = str(request.FILES['file'].read(),'utf-8') failed = False try: response = flat.comm.postxml(request, "upload/" + namespace, f_folia) except Exception as e: failed = True response = fatalerror(request, e) if 'inputformat' in request.POST and request.POST['inputformat'] != 'folia': f_folia.close() #removing temporary output file after conversion os.unlink(tmpoutfile) if failed: return response elif 'error' in response and response['error']: return fatalerror(request, response['error'], 403) else: docid = response['docid'] if namespace == "pub": return HttpResponseRedirect("/" + mode + "/pub/" + configuration + "/" + docid) else: return HttpResponseRedirect("/" + mode + "/" + namespace + "/" + docid)
def index(request, namespace=""): try: namespaces = flat.comm.get(request, '/namespaces/') except Exception as e: return fatalerror(request, e) if not 'configuration' in request.session: return logout(request) if not namespace: #check if user namespace is preset, if not, make it if not request.user.username in namespaces['namespaces']: try: flat.comm.get(request, "createnamespace/" + request.user.username, False) except Exception as e: return fatalerror(request, e) if 'creategroupnamespaces' in settings.CONFIGURATIONS[ request.session['configuration']] and settings.CONFIGURATIONS[ request.session['configuration']][ 'creategroupnamespaces'] and request.user.has_perm( 'groupwrite'): for group in request.user.groups.all(): try: flat.comm.get(request, "createnamespace/" + group.name, False) except Exception as e: return fatalerror(request, e) if request.user.has_perm('auth.groupwrite') and ( request.user.has_perm('auth.allowcopy') or request.user.has_perm('auth.allowdelete')): #create namespaces for all the users in our groups, since we may want to copy there for group in request.user.groups.all(): for user in django.contrib.auth.models.User.objects.filter( groups__name=group.name): try: flat.comm.get(request, "createnamespace/" + user.username, False) except Exception as e: return fatalerror(request, e) readpermission = flat.users.models.hasreadpermission( request.user.username, namespace, request) dirs = [] recursivedirs = [] subdirs = [] for ns in sorted(namespaces['namespaces']): if flat.users.models.hasreadpermission(request.user.username, ns, request): recursivedirs.append(ns) if '/' not in ns: dirs.append(ns) if not namespace: subdirs.append(ns) if ns.startswith(namespace + '/'): subdirs.append(ns[len(namespace) + 1:]) dirs.sort() recursivedirs.sort() dometadataindex = 'metadataindex' in settings.CONFIGURATIONS[ request.session['configuration']] and settings.CONFIGURATIONS[ request.session['configuration']]['metadataindex'] if dometadataindex: metadataindex = defaultdict(list) for m in MetadataIndex.objects.filter(namespace=namespace): metadataindex[m.docid].append((m.key, m.value)) docs = [] if namespace and readpermission: try: r = flat.comm.get(request, '/documents/' + namespace) except Exception as e: return fatalerror(request, e) for d in sorted(r['documents']): docid = os.path.basename(d.replace('.folia.xml', '')) if dometadataindex and docid in metadataindex: metaitems = metadataindex[docid] else: metaitems = [] docs.append( (docid, round(r['filesize'][d] / 1024 / 1024, 2), datetime.datetime.fromtimestamp( r['timestamp'][d]).strftime("%Y-%m-%d %H:%M"), metaitems)) docs.sort() if namespace: parentdir = '/'.join(namespace.split('/')[:-1]) else: parentdir = "" return render( request, 'index.html', { 'namespace': namespace, 'parentdir': parentdir, 'dirs': dirs, 'recursivedirs': recursivedirs, 'subdirs': subdirs, 'docs': docs, 'defaultmode': settings.DEFAULTMODE, 'loggedin': request.user.is_authenticated(), 'isadmin': request.user.is_staff, 'username': request.user.username, 'configuration': settings.CONFIGURATIONS[request.session['configuration']], 'converters': get_converters(request), 'inputformatchangefunction': inputformatchangefunction(request), 'allowcopy': request.user.has_perm('auth.allowcopy'), 'allowdelete': request.user.has_perm('auth.allowdelete'), 'version': settings.VERSION })
def index(request, namespace=""): try: namespaces = flat.comm.get(request, '/namespaces/') except Exception as e: return fatalerror(request,e) if not 'configuration' in request.session: return logout(request) if not namespace: #check if user namespace is preset, if not, make it if not request.user.username in namespaces['namespaces']: try: flat.comm.get(request, "createnamespace/" + request.user.username, False) except Exception as e: return fatalerror(request,e) if 'creategroupnamespaces' in settings.CONFIGURATIONS[request.session['configuration']] and settings.CONFIGURATIONS[request.session['configuration']]['creategroupnamespaces'] and request.user.has_perm('groupwrite'): for group in request.user.groups.all(): try: flat.comm.get(request, "createnamespace/" + group.name, False) except Exception as e: return fatalerror(request,e) if request.user.has_perm('auth.groupwrite') and (request.user.has_perm('auth.allowcopy') or request.user.has_perm('auth.allowdelete')): #create namespaces for all the users in our groups, since we may want to copy there for group in request.user.groups.all(): for user in django.contrib.auth.models.User.objects.filter(groups__name=group.name): try: flat.comm.get(request, "createnamespace/" + user.username, False) except Exception as e: return fatalerror(request,e) readpermission = flat.users.models.hasreadpermission(request.user.username, namespace, request) dirs = [] recursivedirs = [] subdirs =[] for ns in sorted(namespaces['namespaces']): if flat.users.models.hasreadpermission(request.user.username, ns, request): recursivedirs.append(ns) if '/' not in ns: dirs.append(ns) if not namespace: subdirs.append(ns) if ns.startswith(namespace + '/'): subdirs.append(ns[len(namespace)+1:]) dirs.sort() recursivedirs.sort() dometadataindex = 'metadataindex' in settings.CONFIGURATIONS[request.session['configuration']] and settings.CONFIGURATIONS[request.session['configuration']]['metadataindex'] if dometadataindex: metadataindex = defaultdict(list) for m in MetadataIndex.objects.filter(namespace=namespace): metadataindex[m.docid].append( (m.key, m.value) ) docs = [] if namespace and readpermission: try: r = flat.comm.get(request, '/documents/' + namespace) except Exception as e: return fatalerror(request,e) for d in sorted(r['documents']): docid = os.path.basename(d.replace('.folia.xml','')) if dometadataindex and docid in metadataindex: metaitems = metadataindex[docid] else: metaitems = [] docs.append( (docid, round(r['filesize'][d] / 1024 / 1024,2) , datetime.datetime.fromtimestamp(r['timestamp'][d]).strftime("%Y-%m-%d %H:%M"), metaitems ) ) docs.sort() if namespace: parentdir = '/'.join(namespace.split('/')[:-1]) else: parentdir = "" return render(request, 'index.html', {'namespace': namespace,'parentdir': parentdir, 'dirs': dirs, 'recursivedirs': recursivedirs, 'subdirs': subdirs, 'docs': docs, 'defaultmode': settings.DEFAULTMODE,'loggedin': request.user.is_authenticated(), 'isadmin': request.user.is_staff, 'username': request.user.username, 'configuration': settings.CONFIGURATIONS[request.session['configuration']], 'converters': get_converters(request), 'inputformatchangefunction': inputformatchangefunction(request), 'allowcopy': request.user.has_perm('auth.allowcopy'), 'allowdelete': request.user.has_perm('auth.allowdelete'),'version': settings.VERSION})
def upload_helper(request, namespace, configuration=None, mode=None): if not mode: mode = settings.DEFAULTMODE if not configuration: configuration = settings.DEFAULTCONFIGURATION if mode not in dict(settings.MODES): return fatalerror(request, "Invalid mode",403) if configuration not in settings.CONFIGURATIONS: return fatalerror(request, "Invalid configuration",403) if 'inputformat' in request.POST and request.POST['inputformat'] != 'folia': #we need to convert the input converter = None for cv in get_converters(request): if request.POST['inputformat'] == cv.id: converter = cv if not converter: return fatalerror(request, "Converter not found or specified",404) try: parameters = converter.parse_parameters(request, 'parameters') except: return fatalerror(request, "Invalid syntax for conversion parameters",403) if 'TMPDIR' in os.environ: tmpdir = os.environ['TMPDIR'] else: tmpdir = '/tmp' tmpinfile = os.path.join(tmpdir, request.FILES['file'].name) with open(tmpinfile,'wb') as f_tmp: for chunk in request.FILES['file'].chunks(): f_tmp.write(chunk) tmpoutfile = converter.get_output_name(os.path.join(tmpdir, request.FILES['file'].name)) success, msg = converter.convert(tmpinfile, tmpoutfile, **parameters) if not success: return fatalerror(request, "Input conversion failed: " + msg,403) #removing temporary input file os.unlink(tmpinfile) #reading temporary output file f_folia = open(tmpoutfile, 'rb') else: f_folia = request.FILES['file'] #if sys.version < '3': # data = unicode(request.FILES['file'].read(),'utf-8') #pylint: disable=undefined-variable #else: # data = str(request.FILES['file'].read(),'utf-8') failed = False try: response = flat.comm.postxml(request,"upload/" + namespace , f_folia) except Exception as e: failed = True response = fatalerror(request,e) if 'inputformat' in request.POST and request.POST['inputformat'] != 'folia': f_folia.close() #removing temporary output file after conversion os.unlink(tmpoutfile) if failed: return response elif 'error' in response and response['error']: return fatalerror(request, response['error'],403) else: docid = response['docid'] if namespace == "pub": return HttpResponseRedirect("/" + mode + "/pub/" + configuration + "/" + docid ) else: return HttpResponseRedirect("/" + mode + "/" + namespace + "/" + docid )
def upload(request): if request.method == 'POST': namespace = request.POST['namespace'].replace('..','.').replace(' ','').replace('&','') if flat.users.models.haswritepermission(request.user.username, namespace, request) and 'file' in request.FILES: if request.POST['inputformat'] != 'folia': #we need to convert the input converter = None for cv in get_converters(request): if request.POST['inputformat'] == cv.id: converter = cv if not converter: return fatalerror(request, "Converter not found or specified",404) try: parameters = converter.parse_parameters(request, 'parameters') except: return fatalerror(request, "Invalid syntax for conversion parameters",403) if 'TMPDIR' in os.environ: tmpdir = os.environ['TMPDIR'] else: tmpdir = '/tmp' tmpinfile = os.path.join(tmpdir, request.FILES['file'].name) with open(tmpinfile,'wb') as f_tmp: for chunk in request.FILES['file'].chunks(): f_tmp.write(chunk) tmpoutfile = converter.get_output_name(os.path.join(tmpdir, request.FILES['file'].name)) success, msg = converter.convert(tmpinfile, tmpoutfile, **parameters) if not success: return fatalerror(request, "Input conversion failed: " + msg,403) #removing temporary input file os.unlink(tmpinfile) #reading temporary output file f_folia = open(tmpoutfile, 'rb') else: f_folia = request.FILES['file'] #if sys.version < '3': # data = unicode(request.FILES['file'].read(),'utf-8') #pylint: disable=undefined-variable #else: # data = str(request.FILES['file'].read(),'utf-8') failed = False try: response = flat.comm.postxml(request,"upload/" + namespace , f_folia) except Exception as e: failed = True response = fatalerror(request,e) if request.POST['inputformat'] != 'folia': f_folia.close() #removing temporary output file after conversion os.unlink(tmpoutfile) if failed: return response elif 'error' in response and response['error']: return fatalerror(request, response['error'],403) else: docid = response['docid'] return HttpResponseRedirect("/" + settings.DEFAULTMODE + "/" + namespace + "/" + docid ) else: return fatalerror(request, "Write permission denied",403) else: return fatalerror(request, "Method denied",403)