diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
| -rw-r--r-- | bitbake/lib/toaster/toastergui/views.py | 167 |
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 @@ | |||
| 19 | import operator | 19 | import operator |
| 20 | 20 | ||
| 21 | from django.db.models import Q | 21 | from django.db.models import Q |
| 22 | from django.shortcuts import render | 22 | from django.shortcuts import render, redirect |
| 23 | from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable | 23 | from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable |
| 24 | from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency | 24 | from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency |
| 25 | from orm.models import Target_Installed_Package | 25 | from 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) | ||
| 52 | def 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)) | 53 | def _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 | |||
| 62 | def _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' : [ | 77 | def 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 | ||
| 122 | def 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 | |||
| 131 | def 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 | |||
| 140 | def 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 | |||
| 150 | def 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 | |||
| 159 | def 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 | |||
| 67 | def _find_task_revdep(task): | 170 | def _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 | ||
| 84 | def task(request, build_id): | 187 | def 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 | ||
| 200 | def 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 | |||
| 97 | def configuration(request, build_id): | 210 | def 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 | ||
| 216 | def 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 | |||
| 225 | def 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 | |||
| 234 | def 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 | |||
| 103 | def bpackage(request, build_id): | 246 | def 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') |
