public function actionSaveResponse()
 {
     $competition_user_id = isset(Yii::app()->session['competition_user_id']) ? Yii::app()->session['competition_user_id'] : 0;
     if ($competition_user_id == 0) {
         self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User is not authenticated.')));
     }
     $competitionUser = CompetitionUser::model()->findByPk($competition_user_id);
     if ($competitionUser != null) {
         if ($competitionUser == null) {
             $competitionUser = new CompetitionUser();
         }
         if ($competitionUser->finished == 1 || $competitionUser->finish_time != null) {
             self::reponseJSON(array('success' => false, 'errorCode' => 999, 'error' => Yii::t('app', 'You already finished competition. You cannot save answer anymore.')));
         }
         if ($competitionUser->start_time != null) {
             $duration = $competitionUser->competition->duration * 60;
             $starttime = strtotime($competitionUser->start_time);
             $endtime = $starttime + $duration;
             if ($endtime < time()) {
                 self::reponseJSON(array('success' => false, 'errorCode' => 999, 'error' => Yii::t('app', 'Time is up. Answer cannot be saved!')));
             }
         } else {
             self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User did not authenticate competition!')));
         }
     } else {
         self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User is not authenticated.')));
     }
     $question_id = Yii::app()->getRequest()->getPost('q', 0);
     if ($question_id == 0) {
         self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'Empty Question ID!')));
     }
     $answer = Yii::app()->getRequest()->getPost('a', '');
     $competition_user_question = CompetitionUserQuestion::model()->with('competitionQuestion')->find('competitionQuestion.question_id=:question_id and t.competition_user_id=:competition_user_id', array(':question_id' => $question_id, ':competition_user_id' => $competition_user_id));
     if ($competition_user_question != null) {
         // DUMPING DATA TO DISK
         if (Yii::app()->params['dump_answers_to_disk']) {
             $dataToLog = $competition_user_id . ";" . $question_id . ";" . $answer . ";" . date("Y-m-d H:i:s") . "\n";
             if (file_put_contents(dirname(__FILE__) . "/../data/" . $competition_user_id . ".txt", $dataToLog, FILE_APPEND) === FALSE) {
                 self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'Error saving question answer into a file!')));
             } else {
                 self::reponseJSON(array('success' => true));
             }
         } else {
             // END OF DUMPING DATA TO DISK
             if ($competition_user_question->custom_answer != $answer) {
                 $competition_user_question->custom_answer = $answer;
                 $competition_user_question->last_change = date('Y-m-d H:i:s');
                 if ($competition_user_question->save(true, array('custom_answer', 'last_change'))) {
                     self::reponseJSON(array('success' => true));
                 } else {
                     self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'Error saving question answer!')));
                 }
             } else {
                 self::reponseJSON(array('success' => true, 'same_in_db' => true, 'error' => Yii::t('app', 'Nothing changed!')));
             }
         }
     } else {
         self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'You submited answer for question you don\'t have!')));
     }
 }
