From 850bc96a7822955047794accc08a7ba6cfb897e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Sat, 13 Apr 2013 14:53:54 +0200 Subject: [PATCH] provide file type statistics for admins --- .../_design/episode_stats/views/filetypes/map.js | 2 +- mygpo/admin/templates/admin/filetypes.html | 36 ++++++++++++++++++++++ mygpo/admin/urls.py | 7 ++++- mygpo/admin/views.py | 20 +++++++++++- mygpo/db/couchdb/episode.py | 14 +++++++++ 5 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 mygpo/admin/templates/admin/filetypes.html diff --git a/couchdb/_design/episode_stats/views/filetypes/map.js b/couchdb/_design/episode_stats/views/filetypes/map.js index fa9a6d51..eadb4a93 100644 --- a/couchdb/_design/episode_stats/views/filetypes/map.js +++ b/couchdb/_design/episode_stats/views/filetypes/map.js @@ -15,7 +15,7 @@ function(doc) /* make sure we exclude obvious non-extensions */ if (ext.length < 10) { - emit(ext, url); + emit(ext.toLowerCase(), url); } } } diff --git a/mygpo/admin/templates/admin/filetypes.html b/mygpo/admin/templates/admin/filetypes.html new file mode 100644 index 00000000..b4c06b56 --- /dev/null +++ b/mygpo/admin/templates/admin/filetypes.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% load i18n %} +{% load charts %} +{% load utils %} + +{% load menu %} +{% block mainmenu %}{{ "/admin/"|main_menu }}{% endblock %} +{% block sectionmenu %}{{ "/admin/"|section_menu:"Admin" }}{% endblock %} + +{% block title %}{% trans "File Type Stats" %}{% endblock %} + +{% block header %} +

{% trans "File Type Stats" %}

+{% endblock %} + +{% block content %} + + + + + + + + {% for filetype, num in stats %} + + + + + + {% endfor %} + +
{% trans "#" %}{% trans "File Type" %}{% trans "Episode URLs" %}
{{ forloop.counter }}{{ filetype }}{% vertical_bar num max_num %}
+ + +{% endblock %} + diff --git a/mygpo/admin/urls.py b/mygpo/admin/urls.py index b6f631d9..ff475cb5 100644 --- a/mygpo/admin/urls.py +++ b/mygpo/admin/urls.py @@ -2,7 +2,8 @@ from django.conf.urls import * from mygpo.admin.views import Overview, MergeSelect, MergeVerify, \ MergeProcess, MergeStatus, ClientStatsView, ClientStatsJsonView, \ - UserAgentStatsView, StatsView, StatsJsonView, HostInfo + UserAgentStatsView, StatsView, StatsJsonView, HostInfo, \ + FiletypeStatsView urlpatterns = patterns('mygpo.admin.views', url(r'^$', Overview.as_view(), name='admin-overview'), @@ -21,4 +22,8 @@ urlpatterns = patterns('mygpo.admin.views', url(r'^stats$', StatsView.as_view(), name='stats'), url(r'^stats\.json$', StatsJsonView.as_view(), name='stats-json'), + + url(r'^filetypes/$', + FiletypeStatsView.as_view(), + name='admin-filetypes'), ) diff --git a/mygpo/admin/views.py b/mygpo/admin/views.py index 0ff7a3fc..a586c734 100644 --- a/mygpo/admin/views.py +++ b/mygpo/admin/views.py @@ -23,7 +23,7 @@ from mygpo.utils import get_git_head from mygpo.api.httpresponse import JsonResponse from mygpo.cel import celery from mygpo.db.couchdb import get_main_database -from mygpo.db.couchdb.episode import episode_count +from mygpo.db.couchdb.episode import episode_count, filetype_stats from mygpo.db.couchdb.podcast import podcast_count, podcast_for_url @@ -276,3 +276,21 @@ class StatsJsonView(StatsView): def get(self, request): stats = self._get_stats() return JsonResponse(stats) + + +class FiletypeStatsView(AdminView): + + template_name = 'admin/filetypes.html' + + def get(self, request): + stats = filetype_stats() + + if len(stats): + max_num = stats.most_common(1)[0][1] + else: + max_num = 0 + + return self.render_to_response({ + 'max_num': max_num, + 'stats': stats.most_common(), + }) diff --git a/mygpo/db/couchdb/episode.py b/mygpo/db/couchdb/episode.py index e7b92ffd..f03d0a1f 100644 --- a/mygpo/db/couchdb/episode.py +++ b/mygpo/db/couchdb/episode.py @@ -1,5 +1,6 @@ from hashlib import sha1 from datetime import datetime +from collections import Counter from django.core.cache import cache @@ -384,6 +385,19 @@ def chapters_for_episode(episode_id): return map(_wrap_chapter, r) +def filetype_stats(): + """ Returns a filetype counter over all episodes """ + + db = get_main_database() + r = db.view('episode_stats/filetypes', + stale = 'update_after', + reduce = True, + group_level = 1, + ) + + return Counter({x['key']: x['value'] for x in r}) + + def _wrap_chapter(res): from mygpo.users.models import Chapter user = res['key'][1] -- 2.11.4.GIT