diff --git a/stats.py b/stats.py index 8ef31660c07b1e13c41454b9ee5a716a23fbfa1c..cd3f5b617257db9649f3136f7eacb903ae4cb735 100644 --- a/stats.py +++ b/stats.py @@ -4,10 +4,11 @@ from jobs import date_json_handler from hashlib import md5 @app.route('/internal/stats') +@app.route('/internal/stats/<semester>') @register_navbar('Statistiken', icon='stats') @mod_required -def stats(): - return render_template('stats.html') +def stats(semester=None): + return render_template('stats.html',semester=semester) statsqueries = {} statsqueries['formats_views'] = "SELECT formats.description AS labels, count(DISTINCT log.id) AS `values` FROM log JOIN videos ON (videos.id = log.video) JOIN formats ON (formats.id = videos.video_format) GROUP BY formats.id" @@ -18,6 +19,7 @@ statsqueries['organizer_courses'] = "SELECT courses.organizer AS labels, count(c statsqueries['categories_lectures'] = "SELECT courses.subject AS labels, count(lectures.id) AS `values` FROM lectures JOIN courses ON (courses.id = lectures.course_id) WHERE lectures.visible GROUP BY courses.subject ORDER BY `values` DESC LIMIT 100" statsqueries['lecture_views'] = "SELECT lectures.time AS x, count(DISTINCT log.id) AS y FROM log JOIN videos ON (videos.id = log.video) JOIN lectures ON (lectures.id = videos.lecture_id) WHERE (lectures.course_id = ?) GROUP BY lectures.id ORDER BY lectures.time" statsqueries['live_views'] = "SELECT hlslog.segment AS x, COUNT(DISTINCT hlslog.id) AS y FROM hlslog WHERE hlslog.lecture = ? GROUP BY hlslog.segment ORDER BY hlslog.segment" +statsqueries['lecture_totalviews'] = "SELECT 42" def plotly_date_handler(obj): return obj.strftime("%Y-%m-%d %H:%M:%S") @@ -45,10 +47,52 @@ def stats_viewsperday(req, param=""): query_expr = 'SELECT date, trace, value AS y FROM logcache WHERE req = "%s" AND param = ? UNION SELECT * FROM (%s) AS cachetmp' date_subexpr = 'SELECT CASE WHEN MAX(date) IS NULL THEN "2000-00-00" ELSE MAX(date) END AS t FROM `logcache` WHERE req = "%s" AND param = ?' queries = { - 'lecture': 'SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y FROM log JOIN videos ON videos.id = log.video JOIN formats ON formats.id = videos.video_format WHERE log.date > %T AND videos.lecture_id = ? GROUP BY log.date, videos.video_format UNION SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y FROM log JOIN videos ON videos.id = log.video WHERE log.date > %T AND videos.lecture_id = ? GROUP BY log.date', - 'course': 'SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y FROM log JOIN videos ON videos.id = log.video JOIN lectures ON lectures.id = videos.lecture_id JOIN formats ON formats.id = videos.video_format WHERE log.date > %T AND lectures.course_id = ? GROUP BY log.date, videos.video_format UNION SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y FROM log JOIN videos ON videos.id = log.video JOIN lectures ON lectures.id = videos.lecture_id WHERE log.date > %T AND lectures.course_id = ? GROUP BY log.date', - 'global': 'SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y FROM log JOIN videos ON videos.id = log.video JOIN formats ON formats.id = videos.video_format WHERE log.date > %T GROUP BY log.date, videos.video_format UNION SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y FROM log WHERE log.date > %T GROUP BY log.date', - 'courses': 'SELECT log.date AS date, courses.handle AS trace, COUNT(DISTINCT log.id) AS y FROM log JOIN videos ON videos.id = log.video JOIN lectures ON lectures.id = videos.lecture_id JOIN courses ON courses.id = lectures.course_id WHERE log.date > %T GROUP BY log.date, courses.id' + 'lecture': # views per day per lecture (split per format) + '''SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y + FROM log + JOIN videos ON videos.id = log.video + JOIN formats ON formats.id = videos.video_format + WHERE log.date > %T AND videos.lecture_id = ? + GROUP BY log.date, videos.video_format + UNION + SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y + FROM log JOIN videos ON videos.id = log.video + WHERE log.date > %T AND videos.lecture_id = ? GROUP BY log.date''', + + 'course': # views per day per format for a single course + '''SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y + FROM log JOIN videos ON videos.id = log.video + JOIN lectures ON lectures.id = videos.lecture_id + JOIN formats ON formats.id = videos.video_format + WHERE log.date > %T AND lectures.course_id = ? + GROUP BY log.date, videos.video_format + UNION + SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y + FROM log + JOIN videos ON videos.id = log.video + JOIN lectures ON lectures.id = videos.lecture_id + WHERE log.date > %T AND lectures.course_id = ? + GROUP BY log.date''', + + 'global': # views per format per day (split per format) + '''SELECT log.date AS date, formats.description AS trace, COUNT(DISTINCT log.id) AS y + FROM log + JOIN videos ON videos.id = log.video + JOIN formats ON formats.id = videos.video_format + WHERE log.date > %T GROUP BY log.date, videos.video_format + UNION + SELECT log.date AS date, "total" AS trace, COUNT(DISTINCT log.id) AS y + FROM log + WHERE log.date > %T + GROUP BY log.date''', + + 'courses': # views per course per day + '''SELECT log.date AS date, courses.handle AS trace, COUNT(DISTINCT log.id) AS y + FROM log JOIN videos ON videos.id = log.video + JOIN lectures ON lectures.id = videos.lecture_id + JOIN courses ON courses.id = lectures.course_id + WHERE log.date > %T + GROUP BY log.date, courses.id''' } expr = queries[req].replace('%T', '"'+query(date_subexpr%('viewsperday.'+req), param)[0]['t']+'"') params = [param]*expr.count('?')