Example #2
0
 public function importCompetitiors($competition_id, $competition_category_id, $content)
 {
     $lines = explode("\n", $content);
     $header = explode(';', $lines[0]);
     $competition_questions = CompetitionQuestionCategory::model()->with('competitionQuestion')->with('competitionQuestion.question')->findAll('competition_category_id=:competition_category_id and competitionQuestion.competition_id=:competition_id', array(':competition_category_id' => $competition_category_id, ':competition_id' => $competition_id));
     $questions_to_import = array();
     foreach ($competition_questions as $cq) {
         if ($cq == null) {
             $cq = new CompetitionQuestionCategory();
         }
         $questions_to_import[trim($cq->competitionQuestion->question->title)] = $cq->competition_question_id;
     }
     echo 'Question to import:<br />';
     pre_print($questions_to_import);
     // map fields
     $colQuestionMap = array();
     $found_c = array();
     for ($i = 0; $i < count($header); ++$i) {
         $col = explode('(', $header[$i]);
         $c = trim($col[0]);
         if (isset($questions_to_import[$c])) {
             $colQuestionMap[$i] = $questions_to_import[$c];
             $found_c[] = $c;
         }
     }
     if (count($colQuestionMap) != count($questions_to_import)) {
         echo 'Question to import and question in CSV does not match!';
         echo 'Question to import:<br />';
         pre_print($questions_to_import);
         echo 'Found questions: <br />';
         pre_print($found_c);
         echo 'CSV header line cols: <br />';
         pre_print($header);
         echo 'Question column mapping found:<br />';
         pre_print($colQuestionMap);
         die;
     } else {
         echo 'Question column exist, we can start importing.<br />';
     }
     // check for required columns
     $required_fields = array('Priimek' => -1, 'Ime' => -1, 'Mentor' => -1, 'Šola' => -1, 'Spol' => -1, 'Razred' => -1);
     $required_keys = array_keys($required_fields);
     // not required fields
     $required_fields['ID1'] = -1;
     $required_fields['ID2'] = -1;
     $required_keys2 = array_keys($required_fields);
     for ($i = 0; $i < count($header); ++$i) {
         if (in_array(trim($header[$i]), $required_keys2)) {
             $required_fields[trim($header[$i])] = $i;
         }
     }
     $missing_fields = array();
     for ($i = 0; $i < count($required_keys); ++$i) {
         if ($required_fields[$required_keys[$i]] == -1) {
             $missing_fields[] = $required_keys[$i];
         }
     }
     if (count($missing_fields) > 0) {
         echo 'Some required fields are missing:<br />';
         pre_print($missing_fields);
         die;
     }
     $competition = Competition::model()->findByPk($competition_id);
     if ($competition == null) {
         echo 'Provided Competition does not exist!';
         die;
     }
     $competitionCategory = CompetitionCategory::model()->findByPk($competition_category_id);
     if ($competitionCategory == null) {
         echo 'Provided Competition Category does not exist!';
         die;
     }
     for ($i = 1; $i < count($lines); ++$i) {
         if (trim($lines[$i]) == '') {
             continue;
         }
         $cols = explode(';', $lines[$i]);
         $cu = new CompetitionUser();
         $cu->competition_category_id = $competition_category_id;
         $cu->competition_id = $competition_id;
         $cu->first_name = $cols[$required_fields['Ime']];
         $cu->last_name = $cols[$required_fields['Priimek']];
         $cu->gender = $cols[$required_fields['Spol']] == 'M' ? 0 : 1;
         $cu->class = $cols[$required_fields['Razred']];
         $sc = School::model()->find('name=:name', array(':name' => trim($cols[$required_fields['Šola']])));
         if ($sc == null) {
             echo 'Provided school not found in database! School name: ', $cols[$required_fields['Šola']], '<br />';
             die;
         }
         $cu->school_id = $sc->id;
         $scm = SchoolMentor::model()->with('user.profile')->find('school_id=:school_id and CONCAT_WS(\' \', `profile`.`last_name`, `profile`.`first_name`) LIKE :mentor', array(':school_id' => $sc->id, ':mentor' => trim($cols[$required_fields['Mentor']])));
         if ($scm == null) {
             echo 'Provided school mentor not found in database! School name: ', $cols[$required_fields['Šola']], ', School mentor: ', $cols[$required_fields['Mentor']], '<br />';
             die;
         }
         // ali je šola prijavljena na tekmovanje za to kategorijo
         $ccs = CompetitionCategorySchool::model()->find('competition_id=:competition_id and competition_category_id=:competition_category_id and school_id=:school_id', array(':competition_id' => $competition_id, ':competition_category_id' => $competition_category_id, ':school_id' => $sc->id));
         if ($ccs == null) {
             echo 'Provided school is not competing in this category! School name: ', $cols[$required_fields['Šola']], ', Competition: ', $competition->name, ', Competition category: ', $competitionCategory->name, '<br />';
             die;
         }
         // ali je mentor prijavljen na tej šoli za to tekmovalno kategorijo
         $ccsm = CompetitionCategorySchoolMentor::model()->find('competition_category_school_id=:competition_category_school_id and user_id=:user_id', array(':competition_category_school_id' => $ccs->id, ':user_id' => $scm->user_id));
         if ($ccsm == null) {
             echo 'Provided mentor is not competing on this school on this competition in this category! School mentor: ', $cols[$required_fields['Mentor']], ', School name: ', $cols[$required_fields['Šola']], ', Competition: ', $competition->name, ', Competition category: ', $competitionCategory->name, '<br />';
             die;
         }
         $cu->competition_category_school_mentor_id = $ccsm->id;
         $cu->start_time = null;
         $cu->finish_time = null;
         $cu->finished = 2;
         if (isset($cols[$required_fields['ID1']])) {
             $cut = CompetitionUser::model()->findByPk($cols[$required_fields['ID1']]);
             if ($cut != null) {
                 if ($cut == null) {
                     $cut = new CompetitionUser();
                 }
                 $cu->start_time = $cut->start_time;
                 $cu->finish_time = $cut->finish_time;
                 $cut->disqualified_reason = 'Prenos v pravilno kategorijo tekmovanja';
                 $cut->disqualified_request = 1;
                 $cut->disqualified = 1;
                 $cut->save();
             }
         }
         if (isset($cols[$required_fields['ID2']])) {
             $cut = CompetitionUser::model()->findByPk($cols[$required_fields['ID2']]);
             if ($cut != null) {
                 if ($cut == null) {
                     $cut = new CompetitionUser();
                 }
                 if ($cu->start_time == null) {
                     $cu->start_time = $cut->start_time;
                     $cu->finish_time = $cut->finish_time;
                 } else {
                     $time_diff1 = strtotime($cu->finish_time) - strtotime($cu->start_time);
                     $time_diff2 = strtotime($cut->finish_time) - strtotime($cut->start_time);
                     if ($time_diff2 > $time_diff1) {
                         $cu->start_time = $cut->start_time;
                         $cu->finish_time = $cut->finish_time;
                     }
                 }
                 $cut->disqualified_reason = 'Prenos v pravilno kategorijo tekmovanja';
                 $cut->disqualified_request = 1;
                 $cut->disqualified = 1;
                 $cut->save();
             }
         }
         // ali tekmovalec s temi podatki že obstaja
         $cuc = CompetitionUser::model()->find('competition_id=:competition_id and competition_category_id=:competition_category_id and competition_category_school_mentor_id=:competition_category_school_mentor_id and school_id=:school_id and first_name=:first_name and last_name=:last_name and gender=:gender and class=:class', array(':competition_id' => $competition_id, ':competition_category_id' => $competition_category_id, ':competition_category_school_mentor_id' => $cu->competition_category_school_mentor_id, ':school_id' => $cu->school_id, ':last_name' => $cu->last_name, ':first_name' => $cu->first_name, ':gender' => $cu->gender, ':class' => $cu->class));
         if ($cuc != null) {
             echo 'Competition User already exists, skipping...';
             continue;
         }
         $cu->save();
         // import answers
         $question_keys = array_keys($colQuestionMap);
         for ($k = 0; $k < count($question_keys); ++$k) {
             $cuq = new CompetitionUserQuestion();
             $cuq->competition_user_id = $cu->id;
             $cuq->competition_question_id = $colQuestionMap[$question_keys[$k]];
             $cuq->ordering = $k + 1;
             $cuq->random_seed = number_format(mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax(), 9, '.', '');
             $cuq->last_change = $cu->finish_time;
             $custom_answer_ex = explode('|', $cols[$question_keys[$k]]);
             $custom_answer = trim($custom_answer_ex[0]);
             $cuq->custom_answer = $custom_answer;
             $cuq->save();
         }
         echo 'Successfully imported user with ID: ', $cu->id, '<br />';
     }
 }
 public function actionGet()
 {
     $starttime = microtime(true);
     if ($this->CanAccess('get')) {
         $keys = array_keys($_GET);
         if (count($keys) == 0) {
             die;
         }
         $question_id = $keys[0];
         $superuser = Generic::isSuperAdmin();
         $user_role = Generic::getUserRole();
         $allow = false;
         if ($superuser || $user_role >= 10) {
             $allow = true;
         }
         $competition_user_id = isset(Yii::app()->session['competition_user_id']) ? Yii::app()->session['competition_user_id'] : 0;
         Yii::app()->session->close();
         $criteria = new CDbCriteria();
         $criteria->limit = 1;
         $criteria->join = 'INNER JOIN competition_question on t.competition_question_id = competition_question.id';
         $criteria->condition = 't.competition_user_id = :competition_user_id AND competition_question.question_id = :question_id';
         $criteria->params = array(':question_id' => $question_id, ':competition_user_id' => $competition_user_id);
         $competition_user_question = CompetitionUserQuestion::model()->find($criteria);
         //$competition_user_question = CompetitionUserQuestion::model()->with('competitionQuestion')->find('competitionQuestion.question_id=:question_id and t.competition_user_id=:competition_user_id', array(':question_id' => $question_id, ':competition_user_id' => $competition_user_id));
         if ($competition_user_question != null) {
             $allow = true;
         }
         if ($allow) {
             $path = '';
             foreach ($_GET as $key => $value) {
                 $path .= $key . '/';
                 if ($value != '') {
                     $path .= $value . '/';
                 }
             }
             $path = trim(mb_substr($path, mb_strpos($path, '/', 0, 'UTF-8') + 1, mb_strlen($path, 'UTF-8'), 'UTF-8'), '/');
             $filename = trim(mb_substr($path, mb_strrpos($path, '/', 0, 'UTF-8'), mb_strlen($path, 'UTF-8'), 'UTF-8'), '/');
             $language_code = mb_substr($path, 0, mb_strpos($path, '/', 0, 'UTF-8'), 'UTF-8');
             $path = ltrim(mb_substr($path, mb_strpos($path, '/', 0, 'UTF-8'), mb_strrpos($path, '/', 0, 'UTF-8') - mb_strpos($path, '/', 0, 'UTF-8'), 'UTF-8'), '/');
             if ($path != '') {
                 $path .= '/';
             }
             /*
                               echo "<pre>";
                               echo "Question ID: ";
                               print_r($question_id);
                               echo "\n";
                               echo "Language code: ";
                               print_r($language_code);
                               echo "\n";
                               var_dump($path);
                               echo "\n";
                               print_r($filename);
                               echo "</pre>";
                               die(); */
             $cache_id = 'bober-' . $question_id . '-' . $language_code . '-' . $path . '-' . $filename;
             $questionResourceArray = Yii::app()->cache->get($cache_id);
             if ($questionResourceArray === false) {
                 $questionResource = QuestionResource::model()->with('language')->find('question_id=:question_id and language.short=:language_code and path=:path and filename=:filename', array(':question_id' => $question_id, ':filename' => $filename, ':path' => $path, ':language_code' => $language_code));
                 if ($questionResource == null) {
                     $questionResource = new QuestionResource();
                     die;
                 }
                 $questionResourceArray = array('data' => $questionResource->data, 'file_type' => $questionResource->file_type, 'length' => strlen($questionResource->data));
                 if ($questionResourceArray['length'] > 1000000) {
                     // cannot go to memcache
                 } else {
                     Yii::app()->cache->set($cache_id, $questionResourceArray, 1800);
                 }
             }
             if (isset($questionResourceArray['length'])) {
                 header('Pragma: public');
                 header('Expires: 0');
                 header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                 header('Content-Transfer-Encoding: binary');
                 header('Content-length: ' . $questionResourceArray['length']);
                 header('Content-Type: ' . $questionResourceArray['file_type']);
                 header('X-Content-Type-Options: nosniff');
                 header('X-Frame-Options: SAMEORIGIN');
                 header('Connection: close');
                 echo $questionResourceArray['data'];
             }
             die;
         } else {
             die;
         }
     } else {
         die;
     }
 }