X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/b80d47e7da6ac90a56b9705089f246a8050ee364..1876ec0c8caf982704410cee305d0cde218421d4:/forum/views/admin.py diff --git a/forum/views/admin.py b/forum/views/admin.py index 421fbc9..dd1f3f5 100644 --- a/forum/views/admin.py +++ b/forum/views/admin.py @@ -1,17 +1,18 @@ from datetime import datetime, timedelta +import time from django.shortcuts import render_to_response from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404 from django.template import RequestContext from django.utils.translation import ugettext as _ +from django.utils import simplejson from django.db.models import Sum from forum.settings.base import Setting from forum.settings.forms import SettingsSetForm -from forum.models import Activity, Question, Answer, User, Node -from forum import const +from forum.models import Question, Answer, User, Node, Action from forum import settings def super_user_required(fn): @@ -19,20 +20,84 @@ def super_user_required(fn): if request.user.is_authenticated() and request.user.is_superuser: return fn(request, *args, **kwargs) else: - raise Http404 + return HttpResponseForbidden() return wrapper -@super_user_required -def index(request): - return render_to_response('osqaadmin/index.html', { - 'sets': get_all_sets(), - 'settings_pack': settings.SETTINGS_PACK, +def admin_page(fn): + @super_user_required + def wrapper(request, *args, **kwargs): + res = fn(request, *args, **kwargs) + if isinstance(res, tuple): + template, context = res + context['basetemplate'] = settings.DJSTYLE_ADMIN_INTERFACE and "osqaadmin/djstyle_base.html" or "osqaadmin/base.html" + context['allsets'] = Setting.sets + context['othersets'] = sorted( + [s for s in Setting.sets.values() if not s.name in + ('basic', 'users', 'email', 'paths', 'extkeys', 'repgain', 'minrep', 'voting', 'badges', 'about', 'faq', 'sidebar', + 'form', 'moderation')] + , lambda s1, s2: s1.weight - s2.weight) + return render_to_response(template, context, context_instance=RequestContext(request)) + else: + return res + + return wrapper + +@admin_page +def dashboard(request): + return ('osqaadmin/dashboard.html', { + 'settings_pack': unicode(settings.SETTINGS_PACK), 'statistics': get_statistics(), 'recent_activity': get_recent_activity(), - }, context_instance=RequestContext(request)) + }) + +@super_user_required +def interface_switch(request): + if request.GET and request.GET.get('to', None) and request.GET['to'] in ('default', 'djstyle'): + settings.DJSTYLE_ADMIN_INTERFACE.set_value(request.GET['to'] == 'djstyle') -@super_user_required + return HttpResponseRedirect(reverse('admin_index')) + +@admin_page +def statistics(request): + today = datetime.now() + last_month = today - timedelta(days=30) + + last_month_questions = Question.objects.filter(deleted=None, added_at__gt=last_month + ).order_by('added_at').values_list('added_at', flat=True) + + last_month_n_questions = Question.objects.filter(deleted=None, added_at__lt=last_month).count() + qgraph_data = simplejson.dumps([ + (time.mktime(d.timetuple()) * 1000, i + last_month_n_questions) + for i, d in enumerate(last_month_questions) + ]) + + last_month_users = User.objects.filter(date_joined__gt=last_month + ).order_by('date_joined').values_list('date_joined', flat=True) + + last_month_n_users = User.objects.filter(date_joined__lt=last_month).count() + + ugraph_data = simplejson.dumps([ + (time.mktime(d.timetuple()) * 1000, i + last_month_n_users) + for i, d in enumerate(last_month_users) + ]) + + return 'osqaadmin/statistics.html', { + 'graphs': [ + { + 'id': 'questions_graph', + 'caption': _("Questions Graph"), + 'data': qgraph_data + },{ + 'id': 'userss_graph', + 'caption': _("Users Graph"), + 'data': ugraph_data + } + ] + } + + +@admin_page def settings_set(request, set_name): set = Setting.sets.get(set_name, None) @@ -48,35 +113,31 @@ def settings_set(request, set_name): if set_name in ('minrep', 'badges', 'repgain'): settings.SETTINGS_PACK.set_value("custom") + + return HttpResponseRedirect(reverse('admin_set', args=[set_name])) else: form = SettingsSetForm(set) - return render_to_response('osqaadmin/set.html', { + return 'osqaadmin/set.html', { 'form': form, 'markdown': set.markdown, - 'sets': get_all_sets(), - }, context_instance=RequestContext(request)) + } -def get_all_sets(): - return sorted(Setting.sets.values(), lambda s1, s2: s1.weight - s2.weight) def get_recent_activity(): - return Activity.objects.filter(activity_type__in=( - const.TYPE_ACTIVITY_ASK_QUESTION, const.TYPE_ACTIVITY_ANSWER, - const.TYPE_ACTIVITY_COMMENT_QUESTION, const.TYPE_ACTIVITY_COMMENT_ANSWER, - const.TYPE_ACTIVITY_MARK_ANSWER)).order_by('-active_at')[0:10] + return Action.objects.order_by('-action_date')[0:30] def get_statistics(): return { 'total_users': User.objects.all().count(), 'users_last_24': User.objects.filter(date_joined__gt=(datetime.now() - timedelta(days=1))).count(), - 'total_questions': Question.objects.filter(deleted=False).count(), - 'questions_last_24': Question.objects.filter(deleted=False, added_at__gt=(datetime.now() - timedelta(days=1))).count(), - 'total_answers': Answer.objects.filter(deleted=False).count(), - 'answers_last_24': Answer.objects.filter(deleted=False, added_at__gt=(datetime.now() - timedelta(days=1))).count(), + 'total_questions': Question.objects.filter(deleted=None).count(), + 'questions_last_24': Question.objects.filter(deleted=None, added_at__gt=(datetime.now() - timedelta(days=1))).count(), + 'total_answers': Answer.objects.filter(deleted=None).count(), + 'answers_last_24': Answer.objects.filter(deleted=None, added_at__gt=(datetime.now() - timedelta(days=1))).count(), } -@super_user_required +@super_user_required def go_bootstrap(request): #todo: this is the quick and dirty way of implementing a bootstrap mode try: @@ -161,12 +222,12 @@ def go_defaults(request): def recalculate_denormalized(request): for n in Node.objects.all(): n = n.leaf - n.vote_up_count = n.votes.filter(canceled=False, vote=1).count() - n.vote_down_count = n.votes.filter(canceled=False, vote=-1).count() + n.score = n.votes.aggregate(score=Sum('value'))['score'] + if not n.score: n.score = 0 n.save() for u in User.objects.all(): - u.reputation = u.reputes.filter(canceled=False).aggregate(reputation=Sum('value'))['reputation'] + u.reputation = u.reputes.aggregate(reputation=Sum('value'))['reputation'] u.save() request.user.message_set.create(message=_('All values recalculated'))