From 053b7db0f0ef38cf72a27f5e20fcf3432fc9f11e Mon Sep 17 00:00:00 2001 From: Joey Hagedorn Date: Tue, 18 Jul 2006 16:00:12 +0000 Subject: New Reports: Summary view is now really fast 3 sec instead of 20; Summary enabled for historical view git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1966 ce84e21b-d406-0410-9b95-82705330c041 --- reports/brpt/importscript.py | 4 +- .../brpt/reports/templates/displays/summary.html | 17 +++- .../brpt/reports/templates/displays/timing.html | 2 +- .../reports/templatetags/django_templating_sigh.py | 5 +- reports/brpt/reports/views.py | 90 +++++++++++++--------- 5 files changed, 77 insertions(+), 41 deletions(-) diff --git a/reports/brpt/importscript.py b/reports/brpt/importscript.py index 7e79b79e2..d588df806 100755 --- a/reports/brpt/importscript.py +++ b/reports/brpt/importscript.py @@ -32,11 +32,11 @@ if __name__ == '__main__': opts, args = getopt(argv[1:], "hvudc:s:", ["help", "verbose", "updates" ,"debug", "clients=", "stats="]) except GetoptError, mesg: # print help information and exit: - print "%s\nUsage:\nStatReports.py [-h] [-v] [-u] [-d] -c -s " % (mesg) + print "%s\nUsage:\nimportscript.py [-h] [-v] [-u] [-d] -c -s " % (mesg) raise SystemExit, 2 for o, a in opts: if o in ("-h", "--help"): - print "Usage:\nStatReports.py [-h] [-v] -c -s \n" + print "Usage:\nimportscript.py [-h] [-v] -c -s \n" print "h : help; this message" print "v : verbose; print messages on record insertion/skip" print "u : updates; print status messages as items inserted semi-verbose" diff --git a/reports/brpt/reports/templates/displays/summary.html b/reports/brpt/reports/templates/displays/summary.html index f3c3c1339..cf253c25c 100644 --- a/reports/brpt/reports/templates/displays/summary.html +++ b/reports/brpt/reports/templates/displays/summary.html @@ -1,5 +1,8 @@ {% extends "base.html" %} - +{% block extra_header_info %} + + +{% endblock%} {% block title %}Display Index Listing{% endblock %} {% block pagebanner %}
@@ -10,5 +13,17 @@ {% endblock %} {% block content %} +
+ +Enter date or use calendar popup: +
+@ + +Calendar + + | +
+



{% include "displays/summary-block-direct-links.html" %} {% endblock %} diff --git a/reports/brpt/reports/templates/displays/timing.html b/reports/brpt/reports/templates/displays/timing.html index b734d9836..e951ff886 100644 --- a/reports/brpt/reports/templates/displays/timing.html +++ b/reports/brpt/reports/templates/displays/timing.html @@ -13,9 +13,9 @@ Report Run @ {% now "F j, Y P"%}

