From 5d27caf107ea9b37401a8329f6df3d15db115311 Mon Sep 17 00:00:00 2001 From: Jan Dickmann Date: Tue, 25 Jun 2024 14:51:04 +0200 Subject: [PATCH] exporting csv and video working --- slaeforms/app.py | 70 ++++++++++++------ slaeforms/attributions.txt | 4 + slaeforms/exports/default_block3_test.csv | 4 + .../exports/default_demographic_test.csv | 2 + slaeforms/exports/double_video_test.csv | 4 + slaeforms/exports/user.csv | 2 + slaeforms/zip_exports/all_tables.zip | Bin 0 -> 2460 bytes slaeforms/zip_exports/all_videos.zip | Bin 0 -> 22 bytes 8 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 slaeforms/exports/default_block3_test.csv create mode 100644 slaeforms/exports/default_demographic_test.csv create mode 100644 slaeforms/exports/double_video_test.csv create mode 100644 slaeforms/exports/user.csv create mode 100644 slaeforms/zip_exports/all_tables.zip create mode 100644 slaeforms/zip_exports/all_videos.zip diff --git a/slaeforms/app.py b/slaeforms/app.py index 57e3126..25d9c0c 100644 --- a/slaeforms/app.py +++ b/slaeforms/app.py @@ -2,7 +2,7 @@ import sys import json import random import base64 -from flask import Flask, redirect, url_for, request, session, make_response, jsonify, send_from_directory +from flask import Flask, redirect, url_for, request, session, make_response, jsonify, send_file from flask import render_template from flask_sqlalchemy import SQLAlchemy from sqlalchemy import Integer, String, Column, Float @@ -14,6 +14,7 @@ from sqlalchemy.orm import DeclarativeBase from flask_wtf.csrf import CSRFProtect import os import csv +from zipfile import ZipFile random_order = True # activate environment: cd C:\Users\Jan\Google Drive\Master Stuff\Code\SLAEForms Testing\.venv\Scripts\ @@ -388,13 +389,50 @@ def update_session(): # Database stuff------------------------------------------------------------------------------ -def create_csv(model, filename): +def zipdir(path, ziph): + # ziph is zipfile handle + for root, dirs, files in os.walk(path): + for file in files: + ziph.write(os.path.join(root, file), + os.path.relpath(os.path.join(root, file), + os.path.join(path, '..'))) + +#create all csvs +def create_all_csvs(): + meta = db.metadata + tables = meta.tables.keys() + + for table_name in tables: + create_csv(meta.tables[table_name], table_name) + + +# export CSV +@app.route("/export_all_tables") +def export_all_tables(): + create_all_csvs() + + with ZipFile('zip_exports/all_tables.zip', 'w') as zipf: #no compression, need to add zipfile.ZIP_DEFLATED for compression + zipdir('exports/', zipf) + + return send_file("zip_exports/all_tables.zip", as_attachment=False, download_name="all_tables.zip") + +# export CSV +@app.route("/export_all_videos") +def export_all_videos(): + + with ZipFile('zip_exports/all_videos.zip', 'w') as zipf: #no compression, need to add zipfile.ZIP_DEFLATED for compression + zipdir('uploads/', zipf) + + return send_file("zip_exports/all_videos.zip", as_attachment=False, download_name="all_tables.zip") + + +def create_csv(table, filename): filename = filename + ".csv" # Query all data from the table - data = db.session.query(model).all() + data = db.session.query(table).all() # Get the column names from the model - column_names = [column.name for column in model.__table__.columns] + column_names = [column.name for column in table.columns] # Open a CSV file and write data path = os.path.join(EXPORT_FOLDER, filename) @@ -406,25 +444,15 @@ def create_csv(model, filename): # export CSV -@app.route("/export_csv") -def export_csv(): +@app.route("/export_csv/") +def export_csv(table_name): - 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) - """ + + try: + create_csv(meta.tables[table_name], table_name) + except Exception as e: + return f'Error occurred: {str(e)}', 500 return redirect("/") diff --git a/slaeforms/attributions.txt b/slaeforms/attributions.txt index d76b728..919df61 100644 --- a/slaeforms/attributions.txt +++ b/slaeforms/attributions.txt @@ -5,6 +5,10 @@ https://jamesalvarez.co.uk/blog/how-to-make-responsive-likert-scales-in-css-(lik # Rootpage that shows all defined routes https://stackoverflow.com/questions/13317536/get-list-of-all-routes-defined-in-the-flask-app +# Zip file of whole directory +https://stackoverflow.com/questions/1855095/how-to-create-a-zip-archive-of-a-directory + + Licenses: diff --git a/slaeforms/exports/default_block3_test.csv b/slaeforms/exports/default_block3_test.csv new file mode 100644 index 0000000..c518fc1 --- /dev/null +++ b/slaeforms/exports/default_block3_test.csv @@ -0,0 +1,4 @@ +id,user_id,date_created,stimulus_name,likertscale,text_feedback +e27365db-7e5a-443b-b6e5-996774baf359,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:01:55.709616,"('video_3', 'video_3')",3, +9e880318-bc66-410e-bac8-d70adbf98de6,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:01:59.317487,video_3,2, +d147ad99-d41e-48a2-91ee-d5610438e862,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:02:01.661348,video_2,5, diff --git a/slaeforms/exports/default_demographic_test.csv b/slaeforms/exports/default_demographic_test.csv new file mode 100644 index 0000000..f2a5d43 --- /dev/null +++ b/slaeforms/exports/default_demographic_test.csv @@ -0,0 +1,2 @@ +id,user_id,date_created,stimulus_name,alter,geschlecht,hoerstatus,bevorzugte_kommunikation,gebärdenzeitraum,gebärdensprachkompetenz +024e75ae-c5b7-4594-8095-b9f360df9d0c,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:01:47.038602,"('video_3', 'video_3')",27,Männlich,Hörend,Gesprochene Sprache,4.0,1 diff --git a/slaeforms/exports/double_video_test.csv b/slaeforms/exports/double_video_test.csv new file mode 100644 index 0000000..fd14f87 --- /dev/null +++ b/slaeforms/exports/double_video_test.csv @@ -0,0 +1,4 @@ +id,user_id,date_created,stimulus_name,likertscale +c317333a-e930-4a3a-93e4-5e213df2d2e6,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:01:28.132611,"('video_1', 'video_1')",1 +860d97ef-4855-4995-9ff3-88177ab494af,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:01:30.220347,"('video_2', 'video_2')",3 +b59c4adb-b730-404a-9d0b-b5630e4f445b,662dc5a5-ff08-4270-ad33-444e8dd01514,2024-06-25 12:01:36.894157,"('video_3', 'video_3')",2 diff --git a/slaeforms/exports/user.csv b/slaeforms/exports/user.csv new file mode 100644 index 0000000..b39ef43 --- /dev/null +++ b/slaeforms/exports/user.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/zip_exports/all_tables.zip b/slaeforms/zip_exports/all_tables.zip new file mode 100644 index 0000000000000000000000000000000000000000..2c94d4bdcd6565f80a78108030a2a61b933a6990 GIT binary patch literal 2460 zcmeHJO^X~w7@incWMII5kNvU4gdFxL zUi}MRbKJWJZ-RQvRq`A3CRXoec6!DQ>YS~nsP6iB>aFK}->3TI`1b3Ey|(;ZKYu_E z*>~UH>h;=sC-%XkRZ-T}2LW=|%B#0-=%$#0V3ZD9q%LvN54!DHBbsq6!_oH;R@*k@685UcbJ7 zgg6@XEf_;MH8}H1VL=JtXqv%66Bn}FngD8F3v9xv7Dl6&+ane?3{+?rti?f4z`{6& zEd{_qDoO-5U=-VH!}ipPQj`nxazln>-0)<}!}tF9@=qGQ+t#}`csRhKI4#|3GWGw_ z&2C;piB6&NlR5ZFjV1+@Rqg7gLK&PD<>Tfw#>lK#ESlwX=IUv&jMK9hWq{>lnAW9h z7S|oss&sx5C$FH6!-IbGFKFoidzoo0q!ri@D{*FXu1LsjAbv02=ve54aH9x&b*M0n zK6$ZR&ZmBY?*CrGGN6wk+F1ArEMfTBrL}-WLJ-}h{MR3T@)wcrw!Yh?ylApHq*uYQ zcS;TVK1Lbm++nbsVBzAMV)LA1W2n|H6IQr z?%yVQ)4zTGhf!0nKxqp)g2k%-I$hrYqs=h89KMS7&XyfCHhTE<=mWTj TK8QoT-a&k3@%-<+*?#>6xMQv9 literal 0 HcmV?d00001 diff --git a/slaeforms/zip_exports/all_videos.zip b/slaeforms/zip_exports/all_videos.zip new file mode 100644 index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7 GIT binary patch literal 22 NcmWIWW@Tf*000g10H*)| literal 0 HcmV?d00001