diff --git a/.gitignore b/.gitignore index b2318ae..34a591a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__/ instance/ uploads/ +zip_exports/ .pytest_cache/ .coverage diff --git a/slaeforms/app.py b/slaeforms/app.py index 0329efb..c332efc 100644 --- a/slaeforms/app.py +++ b/slaeforms/app.py @@ -42,8 +42,8 @@ app.secret_key = b"29fe9e8edd407c5491d4f1c05632d9fa33e26ed8734a3f5e080ebac3772a5 UPLOAD_FOLDER = 'uploads' EXPORT_FOLDER = 'exports' PASSWORD = '#1ACGmsjd' -# CONFIGFILE = 'userstudy1.json' -CONFIGFILE = 'test.json' +CONFIGFILE = 'userstudy1.json' +# CONFIGFILE = 'test.json' # CONFIGFILE = 'default.json' #csrf = CSRFProtect(app) #enable CSRF protection globally @@ -186,7 +186,7 @@ def startpage(): for name in block_names: print("block: ",name) - if config[name]["type"] == "TaskTemplate" and ("stimuli" in current_block): + if config[name]["type"] == "TaskTemplate" and ("stimuli" in config[name]): match config[name]["stimuli"]["type"]: case "single_video": order = list(config[name]["stimuli"]["list"]) # order = list of simuli keys @@ -237,7 +237,7 @@ def startpage(): return redirect("/form") return render_template( - "teststartpage.html" + "startpage.html" ) @app.route("/endpage") @@ -245,6 +245,14 @@ def endpage(): print("Form is done, sent to endpage") return render_template("endpage.html") +@app.route("/datenschutz") +def datenschutz(): + return render_template("datenschutz.html") + +@app.route("/studytest") +def studytest(): + return render_template("studytest.html") + @app.route("/form") def form(): @@ -353,7 +361,7 @@ def sendpage(): video = request.files['recordedVideo'] formatted_date = date.strftime("%Y.%m.%d %H-%M-%S") print("date: ", date) - video_name = str(session_user_id) + "_" + session["current_block_name"] + "_" + session["current_stimulus_name"] + "_" + str(formatted_date) + ".webm" + video_name = str(session_user_id) + "_" + session["current_block_name"] + "_" + str(session["current_stimulus_name"]) + "_" + str(formatted_date) + ".webm" path = os.path.join(UPLOAD_FOLDER, video_name) print("path: ",path) os.makedirs(UPLOAD_FOLDER, exist_ok=True) @@ -364,7 +372,19 @@ def sendpage(): setattr(new_entry, "video_upload", video_name) - for key, value in request.form.items(): + # TODO maybe find a prettier solution, this handeles multiple choice now, so the fact that there can be + # multiple keys that are the same in the form data, but I want to bring them together to 1 key value pair + form_data = {} + for key in request.form: + values = request.form.getlist(key) + + # If there's more than one value for the key, join them with commas + if len(values) > 1: + form_data[key] = ','.join(map(str, values)) # Join multiple values into a single comma-separated string + else: + form_data[key] = values[0] # If only one value, store it directly + + for key, value in form_data.items(): print("hasattr key: ", key) if hasattr(new_entry, key): print("key exists: ", key) @@ -429,9 +449,18 @@ def update_session(): session["current_block_index"] += 1 session["current_block_name"] = session["block_names"][session["current_block_index"]] - if "stimuli" in config[session["current_block_name"]]: - # set the name of the current stimulus - session["current_stimulus_name"] = session["block_order"][session["current_block_name"]][session["current_stimulus_index"]] + #set values for the new block + current_block = config[session["current_block_name"]] + + if "stimuli" in current_block: + # set the name of the current stimulus + session["current_stimulus_name"] = session["block_order"][session["current_block_name"]][session["current_stimulus_index"]] + + # if the block has stimuli, get how many + if current_block["stimuli"]["type"] == "single_video" or current_block["stimuli"]["type"] == "empty": + session["number_of_stimuli"] = len(list(current_block["stimuli"]["list"])) + elif current_block["stimuli"]["type"] == "double_video": + session["number_of_stimuli"] = len(list(current_block["stimuli"]["list_1"])) print("---Session updated-----------------------------------------------") print("current_block_index / number_of_blocks: {current_block_index} / {number_of_blocks}".format(current_block_index=session["current_block_index"],number_of_blocks=session["number_of_blocks"])) diff --git a/slaeforms/static/icons/sl-icon.png b/slaeforms/static/icons/sl-icon.png new file mode 100644 index 0000000..c25975c Binary files /dev/null and b/slaeforms/static/icons/sl-icon.png differ diff --git a/slaeforms/static/styles.css b/slaeforms/static/styles.css index 026893b..61d567d 100644 --- a/slaeforms/static/styles.css +++ b/slaeforms/static/styles.css @@ -106,6 +106,10 @@ form { padding-bottom: 2em; } +.questioncontainer { + max-width: 70%; + margin: auto; +} .dsgvoform { text-align: right; @@ -118,9 +122,7 @@ label { margin-bottom: 1.5rem; } -input, -textarea, -select { +.inputs { margin: 10px 0 0 0; width: 60%; min-height: 2em; @@ -157,6 +159,7 @@ select { border-radius: 8px; /* Optional: rounds the corners of the button */ width: auto; + float: right; } #submitbutton:hover { @@ -176,8 +179,10 @@ select { } .textarea-label { - align-self: flex-start; - /* Aligns the label to the start of the container */ + font-size: 18px; + font-weight: bold; + text-align: center; + } /* Helper */ @@ -190,8 +195,7 @@ select { text-align: center; } -h2, -h3 { +h2 { text-align: center; } @@ -315,7 +319,7 @@ iframe { .dv_half { display: inline-block; - width: 45%; + width: 48%; margin: auto; } @@ -324,6 +328,34 @@ iframe { display: flex; } + +/* Likert stuff 2 */ + +.outer-likert-container { + display: flex; +} + +.normal-likert-container { /* inner container */ + display: flex; + gap: 10px; /* Adjust spacing */ + text-align: center; + flex-grow: 1; + max-width: 70%; + margin: auto; +} + +.likertlabel { + flex-grow: 1; + width: 100%; +} + +.likertinput { + margin: auto; + width: 60%; + min-height: 2em; + display: flex; +} + /* Likert stuff */ .likert { /* --likert-rows: 5;*/ @@ -347,7 +379,7 @@ iframe { aspect-ratio: 1.5 / 1; } -.likercontainer { +.likertcontainer { margin: 30px auto; text-align: center; } diff --git a/slaeforms/static/videos/0009-inflected.mp4 b/slaeforms/static/videos/0009-inflected.mp4 new file mode 100644 index 0000000..d4ebf52 Binary files /dev/null and b/slaeforms/static/videos/0009-inflected.mp4 differ diff --git a/slaeforms/static/videos/0009-mocap.mp4 b/slaeforms/static/videos/0009-mocap.mp4 new file mode 100644 index 0000000..d673e96 Binary files /dev/null and b/slaeforms/static/videos/0009-mocap.mp4 differ diff --git a/slaeforms/static/videos/0009-simple.mp4 b/slaeforms/static/videos/0009-simple.mp4 new file mode 100644 index 0000000..c044ad9 Binary files /dev/null and b/slaeforms/static/videos/0009-simple.mp4 differ diff --git a/slaeforms/static/videos/0009-variation-wide.mp4 b/slaeforms/static/videos/0009-variation-wide.mp4 new file mode 100644 index 0000000..1e4bbda Binary files /dev/null and b/slaeforms/static/videos/0009-variation-wide.mp4 differ diff --git a/slaeforms/static/videos/0018-inflected.mp4 b/slaeforms/static/videos/0018-inflected.mp4 new file mode 100644 index 0000000..c99ec70 Binary files /dev/null and b/slaeforms/static/videos/0018-inflected.mp4 differ diff --git a/slaeforms/static/videos/0018-mocap.mp4 b/slaeforms/static/videos/0018-mocap.mp4 new file mode 100644 index 0000000..90c12db Binary files /dev/null and b/slaeforms/static/videos/0018-mocap.mp4 differ diff --git a/slaeforms/static/videos/0018-simple.mp4 b/slaeforms/static/videos/0018-simple.mp4 new file mode 100644 index 0000000..463cebf Binary files /dev/null and b/slaeforms/static/videos/0018-simple.mp4 differ diff --git a/slaeforms/static/videos/0020-inflected.mp4 b/slaeforms/static/videos/0020-inflected.mp4 new file mode 100644 index 0000000..52f8101 Binary files /dev/null and b/slaeforms/static/videos/0020-inflected.mp4 differ diff --git a/slaeforms/static/videos/0020-mocap.mp4 b/slaeforms/static/videos/0020-mocap.mp4 new file mode 100644 index 0000000..9724011 Binary files /dev/null and b/slaeforms/static/videos/0020-mocap.mp4 differ diff --git a/slaeforms/static/videos/0020-simple.mp4 b/slaeforms/static/videos/0020-simple.mp4 new file mode 100644 index 0000000..c20dadb Binary files /dev/null and b/slaeforms/static/videos/0020-simple.mp4 differ diff --git a/slaeforms/static/videos/0021-inflected.mp4 b/slaeforms/static/videos/0021-inflected.mp4 new file mode 100644 index 0000000..9a2bc5b Binary files /dev/null and b/slaeforms/static/videos/0021-inflected.mp4 differ diff --git a/slaeforms/static/videos/0021-mocap.mp4 b/slaeforms/static/videos/0021-mocap.mp4 new file mode 100644 index 0000000..d752987 Binary files /dev/null and b/slaeforms/static/videos/0021-mocap.mp4 differ diff --git a/slaeforms/static/videos/0021-simple.mp4 b/slaeforms/static/videos/0021-simple.mp4 new file mode 100644 index 0000000..5e71308 Binary files /dev/null and b/slaeforms/static/videos/0021-simple.mp4 differ diff --git a/slaeforms/static/videos/0022-inflected.mp4 b/slaeforms/static/videos/0022-inflected.mp4 new file mode 100644 index 0000000..2c189d4 Binary files /dev/null and b/slaeforms/static/videos/0022-inflected.mp4 differ diff --git a/slaeforms/static/videos/0022-mocap.mp4 b/slaeforms/static/videos/0022-mocap.mp4 new file mode 100644 index 0000000..c4b3d04 Binary files /dev/null and b/slaeforms/static/videos/0022-mocap.mp4 differ diff --git a/slaeforms/static/videos/0022-simple.mp4 b/slaeforms/static/videos/0022-simple.mp4 new file mode 100644 index 0000000..c54758d Binary files /dev/null and b/slaeforms/static/videos/0022-simple.mp4 differ diff --git a/slaeforms/static/videos/GLEISvariations.mp4 b/slaeforms/static/videos/GLEISvariations.mp4 new file mode 100644 index 0000000..b8af137 Binary files /dev/null and b/slaeforms/static/videos/GLEISvariations.mp4 differ diff --git a/slaeforms/templates/datenschutz.html b/slaeforms/templates/datenschutz.html new file mode 100644 index 0000000..1df6852 --- /dev/null +++ b/slaeforms/templates/datenschutz.html @@ -0,0 +1,149 @@ + + + +
+ + + ++ Das DFKI (Deutsches Forschungszentrum für Künstliche Intelligenz) und seine Mitarbeiter/-innen setzen + sich ziel- und risikoorientiert für die informationelle Selbstbestimmung und das Grundrecht auf Schutz + personenbezogener Daten ein. In dieser Datenschutzerklärung informieren wir über die Verarbeitung + personenbezogener Daten in der gegebenen Studie. +
++ Organisation: Deutsches Forschungszentrum für Künstliche Intelligenz, 66123 Saarbrücken +
++ Ansprechpartner: Jan Dickmann, jan.dickmann@web.de +
++ DFKI-Datenschutzbeauftragter: Roland Vogt, roland.vogt@dfki.de +
++ Im Rahmen der Studie werden personenbezogene Daten erhoben, namentlich Alter, Geschlecht, Bildungsgrad, + Hörstatus, seit wann der/die Teilnehmer*in Gehörlos ist, wie lange er/sie Gebärdensprache spricht, ob + die Eltern Gehörlos waren und welche Sprachen er/sie zuhause und auf der Arbeit/Schule verwendet. + Optional können Teilnehmer auch eigenständig Videoaufnahmen aufnehmen und hochladen. +
++ In der Studie bewerten Teilnehmer Videos von Gebärdensprachavataren und können freiwillig Feedback in + Form von Text oder Videoaufnahmen geben. Diese Daten werden soweit möglich vollständig anonymisiert + gespeichert. Aufgrund der Charakteristik der Videoaufnahmen ist eine vollständige Anonymisierung im + Auswertungsprozess nicht möglich. Die persönliche Zuordnung der betroffenen Personen ist jedoch zu jedem + Zeitpunkt für die Verarbeitung der Daten unerheblich. Die Videoaufnahmen werden nach der Studie + ausgewertet und als Text ausgeschrieben. Videoausschnitte die nicht als Text weiterverarbeitet, werden + können, aber wichtiges Feedback beinhalten, werden nachträglich anonymisiert, um die Identität der + Person im Video zu verbergen. +
++ Die Verarbeitung der personenbezogenen Daten im Rahmen dieser Studie ist rechtmäßig, weil die + betroffenen Personen in die Verarbeitung einwilligen (Art. 6 Abs. 1, lit. a EU-DSGVO) oder weil die + Verarbeitung für die wissenschaftlichen Forschungszwecke im Bereich des Affective Computing erforderlich + ist und die Interessen der betroffenen Personen nicht überwiegen (Art. 6 Abs. 1, lit. e und f EU-DSGVO). +
++ Unter der unmittelbaren Verantwortung des DFKI können die personenbezogenen Daten ausschließlich nach + Anonymisierung veröffentlicht oder an Forschungspartner für deren wissenschaftliche Forschungszwecke im + Bereich des Affective Computing übermittelt werden. Personenbezogene Daten werden nicht an + Auftragsverarbeiter oder andere Empfänger übermittelt, auch nicht zur Löschung oder Vernichtung. +
++ Die personenbezogenen Daten werden nicht für eine automatisierte Entscheidungsfindung einschließlich + Profiling verwendet. +
++ Die personenbezogenen Daten werden grundsätzlich für die Dauer der Forschungsprojekte im Bereich des + Affective Computing gespeichert. Sie sollen anonymisiert veröffentlicht werden. Nach der Anonymisierung + ist kein Rückschluss aus den Daten auf die Identität der Person möglich. +
++ Zur Gewährleistung einer transparenten und fairen Verarbeitung im Rahmen dieser Studie bestehen für + betroffene Personen die folgenden Rechte: +
++ Betroffene Personen haben das Recht auf Beschwerde bei einer Aufsichtsbehörde, wenn sie der Ansicht + sind, dass die Verarbeitung ihrer personenbezogenen Daten durch diese Studie gegen gesetzliche + Datenschutzvorschriften verstößt. +
++ In dieser Studie werden verschiedene personenbezogene Informationen erhoben. Die Daten werden + ausschließlich durch das DFKI und Forschungspartner im Rahmen wissenschaftlicher Forschungsprojekte + verarbeitet. Alle weiteren personenbezogenen Daten werden nur anonymisiert gespeichert und im Rahmen + einer wissenschaftlichen Arbeit veröffentlicht. +
++ Ich, bestätige, dass ich die „Information betroffener Personen zur Verarbeitung personenbezogener Daten“ + erhalten habe. +
++ Ich willige hiermit ein, dass das DFKI Daten aus wissenschaftlichen Experimenten im Zusammenhang mit + dieser Studie für die Darstellung von Forschungsergebnissen im Bereich des Affective Computing verwendet + werden. +
++ Mir ist bekannt, dass ich das Recht habe, meine Einwilligung jederzeit zu widerrufen. Durch den Widerruf + der Einwilligung wird die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten + Verarbeitung nicht berührt. Ein Widerruf kann per Email an jan.dickmann@web.de geschickt werden. +
+Demographic Question Info:
+- Falls sie noch Fragen oder Rückmeldungen haben, schreiben sie mir unter: jan.dickmann@web.de -
++ Wir würden uns freuen, wenn Sie die Studie mit anderen Gehörlosen oder Gebärdensprache sprechenden + Personen Teilen würden: https://slaeforms.leafbla.de/start +
++ Falls sie noch Fragen oder Anmerkungen haben, schreiben sie uns unter: jan.dickmann@web.de +
++ Bei allen Aufgaben in dieser Studie gibt es ein Erklärungsvideo, in dem die Aufgabe und die Antwortmöglichkeiten in Gebärdensprache erklärt werden. + Falls sie Fragen haben oder eine Aufgabe nicht verstehen, können sie den "Gebärdensprache" Button auf der rechten Seite des Bildschirms klicken, um das Video und den Erklärungstext zu sehen. + Sie können den Button nochmal anklicken um wieder zur Aufgabe zurückzukommen. +
++ Der Gebärdensprache Button. +
+ +Studie Teil 1:
+Im Folgenden werden ihnen Videos gezeigt, die sie in den Kategorien „Natürlichkeit“, „Verständlichkeit“ und „grammatikalischer Korrektheit“ bewerten sollen.
+Dafür können sie auf einer Skala mit 7 Punkten bewerten, wobei der Punkt ganz links für „sehr schlecht“, der Punkt in der Mitte für „neutral“, und der Punkt ganz rechts für „sehr schlecht“ steht.
+Dann können sie weiteres Feedback als Text oder als Video geben. Das Video können sie direkt im Browser aufnehmen. Beachten sie, dass sie dazu eine Webcam benötigen und der Webseite erlauben müssen diese zu benutzen. Wenn sie auf den Kamera Knopf drücken, wird ihr Browser sie nach der Berechtigung fragen.
+Genaue Informationen darüber wie wir die Videos verarbeiten finden sie in unserer Datenschutzerklärung.
+Studie Teil 2:
+Im Folgenden sehen Sie zwei Videos, in denen der gleiche Satz mit unterschiedlichen Formulierungen gebärdet wird.
+Bitte verwenden Sie wieder die Punkteskala, um zu bewerten, welches der beiden Videos Sie besser finden.
+Die Antwortmöglichkeiten sind jedesmal:
+Studie Teil 3:
+Im Folgenden sehen Sie ein Video, in dem der Avatar drei Mal „Gleis“ gebärdet, jedes Mal in eine etwas andere Richtung. So soll der Avatar in Zukunft die Position und Richtung des Gleises relativ zum Avatar und Zuschauer zum Ausdruck bringen.
+Beantworten Sie dazu bitte die folgenden Fragen, indem Sie die Aussage auf einer Skala mit fünf Punkten, von „Trifft überhaupt nicht zu“, zu „Trifft vollkommen zu“ bewerten.
+Die Antwortmöglichkeiten sind jedesmal:
+