]> git.donarmstrong.com Git - neurodebian.git/blob - survey/surveycollector.cgi
Also for stats report which repo and which job number use our setup
[neurodebian.git] / survey / surveycollector.cgi
1 #!/usr/bin/python
2
3 import json
4 import cgi
5 import time
6 import os
7
8 def validate_form(form):
9     messages = []
10     if not 'bg_datamod' in form or not len(form.getlist('bg_datamod')):
11         messages.append("Please indicate want kind of data you are working with.")
12     if 'bg_datamod' in form and 'other' in form.getlist('bg_datamod') and not form['bg_datamod_other'].value:
13         messages.append("You selected 'Other data modality' but did not specific which one.")
14     if not 'pers_time' in form or form['pers_time'].value == 'none':
15         messages.append("Please indicate how much time you spend in your personal computing environment.")
16     if 'pers_maint_time' in form and form['pers_maint_time'].value:
17         try:
18             t = float(form['pers_maint_time'].value)
19         except:
20             messages.append("The value you entered as maintenance effort per month needs to be a (floating point) number. For example: 1.2 or 5")
21     if not 'man_time' in form or form['man_time'].value == 'none':
22         messages.append("Please indicate how much time you spend in a managed computing environment.")
23     if not 'virt_time' in form or form['virt_time'].value == 'none':
24         messages.append("Please indicate how often you use virtual machines.")
25     return messages
26
27
28 def format_message(mesgs):
29     msg = '>>> We found a problem with your submission <<<\n\n'
30     return msg + '\n\n'.join(mesgs)
31
32 def extract_results(form, result):
33     # simple strings
34     for ff in ["bg_country", "bg_employer", "bg_position", "bg_developer", "bg_datamod_other",
35                "pers_time", "pers_hardware", "pers_os",
36                "man_time", "man_hardware", "man_os",
37                "virt_time", "virt_other", "virt_guest_os", "virt_host_os",
38                "software_resource_other", "sw_other", "sw_other_name"]:
39         if ff in form:
40             result[ff] = form[ff].value
41     # integers
42     for ff in ["pers_r1", "pers_r2", "pers_r3", "pers_r4", "pers_r5", "pers_r6", "pers_r7", "pers_r8",
43                "man_r1", "man_r2", "man_r3", "man_r4", "man_r5",
44                "virt_r1", "virt_r2", "virt_r3", "virt_r4"]:
45         if ff in form:
46             result[ff] = int(form[ff].value)
47     # lists
48     for ff in ["bg_datamod", "virt_prod", "software_resource", "sw_general",
49                "sw_dc", "sw_img", "sw_datamanage", "sw_electro", "sw_neusys",
50                "sw_bci", "sw_acq", "sw_rt", "sw_psychphys"]:
51         if ff in form:
52             result[ff] = form.getlist(ff)
53
54     # special
55     if "pers_maint_time" in form and form["pers_maint_time"].value:
56         result["pers_maint_time"] = float(form["pers_maint_time"].value)
57
58     # timestamp
59     result['timestamp'] = time.time()
60
61     # IP
62     if 'REMOTE_ADDR' in os.environ:
63         result['remote_addr'] = os.environ['REMOTE_ADDR']
64     if 'HTTP_USER_AGENT' in os.environ:
65         result['user_agent'] = os.environ['HTTP_USER_AGENT']
66
67     return result
68
69 def main():
70     # list of form data keys
71     formkeys = []
72
73     # get the form data
74     form = cgi.FieldStorage(keep_blank_values=True)
75
76     # compose the server response
77     result ={}
78     result['success'] = False
79
80     # Make sure we always return something meaningful 
81     try:
82         messages = validate_form(form)
83         if not len(messages):
84             # no messages means all good
85             result['success'] = True
86             result = extract_results(form, result)
87             try:
88                 logfile = open('/home/neurodebian/survey/data/%s.json' % result['timestamp'], 'w+')
89                 logfile.write(json.write(result))
90                 logfile.write('\n')
91                 logfile.close()
92             except:
93                 result['success'] = False
94                 result['message'] = 'We are very sorry, but the server is unable to store your submission. Please contact team@neuro.debian.net.'
95             # send HTML snippet to let the submitter see the results
96             try:
97                 result['results'] = open('/home/neurodebian/survey/results_snippet.html').read()
98             except:
99                 result['results'] = 'We are very sorry, but the statistics could not be displayed. Please contact team@neuro.debian.net to get access.'
100         else:
101             result['message'] = format_message(messages)
102
103     finally:
104         # always talk to the client
105         print json.write(result)
106
107
108 if __name__ == '__main__':
109     print "Content-Type: text/xhtml"    # HTML is following
110     print                               # blank line, end of headers
111
112     main()
113