def comparison(request): data = request.GET # Configuration of default parameters enviros = Environment.objects.all() if not enviros: return no_environment_error(request) checkedenviros = get_default_environment(enviros, data, multi=True) if not len(Project.objects.filter(track=True)): return no_default_project_error(request) # Check whether there exist appropiate executables if not getdefaultexecutable(): return no_executables_error(request) executables, exekeys = getcomparisonexes() checkedexecutables = [] if 'exe' in data: for i in data['exe'].split(","): if not i: continue if i in exekeys: checkedexecutables.append(i) elif hasattr(settings, 'COMP_EXECUTABLES') and settings.COMP_EXECUTABLES: for exe, rev in settings.COMP_EXECUTABLES: try: exe = Executable.objects.get(name=exe) key = str(exe.id) + "+" if rev == "L": key += rev else: rev = Revision.objects.get(commitid=rev) key += str(rev.id) key += "+default" if key in exekeys: checkedexecutables.append(key) else: #TODO: log pass except Executable.DoesNotExist: #TODO: log pass except Revision.DoesNotExist: #TODO: log pass if not checkedexecutables: checkedexecutables = exekeys units_titles = Benchmark.objects.filter( benchmark_type="C").values('units_title').distinct() units_titles = [unit['units_title'] for unit in units_titles] benchmarks = {} bench_units = {} for unit in units_titles: # Only include benchmarks marked as cross-project benchmarks[unit] = Benchmark.objects.filter(benchmark_type="C").filter( units_title=unit) units = benchmarks[unit][0].units lessisbetter = (benchmarks[unit][0].lessisbetter and ' (less is better)' or ' (more is better)') bench_units[unit] = [[b.id for b in benchmarks[unit]], lessisbetter, units] checkedbenchmarks = [] if 'ben' in data: checkedbenchmarks = [] for i in data['ben'].split(","): if not i: continue try: checkedbenchmarks.append(Benchmark.objects.get(id=int(i))) except Benchmark.DoesNotExist: pass if not checkedbenchmarks: # Only include benchmarks marked as cross-project checkedbenchmarks = Benchmark.objects.filter( benchmark_type="C", default_on_comparison=True) charts = ['normal bars', 'stacked bars', 'relative bars'] # Don't show relative charts as an option if there is only one executable # Relative charts need normalization if len(executables) == 1: charts.remove('relative bars') selectedchart = charts[0] if 'chart' in data and data['chart'] in charts: selectedchart = data['chart'] elif hasattr(settings, 'CHART_TYPE') and settings.CHART_TYPE in charts: selectedchart = settings.CHART_TYPE selectedbaseline = "none" if 'bas' in data and data['bas'] in exekeys: selectedbaseline = data['bas'] elif 'bas' in data: # bas is present but is none pass elif (len(exekeys) > 1 and hasattr(settings, 'NORMALIZATION') and settings.NORMALIZATION): try: # TODO: Avoid calling twice getbaselineexecutables selectedbaseline = getbaselineexecutables()[1]['key'] # Uncheck exe used for normalization try: checkedexecutables.remove(selectedbaseline) except ValueError: pass # The selected baseline was not checked except: pass # Keep "none" as default baseline selecteddirection = False if ('hor' in data and data['hor'] == "true" or hasattr(settings, 'CHART_ORIENTATION') and settings.CHART_ORIENTATION == 'horizontal'): selecteddirection = True return render_to_response('codespeed/comparison.html', { 'checkedexecutables': checkedexecutables, 'checkedbenchmarks': checkedbenchmarks, 'checkedenviros': checkedenviros, 'executables': executables, 'benchmarks': benchmarks, 'bench_units': json.dumps(bench_units), 'enviros': enviros, 'charts': charts, 'selectedbaseline': selectedbaseline, 'selectedchart': selectedchart, 'selecteddirection': selecteddirection }, context_instance=RequestContext(request))
def changes(request): data = request.GET # Configuration of default parameters defaultchangethres = 3.0 defaulttrendthres = 4.0 if (hasattr(settings, 'CHANGE_THRESHOLD') and settings.CHANGE_THRESHOLD is not None): defaultchangethres = settings.CHANGE_THRESHOLD if (hasattr(settings, 'TREND_THRESHOLD') and settings.TREND_THRESHOLD is not None): defaulttrendthres = settings.TREND_THRESHOLD defaulttrend = 10 trends = [5, 10, 20, 50, 100] if 'tre' in data and int(data['tre']) in trends: defaulttrend = int(data['tre']) enviros = Environment.objects.all() if not enviros: return no_environment_error(request) defaultenv = get_default_environment(enviros, data) if not len(Project.objects.filter(track=True)): return no_default_project_error(request) defaultexecutable = getdefaultexecutable() if not defaultexecutable: return no_executables_error(request) if "exe" in data: try: defaultexecutable = Executable.objects.get(id=int(data['exe'])) except Executable.DoesNotExist: pass except ValueError: pass baseline = getbaselineexecutables() defaultbaseline = "+" if len(baseline) > 1: defaultbaseline = str(baseline[1]['executable'].id) + "+" defaultbaseline += str(baseline[1]['revision'].id) if "base" in data and data['base'] != "undefined": try: defaultbaseline = data['base'] except ValueError: pass # Information for template revlimit = 20 executables = {} revisionlists = {} projectlist = [] for proj in Project.objects.filter(track=True): executables[proj] = Executable.objects.filter(project=proj) projectlist.append(proj) branch = Branch.objects.filter(name=settings.DEF_BRANCH, project=proj) revisionlists[proj.name] = list( Revision.objects.filter( branch=branch).order_by('-date')[:revlimit]) # Get lastest revisions for this project and it's "default" branch lastrevisions = revisionlists.get(defaultexecutable.project.name) if not len(lastrevisions): return no_data_found(request) selectedrevision = lastrevisions[0] if "rev" in data: commitid = data['rev'] try: selectedrevision = Revision.objects.get( commitid__startswith=commitid, branch=branch) if selectedrevision not in revisionlists[ selectedrevision.project.name]: revisionlists[selectedrevision.project.name].append( selectedrevision) except Revision.DoesNotExist: selectedrevision = lastrevisions[0] # This variable is used to know when the newly selected executable # belongs to another project (project changed) and then trigger the # repopulation of the revision selection selectbox projectmatrix = {} for proj in executables: for e in executables[proj]: projectmatrix[e.id] = e.project.name projectmatrix = json.dumps(projectmatrix) for project, revisions in revisionlists.items(): revisionlists[project] = [(unicode(rev), rev.commitid) for rev in revisions] revisionlists = json.dumps(revisionlists) return render_to_response('codespeed/changes.html', { 'defaultenvironment': defaultenv, 'defaultexecutable': defaultexecutable, 'selectedrevision': selectedrevision, 'defaulttrend': defaulttrend, 'defaultchangethres': defaultchangethres, 'defaulttrendthres': defaulttrendthres, 'environments': enviros, 'executables': executables, 'projectmatrix': projectmatrix, 'revisionlists': revisionlists, 'trends': trends, }, context_instance=RequestContext(request))
def timeline(request): data = request.GET ## Configuration of default parameters ## # Default Environment enviros = Environment.objects.all() if not enviros: return no_environment_error(request) defaultenviro = get_default_environment(enviros, data) # Default Project defaultproject = Project.objects.filter(track=True) if not len(defaultproject): return no_default_project_error(request) else: defaultproject = defaultproject[0] checkedexecutables = [] if 'exe' in data: for i in data['exe'].split(","): if not i: continue try: checkedexecutables.append(Executable.objects.get(id=int(i))) except Executable.DoesNotExist: pass if not checkedexecutables: checkedexecutables = Executable.objects.filter(project__track=True) if not len(checkedexecutables): return no_executables_error(request) # TODO: we need branches for all tracked projects branch_list = [ branch.name for branch in Branch.objects.filter(project=defaultproject) ] branch_list.sort() defaultbranch = "" if "default" in branch_list: defaultbranch = settings.DEF_BRANCH if data.get('bran') in branch_list: defaultbranch = data.get('bran') baseline = getbaselineexecutables() defaultbaseline = None if len(baseline) > 1: defaultbaseline = str(baseline[1]['executable'].id) + "+" defaultbaseline += str(baseline[1]['revision'].id) if "base" in data and data['base'] != "undefined": try: defaultbaseline = data['base'] except ValueError: pass lastrevisions = [10, 50, 200, 1000] defaultlast = settings.DEF_TIMELINE_LIMIT if 'revs' in data: if int(data['revs']) not in lastrevisions: lastrevisions.append(data['revs']) defaultlast = data['revs'] benchmarks = Benchmark.objects.all() grid_limit = 30 defaultbenchmark = "grid" if not len(benchmarks): return no_data_found(request) elif len(benchmarks) == 1: defaultbenchmark = benchmarks[0] elif hasattr(settings, 'DEF_BENCHMARK') and settings.DEF_BENCHMARK is not None: if settings.DEF_BENCHMARK in ['grid', 'show_none']: defaultbenchmark = settings.DEF_BENCHMARK else: try: defaultbenchmark = Benchmark.objects.get( name=settings.DEF_BENCHMARK) except Benchmark.DoesNotExist: pass elif len(benchmarks) >= grid_limit: defaultbenchmark = 'show_none' if 'ben' in data and data['ben'] != defaultbenchmark: if data['ben'] == "show_none": defaultbenchmark = data['ben'] else: defaultbenchmark = get_object_or_404(Benchmark, name=data['ben']) if 'equid' in data: defaultequid = data['equid'] else: defaultequid = "off" # Information for template executables = {} for proj in Project.objects.filter(track=True): executables[proj] = Executable.objects.filter(project=proj) return render_to_response('codespeed/timeline.html', { 'checkedexecutables': checkedexecutables, 'defaultbaseline': defaultbaseline, 'baseline': baseline, 'defaultbenchmark': defaultbenchmark, 'defaultenvironment': defaultenviro, 'lastrevisions': lastrevisions, 'defaultlast': defaultlast, 'executables': executables, 'benchmarks': benchmarks, 'environments': enviros, 'branch_list': branch_list, 'defaultbranch': defaultbranch, 'defaultequid': defaultequid }, context_instance=RequestContext(request))
def comparison(request): data = request.GET # Configuration of default parameters enviros = Environment.objects.all() if not enviros: return no_environment_error(request) checkedenviros = get_default_environment(enviros, data, multi=True) if not len(Project.objects.filter(track=True)): return no_default_project_error(request) # Check whether there exist appropiate executables if not getdefaultexecutable(): return no_executables_error(request) executables, exekeys = getcomparisonexes() checkedexecutables = [] if 'exe' in data: for i in data['exe'].split(","): if not i: continue if i in exekeys: checkedexecutables.append(i) elif hasattr(settings, 'COMP_EXECUTABLES') and settings.COMP_EXECUTABLES: for exe, rev in settings.COMP_EXECUTABLES: try: exe = Executable.objects.get(name=exe) key = str(exe.id) + "+" if rev == "L": key += rev else: rev = Revision.objects.get(commitid=rev) key += str(rev.id) key += "+default" if key in exekeys: checkedexecutables.append(key) else: #TODO: log pass except Executable.DoesNotExist: #TODO: log pass except Revision.DoesNotExist: #TODO: log pass if not checkedexecutables: checkedexecutables = exekeys units_titles = Benchmark.objects.filter( benchmark_type="C" ).values('units_title').distinct() units_titles = [unit['units_title'] for unit in units_titles] benchmarks = {} bench_units = {} for unit in units_titles: # Only include benchmarks marked as cross-project benchmarks[unit] = Benchmark.objects.filter( benchmark_type="C" ).filter(units_title=unit) units = benchmarks[unit][0].units lessisbetter = (benchmarks[unit][0].lessisbetter and ' (less is better)' or ' (more is better)') bench_units[unit] = [ [b.id for b in benchmarks[unit]], lessisbetter, units ] checkedbenchmarks = [] if 'ben' in data: checkedbenchmarks = [] for i in data['ben'].split(","): if not i: continue try: checkedbenchmarks.append(Benchmark.objects.get(id=int(i))) except Benchmark.DoesNotExist: pass if not checkedbenchmarks: # Only include benchmarks marked as cross-project checkedbenchmarks = Benchmark.objects.filter( benchmark_type="C", default_on_comparison=True) charts = ['normal bars', 'stacked bars', 'relative bars'] # Don't show relative charts as an option if there is only one executable # Relative charts need normalization if len(executables) == 1: charts.remove('relative bars') selectedchart = charts[0] if 'chart' in data and data['chart'] in charts: selectedchart = data['chart'] elif hasattr(settings, 'CHART_TYPE') and settings.CHART_TYPE in charts: selectedchart = settings.CHART_TYPE selectedbaseline = "none" if 'bas' in data and data['bas'] in exekeys: selectedbaseline = data['bas'] elif 'bas' in data: # bas is present but is none pass elif (len(exekeys) > 1 and hasattr(settings, 'NORMALIZATION') and settings.NORMALIZATION): try: # TODO: Avoid calling twice getbaselineexecutables selectedbaseline = getbaselineexecutables()[1]['key'] # Uncheck exe used for normalization try: checkedexecutables.remove(selectedbaseline) except ValueError: pass # The selected baseline was not checked except: pass # Keep "none" as default baseline selecteddirection = False if ('hor' in data and data['hor'] == "true" or hasattr(settings, 'CHART_ORIENTATION') and settings.CHART_ORIENTATION == 'horizontal'): selecteddirection = True return render_to_response('codespeed/comparison.html', { 'checkedexecutables': checkedexecutables, 'checkedbenchmarks': checkedbenchmarks, 'checkedenviros': checkedenviros, 'executables': executables, 'benchmarks': benchmarks, 'bench_units': json.dumps(bench_units), 'enviros': enviros, 'charts': charts, 'selectedbaseline': selectedbaseline, 'selectedchart': selectedchart, 'selecteddirection': selecteddirection }, context_instance=RequestContext(request))
def changes(request): data = request.GET # Configuration of default parameters defaultchangethres = 3.0 defaulttrendthres = 4.0 if (hasattr(settings, 'CHANGE_THRESHOLD') and settings.CHANGE_THRESHOLD is not None): defaultchangethres = settings.CHANGE_THRESHOLD if (hasattr(settings, 'TREND_THRESHOLD') and settings.TREND_THRESHOLD is not None): defaulttrendthres = settings.TREND_THRESHOLD defaulttrend = 10 trends = [5, 10, 20, 50, 100] if 'tre' in data and int(data['tre']) in trends: defaulttrend = int(data['tre']) enviros = Environment.objects.all() if not enviros: return no_environment_error(request) defaultenv = get_default_environment(enviros, data) if not len(Project.objects.filter(track=True)): return no_default_project_error(request) defaultexecutable = getdefaultexecutable() if not defaultexecutable: return no_executables_error(request) if "exe" in data: try: defaultexecutable = Executable.objects.get(id=int(data['exe'])) except Executable.DoesNotExist: pass except ValueError: pass baseline = getbaselineexecutables() defaultbaseline = "+" if len(baseline) > 1: defaultbaseline = str(baseline[1]['executable'].id) + "+" defaultbaseline += str(baseline[1]['revision'].id) if "base" in data and data['base'] != "undefined": try: defaultbaseline = data['base'] except ValueError: pass # Information for template revlimit = 20 executables = {} revisionlists = {} projectlist = [] for proj in Project.objects.filter(track=True): executables[proj] = Executable.objects.filter(project=proj) projectlist.append(proj) branch = Branch.objects.filter(name=settings.DEF_BRANCH, project=proj) revisionlists[proj.name] = list(Revision.objects.filter( branch=branch ).order_by('-date')[:revlimit]) # Get lastest revisions for this project and it's "default" branch lastrevisions = revisionlists.get(defaultexecutable.project.name) if not len(lastrevisions): return no_data_found(request) selectedrevision = lastrevisions[0] if "rev" in data: commitid = data['rev'] try: selectedrevision = Revision.objects.get( commitid__startswith=commitid, branch=branch ) if selectedrevision not in revisionlists[selectedrevision.project.name]: revisionlists[selectedrevision.project.name].append(selectedrevision) except Revision.DoesNotExist: selectedrevision = lastrevisions[0] # This variable is used to know when the newly selected executable # belongs to another project (project changed) and then trigger the # repopulation of the revision selection selectbox projectmatrix = {} for proj in executables: for e in executables[proj]: projectmatrix[e.id] = e.project.name projectmatrix = json.dumps(projectmatrix) for project, revisions in revisionlists.items(): revisionlists[project] = [ (unicode(rev), rev.commitid) for rev in revisions ] revisionlists = json.dumps(revisionlists) return render_to_response('codespeed/changes.html', { 'defaultenvironment': defaultenv, 'defaultexecutable': defaultexecutable, 'selectedrevision': selectedrevision, 'defaulttrend': defaulttrend, 'defaultchangethres': defaultchangethres, 'defaulttrendthres': defaulttrendthres, 'environments': enviros, 'executables': executables, 'projectmatrix': projectmatrix, 'revisionlists': revisionlists, 'trends': trends, }, context_instance=RequestContext(request))
def timeline(request): data = request.GET ## Configuration of default parameters ## # Default Environment enviros = Environment.objects.all() if not enviros: return no_environment_error(request) defaultenviro = get_default_environment(enviros, data) # Default Project defaultproject = Project.objects.filter(track=True) if not len(defaultproject): return no_default_project_error(request) else: defaultproject = defaultproject[0] checkedexecutables = [] if 'exe' in data: for i in data['exe'].split(","): if not i: continue try: checkedexecutables.append(Executable.objects.get(id=int(i))) except Executable.DoesNotExist: pass if not checkedexecutables: checkedexecutables = Executable.objects.filter(project__track=True) if not len(checkedexecutables): return no_executables_error(request) # TODO: we need branches for all tracked projects branch_list = [ branch.name for branch in Branch.objects.filter(project=defaultproject)] branch_list.sort() defaultbranch = "" if "default" in branch_list: defaultbranch = settings.DEF_BRANCH if data.get('bran') in branch_list: defaultbranch = data.get('bran') baseline = getbaselineexecutables() defaultbaseline = None if len(baseline) > 1: defaultbaseline = str(baseline[1]['executable'].id) + "+" defaultbaseline += str(baseline[1]['revision'].id) if "base" in data and data['base'] != "undefined": try: defaultbaseline = data['base'] except ValueError: pass lastrevisions = [10, 50, 200, 1000] defaultlast = settings.DEF_TIMELINE_LIMIT if 'revs' in data: if int(data['revs']) not in lastrevisions: lastrevisions.append(data['revs']) defaultlast = data['revs'] benchmarks = Benchmark.objects.all() grid_limit = 30 defaultbenchmark = "grid" if not len(benchmarks): return no_data_found(request) elif len(benchmarks) == 1: defaultbenchmark = benchmarks[0] elif hasattr(settings, 'DEF_BENCHMARK') and settings.DEF_BENCHMARK is not None: if settings.DEF_BENCHMARK in ['grid', 'show_none']: defaultbenchmark = settings.DEF_BENCHMARK else: try: defaultbenchmark = Benchmark.objects.get( name=settings.DEF_BENCHMARK) except Benchmark.DoesNotExist: pass elif len(benchmarks) >= grid_limit: defaultbenchmark = 'show_none' if 'ben' in data and data['ben'] != defaultbenchmark: if data['ben'] == "show_none": defaultbenchmark = data['ben'] else: defaultbenchmark = get_object_or_404(Benchmark, name=data['ben']) if 'equid' in data: defaultequid = data['equid'] else: defaultequid = "off" # Information for template executables = {} for proj in Project.objects.filter(track=True): executables[proj] = Executable.objects.filter(project=proj) return render_to_response('codespeed/timeline.html', { 'checkedexecutables': checkedexecutables, 'defaultbaseline': defaultbaseline, 'baseline': baseline, 'defaultbenchmark': defaultbenchmark, 'defaultenvironment': defaultenviro, 'lastrevisions': lastrevisions, 'defaultlast': defaultlast, 'executables': executables, 'benchmarks': benchmarks, 'environments': enviros, 'branch_list': branch_list, 'defaultbranch': defaultbranch, 'defaultequid': defaultequid }, context_instance=RequestContext(request))