Skip to content

Commit 7512bb3

Browse files
committed
fixes
1 parent 6bb809f commit 7512bb3

File tree

2 files changed

+201
-0
lines changed

2 files changed

+201
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
'use strict';
2+
3+
const mongoose = require('mongoose');
4+
const countries = require('countries');
5+
const CourseFeedback = require('../models/courseFeedback');
6+
const CourseGroup = require('../models/courseGroup');
7+
const Course = require('../models/course');
8+
const User = require('users').User;
9+
const _ = require('lodash');
10+
const CacheEntry = require('cache').CacheEntry;
11+
12+
exports.get = function*() {
13+
14+
this.locals.course = yield Course.findOne({
15+
slug: this.params.course
16+
});
17+
18+
if (!this.locals.course) {
19+
this.throw(404);
20+
}
21+
22+
let type = this.accepts('json', 'html');
23+
24+
if (type == 'html') {
25+
26+
this.locals.title = "Отзыв о курсе\n" + this.locals.course.title;
27+
28+
// star => count
29+
let feedbackStats = yield* CacheEntry.getOrGenerate({
30+
key: 'courses:feedback:' + this.params.slug,
31+
tags: ['courses:feedback']
32+
}, getFeedbackStats.bind(this, this.locals.course));
33+
34+
this.body = this.render('feedback/list', {
35+
stats: feedbackStats
36+
});
37+
38+
}
39+
40+
41+
};
42+
43+
44+
function* getFeedbackStats(course) {
45+
46+
let groups = yield CourseGroup.find({
47+
course: course.id
48+
});
49+
50+
let groupIds = _.pluck(groups, '_id');
51+
52+
let stats = yield CourseFeedback.aggregate([
53+
{
54+
$match: {
55+
group: {
56+
$in: groupIds
57+
}
58+
}
59+
},
60+
{
61+
$group: {
62+
_id: '$stars',
63+
count: {
64+
$sum: 1
65+
}
66+
}
67+
}
68+
]).exec();
69+
70+
let totalFeedbacks = stats.reduce(function(prev, next) { return prev + next.count; }, 0);
71+
72+
console.log(totalFeedbacks);
73+
// default stats (if no stars for a star)
74+
let starStatsPopulated = {};
75+
for(let i=1; i<=5; i++) starStatsPopulated[i] = {
76+
count: 0,
77+
fraction: 0
78+
};
79+
80+
stats.forEach(function(stat) {
81+
starStatsPopulated[stat._id] = {
82+
count: stat.count,
83+
fraction: stat.count ? +(stat.count / totalFeedbacks).toFixed(2) : 0
84+
};
85+
});
86+
87+
88+
let recommendStats = yield CourseFeedback.aggregate([
89+
{
90+
$match: {
91+
group: {
92+
$in: groupIds
93+
}
94+
}
95+
},
96+
{
97+
$group: {
98+
_id: '$recommend',
99+
count: {
100+
$sum: 1
101+
}
102+
}
103+
}
104+
]).exec();
105+
106+
107+
recommendStats = _.groupBy(recommendStats, '_id');
108+
109+
if (!recommendStats[true]) recommendStats[true] = [{count: 0}];
110+
if (!recommendStats[false]) recommendStats[false] = [{count: 0}];
111+
112+
// 76% recommend
113+
let recommendFraction = recommendStats[true][0].count / (recommendStats[true][0].count + recommendStats[false][0].count);
114+
115+
return {
116+
stars: starStatsPopulated,
117+
recommendFraction: recommendFraction,
118+
total: totalFeedbacks
119+
};
120+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
extends /layouts/main
2+
3+
block append variables
4+
5+
- var layout_header_class = "main__header_center"
6+
- var layout_main_class = "main_width-limit"
7+
- var breadcrumbs = [{ title: 'Учебник', url: '/' }, { title: 'Курсы', url: '/courses' }, { title: course.title, url: course.getUrl() }]
8+
- var content_class = '_center'
9+
- var siteToolbarCurrentSection = "courses"
10+
- var sitetoolbar = true
11+
- var statsBarLength = 240
12+
- console.log(stats.stars);
13+
14+
block content
15+
16+
script var feedbackStats = !{escapeJSON(stats)};
17+
18+
+b.feedback-stat
19+
+e('ul').list
20+
+e('li').item._active Отлично
21+
+e('span').status
22+
+e('span').status-i(style="width: " + stats.stars[5].fraction * statsBarLength + "px")
23+
+e('li').item Хорошо
24+
+e('span').status
25+
+e('span').status-i(style="width: " + stats.stars[4].fraction * statsBarLength + "px")
26+
+e('li').item Нормально
27+
+e('span').status
28+
+e('span').status-i(style="width: " + stats.stars[3].fraction * statsBarLength + "px")
29+
+e('li').item Так себе
30+
+e('span').status
31+
+e('span').status-i(style="width: " + stats.stars[2].fraction * statsBarLength + "px")
32+
+e('li').item Плохо
33+
+e('span').status
34+
+e('span').status-i(style="width: " + stats.stars[1].fraction * statsBarLength + "px")
35+
+b.pie
36+
+e.text
37+
+e('strong').percents #{stats.recommendFraction * 100}%
38+
+e('span').advice Пользователей рекомендуют эти курсы
39+
+b('section').course-feedbacks
40+
+e('h2').title
41+
+e('span').title-n 286
42+
| &nbsp;отзывов
43+
| с оценкой
44+
+e('span').title-mark !{' '} «Отлично»
45+
+e('a').show-all показать все
46+
+e('article').feedback
47+
+b.course-feedback._result._external
48+
+e.user
49+
+e.userpic
50+
+e('img').userpic-img(src="/img/userpic/userpic.svg")
51+
+e('span').username
52+
+e('a').mjmusername-link(href="/123") Александр Луговой
53+
+e('span').country
54+
+e('img').country-flag(src='/img/flags/ru.svg' width=16 height=12)
55+
+e('span').country-text Россия, Москва
56+
+e('span').date 12 Мар 2015
57+
+b.rating._4
58+
for raiting in [1,2,3,4,5]
59+
+e('i').star
60+
+e.name Рекомендует курс “Javascript, DOM, интерфейсы”
61+
+e.body
62+
p Очень доволен данным курсом.Я сам из Республики Беларусь.Практический все, с кем я общался по js, хоть раз да заходили на ваш сайт. Если кто-то решится из РБ пройти этот курс, рекомендую. Понравилось: подача материала, расставленные приоритеты в изучении, только актуальные данные , а не устаревшая информация. Мне не хватило пару занятий по организации проекта на js и про шаблоны. Хотел пройти курс у человека, который ПОЛНОСТЬЮ ПРАКТИК. Очень радостно, что вы поделились своим опытом!!! Спасибо.
63+
+e('article').feedback
64+
+b.course-feedback._result._external
65+
+e.user
66+
+e.userpic
67+
+e('img').userpic-img(src="/img/userpic/userpic.svg")
68+
+e('span').username
69+
+e('a').username-link(href="/123") Александр Луговой
70+
+e('span').country
71+
+e('img').country-flag(src='/img/flags/ru.svg' width=16 height=12)
72+
+e('span').country-text Россия, Москва
73+
+e('span').date 12 Мар 2015
74+
+b.rating._4
75+
for raiting in [1,2,3,4,5]
76+
+e('i').star
77+
+e.name Рекомендует курс “Javascript, DOM, интерфейсы”
78+
+e.body
79+
p Очень доволен данным курсом.Я сам из Республики Беларусь.Практический все, с кем я общался по js, хоть раз да заходили на ваш сайт. Если кто-то решится из РБ пройти этот курс, рекомендую. Понравилось: подача материала, расставленные приоритеты в изучении, только актуальные данные , а не устаревшая информация. Мне не хватило пару занятий по организации проекта на js и про шаблоны. Хотел пройти курс у человека, который ПОЛНОСТЬЮ ПРАКТИК. Очень радостно, что вы поделились своим опытом!!! Спасибо.
80+
81+

0 commit comments

Comments
 (0)