Esempio n. 1
0
 def accessibility_view(self):
     category = self._secure_get_category(int(self.request.matchdict['id']))
     
     if self.request.params.get('nojs','0') != '1':
         if not self.request.user.needs_accessibility:
             return HTTPFound(location=route_url('category', self.request))
 
     id = self.request.user.current_test
     test = Tests.by(id).first()
     results = TestsResults.by({'tests_id':id}, sort='id asc').all()
 
     if 'form.submit' in self.request.params:
         for key, value in self.request.params.iteritems():
             key_type, sep, rid = key.rpartition(".")
             if key_type == 'question':
                 result = TestsResults.by(rid).first()
                 passed = TestManager.check_answer_byid(result.question_sets_id, int(value))
                 result.correctly_answered = passed
                 if not passed:
                     result.wrong_attempts = test.max_wrong_answer_allowed
                 result.attempted = True
                 result.duration = self._accessibility_duration_calculator(self.request.params['st'], len(results), test.question_time_allowed)
                 final = self._test_calculator(test,results,result)
         transaction.commit()
         return HTTPFound(location=route_url('score', self.request, id=id))
     else:
         self.response['time_started'] = int(time.time())
         self.response['test'] = test
         self.response['results'] = []
         for result in results:
             self.response['results'].append({'question_set': result,
                                              'answer': result.get_answers()})
         return self.template('playing-accessibility.pt')
Esempio n. 2
0
 def get_question_scores(self, result, total_results, max_allowed_wrong, max_allowed_duration):
 
     percentage = TestManager.score_percentage(result.correctly_answered,
                                                  result.wrong_attempts,
                                                  max_allowed_wrong,
                                                  total_results,
                                                  result.duration,
                                                  max_allowed_duration
                                                  )
     competitive = TestManager.score_competitive(result.correctly_answered,
                                                  result.wrong_attempts,
                                                  max_allowed_wrong,
                                                  total_results,
                                                  result.duration,
                                                  max_allowed_duration
                                                  )
                                                  
     answer_help = None
     try:
         try:
             # if questionset was removed, this will still allow people to view old tests.
             answer_help = QuestionSets.by(result.question_sets_id).first().answer_help
         except exc.SQLAlchemyError as e:
             pass # defensive
     except Exception as e:
         pass # defensive
             
     return { 'question' : str(result.question),
              'question_textonly' : RemoveImages(result.question),
              'correctly_answered' : result.correctly_answered,
              'wrong_attempts' : result.wrong_attempts,
              'duration' : result.duration,
              'duration_passed_fmt' : Seconds2Str((max_allowed_duration-result.duration)),
              'duration_remaining_fmt' : Seconds2Str(result.duration),
              'percentage' : percentage,
              'competitive' : competitive,             
              'answer_help': str(answer_help),           
              'attempted': result.attempted,    
              'answer_choices': str(result.get_answers()),
              'had_wrong_attempts': (result.wrong_attempts!=0 and result.attempted),
              'had_more_than_one_wrong': (result.wrong_attempts>1),
              'had_no_time_remaining': (result.duration<1 and result.attempted),
             }
Esempio n. 3
0
 def _test_calculator(self,test,results,result):
     percentage = TestManager.score_percentage(result.correctly_answered,
                                                 result.wrong_attempts,
                                                 test.max_wrong_answer_allowed,
                                                 len(results),
                                                 result.duration,
                                                 test.question_time_allowed
                                                 )
     competitive = TestManager.score_competitive(result.correctly_answered,
                                                 result.wrong_attempts,
                                                 test.max_wrong_answer_allowed,
                                                 len(results),
                                                 result.duration,
                                                 test.question_time_allowed
                                                 )
     
     test.total_percentage += percentage
     test.base_competitive += competitive['score']
     test.bonus_competitive += competitive['bonus']
     test.total_competitive += competitive['combined']
     test.time_remaining += result.duration
     test.time_spent += (test.question_time_allowed - result.duration)
     DBSession.flush()
     return { 'competitive': competitive, 'percentage': percentage }
Esempio n. 4
0
    def check(self):
    
        self.response['was_correct'] = -1
        category = self._secure_get_category(int(self.request.matchdict['id']))
        
        if 'answer' in self.request.params:
            answer = self.request.params.get('answer','0')
            duration = float(self.request.params['time'])
            self.response['was_correct'] = TestManager.check_answer_byid(self.request.user.current_question, answer)
            
            result = TestsResults.by({'tests_id':self.request.user.current_test, 'question_sets_id':self.request.user.current_question}).first()
            self.log_if_error('Current Test: %d' % self.request.user.current_test)
            self.log_if_error('Current Question: %d' % self.request.user.current_question)
            self.log_if_error('Chosen Answer: %s' % answer)
            self.log_if_error('Duration: %s' % duration)
            test = Tests.by(self.request.user.current_test).first()

            if not self.response['was_correct'] and duration > 0:
                if result.wrong_attempts < test.max_wrong_answer_allowed:
                    result.wrong_attempts += 1
                    duration = duration - test.wrong_answer_time_penalty
            
            # cheaters hacking more than duration will result in failure
            if duration <= 0 or duration > test.question_time_allowed:
                duration = 0

            self.response['continue_on'] = True
            if result.wrong_attempts == test.max_wrong_answer_allowed or self.response['was_correct'] or duration == 0:
                self.response['continue_on'] = False
                
            result.correctly_answered = self.response['was_correct']
            result.duration = duration
            answers = result.get_answers()
            changed = []
            for a in answers:
                if a['id'] == int(answer):
                    checked = -1
                    if self.response['was_correct']:
                        checked = 1
                    changed.append({'id':a['id'],'content':a['content'],'answered':checked})
                else:
                    changed.append(a)
            result.set_answers(changed)
            transaction.commit()
            
        self.response['duration'] = int(duration)
        return self.response