summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rw-r--r--bitbake/lib/toaster/toastergui/views.py167
1 files changed, 155 insertions, 12 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 7cb9b42379..663e03dfd2 100644
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -19,7 +19,7 @@
19import operator 19import operator
20 20
21from django.db.models import Q 21from django.db.models import Q
22from django.shortcuts import render 22from django.shortcuts import render, redirect
23from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable 23from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable
24from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency 24from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
25from orm.models import Target_Installed_Package 25from orm.models import Target_Installed_Package
@@ -35,6 +35,7 @@ def _build_page_range(paginator, index = 1):
35 except EmptyPage: 35 except EmptyPage:
36 page = paginator.page(paginator.num_pages) 36 page = paginator.page(paginator.num_pages)
37 37
38
38 page.page_range = [page.number] 39 page.page_range = [page.number]
39 crt_range = 0 40 crt_range = 0
40 for i in range(1,5): 41 for i in range(1,5):
@@ -48,22 +49,124 @@ def _build_page_range(paginator, index = 1):
48 break 49 break
49 return page 50 return page
50 51
51@cache_control(no_store=True)
52def build(request):
53 template = 'build.html'
54 logs = LogMessage.objects.all()
55 52
56 build_info = _build_page_range(Paginator(Build.objects.order_by("-id"), 10),request.GET.get('page', 1)) 53def _verify_parameters(g, mandatory_parameters):
54 miss = []
55 for mp in mandatory_parameters:
56 if not mp in g:
57 miss.append(mp)
58 if len(miss):
59 return miss
60 return None
61
62def _redirect_parameters(view, g, mandatory_parameters):
63 import urllib
64 from django.core.urlresolvers import reverse
65 url = reverse(view)
66 params = {}
67 for i in g:
68 params[i] = g[i]
69 for i in mandatory_parameters:
70 if not i in params:
71 params[i] = mandatory_parameters[i]
72
73 return redirect(url + "?%s" % urllib.urlencode(params))
74
57 75
58 context = {'objects': build_info, 'logs': logs , 76# shows the "all builds" page
59 'hideshowcols' : [ 77def builds(request):
60 {'name': 'Output', 'order':10}, 78 template = 'build.html'
61 {'name': 'Log', 'order':11}, 79 # define here what parameters the view needs in the GET portion in order to
80 # be able to display something. 'count' and 'page' are mandatory for all views
81 # that use paginators.
82 mandatory_parameters = { 'count': 10, 'page' : 1};
83 retval = _verify_parameters( request.GET, mandatory_parameters )
84 if retval:
85 return _redirect_parameters( builds, request.GET, mandatory_parameters)
86
87 # retrieve the objects that will be displayed in the table
88 build_info = _build_page_range(Paginator(Build.objects.exclude(outcome = Build.IN_PROGRESS).order_by("-id"), request.GET.get('count', 10)),request.GET.get('page', 1))
89
90 # build view-specific information; this is rendered specifically in the builds page
91 build_mru = Build.objects.order_by("-started_on")[:3]
92 for b in [ x for x in build_mru if x.outcome == Build.IN_PROGRESS ]:
93 tf = Task.objects.filter(build = b)
94 b.completeper = tf.exclude(order__isnull=True).count()*100/tf.count()
95 from django.utils import timezone
96 b.eta = timezone.now() + ((timezone.now() - b.started_on)*100/b.completeper)
97
98 # send the data to the template
99 context = {
100 # specific info for
101 'mru' : build_mru,
102 # TODO: common objects for all table views, adapt as needed
103 'objects' : build_info,
104 'tablecols' : [
105 {'name': 'Target ', 'clclass': 'target',},
106 {'name': 'Machine ', 'clclass': 'machine'},
107 {'name': 'Completed on ', 'clclass': 'completed_on'},
108 {'name': 'Failed tasks ', 'clclass': 'failed_tasks'},
109 {'name': 'Errors ', 'clclass': 'errors_no'},
110 {'name': 'Warnings', 'clclass': 'warnings_no'},
111 {'name': 'Output ', 'clclass': 'output'},
112 {'name': 'Started on ', 'clclass': 'started_on', 'hidden' : 1},
113 {'name': 'Time ', 'clclass': 'time', 'hidden' : 1},
114 {'name': 'Output', 'clclass': 'output'},
115 {'name': 'Log', 'clclass': 'log', 'hidden': 1},
62 ]} 116 ]}
63 117
64 return render(request, template, context) 118 return render(request, template, context)
65 119
66 120
121# build dashboard for a single build, coming in as argument
122def builddashboard(request, build_id):
123 template = "builddashboard.html"
124 if Build.objects.filter(pk=build_id).count() == 0 :
125 return redirect(builds)
126 context = {
127 'build' : Build.objects.filter(pk=build_id)[0],
128 }
129 return render(request, template, context)
130
131def task(request, build_id, task_id):
132 template = "singletask.html"
133 if Build.objects.filter(pk=build_id).count() == 0 :
134 return redirect(builds)
135 context = {
136 'build' : Build.objects.filter(pk=build_id)[0],
137 }
138 return render(request, template, context)
139
140def recipe(request, build_id, recipe_id):
141 template = "recipe.html"
142 if Recipe.objects.filter(pk=recipe_id).count() == 0 :
143 return redirect(builds)
144 context = {
145 'build' : Build.objects.filter(pk=build_id)[0],
146 'object' : Recipe.objects.filter(pk=recipe_id)[0],
147 }
148 return render(request, template, context)
149
150def package(request, build_id, package_id):
151 template = "singlepackage.html"
152 if Build.objects.filter(pk=build_id).count() == 0 :
153 return redirect(builds)
154 context = {
155 'build' : Build.objects.filter(pk=build_id)[0],
156 }
157 return render(request, template, context)
158
159def target(request, build_id, target_id):
160 template = "target.html"
161 if Build.objects.filter(pk=build_id).count() == 0 :
162 return redirect(builds)
163 context = {
164 'build' : Build.objects.filter(pk=build_id)[0],
165 }
166 return render(request, template, context)
167
168
169
67def _find_task_revdep(task): 170def _find_task_revdep(task):
68 tp = [] 171 tp = []
69 for p in Task_Dependency.objects.filter(depends_on=task): 172 for p in Task_Dependency.objects.filter(depends_on=task):
@@ -81,7 +184,7 @@ def _find_task_provider(task):
81 return trc 184 return trc
82 return None 185 return None
83 186
84def task(request, build_id): 187def tasks(request, build_id):
85 template = 'task.html' 188 template = 'task.html'
86 189
87 tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id), 100),request.GET.get('page', 1)) 190 tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id), 100),request.GET.get('page', 1))
@@ -94,12 +197,52 @@ def task(request, build_id):
94 197
95 return render(request, template, context) 198 return render(request, template, context)
96 199
200def recipes(request, build_id):
201 template = 'recipe.html'
202
203 recipes = _build_page_range(Paginator(Recipe.objects.filter(build_recipe=build_id), 100),request.GET.get('page', 1))
204
205 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects': recipes}
206
207 return render(request, template, context)
208
209
97def configuration(request, build_id): 210def configuration(request, build_id):
98 template = 'configuration.html' 211 template = 'configuration.html'
99 variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1)) 212 variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1))
100 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables} 213 context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables}
101 return render(request, template, context) 214 return render(request, template, context)
102 215
216def buildtime(request, build_id):
217 template = "buildtime.html"
218 if Build.objects.filter(pk=build_id).count() == 0 :
219 return redirect(builds)
220 context = {
221 'build' : Build.objects.filter(pk=build_id)[0],
222 }
223 return render(request, template, context)
224
225def cpuusage(request, build_id):
226 template = "cpuusage.html"
227 if Build.objects.filter(pk=build_id).count() == 0 :
228 return redirect(builds)
229 context = {
230 'build' : Build.objects.filter(pk=build_id)[0],
231 }
232 return render(request, template, context)
233
234def diskio(request, build_id):
235 template = "diskio.html"
236 if Build.objects.filter(pk=build_id).count() == 0 :
237 return redirect(builds)
238 context = {
239 'build' : Build.objects.filter(pk=build_id)[0],
240 }
241 return render(request, template, context)
242
243
244
245
103def bpackage(request, build_id): 246def bpackage(request, build_id):
104 template = 'bpackage.html' 247 template = 'bpackage.html'
105 packages = Package.objects.filter(build = build_id) 248 packages = Package.objects.filter(build = build_id)
@@ -227,8 +370,8 @@ def model_explorer(request, model_name):
227 response_data['count'] = queryset.count() 370 response_data['count'] = queryset.count()
228 else: 371 else:
229 response_data['count'] = 0 372 response_data['count'] = 0
230
231 response_data['list'] = serializers.serialize('json', queryset) 373 response_data['list'] = serializers.serialize('json', queryset)
374# response_data = serializers.serialize('json', queryset)
232 375
233 return HttpResponse(json.dumps(response_data), 376 return HttpResponse(json.dumps(response_data),
234 content_type='application/json') 377 content_type='application/json')