diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/api.py')
-rw-r--r-- | bitbake/lib/toaster/toastergui/api.py | 105 |
1 files changed, 104 insertions, 1 deletions
diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/toastergui/api.py index 414afce1d0..aa3cbd83b2 100644 --- a/bitbake/lib/toaster/toastergui/api.py +++ b/bitbake/lib/toaster/toastergui/api.py | |||
@@ -27,7 +27,10 @@ from bldcontrol import bbcontroller | |||
27 | from django.http import HttpResponse, JsonResponse | 27 | from django.http import HttpResponse, JsonResponse |
28 | from django.views.generic import View | 28 | from django.views.generic import View |
29 | from django.core.urlresolvers import reverse | 29 | from django.core.urlresolvers import reverse |
30 | 30 | from django.core import serializers | |
31 | from django.utils import timezone | ||
32 | from django.template.defaultfilters import date | ||
33 | from toastergui.templatetags.projecttags import json, sectohms, get_tasks | ||
31 | 34 | ||
32 | def error_response(error): | 35 | def error_response(error): |
33 | return JsonResponse({"error": error}) | 36 | return JsonResponse({"error": error}) |
@@ -208,3 +211,103 @@ class XhrLayer(View): | |||
208 | "error": "ok", | 211 | "error": "ok", |
209 | "redirect": reverse('project', args=(kwargs['pid'],)) | 212 | "redirect": reverse('project', args=(kwargs['pid'],)) |
210 | }) | 213 | }) |
214 | |||
215 | class MostRecentBuildsView(View): | ||
216 | def _was_yesterday_or_earlier(self, completed_on): | ||
217 | now = timezone.now() | ||
218 | delta = now - completed_on | ||
219 | |||
220 | if delta.days >= 1: | ||
221 | return True | ||
222 | |||
223 | return False | ||
224 | |||
225 | def get(self, request, *args, **kwargs): | ||
226 | """ | ||
227 | Returns a list of builds in JSON format. | ||
228 | """ | ||
229 | mrb_type = 'all' | ||
230 | project = None | ||
231 | |||
232 | project_id = request.GET.get('project_id', None) | ||
233 | if project_id: | ||
234 | try: | ||
235 | mrb_type = 'project' | ||
236 | project = Project.objects.get(pk=project_id) | ||
237 | except: | ||
238 | # if project lookup fails, assume no project | ||
239 | pass | ||
240 | |||
241 | recent_build_objs = Build.get_recent(project) | ||
242 | recent_builds = [] | ||
243 | |||
244 | # for timezone conversion | ||
245 | tz = timezone.get_current_timezone() | ||
246 | |||
247 | for build_obj in recent_build_objs: | ||
248 | dashboard_url = reverse('builddashboard', args=(build_obj.pk,)) | ||
249 | buildtime_url = reverse('buildtime', args=(build_obj.pk,)) | ||
250 | rebuild_url = \ | ||
251 | reverse('xhr_buildrequest', args=(build_obj.project.pk,)) | ||
252 | cancel_url = \ | ||
253 | reverse('xhr_buildrequest', args=(build_obj.project.pk,)) | ||
254 | |||
255 | build = {} | ||
256 | build['id'] = build_obj.pk | ||
257 | build['dashboard_url'] = dashboard_url | ||
258 | |||
259 | tasks_complete_percentage = 0 | ||
260 | if build_obj.outcome in (Build.SUCCEEDED, Build.FAILED): | ||
261 | tasks_complete_percentage = 100 | ||
262 | elif build_obj.outcome == Build.IN_PROGRESS: | ||
263 | tasks_complete_percentage = build_obj.completeper() | ||
264 | build['tasks_complete_percentage'] = tasks_complete_percentage | ||
265 | |||
266 | build['state'] = build_obj.get_state() | ||
267 | |||
268 | build['errors'] = build_obj.errors.count() | ||
269 | build['dashboard_errors_url'] = dashboard_url + '#errors' | ||
270 | |||
271 | build['warnings'] = build_obj.warnings.count() | ||
272 | build['dashboard_warnings_url'] = dashboard_url + '#warnings' | ||
273 | |||
274 | build['buildtime'] = sectohms(build_obj.timespent_seconds) | ||
275 | build['buildtime_url'] = buildtime_url | ||
276 | |||
277 | build['rebuild_url'] = rebuild_url | ||
278 | build['cancel_url'] = cancel_url | ||
279 | |||
280 | build['is_default_project_build'] = build_obj.project.is_default | ||
281 | |||
282 | build['build_targets_json'] = \ | ||
283 | json(get_tasks(build_obj.target_set.all())) | ||
284 | |||
285 | # convert completed_on time to user's timezone | ||
286 | completed_on = timezone.localtime(build_obj.completed_on) | ||
287 | |||
288 | completed_on_template = '%H:%M' | ||
289 | if self._was_yesterday_or_earlier(completed_on): | ||
290 | completed_on_template = '%d/%m/%Y ' + completed_on_template | ||
291 | build['completed_on'] = completed_on.strftime(completed_on_template) | ||
292 | |||
293 | targets = [] | ||
294 | target_objs = build_obj.get_sorted_target_list() | ||
295 | for target_obj in target_objs: | ||
296 | if target_obj.task: | ||
297 | targets.append(target_obj.target + ':' + target_obj.task) | ||
298 | else: | ||
299 | targets.append(target_obj.target) | ||
300 | build['targets'] = ' '.join(targets) | ||
301 | |||
302 | # abbreviated form of the full target list | ||
303 | abbreviated_targets = '' | ||
304 | num_targets = len(targets) | ||
305 | if num_targets > 0: | ||
306 | abbreviated_targets = targets[0] | ||
307 | if num_targets > 1: | ||
308 | abbreviated_targets += (' +%s' % (num_targets - 1)) | ||
309 | build['targets_abbreviated'] = abbreviated_targets | ||
310 | |||
311 | recent_builds.append(build) | ||
312 | |||
313 | return JsonResponse(recent_builds, safe=False) | ||