40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""HTTP adapters for files; business logic lives in services."""
|
|
|
|
from flask import Blueprint, render_template, request, send_from_directory
|
|
from werkzeug.exceptions import NotFound
|
|
|
|
from .. import file_service, visitor_service
|
|
from ..config import get_setting
|
|
|
|
bp = Blueprint('files', __name__)
|
|
|
|
|
|
def unavailable(staff=False):
|
|
return render_template('attachment_unavailable.html', staff=staff), 404, {'Cache-Control':'private, no-store'}
|
|
|
|
@bp.route('/api/upload', methods=['POST'])
|
|
def upload_file():
|
|
return file_service.upload_file(request.files)
|
|
|
|
|
|
@bp.route('/uploads/<path:name>')
|
|
def uploaded_file(name):
|
|
if not visitor_service.owns_upload(name):
|
|
return unavailable()
|
|
try:
|
|
response = send_from_directory(get_setting('UPLOAD_DIR'), name)
|
|
except NotFound:
|
|
return unavailable()
|
|
response.headers['Cache-Control'] = 'private, no-store'
|
|
return response
|
|
|
|
|
|
@bp.route('/api/staff/uploads/<path:name>')
|
|
def staff_uploaded_file(name):
|
|
try:
|
|
response = send_from_directory(get_setting('UPLOAD_DIR'), name)
|
|
except NotFound:
|
|
return unavailable(staff=True)
|
|
response.headers['Cache-Control'] = 'private, no-store'
|
|
return response
|