Beispiel #1
0
 public function init()
 {
     $this->_auth = Zend_Auth::getInstance();
     if ($this->_auth->hasIdentity()) {
         $identity = Zend_Auth::getInstance()->getIdentity();
         if (!isset($identity->username)) {
             // Don't know how you got here... But you're not authenticated
             $this->_helper->redirector("login", "auth");
             //Must Log in before accessing anything
         }
         $this->view->username = $identity->username;
         // Determine what sidebars this person has access to
         // (Determined at this point by defined groups)
         $auth_model = Model_Auth_General::getAuthModel();
         if ($auth_model->userInGroup($identity->username, QUIZ_ADMINISTRATORS)) {
             $this->view->is_admin = true;
         } else {
             $this->view->is_admin = false;
         }
     } else {
         $this->_helper->redirector("login", "auth");
         //Must Log in before accessing anything
     }
     $this->view->baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl();
     if (!$this->view->is_admin) {
         throw new Ecxeption("Unauthorised.", 3005);
     }
 }
Beispiel #2
0
 /**
  * The Login Action
  * @author Ben Evans
  */
 public function loginAction()
 {
     $this->view->headTitle("Login");
     $this->view->title = "Login";
     if ($this->getRequest()->isPost()) {
         $username = $this->_getParam("rqz-username");
         $password = $this->_getParam("rqz-password");
         //echo("$username $password");
         if (isset($username) && isset($password)) {
             // We have some Data. Call the Authentication Model
             $auth_model = Model_Auth_General::getAuthModel();
             $auth_result = $auth_model->authenticate($username, $password);
             if ($auth_result === true) {
                 $auth_storage = $this->_auth->getStorage();
                 $auth_object = new stdClass();
                 $auth_object->username = $username;
                 $auth_object->login_time = time();
                 $auth_storage->write($auth_object);
                 $identity = Zend_Auth::getInstance()->getIdentity();
                 $this->_helper->redirector("index", "index");
             }
         }
         $this->view->msg = "There was a problem with your credentials. Check your username and password, and try again.";
     }
 }
