コード例 #1
0
ファイル: PageServer.py プロジェクト: TGRHavoc/QuickVote
    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())
コード例 #2
0
ファイル: PageServer.py プロジェクト: marc-hanheide/QuickVote
    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())
コード例 #3
0
ファイル: PageServer.py プロジェクト: TGRHavoc/QuickVote
    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')
コード例 #4
0
ファイル: PageServer.py プロジェクト: marc-hanheide/QuickVote
    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')