diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 94 |
1 files changed, 37 insertions, 57 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index e296cf6de3..23025a2a19 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -1806,6 +1806,20 @@ def package_included_reverse_dependencies(request, build_id, target_id, package_ | |||
1806 | def image_information_dir(request, build_id, target_id, packagefile_id): | 1806 | def image_information_dir(request, build_id, target_id, packagefile_id): |
1807 | # stubbed for now | 1807 | # stubbed for now |
1808 | return redirect(builds) | 1808 | return redirect(builds) |
1809 | # the context processor that supplies data used across all the pages | ||
1810 | |||
1811 | |||
1812 | def managedcontextprocessor(request): | ||
1813 | import subprocess | ||
1814 | ret = { | ||
1815 | "projects": Project.objects.all(), | ||
1816 | "MANAGED" : toastermain.settings.MANAGED, | ||
1817 | "DEBUG" : toastermain.settings.DEBUG, | ||
1818 | "TOASTER_BRANCH": toastermain.settings.TOASTER_BRANCH, | ||
1819 | "TOASTER_REVISION" : toastermain.settings.TOASTER_REVISION, | ||
1820 | } | ||
1821 | return ret | ||
1822 | |||
1809 | 1823 | ||
1810 | 1824 | ||
1811 | import toastermain.settings | 1825 | import toastermain.settings |
@@ -1827,23 +1841,6 @@ if toastermain.settings.MANAGED: | |||
1827 | 1841 | ||
1828 | class BadParameterException(Exception): pass # error thrown on invalid POST requests | 1842 | class BadParameterException(Exception): pass # error thrown on invalid POST requests |
1829 | 1843 | ||
1830 | # the context processor that supplies data used across all the pages | ||
1831 | def managedcontextprocessor(request): | ||
1832 | import subprocess | ||
1833 | ret = { | ||
1834 | "projects": Project.objects.all(), | ||
1835 | "MANAGED" : toastermain.settings.MANAGED, | ||
1836 | "DEBUG" : toastermain.settings.DEBUG, | ||
1837 | "TOASTER_BRANCH": toastermain.settings.TOASTER_BRANCH, | ||
1838 | "TOASTER_REVISION" : toastermain.settings.TOASTER_REVISION, | ||
1839 | } | ||
1840 | if 'project_id' in request.session: | ||
1841 | try: | ||
1842 | ret['project'] = Project.objects.get(pk = request.session['project_id']) | ||
1843 | except Project.DoesNotExist: | ||
1844 | del request.session['project_id'] | ||
1845 | return ret | ||
1846 | |||
1847 | 1844 | ||
1848 | class InvalidRequestException(Exception): | 1845 | class InvalidRequestException(Exception): |
1849 | def __init__(self, response): | 1846 | def __init__(self, response): |
@@ -2176,7 +2173,7 @@ if toastermain.settings.MANAGED: | |||
2176 | puser = None | 2173 | puser = None |
2177 | 2174 | ||
2178 | # we use implicit knowledge of the current user's project to filter layer information, e.g. | 2175 | # we use implicit knowledge of the current user's project to filter layer information, e.g. |
2179 | request.session['project_id'] = prj.id | 2176 | pid = prj.id |
2180 | 2177 | ||
2181 | from collections import Counter | 2178 | from collections import Counter |
2182 | freqtargets = [] | 2179 | freqtargets = [] |
@@ -2201,7 +2198,7 @@ if toastermain.settings.MANAGED: | |||
2201 | "name" : x.layercommit.layer.name, | 2198 | "name" : x.layercommit.layer.name, |
2202 | "giturl": x.layercommit.layer.vcs_url, | 2199 | "giturl": x.layercommit.layer.vcs_url, |
2203 | "url": x.layercommit.layer.layer_index_url, | 2200 | "url": x.layercommit.layer.layer_index_url, |
2204 | "layerdetailurl": reverse("layerdetails", args=(x.layercommit.pk,)), | 2201 | "layerdetailurl": reverse("layerdetails", args=(prj.id, x.layercommit.pk,)), |
2205 | # This branch name is actually the release | 2202 | # This branch name is actually the release |
2206 | "branch" : { "name" : x.layercommit.get_vcs_reference(), "layersource" : x.layercommit.up_branch.layer_source.name if x.layercommit.up_branch != None else None}}, | 2203 | "branch" : { "name" : x.layercommit.get_vcs_reference(), "layersource" : x.layercommit.up_branch.layer_source.name if x.layercommit.up_branch != None else None}}, |
2207 | prj.projectlayer_set.all().order_by("id")), | 2204 | prj.projectlayer_set.all().order_by("id")), |
@@ -2237,7 +2234,7 @@ if toastermain.settings.MANAGED: | |||
2237 | try: | 2234 | try: |
2238 | if request.method != "POST": | 2235 | if request.method != "POST": |
2239 | raise BadParameterException("invalid method") | 2236 | raise BadParameterException("invalid method") |
2240 | request.session['project_id'] = pid | 2237 | pid = pid |
2241 | prj = Project.objects.get(id = pid) | 2238 | prj = Project.objects.get(id = pid) |
2242 | 2239 | ||
2243 | 2240 | ||
@@ -2326,7 +2323,7 @@ if toastermain.settings.MANAGED: | |||
2326 | # return all project settings | 2323 | # return all project settings |
2327 | return HttpResponse(jsonfilter( { | 2324 | return HttpResponse(jsonfilter( { |
2328 | "error": "ok", | 2325 | "error": "ok", |
2329 | "layers" : map(lambda x: {"id": x.layercommit.pk, "orderid" : x.pk, "name" : x.layercommit.layer.name, "giturl" : x.layercommit.layer.vcs_url, "url": x.layercommit.layer.layer_index_url, "layerdetailurl": reverse("layerdetails", args=(x.layercommit.pk,)), "branch" : { "name" : x.layercommit.get_vcs_reference(), "layersource" : x.layercommit.up_branch.layer_source.name}}, prj.projectlayer_set.all().select_related("layer").order_by("id")), | 2326 | "layers" : map(lambda x: {"id": x.layercommit.pk, "orderid" : x.pk, "name" : x.layercommit.layer.name, "giturl" : x.layercommit.layer.vcs_url, "url": x.layercommit.layer.layer_index_url, "layerdetailurl": reverse("layerdetails", args=(prj.id, x.layercommit.pk,)), "branch" : { "name" : x.layercommit.get_vcs_reference(), "layersource" : x.layercommit.up_branch.layer_source.name}}, prj.projectlayer_set.all().select_related("layer").order_by("id")), |
2330 | "builds" : _project_recent_build_list(prj), | 2327 | "builds" : _project_recent_build_list(prj), |
2331 | "variables": map(lambda x: (x.name, x.value), prj.projectvariable_set.all()), | 2328 | "variables": map(lambda x: (x.name, x.value), prj.projectvariable_set.all()), |
2332 | "machine": {"name": prj.projectvariable_set.get(name="MACHINE").value}, | 2329 | "machine": {"name": prj.projectvariable_set.get(name="MACHINE").value}, |
@@ -2344,8 +2341,6 @@ if toastermain.settings.MANAGED: | |||
2344 | prj = None | 2341 | prj = None |
2345 | if request.GET.has_key('project_id'): | 2342 | if request.GET.has_key('project_id'): |
2346 | prj = Project.objects.get(pk = request.GET['project_id']) | 2343 | prj = Project.objects.get(pk = request.GET['project_id']) |
2347 | elif 'project_id' in request.session: | ||
2348 | prj = Project.objects.get(pk = request.session['project_id']) | ||
2349 | else: | 2344 | else: |
2350 | raise Exception("No valid project selected") | 2345 | raise Exception("No valid project selected") |
2351 | 2346 | ||
@@ -2389,8 +2384,6 @@ if toastermain.settings.MANAGED: | |||
2389 | 2384 | ||
2390 | # returns layer versions that would be deleted on the new release__pk | 2385 | # returns layer versions that would be deleted on the new release__pk |
2391 | if request.GET['type'] == "versionlayers": | 2386 | if request.GET['type'] == "versionlayers": |
2392 | if not 'project_id' in request.session: | ||
2393 | raise Exception("This call cannot makes no sense outside a project context") | ||
2394 | 2387 | ||
2395 | retval = [] | 2388 | retval = [] |
2396 | for i in prj.projectlayer_set.all(): | 2389 | for i in prj.projectlayer_set.all(): |
@@ -2689,16 +2682,15 @@ if toastermain.settings.MANAGED: | |||
2689 | 2682 | ||
2690 | 2683 | ||
2691 | 2684 | ||
2692 | def importlayer(request): | 2685 | def importlayer(request, pid): |
2693 | template = "importlayer.html" | 2686 | template = "importlayer.html" |
2694 | context = { | 2687 | context = { |
2688 | 'project': Project.objects.get(id=pid), | ||
2695 | } | 2689 | } |
2696 | return render(request, template, context) | 2690 | return render(request, template, context) |
2697 | 2691 | ||
2698 | 2692 | ||
2699 | def layers(request): | 2693 | def layers(request, pid): |
2700 | if not 'project_id' in request.session: | ||
2701 | raise Exception("invalid page: cannot show page without a project") | ||
2702 | 2694 | ||
2703 | template = "layers.html" | 2695 | template = "layers.html" |
2704 | # define here what parameters the view needs in the GET portion in order to | 2696 | # define here what parameters the view needs in the GET portion in order to |
@@ -2708,13 +2700,13 @@ if toastermain.settings.MANAGED: | |||
2708 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; | 2700 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; |
2709 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 2701 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
2710 | if retval: | 2702 | if retval: |
2711 | return _redirect_parameters( 'layers', request.GET, mandatory_parameters) | 2703 | return _redirect_parameters( 'all-layers', request.GET, mandatory_parameters, pid=pid) |
2712 | 2704 | ||
2713 | # boilerplate code that takes a request for an object type and returns a queryset | 2705 | # boilerplate code that takes a request for an object type and returns a queryset |
2714 | # for that object type. copypasta for all needed table searches | 2706 | # for that object type. copypasta for all needed table searches |
2715 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) | 2707 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) |
2716 | 2708 | ||
2717 | prj = Project.objects.get(pk = request.session['project_id']) | 2709 | prj = Project.objects.get(pk = pid) |
2718 | 2710 | ||
2719 | queryset_all = prj.compatible_layerversions() | 2711 | queryset_all = prj.compatible_layerversions() |
2720 | 2712 | ||
@@ -2729,6 +2721,7 @@ if toastermain.settings.MANAGED: | |||
2729 | 2721 | ||
2730 | 2722 | ||
2731 | context = { | 2723 | context = { |
2724 | 'project' : prj, | ||
2732 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), | 2725 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), |
2733 | 'objects' : layer_info, | 2726 | 'objects' : layer_info, |
2734 | 'objectname' : "layers", | 2727 | 'objectname' : "layers", |
@@ -2773,7 +2766,7 @@ if toastermain.settings.MANAGED: | |||
2773 | 2766 | ||
2774 | return response | 2767 | return response |
2775 | 2768 | ||
2776 | def layerdetails(request, layerid): | 2769 | def layerdetails(request, pid, layerid): |
2777 | template = "layerdetails.html" | 2770 | template = "layerdetails.html" |
2778 | limit = 10 | 2771 | limit = 10 |
2779 | 2772 | ||
@@ -2806,8 +2799,9 @@ if toastermain.settings.MANAGED: | |||
2806 | machines = _build_page_range(Paginator(machines_query.order_by("name"), limit), request.GET.get('mpage', 1)) | 2799 | machines = _build_page_range(Paginator(machines_query.order_by("name"), limit), request.GET.get('mpage', 1)) |
2807 | 2800 | ||
2808 | context = { | 2801 | context = { |
2802 | 'project' : Project.objects.get(pk=pid), | ||
2809 | 'layerversion': layer_version, | 2803 | 'layerversion': layer_version, |
2810 | 'layer_in_project' : ProjectLayer.objects.filter(project_id=request.session['project_id'],layercommit=layerid).count(), | 2804 | 'layer_in_project' : ProjectLayer.objects.filter(project_id=pid,layercommit=layerid).count(), |
2811 | 'machines': machines, | 2805 | 'machines': machines, |
2812 | 'targets': targets, | 2806 | 'targets': targets, |
2813 | 'total_targets': Recipe.objects.filter(layer_version=layer_version).count(), | 2807 | 'total_targets': Recipe.objects.filter(layer_version=layer_version).count(), |
@@ -2816,19 +2810,16 @@ if toastermain.settings.MANAGED: | |||
2816 | } | 2810 | } |
2817 | return render(request, template, context) | 2811 | return render(request, template, context) |
2818 | 2812 | ||
2819 | def targets(request): | 2813 | def targets(request, pid): |
2820 | if not 'project_id' in request.session: | ||
2821 | raise Exception("invalid page: cannot show page without a project") | ||
2822 | |||
2823 | template = 'targets.html' | 2814 | template = 'targets.html' |
2824 | (pagesize, orderby) = _get_parameters_values(request, 100, 'name:+') | 2815 | (pagesize, orderby) = _get_parameters_values(request, 100, 'name:+') |
2825 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } | 2816 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } |
2826 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 2817 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
2827 | if retval: | 2818 | if retval: |
2828 | return _redirect_parameters( 'all-targets', request.GET, mandatory_parameters) | 2819 | return _redirect_parameters( 'all-targets', request.GET, mandatory_parameters, pid = pid) |
2829 | (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) | 2820 | (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) |
2830 | 2821 | ||
2831 | prj = Project.objects.get(pk = request.session['project_id']) | 2822 | prj = Project.objects.get(pk = pid) |
2832 | queryset_all = Recipe.objects.filter(Q(layer_version__up_branch__name= prj.release.name) | Q(layer_version__build__in = prj.build_set.all())).filter(name__regex=r'.{1,}.*') | 2823 | queryset_all = Recipe.objects.filter(Q(layer_version__up_branch__name= prj.release.name) | Q(layer_version__build__in = prj.build_set.all())).filter(name__regex=r'.{1,}.*') |
2833 | 2824 | ||
2834 | queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') | 2825 | queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') |
@@ -2854,6 +2845,7 @@ if toastermain.settings.MANAGED: | |||
2854 | e.vcs_link_url = e.vcs_link_url.replace('%branch%', e.preffered_layerversion.up_branch.name) | 2845 | e.vcs_link_url = e.vcs_link_url.replace('%branch%', e.preffered_layerversion.up_branch.name) |
2855 | 2846 | ||
2856 | context = { | 2847 | context = { |
2848 | 'project' : prj, | ||
2857 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all().select_related("layercommit"))), | 2849 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all().select_related("layercommit"))), |
2858 | 'objects' : target_info, | 2850 | 'objects' : target_info, |
2859 | 'objectname' : "recipes", | 2851 | 'objectname' : "recipes", |
@@ -2916,10 +2908,7 @@ if toastermain.settings.MANAGED: | |||
2916 | 2908 | ||
2917 | return response | 2909 | return response |
2918 | 2910 | ||
2919 | def machines(request): | 2911 | def machines(request, pid): |
2920 | if not 'project_id' in request.session: | ||
2921 | raise Exception("invalid page: cannot show page without a project") | ||
2922 | |||
2923 | template = "machines.html" | 2912 | template = "machines.html" |
2924 | # define here what parameters the view needs in the GET portion in order to | 2913 | # define here what parameters the view needs in the GET portion in order to |
2925 | # be able to display something. 'count' and 'page' are mandatory for all views | 2914 | # be able to display something. 'count' and 'page' are mandatory for all views |
@@ -2928,13 +2917,13 @@ if toastermain.settings.MANAGED: | |||
2928 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; | 2917 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; |
2929 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 2918 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
2930 | if retval: | 2919 | if retval: |
2931 | return _redirect_parameters( 'machines', request.GET, mandatory_parameters) | 2920 | return _redirect_parameters( 'all-machines', request.GET, mandatory_parameters, pid = pid) |
2932 | 2921 | ||
2933 | # boilerplate code that takes a request for an object type and returns a queryset | 2922 | # boilerplate code that takes a request for an object type and returns a queryset |
2934 | # for that object type. copypasta for all needed table searches | 2923 | # for that object type. copypasta for all needed table searches |
2935 | (filter_string, search_term, ordering_string) = _search_tuple(request, Machine) | 2924 | (filter_string, search_term, ordering_string) = _search_tuple(request, Machine) |
2936 | 2925 | ||
2937 | prj = Project.objects.get(pk = request.session['project_id']) | 2926 | prj = Project.objects.get(pk = pid) |
2938 | compatible_layers = prj.compatible_layerversions() | 2927 | compatible_layers = prj.compatible_layerversions() |
2939 | 2928 | ||
2940 | queryset_all = Machine.objects.filter(layer_version__in=compatible_layers) | 2929 | queryset_all = Machine.objects.filter(layer_version__in=compatible_layers) |
@@ -2946,7 +2935,7 @@ if toastermain.settings.MANAGED: | |||
2946 | # Make sure we only show machines / layers which are compatible | 2935 | # Make sure we only show machines / layers which are compatible |
2947 | # with the current project | 2936 | # with the current project |
2948 | 2937 | ||
2949 | project_layers = ProjectLayer.objects.filter(project_id=request.session['project_id']).values_list('layercommit',flat=True) | 2938 | project_layers = ProjectLayer.objects.filter(project_id=pid).values_list('layercommit',flat=True) |
2950 | 2939 | ||
2951 | # Now we need to weed out the layers which will appear as duplicated | 2940 | # Now we need to weed out the layers which will appear as duplicated |
2952 | # because they're from a layer source which doesn't need to be used | 2941 | # because they're from a layer source which doesn't need to be used |
@@ -2958,6 +2947,7 @@ if toastermain.settings.MANAGED: | |||
2958 | machine_info = _build_page_range(Paginator(queryset_all, request.GET.get('count', 100)),request.GET.get('page', 1)) | 2947 | machine_info = _build_page_range(Paginator(queryset_all, request.GET.get('count', 100)),request.GET.get('page', 1)) |
2959 | 2948 | ||
2960 | context = { | 2949 | context = { |
2950 | 'project': prj, | ||
2961 | 'objects' : machine_info, | 2951 | 'objects' : machine_info, |
2962 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), | 2952 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), |
2963 | 'objectname' : "machines", | 2953 | 'objectname' : "machines", |
@@ -3041,6 +3031,7 @@ if toastermain.settings.MANAGED: | |||
3041 | configvars = configvars.exclude(name = var) | 3031 | configvars = configvars.exclude(name = var) |
3042 | 3032 | ||
3043 | context = { | 3033 | context = { |
3034 | 'project': prj, | ||
3044 | 'configvars': configvars, | 3035 | 'configvars': configvars, |
3045 | 'vars_managed': vars_managed, | 3036 | 'vars_managed': vars_managed, |
3046 | 'vars_fstypes': vars_fstypes, | 3037 | 'vars_fstypes': vars_fstypes, |
@@ -3316,17 +3307,6 @@ if toastermain.settings.MANAGED: | |||
3316 | 3307 | ||
3317 | 3308 | ||
3318 | else: | 3309 | else: |
3319 | # these are pages that are NOT available in interactive mode | ||
3320 | def managedcontextprocessor(request): | ||
3321 | return { | ||
3322 | "projects": [], | ||
3323 | "MANAGED" : toastermain.settings.MANAGED, | ||
3324 | "DEBUG" : toastermain.settings.DEBUG, | ||
3325 | "TOASTER_BRANCH": toastermain.settings.TOASTER_BRANCH, | ||
3326 | "TOASTER_REVISION" : toastermain.settings.TOASTER_REVISION, | ||
3327 | } | ||
3328 | |||
3329 | |||
3330 | # shows the "all builds" page for interactive mode; this is the old code, simply moved | 3310 | # shows the "all builds" page for interactive mode; this is the old code, simply moved |
3331 | def builds(request): | 3311 | def builds(request): |
3332 | template = 'build.html' | 3312 | template = 'build.html' |