Exemple #1
0
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)
Exemple #2
0
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
        })
Exemple #3
0
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})
Exemple #4
0
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  )
Exemple #5
0
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)