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
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))
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