Beispiel #3
0
 public function indexAction()
 {
     $auth_model = Model_Auth_General::getAuthModel();
     $result = $auth_model->authenticate("administrator", "fgkjh");
     var_dump($result);
     die("finished");
 }
 /**
  * This action is the quiz shell.
  * It ensures permissions, creates new attempts etc etc.
  *
  * @author Ben Evans
  */
 public function attemptAction()
 {
     Model_Shell_Debug::getInstance()->log("User Entered the Attempt Action");
     $identity = Zend_Auth::getInstance()->getIdentity();
     $username = $identity->username;
     $auth_model = Model_Auth_General::getAuthModel();
     /*	Before we do anything, test to make sure we've passed a VALID QUIZ which WE ARE ENTITLED to sit.	*/
     $quiz_id = $this->_getParam("quiz");
     if (is_null($quiz_id)) {
         throw new Exception("No quiz was passed. Cannot continue.");
     }
     $vQuiz = Model_Quiz_Quiz::fromID($quiz_id);
     if ($vQuiz == null) {
         throw new Exception("Quiz ID passed was invalid. Cannot continue.");
     }
     $mFinished = false;
     $mMarking = false;
     //Permissions
     if ($auth_model->userInGroup($username, $vQuiz->getPermissions_group()) && $vQuiz->getOpen_date() <= strtotime("now")) {
         //Have we run out of attempts?
         $vAttempts = Model_Quiz_QuizAttempt::getAllFromUser($username, $vQuiz);
         if (sizeof($vAttempts) >= $vQuiz->getMax_attempts()) {
             //It is possible that we're on our last attempt, and that it's "in progress"...check
             $bInProgress = false;
             foreach ($vAttempts as $vAttempt) {
                 if ($vAttempt->getDate_finished() == null) {
                     $bInProgress = true;
                 }
             }
             if (!$bInProgress) {
                 throw new Exception("You've exceeded your maximum attempts for this quiz. Cannot continue");
             }
         }
     } else {
         if (!$this->view->is_admin) {
             throw new Exception("Insufficient Permissions to take this quiz / Quiz not open yet");
         }
         $vAttempts = Model_Quiz_QuizAttempt::getAllFromUser($username, $vQuiz);
     }
     /*	Ok. We're allowed to TAKE the quiz. Are we resuming, or starting a new one? */
     $mQuizAttempt = null;
     if (is_array($vAttempts)) {
         foreach ($vAttempts as $vAttempt) {
             if ($vAttempt->getDate_finished() == null) {
                 $mQuizAttempt = $vAttempt;
                 break;
             }
         }
         //End Foreach
     }
     //End If
     if ($mQuizAttempt == null) {
         $mQuizAttempt = Model_Quiz_QuizAttempt::fromScratch(strtotime("now"), $vQuiz, $username);
     }
     /* Calculate the total questions needed for this quiz */
     $vTCs = $vQuiz->getTestedConcepts();
     $vTotalQuestions = 0;
     foreach ($vTCs as $vTC) {
         $vTotalQuestions = $vTotalQuestions + $vTC->getNumber_tested();
     }
     /*	We have our quizAttempt ready to go. Now we look to see if we're resuming a question or not */
     $mQuestionAttempt = $mQuizAttempt->getLastIncompleteQuestion();
     if (is_object($mQuestionAttempt) && !$mQuestionAttempt->isValid()) {
         $mQuestionAttempt->destroy();
         // Remove the Question attempt (Database was reinitialised or something)
         $mQuestionAttempt = null;
     }
     if ($mQuestionAttempt != null) {
         /*	Are we getting an ANSWER for this question? */
         if (array_key_exists("marking", $_POST) && $_POST['marking'] == "1") {
             /*	Mark it */
             $mMarking = true;
         }
         /* If we reach here, the page has probably been refreshed. We just re-display the last question */
     } else {
         /* Have we finished this quiz? */
         if ($mQuizAttempt->getQuestionAttemptCount() >= $vTotalQuestions) {
             //Close this attempt and display a result later on down the page
             $mQuizAttempt->setDate_finished(strtotime("now"));
             //Calculate and store the final score
             $mQuizAttempt->setTotal_score($mQuizAttempt->getTotal_score());
             $mFinished = true;
         } else {
             /*	QuizAttempt isn't finished... Fetch a questionBase */
             $vQuestionBase = Model_Shell_QuestionChooser::select_next_question($mQuizAttempt, true);
             /* Make a GeneratedQuestion */
             $vCounter = 0;
             //Make sure we don't get any fluke no-text answers
             while ($vCounter < 3) {
                 Model_Shell_Debug::getInstance()->log("vQuestionBase: " . isset($vQuestionBase));
                 Model_Shell_Debug::getInstance()->log("Generating... from " . $vQuestionBase->getXml());
                 $vGen = Model_Quiz_GeneratedQuestion::fromQuestionBase($vQuestionBase);
                 if ($vGen->getCorrect_answer() != "" && $vGen->getCorrect_answer() != "\r\n") {
                     break;
                 } else {
                     $vGen->remove();
                 }
                 $vCounter++;
             }
             if ($vGen->getCorrect_answer() == "" || $vGen->getCorrect_answer() == "\r\n") {
                 throw new Exception("Error. While generating a question for you, blank answers appeared > 3 times. This should never happen. Either try to refresh this page, or consult your lecturer...");
             }
             /* Make a QuestionAttempt */
             $mQuestionAttempt = Model_Quiz_QuestionAttempt::fromScratch($vQuestionBase, strtotime("now"), strtotime("now"), $mQuizAttempt, $vGen);
         }
         //End-if_finished_quizAttempt
     }
     // Pass all relevant information to the view
     $this->view->quiz = $vQuiz;
     $this->view->question_attempt = $mQuestionAttempt;
     $this->view->finished = $mFinished;
     $this->view->marking = $mMarking;
     $this->view->mQuizAttempt = $mQuizAttempt;
     $this->view->vTotalQuestions = $vTotalQuestions;
 }
