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.'))); } }