From b1b21703c7180395d03a62dd620733562e96ef42 Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Fri, 12 Jul 2024 10:32:47 +0200 Subject: [PATCH] Work --- app.py | 14 +++-- db.py | 122 ++++++++++++++++++++++++++++++++---------- schema.sql | 15 ++++-- templates/object.html | 3 ++ 4 files changed, 116 insertions(+), 38 deletions(-) diff --git a/app.py b/app.py index a70688a..ac52959 100755 --- a/app.py +++ b/app.py @@ -2,7 +2,6 @@ from flask import Flask, redirect, request, render_template, send_from_directory import json -import os from os.path import join import uuid from . import db, config, scanner, calibration @@ -21,8 +20,7 @@ def hello_world(): def create_object(): conn = db.get() with conn: - object = db.Object.create(request.form.get('name'), conn) - os.makedirs(join(config.DATA_DIR, str(object.id), 'previews')) + db.Object.create(request.form.get('name'), conn) return redirect('/') @@ -30,8 +28,14 @@ def create_object(): def object(id: int): conn = db.get() object = db.Object.get_from_id(id, conn) - calibration = object.calibration(conn) - return render_template('object.html', object=object, calibration=calibration) + return render_template('object.html', object=object) + + +@app.route('/scan/') +def scan(id: int): + conn = db.get() + object = db.Object.get_from_id(id, conn) + return render_template('object.html', object=object) @app.route("/calibrate/") diff --git a/db.py b/db.py index 92e7aaa..d75745d 100755 --- a/db.py +++ b/db.py @@ -37,15 +37,6 @@ def init_app(app): app.cli.add_command(init) -if __name__ == '__main__': - db = sqlite3.connect( - os.environ.get('DATABASE_PATH', 'db.sqlite'), - detect_types=sqlite3.PARSE_DECLTYPES, - ) - db.row_factory = sqlite3.Row - init(db) - - class CalibrationState(IntEnum): Empty = 0 HasData = 1 @@ -91,36 +82,72 @@ class Calibration: return Calibration.from_row(response.fetchone()) -class Object: +class Acquisition: @staticmethod def select_args() -> str: - return 'id, name, calibration_id' + return 'id, calibration_id, object_id' - def __init__(self, object_id: int, name: str, calibration: int): + def __init__(self, acquisition_id: int, calibration_id: int, object_id: int): self.id = object_id - self.name = name - self.calibration_id = calibration - - @staticmethod - def create(name: str, db: sqlite3.Connection) -> 'Object': - cur = db.cursor() - response = cur.execute( - 'INSERT INTO object(name, calibration_id) VALUES (?, ?) RETURNING ' + Object.select_args() + ';', - [name, None] - ) - return Object.from_row(response.fetchone()) + self.calibration_id = calibration_id + self.object_id = object_id def save(self, db: sqlite3.Connection): cur = db.cursor() cur.execute( - 'UPDATE object SET name = ?, calibration_id = ? WHERE id = ?', - [self.name, self.calibration_id, self.id] + 'UPDATE acquisition SET calibration_id = ?, object_id = ? WHERE id = ?', + [self.calibration_id, self.objct_id, self.id] + ) + + @staticmethod + def from_row(row: sqlite3.Row) -> 'Acquisition': + return Acquisition(*row) + + @staticmethod + def get_from_id(acquisition_id: int, db: sqlite3.Connection) -> Optional['Acquisition']: + cur = db.cursor() + response = cur.execute( + 'SELECT ' + Acquisition.select_args() + ' FROM acquisition WHERE id = ?;', + [acquisition_id] + ) + return Acquisition.from_row(response.fetchone()) + + def calibration(self, db: sqlite3.Connection) -> Optional[Calibration]: + if self.calibration_id is None: + return None + + return Calibration.get_from_id(self.calibration_id, db) + + +class Object: + @staticmethod + def select_args() -> str: + return 'id, name' + + def __init__(self, object_id: int, name: str): + self.id = object_id + self.name = name + + def save(self, db: sqlite3.Connection): + cur = db.cursor() + cur.execute( + 'UPDATE object SET name = ? WHERE id = ?', + [self.name, self.id] ) @staticmethod def from_row(row: sqlite3.Row) -> 'Object': return Object(*row) + @staticmethod + def create(name: str, db: sqlite3.Connection) -> 'Object': + cur = db.cursor() + response = cur.execute( + 'INSERT INTO object(name) VALUES (?) RETURNING ' + Object.select_args() + ';', + [name] + ) + return Object.from_row(response.fetchone()) + @staticmethod def get_from_id(object_id: int, db: sqlite3.Connection) -> Optional['Object']: cur = db.cursor() @@ -139,8 +166,45 @@ class Object: ) return list(map(Object.from_row, response.fetchall())) - def calibration(self, db: sqlite3.Connection) -> Optional[Calibration]: - if self.calibration_id is None: - return None + def add_acquisition(self, calibration_id: int, db: sqlite3.Connection) -> Acquisition: + cur = db.cursor() + response = cur.execute( + 'INSERT INTO acquisition(calibration_id, object_id) VALUES (?, ?) RETURNING ' + Acquisition.select_args() + ';', + [calibration_id, self.id] + ) + return Acquisition.from_row(response.fetchone()) - return Calibration.get_from_id(self.calibration_id, db) + +def main(): + db = sqlite3.connect( + os.environ.get('DATABASE_PATH', 'db.sqlite'), + detect_types=sqlite3.PARSE_DECLTYPES, + ) + db.row_factory = sqlite3.Row + init(db) + + # Create a new object + with db: + object = Object.create('Mon premier objet', db) + calibration = Calibration.create(db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + calibration = Calibration.create(db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + + object = Object.create('Mon deuxième objet', db) + calibration = Calibration.create(db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + calibration = Calibration.create(db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + object.add_acquisition(calibration.id, db) + + +if __name__ == '__main__': + main() diff --git a/schema.sql b/schema.sql index e6e5d30..92cf3db 100644 --- a/schema.sql +++ b/schema.sql @@ -1,14 +1,21 @@ -DROP TABLE IF EXISTS object; DROP TABLE IF EXISTS calibration; +DROP TABLE IF EXISTS acquisition; +DROP TABLE IF EXISTS object; CREATE TABLE calibration ( id INTEGER PRIMARY KEY AUTOINCREMENT, state INTEGER NOT NULL ); +CREATE TABLE acquisition ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + calibration_id INTEGER NOT NULL, + object_id INTEGER NOT NULL, + CONSTRAINT fk_calibration FOREIGN KEY(calibration_id) REFERENCES calibration(id), + CONSTRAINT fk_object FOREIGN KEY(object_id) REFERENCES object(id) +); + CREATE TABLE object ( id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL, - calibration_id INTEGER, - CONSTRAINT fk_calibration FOREIGN KEY(calibration_id) REFERENCES calibration(id) + name TEXT NOT NULL ); diff --git a/templates/object.html b/templates/object.html index 4190b98..2ec7af2 100644 --- a/templates/object.html +++ b/templates/object.html @@ -4,6 +4,7 @@

{{ object.name }}

+ {#
{% if calibration is none or calibration.state == 0 %} @@ -30,6 +31,8 @@ Utiliser le dernier étalonnage connu
{% endif %} + #} + Faire un scan
{% endblock content %}