]> git.donarmstrong.com Git - neurodebian.git/blob - survey/surveycollector.cgi
Towards survey stats.
[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 'pers_time' in form or form['pers_time'].value == 'none':
11         messages.append("Please indicate how much time you spend in your personal computing environment.")
12     if not 'man_time' in form or form['man_time'].value == 'none':
13         messages.append("Please indicate how much time you spend in a managed computing environment.")
14     if not 'virt_time' in form or form['virt_time'].value == 'none':
15         messages.append("Please indicate how often you use virtual machines.")
16     if not 'bg_datamod' in form or not len(form.getlist('bg_datamod')):
17         messages.append("Please indicate want kind of data you are working with.")
18     if 'bg_datamod' in form and 'other' in form.getlist('bg_datamod') and not form['bg_datamod_other'].value:
19         messages.append("You selected 'Other data modality' but did not specific which one.")
20     if 'pers_maint_time' in form and form['pers_maint_time'].value:
21         try:
22             t = float(form['pers_maint_time'].value)
23         except:
24             messages.append("The value you entered as maintenance effort per month needs to be a (floating point) number. For example: 1.2 or 5")
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"]:
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"]:
49         if ff in form:
50             result[ff] = form.getlist(ff)
51         
52     # special
53     if "pers_maint_time" in form and form["pers_maint_time"].value:
54         result["pers_maint_time"] = float(form["pers_maint_time"].value)
55
56     # timestamp
57     result['timestamp'] = time.time()
58
59     # IP
60     if 'REMOTE_ADDR' in os.environ:
61         result['remote_addr'] = os.environ['REMOTE_ADDR']
62
63     return result
64
65 def main():
66     # list of form data keys
67     formkeys = []
68
69     # get the form data
70     form = cgi.FieldStorage(keep_blank_values=True)
71
72     # compose the server response
73     result ={}
74     result['success'] = False
75
76     # Make sure we always return something meaningful 
77     try:
78         messages = validate_form(form)
79         if not len(messages):
80             # no messages means all good
81             result['success'] = True
82             result = extract_results(form, result)
83             try:
84                 logfile = open('/home/neurodebian/surveydata/%s.json' % result['timestamp'], 'w+')
85                 logfile.write(json.write(result))
86                 logfile.write('\n')
87                 logfile.close()
88             except:
89                 result['success'] = False
90                 result['message'] = 'We are very sorry, but the server is unable to store your submission. Please contact team@neuro.debian.net.'
91         else:
92             result['message'] = format_message(messages)
93
94     finally:
95         # always talk to the client
96         print json.write(result)
97
98
99 if __name__ == '__main__':
100     print "Content-Type: text/xhtml"    # HTML is following
101     print                               # blank line, end of headers
102
103     main()
104