import base64 import pickle import redis import datetime from operator import countOf from collections import defaultdict from django.http import HttpResponse from django.shortcuts import render from django.contrib.auth.decorators import login_required from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import User from django.conf import settings from django.utils import feedgenerator from django.http import HttpResponseForbidden from apps.statistics.models import MStatistics, MFeedback from apps.statistics.rstats import round_time from apps.profile.models import PaymentHistory from utils import log as logging def dashboard_graphs(request): statistics = MStatistics.all() return render( request, 'statistics/render_statistics_graphs.xhtml', {'statistics': statistics} ) def feedback_table(request): feedbacks = MFeedback.all() return render( request, 'statistics/render_feedback_table.xhtml', {'feedbacks': feedbacks} ) def revenue(request): data = {} data['title'] = "NewsBlur Revenue" data['link'] = "https://www.newsblur.com" data['description'] = "Revenue" data['lastBuildDate'] = datetime.datetime.utcnow() data['generator'] = 'NewsBlur Revenue Writer' data['docs'] = None rss = feedgenerator.Atom1Feed(**data) report = PaymentHistory.report() content = "%s revenue: $%s
%s" % (datetime.datetime.now().strftime('%Y'), report['annual'], report['output'].replace('\n', '
')) story = { 'title': "Daily snapshot: %s" % (datetime.datetime.now().strftime('%a %b %-d, %Y')), 'link': 'https://www.newsblur.com', 'description': content, 'unique_id': datetime.datetime.now().strftime('%a %b %-d, %Y'), 'pubdate': datetime.datetime.now(), } rss.add_item(**story) logging.user(request, "~FBGenerating Revenue RSS feed: ~FM%s" % ( request.META.get('HTTP_USER_AGENT', "")[:24] )) return HttpResponse(rss.writeString('utf-8'), content_type='application/rss+xml') @login_required def slow(request): r = redis.Redis(connection_pool=settings.REDIS_STATISTICS_POOL) if not request.user.is_staff and not settings.DEBUG: logging.user(request, "~SKNON-STAFF VIEWING SLOW STATUS!") assert False return HttpResponseForbidden() now = datetime.datetime.now() all_queries = {} user_id_counts = {} path_counts = {} users = {} for minutes_ago in range(60*6): dt_ago = now - datetime.timedelta(minutes=minutes_ago) minute = round_time(dt_ago, round_to=60) dt_ago_str = minute.strftime("%a %b %-d, %Y %H:%M") name = f"SLOW:{minute.strftime('%s')}" minute_queries = r.lrange(name, 0, -1) for query_raw in minute_queries: query = pickle.loads(base64.b64decode(query_raw)) user_id = query['user_id'] if dt_ago_str not in all_queries: all_queries[dt_ago_str] = [] if user_id in users: user = users[user_id] elif int(user_id) != 0: try: user = User.objects.get(pk=user_id) except User.DoesNotExist: continue users[user_id] = user else: user = AnonymousUser() users[user_id] = user query['user'] = user query['datetime'] = minute all_queries[dt_ago_str].append(query) if user_id not in user_id_counts: user_id_counts[user_id] = 0 user_id_counts[user_id] += 1 if query['path'] not in path_counts: path_counts[query['path']] = 0 path_counts[query['path']] += 1 user_counts = [] for user_id, count in user_id_counts.items(): user_counts.append({'user': users[user_id], 'count': count}) return render(request, 'statistics/slow.xhtml', { 'all_queries': all_queries, 'user_counts': user_counts, 'path_counts': path_counts, })