diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
| -rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 173 |
1 files changed, 167 insertions, 6 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 86a34adf24..167b687d03 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
| @@ -1761,7 +1761,7 @@ if toastermain.settings.MANAGED: | |||
| 1761 | from django.contrib.auth.decorators import login_required | 1761 | from django.contrib.auth.decorators import login_required |
| 1762 | 1762 | ||
| 1763 | from orm.models import Project, ProjectLayer, ProjectTarget, ProjectVariable | 1763 | from orm.models import Project, ProjectLayer, ProjectTarget, ProjectVariable |
| 1764 | from orm.models import Branch, LayerSource, ToasterSetting, Release | 1764 | from orm.models import Branch, LayerSource, ToasterSetting, Release, Machine |
| 1765 | from bldcontrol.models import BuildRequest | 1765 | from bldcontrol.models import BuildRequest |
| 1766 | 1766 | ||
| 1767 | import traceback | 1767 | import traceback |
| @@ -1770,10 +1770,13 @@ if toastermain.settings.MANAGED: | |||
| 1770 | 1770 | ||
| 1771 | # the context processor that supplies data used across all the pages | 1771 | # the context processor that supplies data used across all the pages |
| 1772 | def managedcontextprocessor(request): | 1772 | def managedcontextprocessor(request): |
| 1773 | return { | 1773 | ret = { |
| 1774 | "projects": Project.objects.all(), | 1774 | "projects": Project.objects.all(), |
| 1775 | "MANAGED" : toastermain.settings.MANAGED | 1775 | "MANAGED" : toastermain.settings.MANAGED |
| 1776 | } | 1776 | } |
| 1777 | if 'project' in request.session: | ||
| 1778 | ret['project'] = request.session['project'] | ||
| 1779 | return ret | ||
| 1777 | 1780 | ||
| 1778 | # new project | 1781 | # new project |
| 1779 | def newproject(request): | 1782 | def newproject(request): |
| @@ -1922,7 +1925,7 @@ if toastermain.settings.MANAGED: | |||
| 1922 | # define here what parameters the view needs in the GET portion in order to | 1925 | # define here what parameters the view needs in the GET portion in order to |
| 1923 | # be able to display something. 'count' and 'page' are mandatory for all views | 1926 | # be able to display something. 'count' and 'page' are mandatory for all views |
| 1924 | # that use paginators. | 1927 | # that use paginators. |
| 1925 | mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'layer__name:-' }; | 1928 | mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'layer__name:+' }; |
| 1926 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 1929 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
| 1927 | if retval: | 1930 | if retval: |
| 1928 | return _redirect_parameters( 'layers', request.GET, mandatory_parameters) | 1931 | return _redirect_parameters( 'layers', request.GET, mandatory_parameters) |
| @@ -1945,7 +1948,8 @@ if toastermain.settings.MANAGED: | |||
| 1945 | context = { | 1948 | context = { |
| 1946 | 'objects' : layer_info, | 1949 | 'objects' : layer_info, |
| 1947 | 'objectname' : "layers", | 1950 | 'objectname' : "layers", |
| 1948 | 'default_orderby' : 'completed_on:-', | 1951 | 'default_orderby' : 'layer__name:+', |
| 1952 | 'total_count': queryset_with_search.count(), | ||
| 1949 | 1953 | ||
| 1950 | 'tablecols' : [ | 1954 | 'tablecols' : [ |
| 1951 | { 'name': 'Layer', | 1955 | { 'name': 'Layer', |
| @@ -1954,8 +1958,10 @@ if toastermain.settings.MANAGED: | |||
| 1954 | }, | 1958 | }, |
| 1955 | { 'name': 'Description', | 1959 | { 'name': 'Description', |
| 1956 | 'dclass': 'span4', | 1960 | 'dclass': 'span4', |
| 1961 | 'clclass': 'description', | ||
| 1957 | }, | 1962 | }, |
| 1958 | { 'name': 'Layer source', | 1963 | { 'name': 'Layer source', |
| 1964 | 'clclass': 'source', | ||
| 1959 | 'qhelp': "Where the layer is coming from, for example, if it's part of the OpenEmbedded collection of layers or if it's a layer you have imported", | 1965 | 'qhelp': "Where the layer is coming from, for example, if it's part of the OpenEmbedded collection of layers or if it's a layer you have imported", |
| 1960 | 'orderfield': _get_toggle_order(request, "layer_source__name"), | 1966 | 'orderfield': _get_toggle_order(request, "layer_source__name"), |
| 1961 | 'ordericon': _get_toggle_order_icon(request, "layer_source__name"), | 1967 | 'ordericon': _get_toggle_order_icon(request, "layer_source__name"), |
| @@ -1967,15 +1973,20 @@ if toastermain.settings.MANAGED: | |||
| 1967 | }, | 1973 | }, |
| 1968 | { 'name': 'Git repository URL', | 1974 | { 'name': 'Git repository URL', |
| 1969 | 'dclass': 'span6', | 1975 | 'dclass': 'span6', |
| 1976 | 'clclass': 'git-repo', 'hidden': 1, | ||
| 1970 | 'qhelp': "The Git repository for the layer source code", | 1977 | 'qhelp': "The Git repository for the layer source code", |
| 1971 | }, | 1978 | }, |
| 1972 | { 'name': 'Subdirectory', | 1979 | { 'name': 'Subdirectory', |
| 1980 | 'clclass': 'git-subdir', | ||
| 1981 | 'hidden': 1, | ||
| 1973 | 'qhelp': "The layer directory within the Git repository", | 1982 | 'qhelp': "The layer directory within the Git repository", |
| 1974 | }, | 1983 | }, |
| 1975 | { 'name': 'Branch, tag o commit', | 1984 | { 'name': 'Branch, tag o commit', |
| 1985 | 'clclass': 'branch', | ||
| 1976 | 'qhelp': "The Git branch of the layer. For the layers from the OpenEmbedded source, the branch matches the Yocto Project version you selected for this project", | 1986 | 'qhelp': "The Git branch of the layer. For the layers from the OpenEmbedded source, the branch matches the Yocto Project version you selected for this project", |
| 1977 | }, | 1987 | }, |
| 1978 | { 'name': 'Dependencies', | 1988 | { 'name': 'Dependencies', |
| 1989 | 'clclass': 'dependencies', | ||
| 1979 | 'qhelp': "Other layers a layer depends upon", | 1990 | 'qhelp': "Other layers a layer depends upon", |
| 1980 | }, | 1991 | }, |
| 1981 | { 'name': 'Add | Delete', | 1992 | { 'name': 'Add | Delete', |
| @@ -1992,10 +2003,160 @@ if toastermain.settings.MANAGED: | |||
| 1992 | raise Exception("TODO: implement page #6591") | 2003 | raise Exception("TODO: implement page #6591") |
| 1993 | 2004 | ||
| 1994 | def targets(request): | 2005 | def targets(request): |
| 1995 | raise Exception("TODO: implement page #6592") | 2006 | template = "targets.html" |
| 2007 | # define here what parameters the view needs in the GET portion in order to | ||
| 2008 | # be able to display something. 'count' and 'page' are mandatory for all views | ||
| 2009 | # that use paginators. | ||
| 2010 | mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'name:+' }; | ||
| 2011 | retval = _verify_parameters( request.GET, mandatory_parameters ) | ||
| 2012 | if retval: | ||
| 2013 | return _redirect_parameters( 'targets', request.GET, mandatory_parameters) | ||
| 2014 | |||
| 2015 | # boilerplate code that takes a request for an object type and returns a queryset | ||
| 2016 | # for that object type. copypasta for all needed table searches | ||
| 2017 | (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) | ||
| 2018 | |||
| 2019 | queryset_all = Recipe.objects.all() | ||
| 2020 | if 'project' in request.session: | ||
| 2021 | queryset_all = queryset_all.filter(Q(layer_version__up_branch__in = Branch.objects.filter(name = request.session['project'].release.name)) | Q(layer_version__build__in = request.session['project'].build_set.all())) | ||
| 2022 | |||
| 2023 | queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') | ||
| 2024 | queryset = _get_queryset(Recipe, queryset_all, filter_string, search_term, ordering_string, '-name') | ||
| 2025 | |||
| 2026 | # retrieve the objects that will be displayed in the table; targets a paginator and gets a page range to display | ||
| 2027 | target_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1)) | ||
| 2028 | |||
| 2029 | |||
| 2030 | context = { | ||
| 2031 | 'objects' : target_info, | ||
| 2032 | 'objectname' : "targets", | ||
| 2033 | 'default_orderby' : 'name:+', | ||
| 2034 | 'total_count': queryset_with_search.count(), | ||
| 2035 | |||
| 2036 | 'tablecols' : [ | ||
| 2037 | { 'name': 'Target', | ||
| 2038 | 'orderfield': _get_toggle_order(request, "name"), | ||
| 2039 | 'ordericon' : _get_toggle_order_icon(request, "name"), | ||
| 2040 | }, | ||
| 2041 | { 'name': 'Target version', | ||
| 2042 | 'dclass': 'span2', | ||
| 2043 | }, | ||
| 2044 | { 'name': 'Description', | ||
| 2045 | 'dclass': 'span5', | ||
| 2046 | 'clclass': 'description', | ||
| 2047 | }, | ||
| 2048 | { 'name': 'Recipe file', | ||
| 2049 | 'clclass': 'recipe-file', | ||
| 2050 | 'hidden': 1, | ||
| 2051 | 'dclass': 'span5', | ||
| 2052 | }, | ||
| 2053 | { 'name': 'Section', | ||
| 2054 | 'clclass': 'target-section', | ||
| 2055 | 'hidden': 1, | ||
| 2056 | }, | ||
| 2057 | { 'name': 'License', | ||
| 2058 | 'clclass': 'license', | ||
| 2059 | 'hidden': 1, | ||
| 2060 | }, | ||
| 2061 | { 'name': 'Layer', | ||
| 2062 | 'clclass': 'layer', | ||
| 2063 | }, | ||
| 2064 | { 'name': 'Layer source', | ||
| 2065 | 'clclass': 'source', | ||
| 2066 | 'qhelp': "Where the target is coming from, for example, if it's part of the OpenEmbedded collection of targets or if it's a target you have imported", | ||
| 2067 | 'orderfield': _get_toggle_order(request, "layer_source__name"), | ||
| 2068 | 'ordericon': _get_toggle_order_icon(request, "layer_source__name"), | ||
| 2069 | 'filter': { | ||
| 2070 | 'class': 'target', | ||
| 2071 | 'label': 'Show:', | ||
| 2072 | 'options': map(lambda x: (x.name, 'layer_source__pk:' + str(x.id), queryset_with_search.filter(layer_source__pk = x.id).count() ), LayerSource.objects.all()), | ||
| 2073 | } | ||
| 2074 | }, | ||
| 2075 | { 'name': 'Branch, tag or commit', | ||
| 2076 | 'clclass': 'branch', | ||
| 2077 | 'hidden': 1, | ||
| 2078 | }, | ||
| 2079 | { 'name': 'Build', | ||
| 2080 | 'dclass': 'span2', | ||
| 2081 | 'qhelp': "Add or delete targets to / from your project ", | ||
| 2082 | }, | ||
| 2083 | |||
| 2084 | ] | ||
| 2085 | } | ||
| 2086 | |||
| 2087 | return render(request, template, context) | ||
| 1996 | 2088 | ||
| 1997 | def machines(request): | 2089 | def machines(request): |
| 1998 | raise Exception("TODO: implement page #6593") | 2090 | template = "machines.html" |
| 2091 | # define here what parameters the view needs in the GET portion in order to | ||
| 2092 | # be able to display something. 'count' and 'page' are mandatory for all views | ||
| 2093 | # that use paginators. | ||
| 2094 | mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'name:+' }; | ||
| 2095 | retval = _verify_parameters( request.GET, mandatory_parameters ) | ||
| 2096 | if retval: | ||
| 2097 | return _redirect_parameters( 'machines', request.GET, mandatory_parameters) | ||
| 2098 | |||
| 2099 | # boilerplate code that takes a request for an object type and returns a queryset | ||
| 2100 | # for that object type. copypasta for all needed table searches | ||
| 2101 | (filter_string, search_term, ordering_string) = _search_tuple(request, Machine) | ||
| 2102 | |||
| 2103 | queryset_all = Machine.objects.all() | ||
| 2104 | # if 'project' in request.session: | ||
| 2105 | # queryset_all = queryset_all.filter(Q(layer_version__up_branch__in = Branch.objects.filter(name = request.session['project'].release.name)) | Q(layer_version__build__in = request.session['project'].build_set.all())) | ||
| 2106 | |||
| 2107 | queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name') | ||
| 2108 | queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name') | ||
| 2109 | |||
| 2110 | # retrieve the objects that will be displayed in the table; machines a paginator and gets a page range to display | ||
| 2111 | machine_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1)) | ||
| 2112 | |||
| 2113 | |||
| 2114 | context = { | ||
| 2115 | 'objects' : machine_info, | ||
| 2116 | 'objectname' : "machines", | ||
| 2117 | 'default_orderby' : 'name:+', | ||
| 2118 | 'total_count': queryset_with_search.count(), | ||
| 2119 | |||
| 2120 | 'tablecols' : [ | ||
| 2121 | { 'name': 'Machine', | ||
| 2122 | 'orderfield': _get_toggle_order(request, "name"), | ||
| 2123 | 'ordericon' : _get_toggle_order_icon(request, "name"), | ||
| 2124 | }, | ||
| 2125 | { 'name': 'Description', | ||
| 2126 | 'dclass': 'span5', | ||
| 2127 | 'clclass': 'description', | ||
| 2128 | }, | ||
| 2129 | { 'name': 'Machine file', | ||
| 2130 | 'clclass': 'machine-file', | ||
| 2131 | 'hidden': 1, | ||
| 2132 | }, | ||
| 2133 | { 'name': 'Layer', | ||
| 2134 | 'clclass': 'layer', | ||
| 2135 | }, | ||
| 2136 | { 'name': 'Layer source', | ||
| 2137 | 'clclass': 'source', | ||
| 2138 | 'qhelp': "Where the machine is coming from, for example, if it's part of the OpenEmbedded collection of machines or if it's a machine you have imported", | ||
| 2139 | 'orderfield': _get_toggle_order(request, "layer_source__name"), | ||
| 2140 | 'ordericon': _get_toggle_order_icon(request, "layer_source__name"), | ||
| 2141 | 'filter': { | ||
| 2142 | 'class': 'machine', | ||
| 2143 | 'label': 'Show:', | ||
| 2144 | 'options': map(lambda x: (x.name, 'layer_source__pk:' + str(x.id), queryset_with_search.filter(layer_source__pk = x.id).count() ), LayerSource.objects.all()), | ||
| 2145 | } | ||
| 2146 | }, | ||
| 2147 | { 'name': 'Branch, tag or commit', | ||
| 2148 | 'clclass': 'branch', | ||
| 2149 | 'hidden': 1, | ||
| 2150 | }, | ||
| 2151 | { 'name': 'Select', | ||
| 2152 | 'dclass': 'span2', | ||
| 2153 | 'qhelp': "Add or delete machines to / from your project ", | ||
| 2154 | }, | ||
| 2155 | |||
| 2156 | ] | ||
| 2157 | } | ||
| 2158 | |||
| 2159 | return render(request, template, context) | ||
| 1999 | 2160 | ||
| 2000 | def projectconf(request, pid): | 2161 | def projectconf(request, pid): |
| 2001 | raise Exception("TODO: implement page #6588") | 2162 | raise Exception("TODO: implement page #6588") |