+
- Enter date or use calendar popup:
@ diff --git a/reports/brpt/reports/templatetags/django_templating_sigh.py b/reports/brpt/reports/templatetags/django_templating_sigh.py index 2d5f76e06..35378f444 100644 --- a/reports/brpt/reports/templatetags/django_templating_sigh.py +++ b/reports/brpt/reports/templatetags/django_templating_sigh.py @@ -18,7 +18,10 @@ class SetInteraction(template.Node): def __init__(self, times): self.times = times#do soemthing to select different interaction with host def render(self, context): - context['interaction'] = context['client_interaction_dict'][context['client'].id] + try: + context['interaction'] = context['client_interaction_dict'][context['client'].id] + except:#I don't fully know what the implications of this are. + pass return '' register.tag('set_interaction', set_interaction) diff --git a/reports/brpt/reports/views.py b/reports/brpt/reports/views.py index 695e91ab2..a8cf08276 100644 --- a/reports/brpt/reports/views.py +++ b/reports/brpt/reports/views.py @@ -4,8 +4,9 @@ from django.template import Context, loader from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render_to_response, get_object_or_404 from brpt.reports.models import Client, Interaction, Bad, Modified, Extra, Performance -from datetime import datetime - +from datetime import datetime, timedelta +from time import strptime +from django.db import connection def index(request): return render_to_response('index.html') @@ -22,28 +23,32 @@ def client_detail(request, hostname = None, pk = None): else: interaction = client.interactions.get(pk=pk)#can this be a get object or 404? + for q in connection.queries: + print q + + + return render_to_response('clients/detail.html',{'client': client, 'interaction': interaction}) -def display_sys_view(request): - client_lists = prepare_client_lists(request) +def display_sys_view(request, timestamp = 'now'): + client_lists = prepare_client_lists(request, timestamp) - from django.db import connection for q in connection.queries: print q return render_to_response('displays/sys_view.html', client_lists) -def display_summary(request): - client_lists = prepare_client_lists(request) +def display_summary(request, timestamp = 'now'): + + client_lists = prepare_client_lists(request, timestamp) - from django.db import connection for q in connection.queries: print q return render_to_response('displays/summary.html', client_lists) -def display_timing(request, timestamp = None): +def display_timing(request, timestamp = 'now'): #We're going to send a list of dictionaries. Each dictionary will be a row in the table #+------+-------+----------------+-----------+---------+----------------+-------+ #| name | parse | probe download | inventory | install | cfg dl & parse | total | @@ -51,7 +56,7 @@ def display_timing(request, timestamp = None): client_list = Client.objects.all().order_by('name') stats_list = [] - if not timestamp == None: + if not timestamp == 'now': results = Performance.objects.performance_per_client(timestamp.replace("@"," ")) else: results = Performance.objects.performance_per_client() @@ -104,41 +109,51 @@ def display_timing(request, timestamp = None): def display_index(request): return render_to_response('displays/index.html') -def prepare_client_lists(request): - client_list = Client.objects.all().order_by('name')#change this to order by interaction's state +def prepare_client_lists(request, timestamp = 'now'): + timestamp = timestamp.replace("@"," ") + #client_list = Client.objects.all().order_by('name')#change this to order by interaction's state client_interaction_dict = {} clean_client_list = [] bad_client_list = [] extra_client_list = [] modified_client_list = [] stale_up_client_list = [] - stale_all_client_list = [] + #stale_all_client_list = [] down_client_list = [] - [client_interaction_dict.__setitem__(x.client_id,x) for x in Interaction.objects.interaction_per_client('now')]# or you can specify a time like this: '2007-01-01 00:00:00' - - for client in client_list: - #i = client_interaction_dict[client.id] - - if client_interaction_dict[client.id].isclean(): - clean_client_list.append(client) - else: - bad_client_list.append(client) - if client_interaction_dict[client.id].isstale(): - if client_interaction_dict[client.id].pingable: - stale_up_client_list.append(client) - stale_all_client_list.append(client) - else: - stale_all_client_list.append(client) - if not client_interaction_dict[client.id].pingable: - down_client_list.append(client) + cursor = connection.cursor() + + interact_queryset = Interaction.objects.interaction_per_client(timestamp) + # or you can specify a time like this: '2007-01-01 00:00:00' + [client_interaction_dict.__setitem__(x.client_id,x) for x in interact_queryset] + client_list = Client.objects.filter(id__in=client_interaction_dict.keys()).order_by('name') + + [clean_client_list.append(x) for x in Client.objects.filter(id__in=[y.client_id for y in interact_queryset.filter(state='clean')])] + [bad_client_list.append(x) for x in Client.objects.filter(id__in=[y.client_id for y in interact_queryset.filter(state='dirty')])] + [down_client_list.append(x) for x in Client.objects.filter(id__in=[y.client_id for y in interact_queryset.filter(pingable='N')])]#need to change the PINGING data structure + + if (timestamp == 'now' or timestamp == None): + cursor.execute("select client_id, MAX(timestamp) as timestamp from reports_interaction GROUP BY client_id") + stale_all_client_list = Client.objects.filter(id__in=[x[0] for x in cursor.fetchall() if datetime.now() - x[1]>timedelta(days=1)]) + else: + cursor.execute("select client_id, timestamp, MAX(timestamp) as timestamp from reports_interaction "+ + "WHERE timestamp < %s GROUP BY client_id", [timestamp]) + t = strptime(timestamp,"%Y-%m-%d %H:%M:%S") + datetimestamp = datetime(t[0],t[1],t[2],t[3],t[4],t[5]) + stale_all_client_list = Client.objects.filter(id__in=[x[0] for x in cursor.fetchall() if datetimestamp - x[1] > timedelta(days=1)]) - if len(client_interaction_dict[client.id].modified_items.all()) > 0: - modified_client_list.append(client) - if len(client_interaction_dict[client.id].extra_items.all()) > 0: - extra_client_list.append(client) + [stale_up_client_list.append(x) for x in stale_all_client_list if client_interaction_dict[x.id].pingable=='Y'] + + + cursor.execute("SELECT reports_client.id FROM reports_client, reports_interaction, reports_modified_interactions WHERE reports_client.id=reports_interaction.client_id AND reports_interaction.id = reports_modified_interactions.interaction_id GROUP BY reports_client.id") + modified_client_list = Client.objects.filter(id__in=[x[0] for x in cursor.fetchall()]) + + cursor.execute("SELECT reports_client.id FROM reports_client, reports_interaction, reports_extra_interactions WHERE reports_client.id=reports_interaction.client_id AND reports_interaction.id = reports_extra_interactions.interaction_id GROUP BY reports_client.id") + extra_client_list = Client.objects.filter(id__in=[x[0] for x in cursor.fetchall()]) + + if timestamp == 'now': + timestamp = datetime.now().isoformat('@') - #if the list is empty set it to None? return {'client_list': client_list, 'client_interaction_dict':client_interaction_dict, 'clean_client_list': clean_client_list, @@ -147,4 +162,7 @@ def prepare_client_lists(request): 'modified_client_list': modified_client_list, 'stale_up_client_list': stale_up_client_list, 'stale_all_client_list': stale_all_client_list, - 'down_client_list': down_client_list} + 'down_client_list': down_client_list, + 'timestamp' : timestamp, + 'timestamp_date' : timestamp[:10], + 'timestamp_time' : timestamp[11:19]} -- cgit v1.2.3-1-g7c22