Пример #1
0
 def _generate_test(self):
     category = Categories.by(self.category_id).first()
     last_test = Tests.by({'category':category.name, 'alias':self.alias},sort='id desc').first()
     
     # Create New Test
     test = Tests(alias=self.alias, category=category.name, d2l_folder=category.d2l_folder, used_accessibility_view=self.used_accessibility_view)
     # Copy values at time of generation, this in case values change in the future, personal results aren't effected.
     test.wrong_answer_time_penalty = category.wrong_answer_time_penalty
     test.max_wrong_answer_allowed = category.max_wrong_answer_allowed
     test.question_time_allowed = category.question_time_allowed
     DBSession.add(test)
     DBSession.flush()
     
     # Get and Randomize Questions
     questionsets = QuestionSets.by({'category_id':self.category_id}).all()
     random.shuffle(questionsets) # randomize first to guarentee all questions
     questionsets = questionsets[0:category.playable_questions] # limit randomized
     
     # Setup Unfinished Questions
     for questionset in questionsets:
         question = self._get_question_variation(questionset, last_test)
         
         result = TestsResults(tests_id=test.id, 
                               question_sets_id=questionset.id, 
                               question=question,
                               answer_choices=TestManager.get_answers(questionset.id)
                               )
         DBSession.add(result)
         
     
     # okay below
     DBSession.flush()
     user = Users.by({'alias':self.alias}).first()
     user.current_test = test.id
     transaction.commit()
Пример #2
0
 def leaderboardYourScore(self):
     try:
         category = urllib2.unquote(self.request.params.get('category','0'))
         if category == '0':
             best = Tests.by({'alias':self.request.user.alias, 'completed':1}, sort='total_competitive desc').filter(Tests.created>=LeaderBoard.archive_date()).first()
             result = LeaderBoard.get_all_ranking(best)
         else:
             best = Tests.by({'category':category, 'alias':self.request.user.alias, 'completed':1}, sort='total_competitive desc').filter(Tests.created>=LeaderBoard.archive_date()).first()
             result = LeaderBoard.get_ranking(best)
         return {'status': True, 'rank': result['ranking'], 'total_competitive': result['total_competitive'], 'time_spent': Seconds2Str(result['time_spent']),
                 'total_time': Seconds2Str(best.total_time)}
     except Exception as e:
         return {'status': False}
Пример #3
0
 def check_for_d2l_folder(self, id, folders):
     test = Tests.by(id).first()
     for folder in folders:
         if folder['Name'] == test.d2l_folder:
             return folder['Id']
     return None
     
Пример #4
0
 def d2l_dropbox_submit(self):
     self.set_default_responses()
     uc = self.get_user_context()
     if not isinstance(uc, d2lauth.D2LUserContext):
         return uc # if no user_context is setup, return uc to d2l to get authorized.
     
     try:
         test_id = self.request.params.get('id','0')
         course = self.request.params.get('course_info','0|0').split('|')
         course_org_unit = course[0]
         d2l_folder = course[1]
         pdf = Score(self.request)._generate_pdf(test_id)
         test = Tests.by(test_id).first()
         submission = d2ldata.D2LDropboxSubmission({'Name':'ANVIL_Submission_ID-' + test_id + '.pdf',
                                                    'DescriptorDict':{'Text': None, 'HTML':None}, 
                                                    'Stream':StringIO.StringIO(pdf), 
                                                    'ContentType':'application/pdf',
                                                   })
         response = d2lservice.create_my_submission_for_dropbox(uc, course_org_unit, d2l_folder, submission, return_request=True)
         self.response['id'] = test_id
         self.response['status'] = response.status_code
         self.response['category'] = test.category
         return self.template('dropbox.pt', theme='D2L')
         
     except Exception as e:
         print "ERROR 2: " + str(e) # log later?
     return HTTPForbidden()
