summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Reports/reports/views.py
diff options
context:
space:
mode:
authorTim Laszlo <tim.laszlo@gmail.com>2010-06-03 14:59:34 +0000
committerSol Jerome <solj@ices.utexas.edu>2010-06-03 10:07:57 -0500
commit8170fac20bedde567bf9cf482bca894ef97f8a07 (patch)
tree5531ab1004150c9052bf5125a2b05ab63964a664 /src/lib/Server/Reports/reports/views.py
parent5d73365218e0cbca0befc9b030c31d0d4cea8f9c (diff)
downloadbcfg2-8170fac20bedde567bf9cf482bca894ef97f8a07.tar.gz
bcfg2-8170fac20bedde567bf9cf482bca894ef97f8a07.tar.bz2
bcfg2-8170fac20bedde567bf9cf482bca894ef97f8a07.zip
Performance updates to dynamic reports
Added bad_entries, modified_entries, extra_entries database fields to reduce the number of calls. Created (bad|modified|extra)_entry_count methods to return the sbove fields and populate any missing values. Consolidate interaction_per_client query. Added unique constraint on client_id and timestamp in Interaction. Greatly improved the performance of interaction_per_client. Modified detailed-list.html to add modified field and reduce the database calls to two... unless the bad_entries, modified_entries, extra_entries fields need updating. Modified client index to use only two database queries. Adding automatic update Updating load_stats to update counters in reports_interaction git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5885 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Server/Reports/reports/views.py')
-rw-r--r--src/lib/Server/Reports/reports/views.py60
1 files changed, 34 insertions, 26 deletions
diff --git a/src/lib/Server/Reports/reports/views.py b/src/lib/Server/Reports/reports/views.py
index 9e7dee77a..eea847bf4 100644
--- a/src/lib/Server/Reports/reports/views.py
+++ b/src/lib/Server/Reports/reports/views.py
@@ -90,14 +90,22 @@ def modified_item_index(request, timestamp = 'now'):
def client_index(request, timestamp = 'now'):
timestamp = timestamp.replace("@"," ")
- client_list = Client.objects.active(timestamp).order_by('name')
- client_list_a = client_list[len(client_list)/2:]
- client_list_b = client_list[:len(client_list)/2]
+
+ c_dict = dict()
+ [c_dict.__setitem__(cl.id,cl.name) for cl in Client.objects.active(timestamp).order_by('name')]
+
+ list = []
+ for inter in Interaction.objects.interaction_per_client(timestamp):
+ if inter.client_id in c_dict:
+ list.append([c_dict[inter.client_id], inter])
+ list.sort(lambda a,b: cmp(a[0], b[0]))
+ half_list = len(list) / 2
+
if timestamp == 'now':
timestamp = datetime.now().isoformat('@')
return render_to_response('clients/index.html',
- {'client_list_a': client_list_a,
- 'client_list_b': client_list_b,
+ {'inter_list': list,
+ 'half_list': half_list,
'timestamp' : timestamp,
'timestamp_date' : timestamp[:10],
'timestamp_time' : timestamp[11:19]})
@@ -109,7 +117,7 @@ def client_detailed_list(request, **kwargs):
'''
context = dict(path=request.path)
timestamp = 'now'
- entry_max = None
+ entry_max = datetime.now()
if request.GET:
context['qsa']='?%s' % request.GET.urlencode()
if request.GET.has_key('date1') and request.GET.has_key('time'):
@@ -121,31 +129,31 @@ def client_detailed_list(request, **kwargs):
context['timestamp_date'] = timestamp[:10]
context['timestamp_time'] = timestamp[11:19]
- if 'server' in kwargs and kwargs['server']:
- context['server'] = kwargs['server']
+ interactions = Interaction.objects.interaction_per_client(timestamp)
if 'state' in kwargs and kwargs['state']:
context['state'] = kwargs['state']
+ interactions=interactions.filter(state__exact=kwargs['state'])
+ if 'server' in kwargs and kwargs['server']:
+ interactions=interactions.filter(server__exact=kwargs['server'])
+ context['server'] = kwargs['server']
# build the entry list from available clients
+ c_dict = dict()
+ [c_dict.__setitem__(cl.id,cl.name) for cl in client_list]
+
entry_list = []
- if entry_max:
- for client in client_list:
- try:
- e = Interaction.objects.filter(client=client).filter(timestamp__lt=entry_max).order_by('-timestamp')[0]
- if 'server' in context and e.server != context['server']:
- continue
- if 'state' in context and e.state != context['state']:
- continue
- entry_list.append(e)
- except IndexError:
- # Should never see this.. but skip clients with no data
- pass
- else:
- if 'server' in context:
- client_list = client_list.filter(current_interaction__server__exact=kwargs['server'])
- if 'state' in context:
- client_list = client_list.filter(current_interaction__state__exact=kwargs['state'])
- [ entry_list.append(x.current_interaction) for x in client_list ]
+ for inter in interactions:
+ if inter.client_id in c_dict:
+ entry_list.append([c_dict[inter.client_id], inter, \
+ entry_max - inter.timestamp > timedelta(hours=24)])
+ entry_list.sort(lambda a,b: cmp(a[0], b[0]))
+ '''
+ if(datetime.now()-self.timestamp > timedelta(hours=25) ):
+ return True
+ else:
+ return False
+ '''
+
context['entry_list'] = entry_list
return render_to_response('clients/detailed-list.html', context)