Exemple #1
0
def download_path(request, filename):
    parts = posixpath.normpath(filename).split("/")
    if len(parts) < 3:
        return HttpResponseBadRequest()
    
    requested_file = parts[-1]

    try: version_num = str(int(parts[-2]))
    except ValueError: version_num = None
    
    if version_num is None:
        base_path = "/".join(parts[:-2])
        type_id = parts[-2]
        versions = get_versions('/' + base_path)
        if versions is None:
            return HttpResponseNotFound()
        version_num = str(max(map(int, versions)))
    else:
        base_path = "/".join(parts[:-3])
        type_id = parts[-3]

    try: 
        file_metadata = get_file_metadata("/%s/%s" % (base_path, version_num))
    except NotFoundError:
        return HttpResponseNotFound()

    if requested_file == posixpath.basename(base_path):
        is_mesh = True
        hash = file_metadata['types'][type_id]['hash']
    else:
        is_mesh = False
        subfile_map = {}
        for subfile in file_metadata['types'][type_id]['subfiles']:
            (subfile_base, vers) = posixpath.split(subfile)
            subfile_basename = posixpath.basename(subfile_base)
            subfile_map[subfile_basename] = subfile

        if requested_file not in subfile_map:
            return HttpResponseNotFound()

        subfile_metadata = get_file_metadata(subfile_map[requested_file])
        hash = subfile_metadata['hash']

    try:
        rec = get_hash(hash)
    except NotFoundError:
        return HttpResponseNotFound()

    data = rec['data']
    mime = rec['mimetype']

    response = HttpResponse(data, mimetype=mime)
    response['Content-Length'] = str(len(data))
    response['Access-Control-Allow-Origin'] = '*'
    return response
Exemple #2
0
def view(request, filename):    
    split = filename.split("/")
    try:
        version = str(int(split[-1]))
    except ValueError:
        version = None

    if version is None:
        basename = split[-1]
        basepath = filename
    else:
        basename = split[-2]
        basepath = '/'.join(split[:-1])

    versions = get_versions('/' + basepath)
    if versions is None:
        return HttpResponseNotFound()

    latest_version = str(max(map(int, versions)))
    if version is None:
        version = latest_version

    try: file_metadata = get_file_metadata("/%s/%s" % (basepath, version))
    except NotFoundError: return HttpResponseNotFound()

    view_params = {'metadata': file_metadata}

    view_params['version'] = version
    view_params['basename'] = basename
    view_params['basepath'] = basepath
    view_params['fullpath'] = filename
    view_params['all_versions'] = map(str, sorted(map(int, versions)))
    view_params['latest_version'] = latest_version
    file_username = split[0]

    view_params['can_change'] = False
    if file_username == request.user.get('username') or request.user.get('is_superuser', False):
        view_params['can_change'] = True
        
    view_params['can_clone'] = False
    if request.user['is_authenticated'] and file_username != request.user.get('username'):
        view_params['can_clone'] = True
    
    if file_metadata['type'] == 'image':
        html_page = 'content/view_image.html'
    else:
        html_page = 'content/view.html'
    return render_to_response(html_page, view_params, context_instance = RequestContext(request))
