diff --git a/__init__.py b/__init__.py index e633b7b..175437f 100644 --- a/__init__.py +++ b/__init__.py @@ -1,7 +1,6 @@ -from flask import Flask, redirect, render_template, send_from_directory, session +from flask import Flask, send_from_directory, session import os -from os.path import join -from . import db, config, scanner, routes, utils +from . import db, config, routes, utils app = Flask(__name__) @@ -46,100 +45,6 @@ def manage_auto_use_last_calibration(): app.register_blueprint(routes.blueprint) -@app.route('/scan/') -def scan(id: int): - conn = db.get() - calibration_id = session.get('calibration_id', None) - object = db.Object.get_from_id(id, conn) - - if calibration_id is None: - raise RuntimeError("Impossible de faire l'acquisition sans étalonnage") - - return render_template('scan.html', object=object, calibrated=True) - - -@app.route('/scan-acquisition/') -def scan_existing(id: int): - conn = db.get() - calibrated = session.get('calibration_id', None) is not None - acquisition = db.Acquisition.get_from_id(id, conn) - object = acquisition.object(conn) - return render_template('scan.html', object=object, acquisition=acquisition, calibrated=calibrated) - - -@app.route("/api/scan-for-object/") -def scan_object(object_id: int): - conn = db.get() - calibration_id = session.get('calibration_id', None) - - if calibration_id is None: - raise RuntimeError("Impossible de faire l'acquisition sans étalonnage") - - object = db.Object.get_from_id(object_id, conn) - - if object is None: - raise RuntimeError(f"Aucun objet d'id {object_id}") - - with conn: - acquisition = object.add_acquisition(calibration_id, conn) - - def generate(): - yield str(acquisition.id) - length = len(config.LEDS_UUIDS) - for index, led_uuid in enumerate(scanner.scan(join(config.OBJECT_DIR, str(object.id), str(acquisition.id)))): - yield f"{led_uuid},{(index+1)/length}\n" - - return app.response_class(generate(), mimetype='text/plain') - - -@app.route("/api/scan-for-acquisition/") -def scan_acquisition(acquisition_id: int): - conn = db.get() - calibration_id = session.get('calibration_id', None) - - if calibration_id is None: - raise RuntimeError("Impossible de faire l'acquisition sans étalonnage") - - acquisition = db.Acquisition.get_from_id(acquisition_id, conn) - - if acquisition is None: - raise RuntimeError(f"Aucun acquisition d'id {acquisition_id}") - - object = acquisition.object(conn) - - def generate(): - length = len(config.LEDS_UUIDS) - for index, led_uuid in enumerate(scanner.scan(join(config.OBJECT_DIR, str(object.id), str(acquisition.id)))): - yield f"{led_uuid},{(index+1)/length}\n" - - return app.response_class(generate(), mimetype='text/plain') - - -@app.route("/validate-acquisition/") -def validate_acquisition(acquisition_id: int): - conn = db.get() - acquisition = db.Acquisition.get_from_id(acquisition_id, conn) - - if acquisition is None: - raise f"Aucune acquisition d'id {acquisition_id}" - - object = acquisition.object(conn) - - acquisition.validated = True - with conn: - acquisition.save(conn) - - return redirect(f'/object/{object.id}') - - -@app.route("/delete-acquisition/") -def delete_acquisition(acquisition_id: int): - conn = db.get() - with conn: - acqusition = db.Acquisition.delete_from_id(acquisition_id, conn) - return redirect('/object/' + str(acqusition.object_id)) - - @app.route('/static/') def send_static(path): return send_from_directory('static', path) diff --git a/routes/__init__.py b/routes/__init__.py index 957b6e9..8038c73 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -1,7 +1,7 @@ from flask import Blueprint, render_template from .. import db -from . import object, calibration +from . import object, calibration, acquisition blueprint = Blueprint('routes', __name__) @@ -19,3 +19,4 @@ def index(): blueprint.register_blueprint(object.blueprint, url_prefix='/object') blueprint.register_blueprint(calibration.blueprint, url_prefix='/calibration') +blueprint.register_blueprint(acquisition.blueprint, url_prefix='/acquisition') diff --git a/routes/acquisition.py b/routes/acquisition.py new file mode 100644 index 0000000..fa26dd7 --- /dev/null +++ b/routes/acquisition.py @@ -0,0 +1,106 @@ +from flask import Blueprint, Response, render_template, session, redirect +from os.path import join + +from .. import db, config, scanner + +blueprint = Blueprint('acquisition', __name__) + + +@blueprint.route('/scan/') +def scan(id: int): + """ + Route to scan an object + """ + conn = db.get() + calibration_id = session.get('calibration_id', None) + object = db.Object.get_from_id(id, conn) + + if calibration_id is None: + raise RuntimeError("Impossible de faire l'acquisition sans étalonnage") + + return render_template('scan.html', object=object, calibrated=True) + + +@blueprint.route('/rescan/') +def scan_existing(id: int): + conn = db.get() + calibrated = session.get('calibration_id', None) is not None + acquisition = db.Acquisition.get_from_id(id, conn) + object = acquisition.object(conn) + return render_template('scan.html', object=object, acquisition=acquisition, calibrated=calibrated) + + +@blueprint.route('/run/') +def run(object_id: int): + conn = db.get() + calibration_id = session.get('calibration_id', None) + + if calibration_id is None: + raise RuntimeError("Impossible de faire l'acquisition sans étalonnage") + + object = db.Object.get_from_id(object_id, conn) + + if object is None: + raise RuntimeError(f"Aucun objet d'id {object_id}") + + with conn: + acquisition = object.add_acquisition(calibration_id, conn) + + def generate(): + yield str(acquisition.id) + length = len(config.LEDS_UUIDS) + for index, led_uuid in enumerate(scanner.scan(join(config.OBJECT_DIR, str(object.id), str(acquisition.id)))): + yield f"{led_uuid},{(index+1)/length}\n" + + return Response(generate(), mimetype='text/plain') + + +@blueprint.route('/rerun/') +def rescan(acquisition_id: int): + """ + Route to relaunch an acquisition + """ + conn = db.get() + calibration_id = session.get('calibration_id', None) + + if calibration_id is None: + raise RuntimeError("Impossible de faire l'acquisition sans étalonnage") + + acquisition = db.Acquisition.get_from_id(acquisition_id, conn) + + if acquisition is None: + raise RuntimeError(f"Aucun acquisition d'id {acquisition_id}") + + object = acquisition.object(conn) + + def generate(): + length = len(config.LEDS_UUIDS) + for index, led_uuid in enumerate(scanner.scan(join(config.OBJECT_DIR, str(object.id), str(acquisition.id)))): + yield f"{led_uuid},{(index+1)/length}\n" + + return Response(generate(), mimetype='text/plain') + + +@blueprint.route('/validate/') +def validate(acquisition_id: int): + conn = db.get() + acquisition = db.Acquisition.get_from_id(acquisition_id, conn) + + if acquisition is None: + raise f"Aucune acquisition d'id {acquisition_id}" + + object = acquisition.object(conn) + + acquisition.validated = True + with conn: + acquisition.save(conn) + + return redirect(f'/object/{object.id}') + + +@blueprint.route("/delete/") +def delete(acquisition_id: int): + conn = db.get() + with conn: + acqusition = db.Acquisition.delete_from_id(acquisition_id, conn) + return redirect('/object/' + str(acqusition.object_id)) diff --git a/templates/object.html b/templates/object.html index c9b5076..928733d 100644 --- a/templates/object.html +++ b/templates/object.html @@ -16,7 +16,7 @@
{% for acquisition in object.acquisitions %} - +
@@ -34,7 +34,7 @@
{% if calibration.state == CalibrationState.IsValidated %} {% else %}
diff --git a/templates/scan.html b/templates/scan.html index 012a048..48a10c0 100644 --- a/templates/scan.html +++ b/templates/scan.html @@ -32,16 +32,16 @@
{% else %} {% endif %} {% else %} {% endif %}
@@ -60,7 +60,7 @@ let errorContainer = document.getElementById('error-container'); let errorContent = document.getElementById('error-content'); let calibrateDiv = document.getElementById('calibrate'); - let calibrateButton = document.getElementById('calibrate-button'); + let validateButton = document.getElementById('validate-button'); let deleteButton = document.getElementById('delete-button'); // If we already have calibration images, we show them right now @@ -88,9 +88,9 @@ let response; if (acquisitionId === null) { - response = await fetch('/api/scan-for-object/{{ object.id }}'); + response = await fetch('/acquisition/run/{{ object.id }}'); } else { - response = await fetch('/api/scan-for-acquisition/' + acquisitionId); + response = await fetch('/acquisition/rerun/' + acquisitionId); } let reader = response.body.pipeThrough(new TextDecoderStream()).getReader(); @@ -107,9 +107,9 @@ if (acquisitionId === null) { acquisitionId = parseInt(value, 10); - calibrateButton.setAttribute('href', '/validate-acquisition/' + acquisitionId); - deleteButton.setAttribute('href', '/delete-acquisition/' + acquisitionId); - window.history.pushState('', '', '/scan-acquisition/' + acquisitionId); + validateButton.setAttribute('href', '/acquisition/validate/' + acquisitionId); + deleteButton.setAttribute('href', '/acquisition/delete/' + acquisitionId); + window.history.pushState('', '', '/acquisition/rescan/' + acquisitionId); continue; }