summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rwxr-xr-xbitbake/lib/toaster/toastergui/views.py130
1 files changed, 129 insertions, 1 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 66113cfdf3..38d67e378f 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -38,6 +38,51 @@ from datetime import timedelta
38from django.utils import formats 38from django.utils import formats
39import json 39import json
40 40
41
42# all new sessions should come through the landing page;
43# determine in which mode we are running in, and redirect appropriately
44def landing(request):
45 if toastermain.settings.MANAGED and Build.objects.count() == 0 and Project.objects.count() > 0:
46 return redirect(reverse('all-projects'), permanent = False)
47
48 if Build.objects.all().count() > 0:
49 return redirect(reverse('all-builds'), permanent = False)
50
51 return render(request, 'landing.html')
52
53def _project_recent_build_list(prj):
54 # build requests not yet started
55 return (map(lambda x: {
56 "id": x.pk,
57 "targets" : map(lambda y: {"target": y.target }, x.brtarget_set.all()),
58 "status": x.get_state_display(),
59 }, prj.buildrequest_set.filter(state__lt = BuildRequest.REQ_INPROGRESS).order_by("-pk")) +
60 # build requests started, but with no build yet
61 map(lambda x: {
62 "id": x.pk,
63 "targets" : map(lambda y: {"target": y.target }, x.brtarget_set.all()),
64 "status": x.get_state_display(),
65 }, prj.buildrequest_set.filter(state = BuildRequest.REQ_INPROGRESS, build = None).order_by("-pk")) +
66 # build requests that failed
67 map(lambda x: {
68 "id": x.pk,
69 "targets" : map(lambda y: {"target": y.target }, x.brtarget_set.all()),
70 "status": x.get_state_display(),
71 "errors": map(lambda y: {"type": y.errtype, "msg": y.errmsg, "tb": y.traceback}, x.brerror_set.all()),
72 }, prj.buildrequest_set.filter(state = BuildRequest.REQ_FAILED).order_by("-pk")) +
73 # and already made builds
74 map(lambda x: {
75 "id": x.pk,
76 "targets": map(lambda y: {"target": y.target }, x.target_set.all()),
77 "status": x.get_outcome_display(),
78 "completed_on" : x.completed_on.strftime('%s')+"000",
79 "build_time" : (x.completed_on - x.started_on).total_seconds(),
80 "build_page_url" : reverse('builddashboard', args=(x.pk,)),
81 "completeper": x.completeper(),
82 "eta": x.eta().ctime(),
83 }, prj.build_set.all()))
84
85
41def _build_page_range(paginator, index = 1): 86def _build_page_range(paginator, index = 1):
42 try: 87 try:
43 page = paginator.page(index) 88 page = paginator.page(index)
@@ -219,6 +264,8 @@ def _save_parameters_cookies(response, pagesize, orderby, request):
219 response.set_cookie(key='orderby', value=html_parser.unescape(orderby), path=request.path) 264 response.set_cookie(key='orderby', value=html_parser.unescape(orderby), path=request.path)
220 return response 265 return response
221 266
267
268
222# shows the "all builds" page 269# shows the "all builds" page
223def builds(request): 270def builds(request):
224 template = 'build.html' 271 template = 'build.html'
@@ -242,7 +289,7 @@ def builds(request):
242 build_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1)) 289 build_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1))
243 290
244 # build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds) 291 # build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds)
245 build_mru = Build.objects.filter(completed_on__gte=(timezone.now()-timedelta(hours=24))).order_by("-started_on")[:3] 292 build_mru = Build.objects.order_by("-started_on")[:3]
246 293
247 # set up list of fstypes for each build 294 # set up list of fstypes for each build
248 fstypes_map = {}; 295 fstypes_map = {};
@@ -2553,6 +2600,84 @@ if toastermain.settings.MANAGED:
2553 } 2600 }
2554 2601
2555 return render(request, template, context) 2602 return render(request, template, context)
2603
2604
2605
2606 def projects(request):
2607 template="projects.html"
2608
2609 (pagesize, orderby) = _get_parameters_values(request, 10, 'updated:-')
2610 mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }
2611 retval = _verify_parameters( request.GET, mandatory_parameters )
2612 if retval:
2613 return _redirect_parameters( 'all-projects', request.GET, mandatory_parameters)
2614
2615 queryset_all = Project.objects.all()
2616
2617 # boilerplate code that takes a request for an object type and returns a queryset
2618 # for that object type. copypasta for all needed table searches
2619 (filter_string, search_term, ordering_string) = _search_tuple(request, Project)
2620 queryset_with_search = _get_queryset(Project, queryset_all, None, search_term, ordering_string, 'updated:-')
2621 queryset = _get_queryset(Project, queryset_all, filter_string, search_term, ordering_string, 'updated:-')
2622
2623 # retrieve the objects that will be displayed in the table; projects a paginator and gets a page range to display
2624 project_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1))
2625
2626 # build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds)
2627 build_mru = Build.objects.order_by("-started_on")[:3]
2628
2629
2630
2631 context = {
2632 'mru' : build_mru,
2633
2634 'objects' : project_info,
2635 'objectname' : "projects",
2636 'default_orderby' : 'id:-',
2637 'search_term' : search_term,
2638 'total_count' : queryset_with_search.count(),
2639 'tablecols': [
2640 {'name': 'Project',
2641 'orderfield': _get_toggle_order(request, "name"),
2642 'ordericon':_get_toggle_order_icon(request, "name"),
2643 'orderkey' : 'name',
2644 },
2645 {'name': 'Release',
2646 'qhelp' : "The version of the build system used by the project",
2647 'orderfield': _get_toggle_order(request, "release__name"),
2648 'ordericon':_get_toggle_order_icon(request, "release__name"),
2649 'orderkey' : 'release__name',
2650 },
2651 {'name': 'Machine',
2652 'qhelp': "The hardware currently selected for the project",
2653 },
2654 {'name': 'Number of builds',
2655 'qhelp': "How many builds have been run for the project",
2656 },
2657 {'name': 'Last outcome', 'clclass': 'loutcome',
2658 'qhelp': "Tells you if the last project build completed successfully or failed",
2659 },
2660 {'name': 'Last target', 'clclass': 'ltarget',
2661 'qhelp': "The last project build target(s): one or more recipes or image recipes",
2662 },
2663 {'name': 'Last errors', 'clclass': 'lerrors',
2664 'qhelp': "How many errors were encountered during the last project build (if any)",
2665 },
2666 {'name': 'Last warnings', 'clclass': 'lwarnings',
2667 'qhelp': "How many warnigns were encountered during the last project build (if any)",
2668 },
2669 {'name': 'Last image files', 'clclass': 'limagefiles', 'hidden': 1,
2670 'qhelp': "The root file system types produced by the last project build",
2671 },
2672 {'name': 'Last updated', 'clclass': 'updated',
2673 'orderfield': _get_toggle_order(request, "updated"),
2674 'ordericon':_get_toggle_order_icon(request, "updated"),
2675 'orderkey' : 'updated',
2676 }
2677 ]
2678 }
2679 return render(request, template, context)
2680
2556else: 2681else:
2557 # these are pages that are NOT available in interactive mode 2682 # these are pages that are NOT available in interactive mode
2558 def managedcontextprocessor(request): 2683 def managedcontextprocessor(request):
@@ -2599,3 +2724,6 @@ else:
2599 2724
2600 def projectbuilds(request): 2725 def projectbuilds(request):
2601 raise Exception("page not available in interactive mode") 2726 raise Exception("page not available in interactive mode")
2727
2728 def projects(request):
2729 raise Exception("page not available in interactive mode")