diff --git a/slaeforms/app.py b/slaeforms/app.py index 13250d8..57e3126 100644 --- a/slaeforms/app.py +++ b/slaeforms/app.py @@ -9,10 +9,11 @@ from sqlalchemy import Integer, String, Column, Float from datetime import datetime import uuid from sqlalchemy.exc import SQLAlchemyError -from sqlalchemy import select +from sqlalchemy import select, join from sqlalchemy.orm import DeclarativeBase from flask_wtf.csrf import CSRFProtect import os +import csv random_order = True # activate environment: cd C:\Users\Jan\Google Drive\Master Stuff\Code\SLAEForms Testing\.venv\Scripts\ @@ -37,40 +38,15 @@ db.init_app(app) app.secret_key = b"29fe9e8edd407c5491d4f1c05632d9fa33e26ed8734a3f5e080ebac3772a555a" UPLOAD_FOLDER = 'uploads' +EXPORT_FOLDER = 'exports' #csrf = CSRFProtect(app) #enable CSRF protection globally - -#---------testing JSON Stuff -#open the json file with the config -testconfigfile = open("singleformconfig.json", encoding='utf-8') -#convert it to dict -testconfig = json.load(testconfigfile) -testconfigfile.close() -# get the questions: Questions is a list that contains the keys of the dictionary -questions = list(testconfig) - - - - - - #------------------------------------------------------------------------ -# Setting up DB Models, response -> should be removed eventually and replaced by json files and automatic generation ---------------------------- +# Setting up DB Models -# create the model for the response table -class Response(db.Model): - id = db.Column("id",db.UUID(as_uuid=True), primary_key=True, nullable=False) - user_id = db.Column("user_id",db.UUID(as_uuid=True), nullable=False) - question_title = db.Column("question_title",db.String(30)) - likert_result = db.Column("likert_result",db.Integer, nullable=False) - notes = db.Column("notes",db.String(200)) - date_created = db.Column("date_created",db.DateTime) - def __repr__(self) -> str: - return "" % self.id - -# This table is always created +# This table is always created, tracks all users class User(db.Model): user_id = db.Column("user_id",db.UUID(as_uuid=True), primary_key=True, nullable=False) device_id = db.Column("device_id",db.UUID(as_uuid=True), nullable=False) @@ -87,13 +63,8 @@ except SQLAlchemyError as e: print("Error occurred during database creation:", str(e)) - -# -------Testing the actual final form from json------------------------------------------------ - - - - - +#----------------------------------------------------------------------------- +#open, parse and execute json file #open the json file with the config configfile = open("default.json", encoding='utf-8') #todo replace with other name @@ -155,6 +126,10 @@ try: except SQLAlchemyError as e: print("Error occurred during database creation:", str(e)) + +#------------------------------------------------------------------------------ +#actual page logic with start, form and send + @app.route("/start", methods=["GET", "POST"]) def startpage(): session.permanent = False @@ -413,6 +388,46 @@ def update_session(): # Database stuff------------------------------------------------------------------------------ +def create_csv(model, filename): + filename = filename + ".csv" + # Query all data from the table + data = db.session.query(model).all() + + # Get the column names from the model + column_names = [column.name for column in model.__table__.columns] + + # Open a CSV file and write data + path = os.path.join(EXPORT_FOLDER, filename) + with open(path, 'w', newline='') as file: + writer = csv.writer(file) + writer.writerow(column_names) # Write header + for row in data: + writer.writerow([getattr(row, column) for column in column_names]) + + +# export CSV +@app.route("/export_csv") +def export_csv(): + + create_csv(User, "usertable") + + """ + meta = db.metadata + tables = meta.tables.keys() + print("tables: ",tables) + print("testquerys:") + qtable = meta.tables["default_demographic_test"] + query1 = select(qtable).where(qtable.c.alter == 78) + print("Query 1: ", query1) + print("Query 1 result: ") + result = db.session.execute(query1) + print("Columns: ", result.columns) + for row in result: + print(row) + """ + + return redirect("/") + # the contents of all tables @app.route("/table_contents") def table_contents(): @@ -464,6 +479,20 @@ def show_tables(): tables = meta.tables return render_template('show_tables.html', tables=tables) +# Control Panel --------------------------------------------------------- + +@app.route("/upload_configs") +def upload_configs(): + links = [] + for rule in app.url_map.iter_rules(): + # Filter out rules we can't navigate to in a browser + # and rules that require parameters + if "GET" in rule.methods and has_no_empty_params(rule): + url = url_for(rule.endpoint, **(rule.defaults or {})) + links.append((url, rule.endpoint)) + return render_template("all_links.html", links=links) + + # Root page ----------------------------- def has_no_empty_params(rule): @@ -526,4 +555,4 @@ def delete_all_entries(): db.session.close() if __name__ == '__main__': - app.run(debug=True) \ No newline at end of file + app.run() \ No newline at end of file diff --git a/slaeforms/exports/usertable.csv b/slaeforms/exports/usertable.csv new file mode 100644 index 0000000..b39ef43 --- /dev/null +++ b/slaeforms/exports/usertable.csv @@ -0,0 +1,2 @@ +user_id,device_id,question_order,date_created +662dc5a5-ff08-4270-ad33-444e8dd01514,50bc84f6-6c55-4277-9651-5c3c98e973f5,"{'Block 0': [('video_1', 'video_1'), ('video_2', 'video_2'), ('video_3', 'video_3')], 'Block 1': ['empty_stimulus'], 'Block 2': ['video_1', 'video_3', 'video_2']}",2024-06-25 12:01:22.516505 diff --git a/slaeforms/uploads/05297230-51d9-464c-800b-6e4ab87dc60b_Block 2_empty_stimulus_2024.06.18 12-32-39.webm b/slaeforms/uploads/05297230-51d9-464c-800b-6e4ab87dc60b_Block 2_empty_stimulus_2024.06.18 12-32-39.webm deleted file mode 100644 index f4004f2..0000000 Binary files a/slaeforms/uploads/05297230-51d9-464c-800b-6e4ab87dc60b_Block 2_empty_stimulus_2024.06.18 12-32-39.webm and /dev/null differ diff --git a/slaeforms/uploads/8fa17956-484e-4fed-9941-2b944114d3b0_Block 4_empty_stimulus_2024.06.15 18-56-34.webm b/slaeforms/uploads/8fa17956-484e-4fed-9941-2b944114d3b0_Block 4_empty_stimulus_2024.06.15 18-56-34.webm deleted file mode 100644 index 8a5e35f..0000000 Binary files a/slaeforms/uploads/8fa17956-484e-4fed-9941-2b944114d3b0_Block 4_empty_stimulus_2024.06.15 18-56-34.webm and /dev/null differ diff --git a/slaeforms/uploads/8fa17956-484e-4fed-9941-2b944114d3b0_Block 4_video_3_2024.06.15 18-56-47.webm b/slaeforms/uploads/8fa17956-484e-4fed-9941-2b944114d3b0_Block 4_video_3_2024.06.15 18-56-47.webm deleted file mode 100644 index 8a5e35f..0000000 Binary files a/slaeforms/uploads/8fa17956-484e-4fed-9941-2b944114d3b0_Block 4_video_3_2024.06.15 18-56-47.webm and /dev/null differ diff --git a/slaeforms/uploads/a72f05bb-d6a7-4f0d-940d-e286746b015c_Block 4_video_2_2024.06.15 19-49-35.webm b/slaeforms/uploads/a72f05bb-d6a7-4f0d-940d-e286746b015c_Block 4_video_2_2024.06.15 19-49-35.webm deleted file mode 100644 index 6c77ad6..0000000 Binary files a/slaeforms/uploads/a72f05bb-d6a7-4f0d-940d-e286746b015c_Block 4_video_2_2024.06.15 19-49-35.webm and /dev/null differ diff --git a/slaeforms/uploads/acd47b24-2a64-400a-be52-258fa6dbfee3_Block 4_video_1_2024.06.15 19-15-06.webm b/slaeforms/uploads/acd47b24-2a64-400a-be52-258fa6dbfee3_Block 4_video_1_2024.06.15 19-15-06.webm deleted file mode 100644 index fff3622..0000000 Binary files a/slaeforms/uploads/acd47b24-2a64-400a-be52-258fa6dbfee3_Block 4_video_1_2024.06.15 19-15-06.webm and /dev/null differ diff --git a/slaeforms/uploads/adffef3d-4d54-4a4d-8230-ec1ef2ede482_Block 4_video_3_2024.06.15 19-25-08.webm b/slaeforms/uploads/adffef3d-4d54-4a4d-8230-ec1ef2ede482_Block 4_video_3_2024.06.15 19-25-08.webm deleted file mode 100644 index a1f87f6..0000000 Binary files a/slaeforms/uploads/adffef3d-4d54-4a4d-8230-ec1ef2ede482_Block 4_video_3_2024.06.15 19-25-08.webm and /dev/null differ