public function getBody()
 {
     $indexer = $this->container->get('es_indexer');
     $em = $this->container->get('doctrine')->getManager();
     $rs = $this->container->get('review');
     $body = array();
     $c = $this->entity;
     // Alias for entity
     $body['name'] = $c->getName();
     $body['id'] = $c->getId();
     $body['videoIntro'] = $c->getVideoIntro();
     $body['length'] = $c->getLength();
     $body['slug'] = $c->getSlug();
     $body['description'] = $c->getDescription();
     $body['longDescription'] = $c->getLongDescription();
     $body['syllabus'] = $c->getSyllabus();
     $body['searchDesc'] = $c->getSearchDesc();
     $body['status'] = $c->getStatus();
     $body['certificate'] = $c->getCertificate();
     $body['verifiedCertificate'] = $c->getVerifiedCertificate();
     $body['url'] = $c->getUrl();
     if ($c->getCreated()) {
         $body['created'] = $c->getCreated()->format(DATE_ISO8601);
     }
     // Tags
     $tags = array();
     foreach ($c->getTags() as $tag) {
         $tags[] = strtolower($tag->getName());
     }
     $body['tags'] = $tags;
     // Instructors
     $body['instructors'] = array();
     foreach ($c->getInstructors() as $instructor) {
         $body['instructors'][] = $instructor->getName();
     }
     // Language
     $body['language'] = array();
     $lang = $c->getLanguage();
     if ($lang) {
         $body['language']['name'] = $lang->getName();
         $body['language']['id'] = $lang->getId();
         $body['language']['slug'] = $lang->getSlug();
     } else {
         // Set the default to english
         $l = $em->getRepository('ClassCentralSiteBundle:Language')->findOneBy(array('slug' => 'english'));
         $body['language']['name'] = $l->getName();
         $body['language']['id'] = $l->getId();
         $body['language']['slug'] = $l->getSlug();
     }
     // Institutions
     $body['institutions'] = array();
     foreach ($c->getInstitutions() as $ins) {
         $iDoc = new InstitutionDocumentType($ins, $this->container);
         $body['institutions'][] = $iDoc->getBody();
     }
     // Provider
     $body['provider'] = array();
     if ($c->getInitiative()) {
         $provider = $c->getInitiative();
     } else {
         // create an independent provider
         $provider = new Initiative();
         $provider->setName('Independent');
         $provider->setCode('independent');
     }
     $pDoc = new ProviderDocumentType($provider, $this->container);
     $body['provider'] = $pDoc->getBody();
     // Get the next session
     $body['nextSession'] = array();
     $ns = CourseUtility::getNextSession($c);
     if ($ns) {
         $nsDoc = new SessionDocumentType($ns, $this->container);
         $body['nextSession'] = $nsDoc->getBody();
     }
     // Subject
     $subjects = array();
     $sub = $c->getStream();
     if ($sub->getParentStream()) {
         // Add the parent stream first
         $psDoc = new SubjectDocumentType($sub->getParentStream(), $this->container);
         $subjects[] = $psDoc->getBody();
     }
     $sDoc = new SubjectDocumentType($sub, $this->container);
     $subjects[] = $sDoc->getBody();
     $body['subjects'] = $subjects;
     // Sessions. Add sessions to the records
     $sessions = array();
     $body['sessions'] = array();
     foreach ($c->getOfferings() as $session) {
         // Ignore invalid session
         if ($session->getStatus() == Offering::COURSE_NA) {
             continue;
         }
         $sDoc = new SessionDocumentType($session, $this->container);
         $sessions[] = $sDoc->getBody();
     }
     $body['sessions'] = $sessions;
     $body['numSessions'] = count($sessions);
     $body['rating'] = $rs->getRatings($c->getId());
     $body['ratingSort'] = $rs->getBayesianAverageRating($c->getId());
     $rArray = $rs->getReviewsArray($c->getId());
     $body['reviewsCount'] = $rArray['count'];
     $body['ratingStars'] = ReviewUtility::getRatingStars($body['rating']);
     $body['formattedRating'] = ReviewUtility::formatRating($body['rating']);
     // Get Followed count
     $courseRepo = $this->container->get('doctrine')->getManager()->getRepository('ClassCentralSiteBundle:Course');
     $body['followed'] = intval($courseRepo->getListedCount($c));
     // Check if the course being offered is new
     // Definition of new - created 30 days ago
     $oneMonthAgo = new \DateTime();
     $oneMonthAgo->sub(new \DateInterval("P30D"));
     $newCourse = false;
     if ($c->getCreated() >= $oneMonthAgo) {
         $newCourse = true;
     }
     $body['new'] = intval($newCourse);
     $startingSoon = false;
     $oneMonthLater = new \DateTime();
     $oneMonthLater->add(new \DateInterval("P30D"));
     if ($ns && !in_array('selfpaced', $body['nextSession']['states']) && in_array('upcoming', $body['nextSession']['states'])) {
         if ($ns->getStartDate() < $oneMonthLater and $ns->getStatus() != Offering::START_DATES_UNKNOWN) {
             $startingSoon = true;
         }
     }
     $body['startingSoon'] = intval($startingSoon);
     // Get the Credential
     $credential = array();
     if (!$c->getCredentials()->isEmpty()) {
         $cred = $c->getCredentials()->first();
         if ($cred->getStatus() < 100) {
             $credential['id'] = $cred->getId();
             $credential['name'] = $cred->getName();
             $credential['slug'] = $cred->getSlug();
             $credential['certificateName'] = '';
             $credential['certificateSlug'] = '';
             $credFormatter = $cred->getFormatter();
             $credential['certificateName'] = $credFormatter->getCertificateName();
             $credential['certificateSlug'] = $credFormatter->getCertificateSlug();
         }
     }
     $body['credential'] = $credential;
     return $body;
 }
 /**
  * Wrapper around static function so that it can be accessed from twig
  * @param $rating
  * @return float
  */
 public function formatRating($rating)
 {
     return ReviewUtility::formatRating($rating);
 }
 public function getCredentialReviews($slug)
 {
     $em = $this->container->get('doctrine')->getManager();
     $credential = $em->getRepository('ClassCentralCredentialBundle:Credential')->findOneBy(array('slug' => $slug));
     if (!$credential) {
         throw new \Exception("{$slug} is not a valid credential");
     }
     $rating = $this->calculateAverageRating($credential);
     $reviewEntities = $em->createQuery("\n               SELECT r,LENGTH (r.text) as reviewLength from ClassCentralCredentialBundle:CredentialReview r JOIN r.credential c WHERE c.slug = '{$slug}'\n                ORDER BY r.rating DESC, reviewLength DESC")->getResult();
     $reviewCount = 0;
     $ratingCount = 0;
     $r = array();
     foreach ($reviewEntities as $review) {
         $review = $review[0];
         if ($review->getStatus() < Review::REVIEW_NOT_SHOWN_STATUS_LOWER_BOUND) {
             $ratingCount++;
             $reviewCount++;
             $r[] = $this->getCredentialReviewArray($review);
         }
     }
     $reviews = array();
     $reviews['count'] = $ratingCount;
     $reviews['ratingCount'] = $ratingCount;
     $reviews['reviewCount'] = $reviewCount;
     $reviews['rating'] = $rating['rating'];
     $reviews['formattedRating'] = ReviewUtility::formatRating($rating['rating']);
     $reviews['reviews'] = $r;
     return $reviews;
 }
 /**
  * Renders the review widget
  * @param Request $request
  */
 public function getReviewWidgetAction(Request $request)
 {
     $logger = $this->container->get('monolog.logger.review_widget');
     $cache = $this->get('Cache');
     $courseId = $request->query->get('course-id');
     $courseCode = $request->query->get('course-code');
     $courseName = urldecode($request->query->get('course-name'));
     $providerName = $request->query->get('provider-name');
     $providerCourseUrl = $request->query->get('provider-course-url');
     $providerCourseId = $request->query->get('provider-course-id');
     // Basic check - if both course id and course code are empty then return a blank page
     if (empty($courseId) && empty($courseCode)) {
         $logger->error("Course Id and course code missing", $request->query->all());
         // This returns an empty blank page
         return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', array('course' => null));
     }
     // If course-id is auto-detect then the course page url is a required field
     if ($courseId == 'auto-detect' && empty($providerCourseUrl)) {
         $logger->error("Provider Course url missing", $request->query->all());
         // This returns an empty blank page
         return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', array('course' => null));
     }
     $data = $cache->get($this->generateReviewWidgetCacheKey($courseId, $courseCode, $providerCourseUrl), function () use($courseId, $courseCode, $providerCourseUrl, $courseName, $providerName, $request) {
         $em = $this->getDoctrine()->getManager();
         $rs = $this->get('review');
         $logger = $this->container->get('monolog.logger.review_widget');
         // STEP 1: Figure out which course it is
         $course = null;
         if (!empty($courseId) and is_numeric($courseId)) {
             $course = $em->getRepository('ClassCentralSiteBundle:Course')->find($courseId);
         }
         if (empty($course) && !empty($courseCode)) {
             $course = $em->getRepository('ClassCentralSiteBundle:Course')->findOneBy(array('shortName' => $courseCode));
         }
         // Use the provider url if available
         if (empty($course) && $courseId == 'auto-detect') {
             // Use the provider url to get the offering
             $offering = $em->getRepository('ClassCentralSiteBundle:Offering')->findOneBy(array('url' => $providerCourseUrl));
             if ($offering) {
                 $course = $offering->getCourse();
             }
         }
         // Use the course name and provider name
         if (empty($course) and !empty($courseName) and !empty($providerName)) {
             $course = $em->getRepository('ClassCentralSiteBundle:Course')->findOneBy(array('name' => $courseName));
             if ($course) {
                 // Check its from the same provider
                 $provider = null;
                 if ($course->getInitiative()) {
                     $provider = $course->getInitiative()->getCode();
                 }
                 if (strcasecmp($provider, $providerName) != 0) {
                     $course = null;
                 }
             }
         }
         if ($course) {
             // Step 2: Get 5 reviews that are to be displayed
             $query = $em->createQueryBuilder();
             $query->add('select', 'r')->add('from', 'ClassCentralSiteBundle:Review r')->join('r.reviewSummary', 'rs')->add('orderBy', 'r.rating DESC')->add('where', 'r.course = :course')->andWhere('rs is NOT NULL')->andWhere('r.status < :status')->setMaxResults(5)->setParameter('course', $course)->setParameter(':status', Review::REVIEW_NOT_SHOWN_STATUS_LOWER_BOUND);
             $reviewsWithSummaries = array();
             foreach ($query->getQuery()->getResult() as $review) {
                 $reviewsWithSummaries[] = ReviewUtility::getReviewArray($review);
             }
             // Get reviews and ratings count
             $rating = $rs->getRatings($course->getId());
             $reviews = $rs->getReviews($course->getId());
             return array('reviews' => $reviews, 'rating' => $rating, 'formattedRating' => ReviewUtility::formatRating($rating), 'reviewsWithSummaries' => $reviewsWithSummaries, 'course' => $em->getRepository('ClassCentralSiteBundle:Course')->getCourseArray($course));
         } else {
             $logger->error("Course Not Found", $request->query->all());
             return array('course' => null);
         }
     });
     return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', $data);
 }
 public function getBody()
 {
     $indexer = $this->container->get('es_indexer');
     $em = $this->container->get('doctrine')->getManager();
     $rs = $this->container->get('review');
     $body = array();
     $c = $this->entity;
     // Alias for entity
     $body['name'] = $c->getName();
     $body['id'] = $c->getId();
     $body['videoIntro'] = $c->getVideoIntro();
     $body['length'] = $c->getLength();
     $body['slug'] = $c->getSlug();
     $body['description'] = $c->getDescription();
     $body['longDescription'] = $c->getLongDescription();
     $body['syllabus'] = $c->getSyllabus();
     $body['searchDesc'] = $c->getSearchDesc();
     $body['status'] = $c->getStatus();
     $body['certificate'] = $c->getCertificate();
     $body['verifiedCertificate'] = $c->getVerifiedCertificate();
     $body['url'] = $c->getUrl();
     // Tags
     $tags = array();
     foreach ($c->getTags() as $tag) {
         $tags[] = strtolower($tag->getName());
     }
     $body['tags'] = $tags;
     // Instructors
     $body['instructors'] = array();
     foreach ($c->getInstructors() as $instructor) {
         $body['instructors'][] = $instructor->getName();
     }
     // Language
     $body['language'] = array();
     $lang = $c->getLanguage();
     if ($lang) {
         $body['language']['name'] = $lang->getName();
         $body['language']['id'] = $lang->getId();
         $body['language']['slug'] = $lang->getSlug();
     } else {
         // Set the default to english
         $l = $em->getRepository('ClassCentralSiteBundle:Language')->findOneBy(array('slug' => 'english'));
         $body['language']['name'] = $l->getName();
         $body['language']['id'] = $l->getId();
         $body['language']['slug'] = $l->getSlug();
     }
     // Institutions
     $body['institutions'] = array();
     foreach ($c->getInstitutions() as $ins) {
         $iDoc = new InstitutionDocumentType($ins, $this->container);
         $body['institutions'][] = $iDoc->getBody();
     }
     // Provider
     $body['provider'] = array();
     if ($c->getInitiative()) {
         $provider = $c->getInitiative();
     } else {
         // create an independent provider
         $provider = new Initiative();
         $provider->setName('Independent');
         $provider->setCode('independent');
     }
     $pDoc = new ProviderDocumentType($provider, $this->container);
     $body['provider'] = $pDoc->getBody();
     // Get the next session
     $body['nextSession'] = array();
     $ns = CourseUtility::getNextSession($c);
     if ($ns) {
         $nsDoc = new SessionDocumentType($ns, $this->container);
         $body['nextSession'] = $nsDoc->getBody();
     }
     // Subject
     $subjects = array();
     $sub = $c->getStream();
     if ($sub->getParentStream()) {
         // Add the parent stream first
         $psDoc = new SubjectDocumentType($sub->getParentStream(), $this->container);
         $subjects[] = $psDoc->getBody();
     }
     $sDoc = new SubjectDocumentType($sub, $this->container);
     $subjects[] = $sDoc->getBody();
     $body['subjects'] = $subjects;
     // Sessions. Add sessions to the records
     $sessions = array();
     $body['sessions'] = array();
     foreach ($c->getOfferings() as $session) {
         // Ignore invalid session
         if ($session->getStatus() == Offering::COURSE_NA) {
             continue;
         }
         $sDoc = new SessionDocumentType($session, $this->container);
         $sessions[] = $sDoc->getBody();
     }
     $body['sessions'] = $sessions;
     $body['rating'] = $rs->getRatings($c->getId());
     $body['ratingSort'] = $rs->getBayesianAverageRating($c->getId());
     $rArray = $rs->getReviewsArray($c->getId());
     $body['reviewsCount'] = $rArray['count'];
     $body['ratingStars'] = ReviewUtility::getRatingStars($body['rating']);
     $body['formattedRating'] = ReviewUtility::formatRating($body['rating']);
     // Get the Credential
     $credential = array();
     if (!$c->getCredentials()->isEmpty()) {
         $cred = $c->getCredentials()->first();
         if ($cred->getStatus() < 100) {
             $credential['id'] = $cred->getId();
             $credential['name'] = $cred->getName();
             $credential['slug'] = $cred->getSlug();
             $credential['certificateName'] = '';
             $credential['certificateSlug'] = '';
             $credFormatter = $cred->getFormatter();
             $credential['certificateName'] = $credFormatter->getCertificateName();
             $credential['certificateSlug'] = $credFormatter->getCertificateSlug();
         }
     }
     $body['credential'] = $credential;
     return $body;
 }
 public function getBody()
 {
     $body = array();
     $credentialService = $this->container->get('credential');
     $c = $this->entity;
     // Alias for entity
     $formatter = $c->getFormatter();
     $body['name'] = $c->getName();
     $body['id'] = $c->getId();
     $body['slug'] = $c->getSlug();
     $body['oneLiner'] = $c->getOneLiner();
     $body['subTitle'] = $c->getSubTitle();
     $body['price'] = $c->getPrice();
     $body['pricePeriod'] = $c->getPricePeriod();
     $body['displayPrice'] = $formatter->getPrice();
     $body['durationMin'] = $c->getDurationMin();
     $body['durationMax'] = $c->getDurationMax();
     $body['displayDuration'] = $formatter->getDuration();
     $body['workloadMin'] = $c->getWorkloadMin();
     $body['workloadMax'] = $c->getDurationMax();
     $body['workloadType'] = $c->getWorkloadType();
     $body['displayWorkload'] = $formatter->getWorkload();
     $body['url'] = $c->getUrl();
     $body['description'] = $c->getDescription();
     $body['status'] = $c->getStatus();
     $body['image'] = $credentialService->getImage($c);
     $body['cardImage'] = $credentialService->getCardImage($c);
     $body['subjectSlug'] = null;
     $body['subject'] = null;
     if ($c->getSubject()) {
         $body['subjectSlug'] = $c->getSubject();
         $body['subject'] = Credential::$SUBJECTS[$c->getSubject()];
     }
     $orgs = array();
     // Array of names of organizations who are involved in creating the credential
     // Provider
     $body['provider'] = array();
     if ($c->getInitiative()) {
         $provider = $c->getInitiative();
         $body['certificateName'] = $formatter->getCertificateName();
         $body['certificateSlug'] = $formatter->getCertificateSlug();
         $bulletOrg = "{$formatter->getCertificateName()} via ";
         $orgs[] = $provider->getName();
         // Populate the organization list
     } else {
         // create an independent provider
         $provider = new Initiative();
         $provider->setName('Independent');
         $provider->setCode('independent');
     }
     $pDoc = new ProviderDocumentType($provider, $this->container);
     $body['provider'] = $pDoc->getBody();
     // Institutions
     $body['institutions'] = array();
     $institutions = array();
     foreach ($c->getInstitutions() as $ins) {
         $iDoc = new InstitutionDocumentType($ins, $this->container);
         $body['institutions'][] = $iDoc->getBody();
         $orgs[] = $ins->getName();
         // Populate the organization list
     }
     // Get the ratings
     $rating = $credentialService->calculateAverageRating($this->entity);
     $body['rating'] = $rating['rating'];
     $body['formattedRating'] = ReviewUtility::formatRating($rating['rating']);
     // Rounds the rating to the nearest 0.5
     $body['numRatings'] = $rating['numRatings'];
     $courses = array();
     foreach ($this->entity->getCourses() as $course) {
         $cDoc = new CourseDocumentType($course, $this->container);
         $courses[] = $cDoc->getBody();
     }
     $body['courses'] = $courses;
     $body['isSponsered'] = $c->isSponsored();
     // Build the bullet points in the array
     $bulletPoints = array();
     $bulletPoints[] = $bulletOrg . UniversalHelper::commaSeparateList($orgs);
     // Bullet Price and Duration
     $bulletPriceAndDuration = $formatter->getPrice();
     $displayDuration = $formatter->getDuration();
     if ($displayDuration) {
         $bulletPriceAndDuration .= ' for ' . $displayDuration;
     }
     $bulletPoints[] = $bulletPriceAndDuration;
     // Bullet effort
     $effort = $formatter->getWorkload();
     if ($effort) {
         $bulletPoints[] = $effort . ' of effort';
     }
     if ($provider->getName() == 'Coursera') {
         $bulletPoints[] = count($body['courses']) - 1 . ' courses + capstone project ';
     } elseif ($provider->getName() == 'HBX') {
         $bulletPoints[] = '3 courses and a final exam. Application Required';
     }
     if ($formatter->getEnrollment()) {
         $bulletPoints[] = $formatter->getEnrollment();
     }
     $body['bulletPoints'] = $bulletPoints;
     return $body;
 }
 /**
  * Renders the review widget
  * @param Request $request
  */
 public function getReviewWidgetAction(Request $request)
 {
     $cache = $this->get('Cache');
     $courseId = $request->query->get('course-id');
     $courseCode = $request->query->get('course-code');
     // Basic check
     if ((empty($courseId) || !is_numeric($courseId)) && empty($courseCode)) {
         // This returns an empty blank page
         return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', array('course' => null));
     }
     $data = $cache->get($this->generateReviewWidgetCacheKey($courseId, $courseCode), function () use($courseId, $courseCode) {
         $em = $this->getDoctrine()->getManager();
         $rs = $this->get('review');
         // STEP 1: Figure out which course it is
         $course = null;
         if (!empty($courseId) and is_numeric($courseId)) {
             $course = $em->getRepository('ClassCentralSiteBundle:Course')->find($courseId);
         }
         if (empty($course) && !empty($courseCode)) {
             $course = $em->getRepository('ClassCentralSiteBundle:Course')->findOneBy(array('shortName' => $courseCode));
             $courseId = $course->getId();
         }
         if ($course) {
             // Step 2: Get 5 reviews that are to be displayed
             $query = $em->createQueryBuilder();
             $query->add('select', 'r')->add('from', 'ClassCentralSiteBundle:Review r')->join('r.reviewSummary', 'rs')->add('orderBy', 'r.rating DESC')->add('where', 'r.course = :course')->andWhere('rs is NOT NULL')->andWhere('r.status = :status')->setMaxResults(5)->setParameter('course', $course)->setParameter(':status', Review::REVIEW_STATUS_APPROVED);
             $reviewsWithSummaries = array();
             foreach ($query->getQuery()->getResult() as $review) {
                 $reviewsWithSummaries[] = ReviewUtility::getReviewArray($review);
             }
             // Get reviews and ratings count
             $rating = $rs->getRatings($courseId);
             $reviews = $rs->getReviews($courseId);
             return array('reviews' => $reviews, 'rating' => $rating, 'formattedRating' => ReviewUtility::formatRating($rating), 'reviewsWithSummaries' => $reviewsWithSummaries, 'course' => $em->getRepository('ClassCentralSiteBundle:Course')->getCourseArray($course));
         } else {
             return array('course' => null);
         }
     });
     return $this->render('ClassCentralSiteBundle:Review:review.widget.html.twig', $data);
 }