public function onRun() { $instance = GradeModel::find($this->property('gradeInstance')); if (!is_null($this->property('experienceInstance'))) { $experienceInstance = ExperienceModel::find($this->property('experienceInstance')); $exComp = new ExperienceComponent(); //set class variables $stDate = new DateTime($experienceInstance->start_date); $endDate = new DateTime($experienceInstance->end_date); $ptsPerSecond = $exComp->getPtsPerSecond($stDate, $endDate, $experienceInstance->total_points); $exComp->setPtsPerSecond($ptsPerSecond); $exComp->setStartDate($stDate); $exComp->setBonusPerSecond($experienceInstance->bonus_per_day / 24 / 60 / 60); $exComp->setBonusSeconds($experienceInstance->bonus_days * 24 * 60 * 60); $exComp->setPenaltyPerSecond($experienceInstance->penalty_per_day / 24 / 60 / 60); $exComp->setPenaltySeconds($experienceInstance->penalty_days * 24 * 60 * 60); $points = $exComp->getUserPoints(); $milestonesDesc = Milestone::where('experience_id', '=', $experienceInstance->id)->orderBy('points', 'desc')->get(); $mileClearance = $exComp->getMilestoneClearanceInfo($milestonesDesc); $bonusPenalties = 0; foreach ($mileClearance as $item) { if ($item->cleared) { $bonusPenalties = $bonusPenalties + $item->bonusPenalty; } } $this->page['XP'] = round($points, 2); $this->page['gradeBonus'] = round($bonusPenalties, 2); } else { $this->page['XP'] = 0; $this->page['gradeBonus'] = 0; } //todo: get the bonus, etc from blade, not from experience $this->page['gradeSize'] = $instance->Size; $this->getGradeData(); $this->addJs("/plugins/delphinium/blossom/assets/javascript/grade.js"); $this->addCss("/plugins/delphinium/blossom/assets/css/animate.css"); $this->addCss("/plugins/delphinium/blossom/assets/css/grade.css"); $this->addCss("/plugins/delphinium/blossom/assets/css/main.css"); }
private function getRedLineData() { if (!is_null($this->property('experienceInstance'))) { $instance = ExperienceModel::find($this->property('experienceInstance')); $milestones = $instance->milestones; $this->page['numMilestones'] = count($milestones); $utcTimeZone = new DateTimeZone('UTC'); $stDate = $instance->start_date->setTimezone($utcTimeZone); $endDate = $instance->end_date->setTimezone($utcTimeZone); $expComponent = new ExperienceComponent(); $ptsPerSecond = $expComponent->getPtsPerSecond($stDate, $endDate, $instance->total_points); $milestoneData = array(); foreach ($milestones as $milestone) { $secsTranspired = ceil($milestone->points / $ptsPerSecond); $intervalSeconds = "PT" . $secsTranspired . "S"; $sDate = clone $stDate; $dueDate = $sDate->add(new \DateInterval($intervalSeconds)); $mile = new \stdClass(); $mile->points = $milestone->points; $mile->date = $dueDate->format('c'); $milestoneData[] = $mile; } //fill in the rest of the days $newArr = $this->fillInMissingDays($stDate, $milestoneData); //merge arrays and order by date $final = array_merge($newArr, $milestoneData); usort($final, function ($a, $b) { if ($a->date == $b->date) { return 0; } return $a->date > $b->date ? 1 : -1; }); return $final; } else { return array(); } }
public function matchSubmissionsAndUsers($users, $scores) { $allStudents = array(); $standards = $this->roots->getGradingStandards(); $grading_scheme = $standards[0]->grading_scheme; //get experience total points $experienceInstance = ExperienceModel::find($this->property('experienceInstance')); $maxExperiencePts = $experienceInstance->total_points; $utcTimeZone = new DateTimeZone('UTC'); $stDate = $experienceInstance->start_date->setTimezone($utcTimeZone); $endDate = $experienceInstance->end_date->setTimezone($utcTimeZone); $expComponent = new ExperienceComponent(); $ptsPerSecond = $expComponent->getPtsPerSecond($stDate, $endDate, $experienceInstance->total_points); $bonusPerSecond = $experienceInstance->bonus_per_day / 24 / 60 / 60; $bonusSeconds = $experienceInstance->bonus_days * 24 * 60 * 60; $penaltyPerSecond = $experienceInstance->penalty_per_day / 24 / 60 / 60; $penaltySeconds = $experienceInstance->penalty_days * 24 * 60 * 60; foreach ($users as $user) { $submissionsArr = $this->findScoreByUserId($user->user_id, $scores); //this will weed out any TA's and other people in the course who aren't necessarily students try { $userSubmissions = $expComponent->getSubmissions($user->user_id); $bonusPenalties = $this->getBonusPenaltiesNew($this->property('experienceInstance'), $userSubmissions, $ptsPerSecond, $stDate, $bonusPerSecond, $bonusSeconds, $penaltyPerSecond, $penaltySeconds); // $bonusPenalties = $this->getBonusPenalties($user->user_id); } catch (\GuzzleHttp\Exception\ClientException $e) { continue; } $bonus = $bonusPenalties->bonus; $penalty = $bonusPenalties->penalties; $totalPoints = 0; $userObj = new \stdClass(); $userObj->name = $user->user->name; $userObj->id = $user->user_id; //add link to user profile if (!isset($_SESSION)) { session_start(); } $domain = $_SESSION['domain']; $courseId = $_SESSION['courseID']; $userObj->profile_url = "https://{$domain}/courses/{$courseId}/users/{$user->id}"; $userObj->bonuses = $bonus; $userObj->penalties = $penalty; $userObj->totalBP = $bonus - $penalty; if (count($submissionsArr) >= 1) { $score = $submissionsArr[0]; if (isset($score->score)) { $userObj->score = $score->score; $totalPoints = $score->score + $bonus + $penalty; $userObj->total = $totalPoints; } else { $userObj->score = 0; $totalPoints = $bonus + $penalty; $userObj->total = $totalPoints; } } else { //no scores found for user $userObj->score = 0; $totalPoints = $bonus + $penalty; $userObj->total = $totalPoints; } //get letter grade $grade = new GradeComponent(); $userObj->grade = $grade->getLetterGrade($totalPoints, $maxExperiencePts, $grading_scheme); $allStudents[] = $userObj; } return $allStudents; }