/
experiment.py
157 lines (116 loc) · 5.02 KB
/
experiment.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
from flask import (Blueprint, redirect, render_template, request, session, url_for)
from .io import write_data, write_metadata
## Initialize blueprint.
bp = Blueprint('experiment', __name__)
@bp.route('/experiment')
def experiment():
"""Present jsPsych experiment to participant."""
## Error-catching: screen for missing session.
if not 'workerId' in session:
## Redirect participant to error (missing workerId).
return redirect(url_for('error.error', errornum=1000))
## Case 1: previously completed experiment.
elif 'complete' in session:
## Redirect participant to complete page.
return redirect(url_for('complete.complete'))
## Case 2: repeat visit.
elif not session['allow_restart'] and 'experiment' in session:
## Update participant metadata.
session['ERROR'] = "1004: Revisited experiment."
session['complete'] = 'error'
write_metadata(session, ['ERROR','complete'], 'a')
## Redirect participant to error (previous participation).
return redirect(url_for('error.error', errornum=1004))
## Case 3: first visit.
else:
## Update participant metadata.
session['experiment'] = True
write_metadata(session, ['experiment'], 'a')
## Present experiment.
return render_template('experiment.html', workerId=session['workerId'], assignmentId=session['assignmentId'], hitId=session['hitId'], code_success=session['code_success'], code_reject=session['code_reject'])
@bp.route('/experiment', methods=['POST'])
def pass_message():
"""Write jsPsych message to metadata."""
if request.is_json:
## Retrieve jsPsych data.
msg = request.get_json()
## Update participant metadata.
session['MESSAGE'] = msg
write_metadata(session, ['MESSAGE'], 'a')
## DEV NOTE:
## This function returns the HTTP response status code: 200
## Code 200 signifies the POST request has succeeded.
## For a full list of status codes, see:
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
return ('', 200)
@bp.route('/incomplete_save', methods=['POST'])
def incomplete_save():
"""Save incomplete jsPsych dataset to disk."""
if request.is_json:
## Retrieve jsPsych data.
JSON = request.get_json()
## Save jsPsch data to disk.
write_data(session, JSON, method='incomplete')
## Flag partial data saving.
session['MESSAGE'] = 'incomplete dataset saved'
write_metadata(session, ['MESSAGE'], 'a')
## DEV NOTE:
## This function returns the HTTP response status code: 200
## Code 200 signifies the POST request has succeeded.
## For a full list of status codes, see:
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
return ('', 200)
@bp.route('/redirect_success', methods = ['POST'])
def redirect_success():
"""Save complete jsPsych dataset to disk."""
if request.is_json:
## Retrieve jsPsych data.
JSON = request.get_json()
## Save jsPsch data to disk.
write_data(session, JSON, method='pass')
## Flag experiment as complete.
session['complete'] = 'success'
write_metadata(session, ['complete','code_success'], 'a')
## DEV NOTE:
## This function returns the HTTP response status code: 200
## Code 200 signifies the POST request has succeeded.
## The corresponding jsPsych function handles the redirect.
## For a full list of status codes, see:
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
return ('', 200)
@bp.route('/redirect_reject', methods = ['POST'])
def redirect_reject():
"""Save rejected jsPsych dataset to disk."""
if request.is_json:
## Retrieve jsPsych data.
JSON = request.get_json()
## Save jsPsch data to disk.
write_data(session, JSON, method='reject')
## Flag experiment as complete.
session['complete'] = 'reject'
write_metadata(session, ['complete','code_reject'], 'a')
## DEV NOTE:
## This function returns the HTTP response status code: 200
## Code 200 signifies the POST request has succeeded.
## The corresponding jsPsych function handles the redirect.
## For a full list of status codes, see:
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
return ('', 200)
@bp.route('/redirect_error', methods = ['POST'])
def redirect_error():
"""Save rejected jsPsych dataset to disk."""
if request.is_json:
## Retrieve jsPsych data.
JSON = request.get_json()
## Save jsPsch data to disk.
write_data(session, JSON, method='reject')
## Flag experiment as complete.
session['complete'] = 'error'
write_metadata(session, ['complete'], 'a')
## DEV NOTE:
## This function returns the HTTP response status code: 200
## Code 200 signifies the POST request has succeeded.
## The corresponding jsPsych function handles the redirect.
## For a full list of status codes, see:
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
return ('', 200)