Beispiel #5
0
 /**
  * This action is the quiz shell.
  * It ensures permissions, creates new attempts etc etc.
  *
  * @author Ben Evans
  */
 public function attemptAction()
 {
     Model_Shell_Debug::getInstance()->log("User Entered the Attempt Action");
     $identity = Zend_Auth::getInstance()->getIdentity();
     $username = $identity->username;
     $auth_model = Model_Auth_General::getAuthModel();
     /* Before we do anything, test to make sure we've passed a VALID QUIZ which WE ARE ENTITLED to sit. */
     $quiz = $this->findQuiz($this->_getParam("quiz"));
     $finished = false;
     $marking = false;
     $now = strtotime("now");
     // Permissions
     $is_open = $quiz->getOpen_date() <= $now;
     if ($auth_model->userInGroup($username, $quiz->getPermissions_group()) && $is_open && !$quiz->hasPendingPrerequisite($username)) {
         // Have we run out of attempts?
         $quizAttempts = Model_Quiz_QuizAttempt::getAllFromUser($username, $quiz);
         if (sizeof($quizAttempts) >= $quiz->getMax_attempts()) {
             // It is possible that we're on our last attempt, and that it's "in progress"...check
             $quizAttempt = $this->findQuizAttemptInProgress($quizAttempts);
             if (!$quizAttempt) {
                 throw new Exception("You've exceeded your maximum attempts for this quiz. Cannot continue");
             }
         }
     } else {
         if (!$this->view->is_admin) {
             throw new Exception("Insufficient Permissions to take this quiz / Quiz not open yet / Prerequisites incomplete.");
         }
         $quizAttempts = Model_Quiz_QuizAttempt::getAllFromUser($username, $quiz);
     }
     /* Ok. We're allowed to TAKE the quiz. Are we resuming, or starting a new one? */
     $quizAttempt = $this->findQuizAttemptInProgress($quizAttempts);
     if ($quizAttempt == null) {
         $quizAttempt = Model_Quiz_QuizAttempt::fromScratch($now, $quiz, $username);
     }
     $total_questions = $quiz->getTotalQuestions();
     /* We have our quizAttempt ready to go. Now we look to see if we're resuming a question or not */
     $questionAttempt = $quizAttempt->getLastIncompleteQuestion();
     if (is_object($questionAttempt) && !$questionAttempt->isValid()) {
         $questionAttempt->destroy();
         // Remove the Question attempt (Database was reinitialised or something)
         $questionAttempt = null;
     }
     if ($questionAttempt != null) {
         /* Are we getting an ANSWER for this question? */
         //if (array_key_exists("marking", $_POST) && $_POST['marking'] == "1") {
         if (1 == $this->getRequest()->getPost('marking')) {
             /* Mark it */
             $marking = true;
         }
         My_Logger::log("Marking is {$marking}");
         /* If we reach here, the page has probably been refreshed. We just re-display the last question */
     } else {
         /* Have we finished this quiz? */
         if ($quizAttempt->getQuestionAttemptCount() >= $total_questions) {
             // Close this attempt and display a result later on down the page
             $quizAttempt->setDate_finished($now);
             // Calculate and store the final score
             $quizAttempt->setTotal_score($quizAttempt->getTotal_score());
             $finished = true;
         } else {
             /* Make a QuestionAttempt */
             $questionAttempt = $this->makeQuestionAttempt($quizAttempt, $now);
         }
     }
     // Pass all relevant information to the view
     $this->view->setEscape('htmlentities');
     $this->view->quiz = $quiz;
     $this->view->question_attempt = $questionAttempt;
     $this->view->finished = $finished;
     $this->view->marking = $marking;
     $this->view->mQuizAttempt = $quizAttempt;
     $this->view->vTotalQuestions = $total_questions;
     $this->view->setEscape('htmlspecialchars_decode');
 }
Beispiel #6
0
 /**
  * Shows the Hall of Fame for the Logged in User
  *
  * @return void
  * @author Ben Evans
  */
 public function halloffameAction()
 {
     $this->view->title = "Hall of Fame";
     $this->view->headTitle("Hall of Fame");
     $identity = Zend_Auth::getInstance()->getIdentity();
     $auth_model = Model_Auth_General::getAuthModel();
     //Firstly, we have to get the quizzes that we have access to
     $vQuizzes = Model_Quiz_Quiz::getAll(true);
     $vAvailable = array();
     /*	Make sure you have permission	*/
     foreach ($vQuizzes as $vQuiz) {
         if ($this->view->is_admin) {
             $vAvailable[] = $vQuiz;
         } else {
             if ($auth_model->userInGroup($identity->username, $vQuiz->getPermissions_group()) && $vQuiz->getOpen_date() <= strtotime("now")) {
                 $vAvailable[] = $vQuiz;
             }
         }
     }
     /*	Any Quizzes available? */
     $quiz_rows = array();
     if (sizeof($vAvailable) != 0) {
         foreach ($vAvailable as $vQuiz) {
             $quiz_row = array();
             $quiz_row['name'] = $vQuiz->getName();
             $vAttempts = $vQuiz->getQuizAttempts();
             $vPassed = array();
             if (sizeof($vAttempts) > 0) {
                 foreach ($vAttempts as $vAttempt) {
                     //Make sure we're only looking at people who've passed
                     $vTotalScore = $vAttempt->getTotal_score();
                     //echo "Comparing " . $vTotalScore . "/". $vQuiz->getTotalQuestions() ."  with " . $vQuiz->getPercentage_pass() . "%  (".$vAttempt->getID().")<br/>";
                     if ($vTotalScore / $vQuiz->getTotalQuestions() * 100 >= $vQuiz->getPercentage_pass() && $vAttempt->getDate_finished() != null) {
                         //echo "Added.<br/>";
                         $vPassed[] = $vAttempt;
                     }
                 }
             }
             //Did anyone pass?
             if (sizeof($vPassed) > 0) {
                 //Sort results first
                 usort($vPassed, "sort_by_score");
                 //Truncate the array if necessary
                 if (sizeof($vPassed) > MAX_HALLOFFAME) {
                     array_splice($vPassed, 0, MAX_HALLOFFAME);
                 }
                 // And now record the scores
                 $quiz_row['scores'] = array();
                 //Now output the scores
                 foreach ($vPassed as $vp) {
                     $score_row = array("name" => $vp->getAd_user_cachesamaccountname(), "score" => $vp->getTotal_score(), "time" => $vp->getDate_finished() - $vp->getDate_started());
                     $quiz_row['scores'][] = $score_row;
                 }
             }
             $quiz_rows[] = $quiz_row;
         }
         //End_foreach_quiz
     }
     $this->view->quiz_rows = $quiz_rows;
 }