Skip to content

Commit 1480a47

Browse files
committed
Add new historical data view
- Re-implement home page using a class view and add settings-based context
1 parent d513ef7 commit 1480a47

3 files changed

Lines changed: 98 additions & 6 deletions

File tree

codespeed/settings.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
DEF_BASELINE = None # Which executable + revision should be default as a baseline
1010
# Given as the name of the executable and commitid of the revision
11-
# Example: defaultbaseline = {'executable': 'myexe', 'revision': '21'}
11+
# Example: DEF_BASELINE = {'executable': 'baseExe', 'revision': '444'}
1212

1313
TREND = 10 # Default value for the depth of the trend
1414
# Used by reports for the latest runs and changes view
@@ -20,10 +20,14 @@
2020
# over a number of revisions is significant
2121
TREND_THRESHOLD = 5.0
2222

23+
## Home view options ##
24+
SHOW_REPORTS = True # Show report tables
25+
SHOW_HISTORICAL = False # Show historical graphs
26+
2327
## Changes view options ##
2428
DEF_EXECUTABLE = None # Executable that should be chosen as default in the changes view
2529
# Given as the name of the executable.
26-
# Example: defaultexecutable = "myexe"
30+
# Example: DEF_EXECUTABLE = "myexe O3 64bits"
2731

2832
SHOW_AUTHOR_EMAIL_ADDRESS = True # Whether to show the authors email address in the
2933
# changes log

codespeed/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from codespeed.feeds import LatestEntries, LatestSignificantEntries
77

88
urlpatterns = [
9-
url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'),
9+
url(r'^$', views.HomeView.as_view(), name='home'),
1010
url(r'^about/$',
1111
TemplateView.as_view(template_name='about.html'), name='about'),
1212
# RSS for reports
@@ -16,6 +16,7 @@
1616
]
1717

1818
urlpatterns += [
19+
url(r'^historical/json/$', views.gethistoricaldata, name='gethistoricaldata'),
1920
url(r'^reports/$', views.reports, name='reports'),
2021
url(r'^changes/$', views.changes, name='changes'),
2122
url(r'^changes/table/$', views.getchangestable, name='getchangestable'),

codespeed/views.py

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
import json
55
import logging
6-
import django
76

7+
import django
88
from django.conf import settings
99
from django.urls import reverse
1010
from django.core.exceptions import ValidationError, ObjectDoesNotExist
@@ -14,6 +14,7 @@
1414
from django.shortcuts import get_object_or_404, render_to_response
1515
from django.views.decorators.http import require_GET, require_POST
1616
from django.views.decorators.csrf import csrf_exempt
17+
from django.views.generic.base import TemplateView
1718

1819
from .auth import basic_auth_required
1920
from .models import (Environment, Report, Project, Revision, Result,
@@ -61,6 +62,92 @@ def no_data_found(request):
6162
})
6263

6364

65+
class HomeView(TemplateView):
66+
template_name = "home.html"
67+
68+
def get_context_data(self, **kwargs):
69+
context = super().get_context_data(**kwargs)
70+
context['show_reports'] = settings.SHOW_REPORTS
71+
context['show_historical'] = settings.SHOW_HISTORICAL
72+
historical_settings = ['SHOW_HISTORICAL', 'DEF_BASELINE', 'DEF_EXECUTABLE']
73+
if not all(getattr(settings, var) for var in historical_settings):
74+
context['show_historical'] = False
75+
return context
76+
77+
baseline_exe = Executable.objects.get(
78+
name=settings.DEF_BASELINE['executable'])
79+
context['baseline'] = baseline_exe
80+
default_exe = Executable.objects.get(name=settings.DEF_EXECUTABLE)
81+
context['default_exe'] = default_exe
82+
return context
83+
84+
85+
@require_GET
86+
def gethistoricaldata(request):
87+
data = {'results': {}, 'benchmarks': []}
88+
env = Environment.objects.all()
89+
if settings.DEF_ENVIRONMENT:
90+
env = env.get(name=settings.DEF_ENVIRONMENT)
91+
else:
92+
env = env.first()
93+
94+
# Fetch Baseline data
95+
baseline_exe = Executable.objects.get(
96+
name=settings.DEF_BASELINE['executable'])
97+
baseline_lastrev = Revision.objects.filter(
98+
branch__project=baseline_exe.project).order_by('-date')[0]
99+
data['baseline'] = '{} {}'.format(
100+
settings.DEF_BASELINE['executable'], baseline_lastrev.tag)
101+
baseline_results = Result.objects.filter(
102+
executable=baseline_exe, revision=baseline_lastrev, environment=env)
103+
104+
default_exe = Executable.objects.get(name=settings.DEF_EXECUTABLE)
105+
default_branch = Branch.objects.get(
106+
name=default_exe.project.default_branch,
107+
project=default_exe.project)
108+
109+
# Fetch tagged revisions for default executable
110+
default_taggedrevs = Revision.objects.filter(
111+
branch=default_branch
112+
).exclude(tag="").order_by('date')
113+
data['tagged_revs'] = [rev.tag for rev in default_taggedrevs]
114+
default_results = {}
115+
for rev in default_taggedrevs:
116+
default_results[rev.tag] = Result.objects.filter(
117+
executable=default_exe, revision=rev, environment=env)
118+
119+
# Fetch data for latest results
120+
revs = Revision.objects.filter(
121+
branch=default_branch).order_by('-date')[:5]
122+
default_lastrev = None
123+
for i in range(4):
124+
default_lastrev = revs[i]
125+
if default_lastrev.results.filter(executable=default_exe):
126+
break
127+
default_lastrev = None
128+
if default_lastrev is None:
129+
return HttpResponse(json.dumps(data))
130+
default_results['latest'] = Result.objects.filter(
131+
executable=default_exe, revision=default_lastrev, environment=env)
132+
133+
# Collect data
134+
benchmarks = []
135+
for res in baseline_results:
136+
if res == 0:
137+
continue
138+
benchmarks.append(res.benchmark.name)
139+
data['results'][res.benchmark.name] = {data['baseline']: res.value}
140+
for rev_name in default_results:
141+
val = 0
142+
for default_res in default_results[rev_name]:
143+
if default_res.benchmark.name == res.benchmark.name:
144+
val = default_res.value
145+
data['results'][res.benchmark.name][rev_name] = val
146+
benchmarks.sort()
147+
data['benchmarks'] = benchmarks
148+
return HttpResponse(json.dumps(data))
149+
150+
64151
@require_GET
65152
def getcomparisondata(request):
66153
executables, exekeys = getcomparisonexes()
@@ -75,8 +162,8 @@ def getcomparisondata(request):
75162
for env in environments:
76163
compdata[exe['key']][env.id] = {}
77164

78-
# Load all results for this env/executable/revision in a dict
79-
# for fast lookup
165+
# Load all results for this env/executable/revision in a
166+
# dict for fast lookup
80167
results = dict(Result.objects.filter(
81168
environment=env,
82169
executable=exe['executable'],

0 commit comments

Comments
 (0)