diff options
author | Michael Wood <michael.g.wood@intel.com> | 2015-05-11 18:51:28 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-05-14 18:04:09 +0100 |
commit | 23f5b009e0ebf59cfcc9ae90a1084468fc88e42f (patch) | |
tree | 06eb458cbd9a95dd635160adac7d90aeae6afea1 /bitbake/lib/toaster/toastergui/views.py | |
parent | 7f8c44771cc6219ad7e58da7840fffbe93f11b39 (diff) | |
download | poky-23f5b009e0ebf59cfcc9ae90a1084468fc88e42f.tar.gz |
bitbake: toaster: Port All recipes, layers and machines to ToasterTables
Port of the main tables to the new ToasterTable widget.
(Bitbake rev: 6de539d5953b2dca2a9ed75556a59764337a194c)
Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 267 |
1 files changed, 1 insertions, 266 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index c22f2c1aba..9217d8a100 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -2317,7 +2317,7 @@ if toastermain.settings.MANAGED: | |||
2317 | "tooltip": x.layer.vcs_url+" | "+x.get_vcs_reference(), | 2317 | "tooltip": x.layer.vcs_url+" | "+x.get_vcs_reference(), |
2318 | "detail": "(" + x.layer.vcs_url + (")" if x.up_branch == None else " | "+x.get_vcs_reference()+")"), | 2318 | "detail": "(" + x.layer.vcs_url + (")" if x.up_branch == None else " | "+x.get_vcs_reference()+")"), |
2319 | "giturl": x.layer.vcs_url, | 2319 | "giturl": x.layer.vcs_url, |
2320 | "layerdetailurl" : reverse('layerdetails', args=(pid, x.pk,)), | 2320 | "layerdetailurl" : reverse('layerdetails', args=(prj.id,x.pk)), |
2321 | "revision" : x.get_vcs_reference(), | 2321 | "revision" : x.get_vcs_reference(), |
2322 | } | 2322 | } |
2323 | 2323 | ||
@@ -2656,81 +2656,6 @@ if toastermain.settings.MANAGED: | |||
2656 | return render(request, template, context) | 2656 | return render(request, template, context) |
2657 | 2657 | ||
2658 | 2658 | ||
2659 | def layers(request, pid): | ||
2660 | |||
2661 | template = "layers.html" | ||
2662 | # define here what parameters the view needs in the GET portion in order to | ||
2663 | # be able to display something. 'count' and 'page' are mandatory for all views | ||
2664 | # that use paginators. | ||
2665 | (pagesize, orderby) = _get_parameters_values(request, 100, 'layer__name:+') | ||
2666 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; | ||
2667 | retval = _verify_parameters( request.GET, mandatory_parameters ) | ||
2668 | if retval: | ||
2669 | return _redirect_parameters( 'all-layers', request.GET, mandatory_parameters, pid=pid) | ||
2670 | |||
2671 | # boilerplate code that takes a request for an object type and returns a queryset | ||
2672 | # for that object type. copypasta for all needed table searches | ||
2673 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) | ||
2674 | |||
2675 | prj = Project.objects.get(pk = pid) | ||
2676 | |||
2677 | queryset_all = prj.compatible_layerversions() | ||
2678 | |||
2679 | queryset_all = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name') | ||
2680 | |||
2681 | object_list = set([x.get_equivalents_wpriority(prj)[0] for x in queryset_all]) | ||
2682 | object_list = list(object_list) | ||
2683 | |||
2684 | |||
2685 | # retrieve the objects that will be displayed in the table; layers a paginator and gets a page range to display | ||
2686 | layer_info = _build_page_range(Paginator(object_list, request.GET.get('count', 10)),request.GET.get('page', 1)) | ||
2687 | |||
2688 | |||
2689 | context = { | ||
2690 | 'project' : prj, | ||
2691 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), | ||
2692 | 'objects' : layer_info, | ||
2693 | 'objectname' : "layers", | ||
2694 | 'default_orderby' : 'layer__name:+', | ||
2695 | |||
2696 | 'tablecols' : [ | ||
2697 | { 'name': 'Layer', | ||
2698 | 'orderfield': _get_toggle_order(request, "layer__name"), | ||
2699 | 'ordericon' : _get_toggle_order_icon(request, "layer__name"), | ||
2700 | }, | ||
2701 | { 'name': 'Description', | ||
2702 | 'dclass': 'span4', | ||
2703 | 'clclass': 'description', | ||
2704 | }, | ||
2705 | { 'name': 'Git repository URL', | ||
2706 | 'dclass': 'span6', | ||
2707 | 'clclass': 'git-repo', 'hidden': 1, | ||
2708 | 'qhelp': "The Git repository for the layer source code", | ||
2709 | }, | ||
2710 | { 'name': 'Subdirectory', | ||
2711 | 'clclass': 'git-subdir', | ||
2712 | 'hidden': 1, | ||
2713 | 'qhelp': "The layer directory within the Git repository", | ||
2714 | }, | ||
2715 | { 'name': 'Revision', | ||
2716 | 'clclass': 'branch', | ||
2717 | 'qhelp': "The Git branch, tag or commit. For the layers from the OpenEmbedded layer source, the revision is always the branch compatible with the Yocto Project version you selected for this project", | ||
2718 | }, | ||
2719 | { 'name': 'Dependencies', | ||
2720 | 'clclass': 'dependencies', | ||
2721 | 'qhelp': "Other layers a layer depends upon", | ||
2722 | }, | ||
2723 | { 'name': 'Add | Delete', | ||
2724 | 'dclass': 'span2', | ||
2725 | 'qhelp': "Add or delete layers to / from your project ", | ||
2726 | }, | ||
2727 | ] | ||
2728 | } | ||
2729 | |||
2730 | response = render(request, template, context) | ||
2731 | _save_parameters_cookies(response, pagesize, orderby, request) | ||
2732 | |||
2733 | return response | ||
2734 | 2659 | ||
2735 | def layerdetails(request, pid, layerid): | 2660 | def layerdetails(request, pid, layerid): |
2736 | template = "layerdetails.html" | 2661 | template = "layerdetails.html" |
@@ -2776,187 +2701,6 @@ if toastermain.settings.MANAGED: | |||
2776 | } | 2701 | } |
2777 | return render(request, template, context) | 2702 | return render(request, template, context) |
2778 | 2703 | ||
2779 | def targets(request, pid): | ||
2780 | template = 'targets.html' | ||
2781 | (pagesize, orderby) = _get_parameters_values(request, 100, 'name:+') | ||
2782 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } | ||
2783 | retval = _verify_parameters( request.GET, mandatory_parameters ) | ||
2784 | if retval: | ||
2785 | return _redirect_parameters( 'all-targets', request.GET, mandatory_parameters, pid = pid) | ||
2786 | (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) | ||
2787 | |||
2788 | prj = Project.objects.get(pk = pid) | ||
2789 | 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,}.*') | ||
2790 | |||
2791 | queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') | ||
2792 | |||
2793 | # get unique values for 'name', and select the maximum ID for each entry (the max id is the newest one) | ||
2794 | |||
2795 | # force evaluation of the query here; to process the MAX/GROUP BY, a temporary table is used, on which indexing is very slow | ||
2796 | # by forcing the evaluation here we also prime the caches | ||
2797 | queryset_with_search_maxids = map(lambda i: i[0], list(queryset_with_search.values('name').distinct().annotate(max_id=Max('id')).values_list('max_id'))) | ||
2798 | |||
2799 | queryset_with_search = queryset_with_search.filter(id__in=queryset_with_search_maxids).select_related('layer_version', 'layer_version__layer', 'layer_version__up_branch', 'layer_source') | ||
2800 | |||
2801 | |||
2802 | # retrieve the objects that will be displayed in the table; targets a paginator and gets a page range to display | ||
2803 | target_info = _build_page_range(Paginator(queryset_with_search, request.GET.get('count', 10)),request.GET.get('page', 1)) | ||
2804 | |||
2805 | for e in target_info.object_list: | ||
2806 | e.preffered_layerversion = e.layer_version.get_equivalents_wpriority(prj)[0] | ||
2807 | e.vcs_link_url = Layer.objects.filter(name = e.preffered_layerversion.layer.name).exclude(vcs_web_file_base_url__isnull=True)[0].vcs_web_file_base_url | ||
2808 | if e.vcs_link_url != None: | ||
2809 | fp = e.preffered_layerversion.dirpath + "/" + e.file_path | ||
2810 | e.vcs_link_url = e.vcs_link_url.replace('%path%', fp) | ||
2811 | e.vcs_link_url = e.vcs_link_url.replace('%branch%', e.preffered_layerversion.up_branch.name) | ||
2812 | |||
2813 | context = { | ||
2814 | 'project' : prj, | ||
2815 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all().select_related("layercommit"))), | ||
2816 | 'objects' : target_info, | ||
2817 | 'objectname' : "recipes", | ||
2818 | 'default_orderby' : 'name:+', | ||
2819 | |||
2820 | 'tablecols' : [ | ||
2821 | { 'name': 'Recipe', | ||
2822 | 'orderfield': _get_toggle_order(request, "name"), | ||
2823 | 'ordericon' : _get_toggle_order_icon(request, "name"), | ||
2824 | }, | ||
2825 | { 'name': 'Recipe version', | ||
2826 | 'dclass': 'span2', | ||
2827 | }, | ||
2828 | { 'name': 'Description', | ||
2829 | 'dclass': 'span5', | ||
2830 | 'clclass': 'description', | ||
2831 | }, | ||
2832 | { 'name': 'Recipe file', | ||
2833 | 'clclass': 'recipe-file', | ||
2834 | 'hidden': 1, | ||
2835 | 'dclass': 'span5', | ||
2836 | }, | ||
2837 | { 'name': 'Section', | ||
2838 | 'clclass': 'target-section', | ||
2839 | 'hidden': 1, | ||
2840 | 'orderfield': _get_toggle_order(request, "section"), | ||
2841 | 'ordericon': _get_toggle_order_icon(request, "section"), | ||
2842 | 'orderkey': "section", | ||
2843 | }, | ||
2844 | { 'name': 'License', | ||
2845 | 'clclass': 'license', | ||
2846 | 'hidden': 1, | ||
2847 | 'orderfield': _get_toggle_order(request, "license"), | ||
2848 | 'ordericon': _get_toggle_order_icon(request, "license"), | ||
2849 | 'orderkey': "license", | ||
2850 | }, | ||
2851 | { 'name': 'Layer', | ||
2852 | 'clclass': 'layer', | ||
2853 | 'orderfield': _get_toggle_order(request, "layer_version__layer__name"), | ||
2854 | 'ordericon': _get_toggle_order_icon(request, "layer_version__layer__name"), | ||
2855 | 'orderkey': "layer_version__layer__name", | ||
2856 | }, | ||
2857 | { 'name': 'Revision', | ||
2858 | 'clclass': 'branch', | ||
2859 | 'qhelp': "The Git branch, tag or commit. For the layers from the OpenEmbedded layer source, the revision is always the branch compatible with the Yocto Project version you selected for this project.", | ||
2860 | 'hidden': 1, | ||
2861 | }, | ||
2862 | ] | ||
2863 | } | ||
2864 | |||
2865 | context['tablecols'] += [ | ||
2866 | { 'name': 'Build', | ||
2867 | 'dclass': 'span2', | ||
2868 | 'qhelp': "Add or delete targets to / from your project ", | ||
2869 | }, ] | ||
2870 | |||
2871 | response = render(request, template, context) | ||
2872 | _save_parameters_cookies(response, pagesize, orderby, request) | ||
2873 | |||
2874 | return response | ||
2875 | |||
2876 | def machines(request, pid): | ||
2877 | template = "machines.html" | ||
2878 | # define here what parameters the view needs in the GET portion in order to | ||
2879 | # be able to display something. 'count' and 'page' are mandatory for all views | ||
2880 | # that use paginators. | ||
2881 | (pagesize, orderby) = _get_parameters_values(request, 100, 'name:+') | ||
2882 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; | ||
2883 | retval = _verify_parameters( request.GET, mandatory_parameters ) | ||
2884 | if retval: | ||
2885 | return _redirect_parameters( 'all-machines', request.GET, mandatory_parameters, pid = pid) | ||
2886 | |||
2887 | # boilerplate code that takes a request for an object type and returns a queryset | ||
2888 | # for that object type. copypasta for all needed table searches | ||
2889 | (filter_string, search_term, ordering_string) = _search_tuple(request, Machine) | ||
2890 | |||
2891 | prj = Project.objects.get(pk = pid) | ||
2892 | compatible_layers = prj.compatible_layerversions() | ||
2893 | |||
2894 | queryset_all = Machine.objects.filter(layer_version__in=compatible_layers) | ||
2895 | queryset_all = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, 'name') | ||
2896 | |||
2897 | queryset_all = queryset_all.prefetch_related('layer_version') | ||
2898 | |||
2899 | |||
2900 | # Make sure we only show machines / layers which are compatible | ||
2901 | # with the current project | ||
2902 | |||
2903 | project_layers = ProjectLayer.objects.filter(project_id=pid).values_list('layercommit',flat=True) | ||
2904 | |||
2905 | # Now we need to weed out the layers which will appear as duplicated | ||
2906 | # because they're from a layer source which doesn't need to be used | ||
2907 | for machine in queryset_all: | ||
2908 | to_rm = machine.layer_version.get_equivalents_wpriority(prj)[1:] | ||
2909 | if len(to_rm) > 0: | ||
2910 | queryset_all = queryset_all.exclude(layer_version__in=to_rm) | ||
2911 | |||
2912 | machine_info = _build_page_range(Paginator(queryset_all, request.GET.get('count', 100)),request.GET.get('page', 1)) | ||
2913 | |||
2914 | context = { | ||
2915 | 'project': prj, | ||
2916 | 'objects' : machine_info, | ||
2917 | 'projectlayerset' : jsonfilter(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), | ||
2918 | 'objectname' : "machines", | ||
2919 | 'default_orderby' : 'name:+', | ||
2920 | |||
2921 | 'tablecols' : [ | ||
2922 | { 'name': 'Machine', | ||
2923 | 'orderfield': _get_toggle_order(request, "name"), | ||
2924 | 'ordericon' : _get_toggle_order_icon(request, "name"), | ||
2925 | 'orderkey' : "name", | ||
2926 | }, | ||
2927 | { 'name': 'Description', | ||
2928 | 'dclass': 'span5', | ||
2929 | 'clclass': 'description', | ||
2930 | }, | ||
2931 | { 'name': 'Layer', | ||
2932 | 'clclass': 'layer', | ||
2933 | 'orderfield': _get_toggle_order(request, "layer_version__layer__name"), | ||
2934 | 'ordericon' : _get_toggle_order_icon(request, "layer_version__layer__name"), | ||
2935 | 'orderkey' : "layer_version__layer__name", | ||
2936 | }, | ||
2937 | { 'name': 'Revision', | ||
2938 | 'clclass': 'branch', | ||
2939 | 'qhelp' : "The Git branch, tag or commit. For the layers from the OpenEmbedded layer source, the revision is always the branch compatible with the Yocto Project version you selected for this project", | ||
2940 | 'hidden': 1, | ||
2941 | }, | ||
2942 | { 'name' : 'Machine file', | ||
2943 | 'clclass' : 'machinefile', | ||
2944 | 'hidden' : 1, | ||
2945 | }, | ||
2946 | { 'name': 'Select', | ||
2947 | 'dclass': 'select span2', | ||
2948 | 'qhelp': "Sets the selected machine as the project machine. You can only have one machine per project", | ||
2949 | }, | ||
2950 | |||
2951 | ] | ||
2952 | } | ||
2953 | |||
2954 | response = render(request, template, context) | ||
2955 | _save_parameters_cookies(response, pagesize, orderby, request) | ||
2956 | |||
2957 | return response | ||
2958 | |||
2959 | |||
2960 | def get_project_configvars_context(): | 2704 | def get_project_configvars_context(): |
2961 | # Vars managed outside of this view | 2705 | # Vars managed outside of this view |
2962 | vars_managed = { | 2706 | vars_managed = { |
@@ -3497,18 +3241,9 @@ else: | |||
3497 | def importlayer(request): | 3241 | def importlayer(request): |
3498 | return render(request, 'landing_not_managed.html') | 3242 | return render(request, 'landing_not_managed.html') |
3499 | 3243 | ||
3500 | def layers(request): | ||
3501 | return render(request, 'landing_not_managed.html') | ||
3502 | |||
3503 | def layerdetails(request, layerid): | 3244 | def layerdetails(request, layerid): |
3504 | return render(request, 'landing_not_managed.html') | 3245 | return render(request, 'landing_not_managed.html') |
3505 | 3246 | ||
3506 | def targets(request, pid): | ||
3507 | return render(request, 'landing_not_managed.html') | ||
3508 | |||
3509 | def machines(request): | ||
3510 | return render(request, 'landing_not_managed.html') | ||
3511 | |||
3512 | def projectconf(request, pid): | 3247 | def projectconf(request, pid): |
3513 | return render(request, 'landing_not_managed.html') | 3248 | return render(request, 'landing_not_managed.html') |
3514 | 3249 | ||