diff --git a/dashboard/__init__.py b/dashboard/__init__.py index 03bbe1e..2c8a0e4 100644 --- a/dashboard/__init__.py +++ b/dashboard/__init__.py @@ -18,6 +18,7 @@ import json import os.path +import stat from astropy.time import Time import astropy.units as u @@ -26,12 +27,17 @@ from flask import abort from flask import Flask from flask import jsonify +from flask import redirect from flask import render_template from flask import request from flask import send_from_directory +from flask import url_for +from werkzeug.security import safe_join +from werkzeug.utils import secure_filename # pylint: disable=missing-docstring +FILES_ROOT = '/home/observer/Public' GENERATED_DATA_DIR = '/var/www/dashboard/generated' GENERATED_DATA = { @@ -70,6 +76,66 @@ def vnc(): return render_template('vnc.html') +@app.route('/files/', methods=['GET', 'POST']) +@app.route('/files/', methods=['GET', 'POST']) +def files(directory=''): + path = safe_join(FILES_ROOT, directory) + if path is None: + return abort(403) + + if request.method == 'POST': + # check if the post request has the file part + if 'file' not in request.files: + return redirect(request.url) + + f = request.files['file'] + if f and f.filename: + filename = secure_filename(f.filename) + f.save(os.path.join(path, filename)) + return redirect(request.url) + + table = [] + if directory: + parent = safe_join(FILES_ROOT, os.path.join(directory, '..')) + if parent: + info = os.stat(parent) + modified = Time(info.st_mtime, format='unix').strftime('%Y-%m-%d %H:%M:%S') + table.append((url_for('files', directory=os.path.join(directory, '..')), 'bi-folder2', '..', modified, '-')) + + units = ['B', 'KiB', 'MiB', 'GiB'] + for filename in os.listdir(path): + if filename.startswith('.'): + continue + try: + info = os.stat(os.path.join(path, filename)) + if stat.S_ISDIR(info.st_mode): + url = url_for('files', directory=os.path.join(directory, filename)) + icon = 'bi-folder2' + size = '-' + else: + url = url_for('file', path=os.path.join(directory, filename)) + icon = 'bi-file-earmark' + size = info.st_size + i = 0 + while size > 1024 and i < len(units): + size /= 1024 + i += 1 + + size = f'{size:.2f} {units[i]}' + + modified = Time(info.st_mtime, format='unix').strftime('%Y-%m-%d %H:%M:%S') + table.append((url, icon, filename, modified, size)) + except: + pass + + return render_template('files.html', table=table, directory=directory) + + +@app.route('/file/') +def file(path): + return send_from_directory(FILES_ROOT, path) + + @app.route('/camera/') def camera_image(camera): if camera in ['eumetsat', 'allsky', 'dome', 'telescope']: diff --git a/dashboard/templates/files.html b/dashboard/templates/files.html new file mode 100644 index 0000000..7a0079e --- /dev/null +++ b/dashboard/templates/files.html @@ -0,0 +1,38 @@ +{% extends "layout.html" %} +{% set title = 'TCS Control' -%} +{% set active_page = 'files' -%} +{% block body %} +
+
+
+
+
+ + +
+
+
+
+
+
+ + + + + + + + {% for row in table %} + + + + + + {% endfor %} + +
FilenameModifiedSize
{{ row[2] }}{{ row[3]|safe }}{{ row[4]|safe }}
+
+
+
+ +{% endblock %} diff --git a/dashboard/templates/layout.html b/dashboard/templates/layout.html index 99db9b8..c1f20ec 100644 --- a/dashboard/templates/layout.html +++ b/dashboard/templates/layout.html @@ -98,6 +98,9 @@

Windmill Hill Observatory

+