Exemple #3
0
def dns(request, filename):
    send_body = False
    if request.method != 'HEAD' and request.method != 'GET':
        return HttpResponseBadRequest()

    #check if filename exists as-is, otherwise try meerkat URI
    try:
        file_metadata = get_file_metadata("/" + filename)
        pathinfo = PathInfo(filename)
        requested_file = pathinfo.basename
        version_num = pathinfo.version
        base_path = pathinfo.basepath
        hash = file_metadata['hash']
        file_size = file_metadata['size']
        is_mesh = False
        meerkat = False
    except NotFoundError:
        meerkat = True

    if meerkat:
        parts = posixpath.normpath(filename).split("/")
        if len(parts) < 3:
            return HttpResponseBadRequest()
        
        requested_file = parts[-1]
    
        try: version_num = str(int(parts[-2]))
        except ValueError: version_num = None
        
        if version_num is None:
            base_path = "/".join(parts[:-2])
            type_id = parts[-2]
            versions = get_versions('/' + base_path)
            if versions is None:
                return HttpResponseNotFound()
            version_num = str(max(map(int, versions)))
        else:
            base_path = "/".join(parts[:-3])
            type_id = parts[-3]
    
        try: 
            file_metadata = get_file_metadata("/%s/%s" % (base_path, version_num))
        except NotFoundError:
            return HttpResponseNotFound()

        if type_id not in file_metadata['types']:
            return HttpResponseNotFound()

        if requested_file == posixpath.basename(base_path):
            is_mesh = True
            hash = file_metadata['types'][type_id]['hash']
            file_size = file_metadata['types'][type_id]['size']
        else:
            is_mesh = False
            subfile_map = {}
            for subfile in file_metadata['types'][type_id]['subfiles']:
                (subfile_base, vers) = posixpath.split(subfile)
                subfile_basename = posixpath.basename(subfile_base)
                subfile_map[subfile_basename] = subfile
    
            if requested_file not in subfile_map:
                return HttpResponseNotFound()
    
            subfile_metadata = get_file_metadata(subfile_map[requested_file])
            hash = subfile_metadata['hash']
            file_size = subfile_metadata['size']
    
    if request.method == 'GET':
        body = {'Hash': hash, 'File-Size': file_size}
        bodydata = simplejson.dumps(body)
        response = HttpResponse(bodydata, mimetype='application/json')
    else:
        response = HttpResponse()
        
    if is_mesh and 'progressive_stream' in file_metadata['types'][type_id] and file_metadata['types'][type_id]['progressive_stream'] is not None:
        response['Progresive-Stream'] = file_metadata['types'][type_id]['progressive_stream']
    if is_mesh and 'progressive_stream_num_triangles' in file_metadata['types'][type_id]:
        response['Progresive-Stream-Num-Triangles'] = file_metadata['types'][type_id]['progressive_stream_num_triangles']

    if is_mesh and 'metadata' in file_metadata['types'][type_id]:
        extra_metadata = file_metadata['types'][type_id]['metadata']
        if 'num_triangles' in extra_metadata:
            response['Num-Triangles'] = extra_metadata['num_triangles']
        if 'zernike' in extra_metadata:
            response['Zernike']  = ','.join(map(str, extra_metadata['zernike']))

    if is_mesh and 'subfiles' in file_metadata['types'][type_id]:
        subfiles = file_metadata['types'][type_id]['subfiles']
        response['Subfiles'] = len(subfiles)
        for subfile_number, subfile_path in enumerate(subfiles):
            pathinfo = PathInfo(subfile_path)
            response['Subfile-%d-Name' % subfile_number] = pathinfo.basename
            response['Subfile-%d-Path' % subfile_number] = pathinfo.normpath

    if is_mesh and 'mipmaps' in file_metadata['types'][type_id]:
        mipmaps = file_metadata['types'][type_id]['mipmaps']
        response['Mipmaps'] = len(mipmaps)
        for mipmap_number, (mipmap_name, mipmap_data) in enumerate(mipmaps.iteritems()):
            response['Mipmap-%d-Name' % mipmap_number] = mipmap_name
            response['Mipmap-%d-Hash' % mipmap_number] = mipmap_data['hash']
            for mipmap_level_number, mipmap_level in enumerate(mipmap_data['byte_ranges']):
                response['Mipmap-%d-Level-%d' % (mipmap_number,mipmap_level_number)] = '%s,%s,%s,%s' % (mipmap_level['offset'], mipmap_level['length'], mipmap_level['width'], mipmap_level['height'])

    response['Access-Control-Allow-Origin'] = '*'
    response['Access-Control-Expose-Headers'] = 'Hash, File-Size'
    response['Hash'] = hash
    response['File-Size'] = file_size

    return response