def POST(self, domain): # verify the cookie is not set to the current session. # in that case it would be a resubmission c = web.cookies(session_uuid=uuid4()).session_uuid if str(c) == str(glob.session_uuid): print "user submitted again to same session" return renderer.duplicate(config.base_url,glob.urls['user']['url_pattern'] .replace('$', '') % domain,logman.LoggedIn()) else: web.setcookie('session_uuid', glob.session_uuid, 3600) data = {} data.update(web.input()) data['env'] = {} for (k, v) in web.ctx.env.items(): if type(v) is str: data['env'][k.replace('.', '_')] = v data['inserted_at'] = datetime.now() data['session'] = qv_domains.get_active_session(domain, data['uuid']) new_input.acquire() try: qv_collection.insert(data) new_input.notifyAll() finally: new_input.release() return renderer.submit(config.base_url,glob.urls['user']['url_pattern'] .replace('$', '') % domain,logman.LoggedIn())
def POST(self, domain): # verify the cookie is not set to the current session. # in that case it would be a resubmission c = web.cookies(session_uuid=uuid4()).session_uuid if str(c) == str(glob.session_uuid): print "user submitted again to same session" return renderer.duplicate( config.base_url, glob.urls['user']['url_pattern'].replace('$', '') % domain, logman.LoggedIn()) else: web.setcookie('session_uuid', glob.session_uuid, 3600) user_group = web.cookies(qv_user_group='').qv_user_group data = {} data.update(web.input()) data['env'] = {} for (k, v) in web.ctx.env.items(): if type(v) is str: data['env'][k.replace('.', '_')] = v data['inserted_at'] = datetime.now() data['user_group'] = user_group data['session'] = qv_domains.get_active_session(domain, data['uuid']) new_input.acquire() try: qv_collection.insert(data) new_input.notifyAll() finally: new_input.release() return renderer.submit( config.base_url, glob.urls['user']['url_pattern'].replace('$', '') % domain, logman.LoggedIn())
def compute_results(self, domain, uuid, session=None): if session is None: session = qv_domains.get_active_session(domain, uuid) answers = qv_collection.find({'uuid': uuid, 'session': session}) question = qv_questions.find_one({'uuid': uuid}) results = {} comments = [] sorted_keys = [] if question is not None: total_submissions = 0.0 total_correct_submissions = 0.0 tp = 0.0 tn = 0.0 fp = 0.0 fn = 0.0 user_agents = {} for answer in answers: try: if 'env' in answer: if 'HTTP_USER_AGENT' in answer['env']: ua = httpagentparser.detect(answer['env']['HTTP_USER_AGENT']) try: k = ua['platform']['name'] except: k = "*unknown* / " + ua['browser']['name'] if k not in user_agents: user_agents[k] = 0 user_agents[k] += 1 except Exception as ex: print "couldn't work with HTTP_USER_AGENT: %s %s" % (ex, answer['env']['HTTP_USER_AGENT']) print ua pass correct = True for opt in question['options']: if opt not in results: results[opt] = 0 if opt in answer: results[opt] += 1 if opt in question['correct']: tp += 1 else: fp += 1 correct = False else: if opt in question['correct']: correct = False fn += 1 else: tn += 1 total_correct_submissions += 1 if correct else 0 total_submissions += 1 if len(answer['feedback']) > 0: comments.append(answer['feedback']) sorted_keys = results.keys() sorted_keys.sort() dataset = { 'label': "responses", 'fillColor': "rgba(120,0,0,0.5)", 'data': [results[r] for r in sorted_keys] } dataset_c = { 'label': "correct", 'fillColor': "rgba(0,100,0,0.5)", 'data': [(total_submissions if r in question['correct'] else 0) for r in sorted_keys] } try: sensitivity = tp / (tp + fn) except: sensitivity = 1 try: specificity = tn / (tn + fp) except: specificity = 1 try: accuracy = (tp + tn) / (tp + tn + fp + fn) except: accuracy = 1 try: corrects_ratio = float(total_correct_submissions) / total_submissions except: corrects_ratio = 1 data = { 'userChart': self.generate_user_results(user_agents), 'labels': sorted_keys, 'datasets': [dataset, dataset_c], 'comments': comments, 'totals': total_submissions, 'corrects': total_correct_submissions, 'raw_stats': { 'percent': corrects_ratio, 'sensitivity': sensitivity, 'specificity': specificity, 'accuracy': accuracy }, 'percent': "%2.1f%%" % (corrects_ratio * 100.0), 'sensitivity': "%2.1f%%" % (sensitivity * 100.0), 'specificity': "%2.1f%%" % (specificity * 100.0), 'accuracy': "%2.1f%%" % (accuracy * 100.0), 'question': question['question'] if question is not None else '*unknown*' } return data else: raise web.NotFound('error getting data')
def compute_results(self, domain, uuid, session=None): if session is None: session = qv_domains.get_active_session(domain, uuid) answers = qv_collection.find({'uuid': uuid, 'session': session}) question = qv_questions.find_one({'uuid': uuid}) results = {} comments = [] sorted_keys = [] if question is not None: total_submissions = 0.0 total_correct_submissions = 0.0 tp = 0.0 tn = 0.0 fp = 0.0 fn = 0.0 gtp = defaultdict(float) gtn = defaultdict(float) gfp = defaultdict(float) gfn = defaultdict(float) group_total_correct_submissions = defaultdict(float) group_total_submissions = defaultdict(float) user_agents = {} for answer in answers: try: if 'env' in answer: if 'HTTP_USER_AGENT' in answer['env']: ua = httpagentparser.detect( answer['env']['HTTP_USER_AGENT']) try: k = ua['platform']['name'] except: k = "*unknown* / " + ua['browser']['name'] if k not in user_agents: user_agents[k] = 0 user_agents[k] += 1 except Exception as ex: print "couldn't work with HTTP_USER_AGENT: %s %s" % ( ex, answer['env']['HTTP_USER_AGENT']) print ua pass correct = True if 'user_group' in answer: group = answer['user_group'] else: group = 0 for opt in question['options']: if opt not in results: results[opt] = 0 if opt in answer: results[opt] += 1 if opt in question['correct']: tp += 1 gtp[group] += 1 else: fp += 1 gfp[group] += 1 correct = False else: if opt in question['correct']: correct = False fn += 1 gfn[group] += 1 else: tn += 1 gtn[group] += 1 total_correct_submissions += 1 if correct else 0 total_submissions += 1 group_total_correct_submissions[group] += 1 if correct else 0 group_total_submissions[group] += 1 if len(answer['feedback']) > 0: comments.append(answer['feedback']) sorted_keys = results.keys() sorted_keys.sort() dataset = { 'label': "responses", 'fillColor': "rgba(120,0,0,0.5)", 'data': [results[r] for r in sorted_keys] } dataset_c = { 'label': "correct", 'fillColor': "rgba(0,100,0,0.5)", 'data': [(total_submissions if r in question['correct'] else 0) for r in sorted_keys] } try: sensitivity = tp / (tp + fn) except: sensitivity = 1 try: specificity = tn / (tn + fp) except: specificity = 1 try: accuracy = (tp + tn) / (tp + tn + fp + fn) except: accuracy = 1 try: corrects_ratio = float( total_correct_submissions) / total_submissions except: corrects_ratio = 1 group_correct_ratio = defaultdict(float) group_size_ratio = defaultdict(float) for g in group_total_submissions: group_correct_ratio[g] = group_total_correct_submissions[g] /\ group_total_submissions[g] group_size_ratio[g] = group_total_submissions[g] /\ total_submissions data = { # 'userChart': self.generate_user_results(user_agents), 'userChart': self.generate_group_results(group_correct_ratio, group_size_ratio), 'labels': sorted_keys, 'datasets': [dataset, dataset_c], 'comments': comments, 'totals': total_submissions, 'corrects': total_correct_submissions, 'raw_stats': { 'percent': corrects_ratio, 'sensitivity': sensitivity, 'specificity': specificity, 'accuracy': accuracy, 'group_correct': group_correct_ratio, 'group_size_ratio': group_size_ratio }, 'percent': "%2.1f%%" % (corrects_ratio * 100.0), 'sensitivity': "%2.1f%%" % (sensitivity * 100.0), 'specificity': "%2.1f%%" % (specificity * 100.0), 'accuracy': "%2.1f%%" % (accuracy * 100.0), 'question': question['question'] if question is not None else '*unknown*' } return data else: raise web.NotFound('error getting data')