Пример #5
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')
Пример #6
0
 def next(self):
     id = int(self.request.matchdict['id'])
     category = self._secure_get_category(id)
     self.response['finished'] = False
     result = TestsResults.by({'tests_id':self.request.user.current_test, 'attempted':False}, sort='id asc').first()
     
     if result:
         c = Categories.by(id, user=self.request.user, permission=ACL.PLAY).first()
         self.response['category'] = Result2Dict(c, purge=['category_intro'])
         self.response['category']['transition_in'] = Result2Dict(c.get_transition_in())
         self.response['category']['transition_out'] = Result2Dict(c.get_transition_out())
         self.response['question'] = result.question
         #self.response['answers'] = TestManager.get_answers(result.question_sets_id)
         self.response['answers'] = result.get_answers()
         
         result.attempted = True
         user = Users.by(self.request.user.id).first()
         user.current_question = result.question_sets_id
         transaction.commit()
     else:
         test = Tests.by(self.request.user.current_test).first()
         self.response['test_id'] = self.request.user.current_test
         test.completed = True
         transaction.commit()
         self.response['finished'] = True
         
     return self.response
Пример #7
0
 def score(self):
     id = self.request.matchdict['id']
     test = Tests.by(id).first()
     
     if not test:
         raise HTTPNotFound()
         
     elif test.alias == self.request.user.alias:
         results = TestsResults.by({'tests_id':id}, sort='id asc').all()
         self.response['test'] = test
         self.response['test_total_time'] = Seconds2Str(test.time_spent)
         self.response['librarian'] = test.id % 2 == 0
         self.response['results'] = []
         total = len(results)
         
         self.response['category'] = None
         self.response['assessment'] = None
         try:
             category = Categories.by({'name':test.category}).first()
             self.response['category'] = category
             self.response['assessment'] = category.assess_this(test.percentage)
         except exc.SQLAlchemyError as e: 
             pass # defensive
     
         for result in results:
             self.response['results'].append( self.get_question_scores(result, 
                                                                       total, 
                                                                       test.max_wrong_answer_allowed, 
                                                                       test.question_time_allowed
                                                                       ))
     else:
         raise HTTPForbidden()
     
     return self.template('score.pt')
Пример #8
0
    def email(self):
        id = self.request.matchdict['id']
        test = Tests.by({'id':id,'alias':self.request.user.alias}).first()
        if not test:
            raise HTTPForbidden()
        file = self._generate_pdf(id)
        self.response['id'] = id
        self.response['emails'] = self.request.params.get('email.addresses',None)
        
        if 'form.submitted' in self.request.params:
            if self.request.params['email.ok'] == '1':
                emails = self.request.params['email.addresses'].replace(' ','').split(',')
                for email in emails:
                    if not Validate.email(email):
                        self.notify('Invalid email address',warn=True)
                        return self.template('email.pt')
                        
                try:
                    message = Message(subject=self._email_fmt(id, str(Properties.get('MAILER_TO_SUBJECT','Submission'))),
                                      sender=str(Properties.get('MAILER_GLOBAL_FROM_ADDRESS','System')),
                                      recipients=emails,
                                      body=self._email_fmt(id, str(Properties.get('MAILER_BODY','Submission'))))
                    attachment = Attachment('submission_' + str(id) + '.pdf', 'application/pdf', file)
                    message.attach(attachment)
                    mailer = get_mailer(self.request)
                    mailer.send(message)
                    self.notify('Email sent!')
                except Exception as e:
                    print "ERROR: " + str(e)
                    self.notify('Unable to send email!',warn=True)
            else:
                self.notify('Unable to send example email!',warn=True)

        return self.template('email.pt')
