예제 #1
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 actionGetQuestions()
 {
     $session = Yii::app()->session;
     $competition_user_id = $session['competition_user_id'] ? $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) {
         // we need to get that info somewhere
         /* $GetLanguageIds = QuestionResource::model()->with('question')->with('question.competitionQuestions')->findAll(array(
                'select' => 't.language_id',
                'distinct' => true,
                'condition' => 'competitionQuestions.competition_id=:competition_id',
                'params' => array(':competition_id' => $competitionUser->competition_id)
            ));
            $language_id = 1;
            if ($GetLanguageIds != null) {
                foreach ($GetLanguageIds as $record) {
                    $language_id = $record->language_id;
                    // echo 'Found Language ID: ', $record->language_id, '<br />';
                    // die();
                    break;
                }
            }
            $language = Language::model()->findByPk($language_id); 
            if ($language == null) {
                die('Language invalid');
            }
            $language_code = $language->short;*/
         // how about the session?
         if ($competitionUser->finished == 1 || $competitionUser->finish_time != null) {
             self::reponseJSON(array('success' => false, 'errorCode' => 999, 'error' => Yii::t('app', 'You have already finished competition.')));
         }
         if ($competitionUser->start_time != null) {
             $duration = $competitionUser->competition->duration * 60;
             $starttime = strtotime($competitionUser->start_time);
             $endtime = $starttime + $duration;
             if ($endtime < time()) {
                 $competitionUser->finished = 1;
                 $competitionUser->finish_time = $endtime;
                 $competitionUser->save(true, array('finished', 'finish_time'));
                 self::reponseJSON(array('success' => false, 'errorCode' => 999, 'error' => Yii::t('app', 'Your time is up. Questions won\'t be loaded!')));
             }
         }
         /*
                     $count = CompetitionUserQuestion::model()->count('competition_user_id=:competition_user_id', array(':competition_user_id' => $competition_user_id));*/
         $language_code = $session['preferred_language'];
         // error_log("Lang:".$language_code);
         $language = Language::model()->findByAttributes(array('short' => $language_code));
         $language_id = $language->id;
         if (!$competitionUser->questions_prepared) {
             $connection = Yii::app()->db;
             $transaction = $connection->beginTransaction();
             try {
                 // error_log("Language code:".$language_code."id:".$language_id);
                 // echo 'Adding new Competiton User Questions';
                 // generate questions order for user
                 $criteria = new CDbCriteria();
                 $criteria->together = true;
                 $criteria->with = array('competitionQuestionCategories');
                 $criteria->condition = 't.competition_id=:competition_id and competitionQuestionCategories.competition_category_id=:competition_category_id';
                 $criteria->params = array(':competition_id' => $competitionUser->competition_id, ':competition_category_id' => $competitionUser->competition_category_id);
                 $criteria->order = 'RAND()';
                 $competitionQuestions = CompetitionQuestion::model()->findAll($criteria);
                 $order = 1;
                 foreach ($competitionQuestions as $competitionQuestion) {
                     $competitionUserQuestion = new CompetitionUserQuestion();
                     $competitionUserQuestion->competition_question_id = $competitionQuestion->id;
                     $competitionUserQuestion->competition_user_id = $competition_user_id;
                     $competitionUserQuestion->ordering = $order;
                     $random_seed = number_format(mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax(), 9, '.', '');
                     $competitionUserQuestion->random_seed = $random_seed;
                     if (!$competitionUserQuestion->save()) {
                         var_dump($competitionUserQuestion->getErrors());
                         die;
                     }
                     $order++;
                 }
                 $competitionUser->questions_prepared = 1;
                 $competitionUser->save(true, array('questions_prepared'));
                 $transaction->commit();
             } catch (Exception $e) {
                 error_log($e);
                 $transaction->rollback();
             }
         }
         // $count = CompetitionUserQuestion::model()->count('competition_user_id=:competition_user_id', array(':competition_user_id' => $competition_user_id));
         $competitionUserQuestions = CompetitionUserQuestion::model()->findAll(array('condition' => 'competition_user_id=:competition_user_id', 'params' => array(':competition_user_id' => $competition_user_id), 'order' => 'ordering ASC'));
         if ($competitionUserQuestions != null) {
             $questions = array();
             foreach ($competitionUserQuestions as $competitionUserQuestion) {
                 $question_id = $competitionUserQuestion->competitionQuestion->question_id;
                 $startup_file = QuestionResource::model()->find('question_id=:question_id and language_id=:language_id and type=:type and start_up=:start_up', array(':question_id' => $question_id, ':language_id' => $language_id, ':type' => 1, ':start_up' => 1));
                 if ($startup_file != null) {
                     $questions[] = array('id' => $question_id, 'title' => $competitionUserQuestion->competitionQuestion->question->title, 'country' => $competitionUserQuestion->competitionQuestion->question->country_of_origin, 'link' => $question_id . '/' . $language_code . '/' . $startup_file->path . $startup_file->filename, 'custom_answer' => $competitionUserQuestion->custom_answer == null ? '' : $competitionUserQuestion->custom_answer, 'random_seed' => $competitionUserQuestion->random_seed, 'css' => $competitionUserQuestion->competitionQuestion->question->css);
                 } else {
                     echo "Question: ", $question_id, "\n";
                     die('missing startup file for language id: ' . $language_id . ' question id: ' . $question_id);
                 }
             }
             $response = array('success' => true, 'questions' => $questions, 'competition_title' => $competitionUser->competition->name, 'competition_length' => $competitionUser->competition->duration, 'seconds_to_end' => $competitionUser->start_time == null ? -1 : $competitionUser->competition->duration * 60 - time() - strtotime($competitionUser->start_time));
             self::reponseJSON($response);
         } else {
             self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'No questions defined for user.')));
         }
     } else {
         self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User is not authenticated.')));
     }
 }