Пример #9
0
 def _generate_pdf(self, id):
     test = Tests.by({'id':id,'alias':self.request.user.alias}).first()
     if not test:
         return None
     elif test.alias == self.request.user.alias:
         self.response['test'] = test
         self.response['results'] = []                           
         self.response['total_correct'] = 0
         results = TestsResults.by({'tests_id':id}).all()
         total = len(results)
         for result in results:
             self.response['results'].append( self.get_question_scores(result, 
                                                                       total,
                                                                       test.max_wrong_answer_allowed, 
                                                                       test.question_time_allowed 
                                                                       ))
             if bool(result.correctly_answered):
                 self.response['total_correct'] += 1
                                 
         self.response['category'] = None
         self.response['assessment'] = None
         try:
             category = Categories.by({'name':test.category}).first()
             self.response['category'] = category
             self.response['assessment'] = category.assess_this(test.percentage)
         except exc.SQLAlchemyError as e: 
             pass # defensive
             
         pdf_html = self.template('pdf.pt')
         io = StringIO.StringIO()
         pisa.pisaDocument(StringIO.StringIO( pdf_html.text.encode( "UTF-8" )), io)
         return io.getvalue()
     else:
         return None
Пример #10
0
 def d2l_instructor_grades(self):
     uc = self.get_user_context()
     if not isinstance(uc, d2lauth.D2LUserContext):
         return uc # if no user_context is setup, return uc to d2l to get authorized.
     
     try:
         students = []
         category = self.request.params.get('category','---')
         
         if category != '---':
             id = self.request.matchdict['id']
             classlist = d2lservice.get_classlist(uc,org_unit_id=id)
             
             for student in classlist:
                 email = str(student.props['Username']) + self.settings('d2l_append_email_address','')
                 student_summary = {'name': str(student.props['DisplayName']),
                                    'email': email,
                                    'bestgrade' : 'Incomplete',
                                   }
                 
                 user = Users.by({'email':email}).first()
                 if user:
                     test = Tests.by({'alias':user.alias,'category':category}, sort='total_percentage desc').first()
                     if test:
                         student_summary['bestgrade'] = str(test.percentage) + '%'
                 
                 students.append(student_summary)
             
         self.response['students'] = students
         self.response['categories'] = Categories.all()
         return self.template('instructors-grades.pt', theme='D2L') 
     except Exception as e:
         print "ERROR: " + str(e) # log later?
     return HTTPForbidden() 
Пример #11
0
    def profile(self):
        self.response['played'] = True
        self.response['category'] = 0
        self.response['tests'] = []
        self.response['categories'] = []
        
        self.response['format_time'] = Seconds2Str
        
        try:
            if 'category' in self.request.params:
                self.response['category'] = self.request.params['category']
                self.response['tests'] = Tests.by({'category':self.response['category'], 'alias':self.request.user.alias}, sort='id desc').all()
            else:
                self.response['categories'] = Tests.best_by_user_alias(self.request.user.alias)
        except:
            self.response['played'] = False
            
        return self.template('profile.pt')

        
        
        
        
Пример #12
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
Пример #13
0
 def result(self):
     from quizsmith.app.views.leaderboard import LeaderBoard
     category = self._secure_get_category(int(self.request.matchdict['id']))
     
     self.response['question'] = None
     self.response['wrong_attempts'] = 0
     self.response['duration'] = 0
 
     test = Tests.by(self.request.user.current_test).first()
     result = TestsResults.by({'tests_id':self.request.user.current_test, 'attempted':True}, sort='id desc').first()
     results = TestsResults.by({'tests_id':self.request.user.current_test}).all()
     questionset = QuestionSets.by(result.question_sets_id).first()
     
     self.response['answer_help'] = questionset.answer_help
     self.response['result'] = Result2Dict(result,purge=['id','tests_id','question_sets_id'])
     final = self._test_calculator(test,results,result)
     self.response['percentage'] = final['percentage']
     self.response['competitive'] = final['competitive']
     self.response['ranking'] = LeaderBoard.get_ranking(test)
     transaction.commit()
         
     return self.response
Пример #14
0
 def _email_fmt(self,id,text):
     test = Tests.by(id).first()
     text = text.replace('${CATEGORY}', test.category)
     text = text.replace('${ALIAS}', test.alias)
     return text
         
Пример #15
0
 def edit_reports(self):
     self.response['played_categories'] = Tests.by(None, sort='category asc').group_by('category').all()
     return self.template('/edit-reports.pt', theme='AdminPanel')