diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 157 |
1 files changed, 80 insertions, 77 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index e568ee70ed..fb8075067a 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -123,7 +123,7 @@ def _redirect_parameters(view, g, mandatory_parameters, *args, **kwargs): | |||
123 | params[i] = g[i] | 123 | params[i] = g[i] |
124 | for i in mandatory_parameters: | 124 | for i in mandatory_parameters: |
125 | if not i in params: | 125 | if not i in params: |
126 | params[i] = mandatory_parameters[i] | 126 | params[i] = urllib.unquote(str(mandatory_parameters[i])) |
127 | 127 | ||
128 | return redirect(url + "?%s" % urllib.urlencode(params), *args, **kwargs) | 128 | return redirect(url + "?%s" % urllib.urlencode(params), *args, **kwargs) |
129 | 129 | ||
@@ -202,6 +202,7 @@ def _get_search_results(search_term, queryset, model): | |||
202 | 202 | ||
203 | search_objects.append(reduce(operator.or_, q_map)) | 203 | search_objects.append(reduce(operator.or_, q_map)) |
204 | search_object = reduce(operator.and_, search_objects) | 204 | search_object = reduce(operator.and_, search_objects) |
205 | print "search objects", search_object | ||
205 | queryset = queryset.filter(search_object) | 206 | queryset = queryset.filter(search_object) |
206 | 207 | ||
207 | return queryset | 208 | return queryset |
@@ -1914,8 +1915,7 @@ if toastermain.settings.MANAGED: | |||
1914 | login(request, user) | 1915 | login(request, user) |
1915 | 1916 | ||
1916 | # save the project | 1917 | # save the project |
1917 | prj = Project.objects.create_project(name = request.POST['projectname'], | 1918 | prj = Project.objects.create_project(name = request.POST['projectname'], release = Release.objects.get(pk = request.POST['projectversion'])) |
1918 | release = Release.objects.get(pk = request.POST['projectversion'])) | ||
1919 | prj.user_id = request.user.pk | 1919 | prj.user_id = request.user.pk |
1920 | prj.save() | 1920 | prj.save() |
1921 | return redirect(reverse(project, args = (prj.pk,)) + "#/newproject") | 1921 | return redirect(reverse(project, args = (prj.pk,)) + "#/newproject") |
@@ -1933,36 +1933,21 @@ if toastermain.settings.MANAGED: | |||
1933 | 1933 | ||
1934 | 1934 | ||
1935 | def _project_recent_build_list(prj): | 1935 | def _project_recent_build_list(prj): |
1936 | # build requests not yet started | 1936 | return map(lambda x: { |
1937 | return (map(lambda x: { | ||
1938 | "id": x.pk, | ||
1939 | "targets" : map(lambda y: {"target": y.target }, x.brtarget_set.all()), | ||
1940 | "status": x.get_state_display(), | ||
1941 | }, prj.buildrequest_set.filter(state__lt = BuildRequest.REQ_INPROGRESS).order_by("-pk")) + | ||
1942 | # build requests started, but with no build yet | ||
1943 | map(lambda x: { | ||
1944 | "id": x.pk, | 1937 | "id": x.pk, |
1945 | "targets" : map(lambda y: {"target": y.target }, x.brtarget_set.all()), | 1938 | "targets" : map(lambda y: {"target": y.target, "task": y.task }, x.brtarget_set.all()), |
1946 | "status": x.get_state_display(), | ||
1947 | }, prj.buildrequest_set.filter(state = BuildRequest.REQ_INPROGRESS, build = None).order_by("-pk")) + | ||
1948 | # build requests that failed | ||
1949 | map(lambda x: { | ||
1950 | "id": x.pk, | ||
1951 | "targets" : map(lambda y: {"target": y.target }, x.brtarget_set.all()), | ||
1952 | "status": x.get_state_display(), | 1939 | "status": x.get_state_display(), |
1953 | "errors": map(lambda y: {"type": y.errtype, "msg": y.errmsg, "tb": y.traceback}, x.brerror_set.all()), | 1940 | "errors": map(lambda y: {"type": y.errtype, "msg": y.errmsg, "tb": y.traceback}, x.brerror_set.all()), |
1954 | }, prj.buildrequest_set.filter(state = BuildRequest.REQ_FAILED).order_by("-pk")) + | 1941 | "build" : map( lambda y: {"id": y.pk, |
1955 | # and already made builds | 1942 | "status": y.get_outcome_display(), |
1956 | map(lambda x: { | 1943 | "completed_on" : y.completed_on.strftime('%s')+"000", |
1957 | "id": x.pk, | 1944 | "build_time" : (y.completed_on - y.started_on).total_seconds(), |
1958 | "targets": map(lambda y: {"target": y.target }, x.target_set.all()), | 1945 | "build_page_url" : reverse('builddashboard', args=(y.pk,)), |
1959 | "status": x.get_outcome_display(), | 1946 | "errors": y.errors_no, |
1960 | "completed_on" : x.completed_on.strftime('%s')+"000", | 1947 | "warnings": y.warnings_no, |
1961 | "build_time" : (x.completed_on - x.started_on).total_seconds(), | 1948 | "completeper": y.completeper(), |
1962 | "build_page_url" : reverse('builddashboard', args=(x.pk,)), | 1949 | "eta": y.eta().ctime()}, Build.objects.filter(buildrequest = x)), |
1963 | "completeper": x.completeper(), | 1950 | }, prj.buildrequest_set.order_by("-pk")[:5]) |
1964 | "eta": x.eta().ctime(), | ||
1965 | }, prj.build_set.all())) | ||
1966 | 1951 | ||
1967 | 1952 | ||
1968 | # Shows the edit project page | 1953 | # Shows the edit project page |
@@ -2025,10 +2010,14 @@ if toastermain.settings.MANAGED: | |||
2025 | 2010 | ||
2026 | if 'buildCancel' in request.POST: | 2011 | if 'buildCancel' in request.POST: |
2027 | for i in request.POST['buildCancel'].strip().split(" "): | 2012 | for i in request.POST['buildCancel'].strip().split(" "): |
2028 | br = BuildRequest.objects.select_for_update().get(project = prj, pk = i, state__lte = BuildRequest.REQ_QUEUED) | 2013 | try: |
2029 | print "selected for delete", br.pk | 2014 | br = BuildRequest.objects.select_for_update().get(project = prj, pk = i, state__lte = BuildRequest.REQ_QUEUED) |
2030 | br.delete() | 2015 | print "selected for delete", br.pk |
2031 | print "selected for delete", br.pk | 2016 | br.delete() |
2017 | print "selected for delete", br.pk | ||
2018 | except BuildRequest.DoesNotExist: | ||
2019 | pass | ||
2020 | |||
2032 | 2021 | ||
2033 | if 'targets' in request.POST: | 2022 | if 'targets' in request.POST: |
2034 | ProjectTarget.objects.filter(project = prj).delete() | 2023 | ProjectTarget.objects.filter(project = prj).delete() |
@@ -2059,7 +2048,7 @@ if toastermain.settings.MANAGED: | |||
2059 | # remove layers | 2048 | # remove layers |
2060 | if 'layerDel' in request.POST: | 2049 | if 'layerDel' in request.POST: |
2061 | for t in request.POST['layerDel'].strip().split(" "): | 2050 | for t in request.POST['layerDel'].strip().split(" "): |
2062 | pt = ProjectLayer.objects.get(project = prj, layercommit_id = int(t)).delete() | 2051 | pt = ProjectLayer.objects.filter(project = prj, layercommit_id = int(t)).delete() |
2063 | 2052 | ||
2064 | if 'projectName' in request.POST: | 2053 | if 'projectName' in request.POST: |
2065 | prj.name = request.POST['projectName'] | 2054 | prj.name = request.POST['projectName'] |
@@ -2071,8 +2060,8 @@ if toastermain.settings.MANAGED: | |||
2071 | prj.save() | 2060 | prj.save() |
2072 | # we need to change the layers | 2061 | # we need to change the layers |
2073 | for i in prj.projectlayer_set.all(): | 2062 | for i in prj.projectlayer_set.all(): |
2074 | # find and add a similarly-named layer from the same layer source on the new branch | 2063 | # find and add a similarly-named layer on the new branch |
2075 | lv = Layer_Version.objects.filter(layer_source = i.layercommit.layer_source, layer__name = i.layercommit.layer.name, up_branch__in = Branch.objects.filter(name = prj.release.branch)) | 2064 | lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__release = prj.release) |
2076 | if lv.count() == 1: | 2065 | if lv.count() == 1: |
2077 | ProjectLayer.objects.get_or_create(project = prj, layercommit = lv[0]) | 2066 | ProjectLayer.objects.get_or_create(project = prj, layercommit = lv[0]) |
2078 | # get rid of the old entry | 2067 | # get rid of the old entry |
@@ -2095,17 +2084,19 @@ if toastermain.settings.MANAGED: | |||
2095 | @csrf_exempt | 2084 | @csrf_exempt |
2096 | def xhr_datatypeahead(request): | 2085 | def xhr_datatypeahead(request): |
2097 | try: | 2086 | try: |
2087 | # returns layers for current project release that are not in the project set | ||
2098 | if request.GET['type'] == "layers": | 2088 | if request.GET['type'] == "layers": |
2099 | queryset_all = Layer_Version.objects.all() | 2089 | queryset_all = Layer_Version.objects.all() |
2100 | if 'project_id' in request.session: | 2090 | if 'project_id' in request.session: |
2101 | prj = Project.objects.get(pk = request.session['project_id']) | 2091 | prj = Project.objects.get(pk = request.session['project_id']) |
2102 | queryset_all = queryset_all.filter(up_branch__in = Branch.objects.filter(name = prj.release.name)).exclude(pk__in = map(lambda x: x.layercommit_id, prj.projectlayer_set.all())) | 2092 | queryset_all = queryset_all.filter(up_branch__release = prj.release).exclude(pk__in = map(lambda x: x.layercommit_id, prj.projectlayer_set.all())) |
2103 | queryset_all = queryset_all.filter(layer__name__icontains=request.GET.get('value','')) | 2093 | queryset_all = queryset_all.filter(layer__name__icontains=request.GET.get('value','')) |
2104 | return HttpResponse(json.dumps( { "error":"ok", | 2094 | return HttpResponse(json.dumps( { "error":"ok", |
2105 | "list" : map( lambda x: {"id": x.pk, "name": x.layer.name, "detail": "(" + x.layer.layer_source.name + (")" if x.up_branch == None else " | "+x.up_branch.name+")")}, | 2095 | "list" : map( lambda x: {"id": x.pk, "name": x.layer.name, "detail": "(" + x.layer.layer_source.name + (")" if x.up_branch == None else " | "+x.up_branch.name+")")}, |
2106 | queryset_all[:8]) | 2096 | queryset_all[:8]) |
2107 | }), content_type = "application/json") | 2097 | }), content_type = "application/json") |
2108 | 2098 | ||
2099 | # returns layer dependencies for a layer, excluding current project layers | ||
2109 | if request.GET['type'] == "layerdeps": | 2100 | if request.GET['type'] == "layerdeps": |
2110 | queryset_all = LayerVersionDependency.objects.filter(layer_version_id = request.GET['value']) | 2101 | queryset_all = LayerVersionDependency.objects.filter(layer_version_id = request.GET['value']) |
2111 | 2102 | ||
@@ -2122,6 +2113,7 @@ if toastermain.settings.MANAGED: | |||
2122 | map(lambda x: x.depends_on, queryset_all)) | 2113 | map(lambda x: x.depends_on, queryset_all)) |
2123 | }), content_type = "application/json") | 2114 | }), content_type = "application/json") |
2124 | 2115 | ||
2116 | # returns layer versions that would be deleted on the new release__pk | ||
2125 | if request.GET['type'] == "versionlayers": | 2117 | if request.GET['type'] == "versionlayers": |
2126 | if not 'project_id' in request.session: | 2118 | if not 'project_id' in request.session: |
2127 | raise Exception("This call cannot makes no sense outside a project context") | 2119 | raise Exception("This call cannot makes no sense outside a project context") |
@@ -2129,8 +2121,8 @@ if toastermain.settings.MANAGED: | |||
2129 | retval = [] | 2121 | retval = [] |
2130 | prj = Project.objects.get(pk = request.session['project_id']) | 2122 | prj = Project.objects.get(pk = request.session['project_id']) |
2131 | for i in prj.projectlayer_set.all(): | 2123 | for i in prj.projectlayer_set.all(): |
2132 | lv = Layer_Version.objects.filter(layer_source = i.layercommit.layer_source, layer__name = i.layercommit.layer.name, up_branch__in = Branch.objects.filter(name = Release.objects.get(pk=request.GET['value']).branch)) | 2124 | lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__release__pk=request.GET['value']) |
2133 | if lv.count() != 1: | 2125 | if lv.count() != 1: # there is no layer_version with the new release id, and the same name |
2134 | retval.append(i) | 2126 | retval.append(i) |
2135 | 2127 | ||
2136 | return HttpResponse(json.dumps( {"error":"ok", | 2128 | return HttpResponse(json.dumps( {"error":"ok", |
@@ -2138,14 +2130,14 @@ if toastermain.settings.MANAGED: | |||
2138 | lambda x: {"id": x.layercommit.pk, "name": x.layercommit.layer.name, "detail": "(" + x.layercommit.layer.layer_source.name + (")" if x.layercommit.up_branch == None else " | "+x.layercommit.up_branch.name+")")}, | 2130 | lambda x: {"id": x.layercommit.pk, "name": x.layercommit.layer.name, "detail": "(" + x.layercommit.layer.layer_source.name + (")" if x.layercommit.up_branch == None else " | "+x.layercommit.up_branch.name+")")}, |
2139 | retval) }), content_type = "application/json") | 2131 | retval) }), content_type = "application/json") |
2140 | 2132 | ||
2141 | 2133 | # returns targets provided by current project layers | |
2142 | if request.GET['type'] == "targets": | 2134 | if request.GET['type'] == "targets": |
2143 | queryset_all = Recipe.objects.all() | 2135 | queryset_all = Recipe.objects.all() |
2144 | if 'project_id' in request.session: | 2136 | if 'project_id' in request.session: |
2145 | queryset_all = queryset_all.filter(layer_version__layer__in = map(lambda x: x.layercommit.layer, ProjectLayer.objects.filter(project_id=request.session['project_id']))) | 2137 | queryset_all = queryset_all.filter(layer_version__layer__in = map(lambda x: x.layercommit.layer, ProjectLayer.objects.filter(project_id=request.session['project_id']))) |
2146 | return HttpResponse(json.dumps({ "error":"ok", | 2138 | return HttpResponse(json.dumps({ "error":"ok", |
2147 | "list" : map ( lambda x: {"id": x.pk, "name": x.name, "detail":"[" + x.layer_version.layer.name+ (" | " + x.layer_version.up_branch.name + "]" if x.layer_version.up_branch is not None else "]")}, | 2139 | "list" : map ( lambda x: {"id": x.pk, "name": x.name, "detail":"[" + x.layer_version.layer.name+ (" | " + x.layer_version.up_branch.name + "]" if x.layer_version.up_branch is not None else "]")}, |
2148 | queryset_all.filter(name__istartswith=request.GET.get('value',''))[:8]), | 2140 | queryset_all.filter(name__icontains=request.GET.get('value',''))[:8]), |
2149 | 2141 | ||
2150 | }), content_type = "application/json") | 2142 | }), content_type = "application/json") |
2151 | 2143 | ||
@@ -2155,7 +2147,7 @@ if toastermain.settings.MANAGED: | |||
2155 | queryset_all = queryset_all.filter(layer_version__layer__in = map(lambda x: x.layercommit.layer, ProjectLayer.objects.filter(project_id=request.session['project_id']))) | 2147 | queryset_all = queryset_all.filter(layer_version__layer__in = map(lambda x: x.layercommit.layer, ProjectLayer.objects.filter(project_id=request.session['project_id']))) |
2156 | return HttpResponse(json.dumps({ "error":"ok", | 2148 | return HttpResponse(json.dumps({ "error":"ok", |
2157 | "list" : map ( lambda x: {"id": x.pk, "name": x.name, "detail":"[" + x.layer_version.layer.name+ (" | " + x.layer_version.up_branch.name + "]" if x.layer_version.up_branch is not None else "]")}, | 2149 | "list" : map ( lambda x: {"id": x.pk, "name": x.name, "detail":"[" + x.layer_version.layer.name+ (" | " + x.layer_version.up_branch.name + "]" if x.layer_version.up_branch is not None else "]")}, |
2158 | queryset_all.filter(name__istartswith=request.GET.get('value',''))[:8]), | 2150 | queryset_all.filter(name__icontains=request.GET.get('value',''))[:8]), |
2159 | 2151 | ||
2160 | }), content_type = "application/json") | 2152 | }), content_type = "application/json") |
2161 | 2153 | ||
@@ -2173,11 +2165,15 @@ if toastermain.settings.MANAGED: | |||
2173 | 2165 | ||
2174 | 2166 | ||
2175 | def layers(request): | 2167 | def layers(request): |
2168 | if not 'project_id' in request.session: | ||
2169 | raise Exception("invalid page: cannot show page without a project") | ||
2170 | |||
2176 | template = "layers.html" | 2171 | template = "layers.html" |
2177 | # define here what parameters the view needs in the GET portion in order to | 2172 | # define here what parameters the view needs in the GET portion in order to |
2178 | # be able to display something. 'count' and 'page' are mandatory for all views | 2173 | # be able to display something. 'count' and 'page' are mandatory for all views |
2179 | # that use paginators. | 2174 | # that use paginators. |
2180 | mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'layer__name:+' }; | 2175 | (pagesize, orderby) = _get_parameters_values(request, 100, 'layer__name:+') |
2176 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby }; | ||
2181 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 2177 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
2182 | if retval: | 2178 | if retval: |
2183 | return _redirect_parameters( 'layers', request.GET, mandatory_parameters) | 2179 | return _redirect_parameters( 'layers', request.GET, mandatory_parameters) |
@@ -2187,18 +2183,9 @@ if toastermain.settings.MANAGED: | |||
2187 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) | 2183 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) |
2188 | 2184 | ||
2189 | queryset_all = Layer_Version.objects.all() | 2185 | queryset_all = Layer_Version.objects.all() |
2190 | # mock an empty Project if we are outside project context | ||
2191 | class _mockProject(object): | ||
2192 | id = -1 | ||
2193 | class _mockManager(object): | ||
2194 | def all(self): | ||
2195 | return [] | ||
2196 | projectlayer_set = _mockManager() | ||
2197 | prj = _mockProject() | ||
2198 | 2186 | ||
2199 | if 'project_id' in request.session: | 2187 | prj = Project.objects.get(pk = request.session['project_id']) |
2200 | prj = Project.objects.get(pk = request.session['project_id']) | 2188 | queryset_all = queryset_all.filter(up_branch__release = prj.release) |
2201 | queryset_all = queryset_all.filter(up_branch__in = Branch.objects.filter(name = prj.release.name)) | ||
2202 | 2189 | ||
2203 | queryset_with_search = _get_queryset(Layer_Version, queryset_all, None, search_term, ordering_string, '-layer__name') | 2190 | queryset_with_search = _get_queryset(Layer_Version, queryset_all, None, search_term, ordering_string, '-layer__name') |
2204 | queryset = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name') | 2191 | queryset = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name') |
@@ -2265,7 +2252,6 @@ if toastermain.settings.MANAGED: | |||
2265 | 2252 | ||
2266 | } | 2253 | } |
2267 | }, | 2254 | }, |
2268 | |||
2269 | ] | 2255 | ] |
2270 | } | 2256 | } |
2271 | 2257 | ||
@@ -2279,31 +2265,30 @@ if toastermain.settings.MANAGED: | |||
2279 | return render(request, template, context) | 2265 | return render(request, template, context) |
2280 | 2266 | ||
2281 | def targets(request): | 2267 | def targets(request): |
2282 | template = "targets.html" | 2268 | if not 'project_id' in request.session: |
2283 | # define here what parameters the view needs in the GET portion in order to | 2269 | raise Exception("invalid page: cannot show page without a project") |
2284 | # be able to display something. 'count' and 'page' are mandatory for all views | 2270 | |
2285 | # that use paginators. | 2271 | template = 'targets.html' |
2286 | mandatory_parameters = { 'count': 10, 'page' : 1, 'orderby' : 'name:+' }; | 2272 | (pagesize, orderby) = _get_parameters_values(request, 100, 'name:+') |
2273 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } | ||
2287 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 2274 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
2288 | if retval: | 2275 | if retval: |
2289 | return _redirect_parameters( 'targets', request.GET, mandatory_parameters) | 2276 | return _redirect_parameters( 'targets', request.GET, mandatory_parameters) |
2290 | |||
2291 | # boilerplate code that takes a request for an object type and returns a queryset | ||
2292 | # for that object type. copypasta for all needed table searches | ||
2293 | (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) | 2277 | (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) |
2294 | 2278 | ||
2295 | queryset_all = Recipe.objects.all() | 2279 | prj = Project.objects.get(pk = request.session['project_id']) |
2296 | if 'project_id' in request.session: | 2280 | queryset_all = Recipe.objects.filter(Q(layer_version__up_branch__release = prj.release) | Q(layer_version__build__in = prj.build_set.all())) |
2297 | queryset_all = queryset_all.filter(Q(layer_version__up_branch__in = Branch.objects.filter(name = Project.objects.get(pk=request.session['project_id']).release.name)) | Q(layer_version__build__in = Project.objects.get(pk = request.session['project_id']).build_set.all())) | ||
2298 | 2281 | ||
2299 | queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') | 2282 | queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') |
2300 | queryset = _get_queryset(Recipe, queryset_all, filter_string, search_term, ordering_string, '-name') | 2283 | |
2284 | queryset_with_search.prefetch_related("layer_source") | ||
2301 | 2285 | ||
2302 | # retrieve the objects that will be displayed in the table; targets a paginator and gets a page range to display | 2286 | # retrieve the objects that will be displayed in the table; targets a paginator and gets a page range to display |
2303 | target_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1)) | 2287 | target_info = _build_page_range(Paginator(queryset_with_search, request.GET.get('count', 10)),request.GET.get('page', 1)) |
2304 | 2288 | ||
2305 | 2289 | ||
2306 | context = { | 2290 | context = { |
2291 | 'projectlayerset' : json.dumps(map(lambda x: x.layercommit.id, prj.projectlayer_set.all())), | ||
2307 | 'objects' : target_info, | 2292 | 'objects' : target_info, |
2308 | 'objectname' : "targets", | 2293 | 'objectname' : "targets", |
2309 | 'default_orderby' : 'name:+', | 2294 | 'default_orderby' : 'name:+', |
@@ -2329,13 +2314,19 @@ if toastermain.settings.MANAGED: | |||
2329 | { 'name': 'Section', | 2314 | { 'name': 'Section', |
2330 | 'clclass': 'target-section', | 2315 | 'clclass': 'target-section', |
2331 | 'hidden': 1, | 2316 | 'hidden': 1, |
2317 | 'orderfield': _get_toggle_order(request, "section"), | ||
2318 | 'ordericon': _get_toggle_order_icon(request, "section"), | ||
2332 | }, | 2319 | }, |
2333 | { 'name': 'License', | 2320 | { 'name': 'License', |
2334 | 'clclass': 'license', | 2321 | 'clclass': 'license', |
2335 | 'hidden': 1, | 2322 | 'hidden': 1, |
2323 | 'orderfield': _get_toggle_order(request, "license"), | ||
2324 | 'ordericon': _get_toggle_order_icon(request, "license"), | ||
2336 | }, | 2325 | }, |
2337 | { 'name': 'Layer', | 2326 | { 'name': 'Layer', |
2338 | 'clclass': 'layer', | 2327 | 'clclass': 'layer', |
2328 | 'orderfield': _get_toggle_order(request, "layer_version__layer__name"), | ||
2329 | 'ordericon': _get_toggle_order_icon(request, "layer_version__layer__name"), | ||
2339 | }, | 2330 | }, |
2340 | { 'name': 'Layer source', | 2331 | { 'name': 'Layer source', |
2341 | 'clclass': 'source', | 2332 | 'clclass': 'source', |
@@ -2345,20 +2336,32 @@ if toastermain.settings.MANAGED: | |||
2345 | 'filter': { | 2336 | 'filter': { |
2346 | 'class': 'target', | 2337 | 'class': 'target', |
2347 | 'label': 'Show:', | 2338 | 'label': 'Show:', |
2348 | '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()), | 2339 | 'options': map(lambda x: ("Targets provided by " + x.name + " layers", 'layer_source__pk:' + str(x.id), queryset_with_search.filter(layer_source__pk = x.id).count() ), LayerSource.objects.all()), |
2349 | } | 2340 | } |
2350 | }, | 2341 | }, |
2351 | { 'name': 'Branch, tag or commit', | 2342 | { 'name': 'Branch, tag or commit', |
2352 | 'clclass': 'branch', | 2343 | 'clclass': 'branch', |
2353 | 'hidden': 1, | 2344 | 'hidden': 1, |
2354 | }, | 2345 | }, |
2346 | ] | ||
2347 | } | ||
2348 | |||
2349 | if 'project_id' in request.session: | ||
2350 | context['tablecols'] += [ | ||
2355 | { 'name': 'Build', | 2351 | { 'name': 'Build', |
2356 | 'dclass': 'span2', | 2352 | 'dclass': 'span2', |
2357 | 'qhelp': "Add or delete targets to / from your project ", | 2353 | 'qhelp': "Add or delete targets to / from your project ", |
2358 | }, | 2354 | 'filter': { |
2355 | 'class': 'add-layer', | ||
2356 | 'label': 'Show:', | ||
2357 | 'options': [ | ||
2358 | ('Targets provided by layers added to this project', "layer_version__projectlayer__project:" + str(prj.id), queryset_with_search.filter(layer_version__projectlayer__project = prj.id).count()), | ||
2359 | ('Targets provided by layers not added to this project', "layer_version__projectlayer__project:NOT" + str(prj.id), queryset_with_search.exclude(layer_version__projectlayer__project = prj.id).count()), | ||
2360 | ] | ||
2361 | |||
2362 | } | ||
2363 | }, ] | ||
2359 | 2364 | ||
2360 | ] | ||
2361 | } | ||
2362 | 2365 | ||
2363 | return render(request, template, context) | 2366 | return render(request, template, context) |
2364 | 2367 | ||
@@ -2378,7 +2381,7 @@ if toastermain.settings.MANAGED: | |||
2378 | 2381 | ||
2379 | queryset_all = Machine.objects.all() | 2382 | queryset_all = Machine.objects.all() |
2380 | # if 'project_id' in request.session: | 2383 | # if 'project_id' in request.session: |
2381 | # queryset_all = queryset_all.filter(Q(layer_version__up_branch__in = Branch.objects.filter(name = Project.objects.get(request.session['project_id']).release.name)) | Q(layer_version__build__in = Project.objects.get(request.session['project_id']).build_set.all())) | 2384 | # queryset_all = queryset_all.filter(Q(layer_version__up_branch__release = Project.objects.get(request.session['project_id']).release) | Q(layer_version__build__in = Project.objects.get(request.session['project_id']).build_set.all())) |
2382 | 2385 | ||
2383 | queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name') | 2386 | queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name') |
2384 | queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name') | 2387 | queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name') |
@@ -2643,7 +2646,7 @@ if toastermain.settings.MANAGED: | |||
2643 | def projects(request): | 2646 | def projects(request): |
2644 | template="projects.html" | 2647 | template="projects.html" |
2645 | 2648 | ||
2646 | (pagesize, orderby) = _get_parameters_values(request, 10, 'updated:-') | 2649 | (pagesize, orderby) = _get_parameters_values(request, 10, 'updated:+') |
2647 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } | 2650 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } |
2648 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 2651 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
2649 | if retval: | 2652 | if retval: |
@@ -2654,8 +2657,8 @@ if toastermain.settings.MANAGED: | |||
2654 | # boilerplate code that takes a request for an object type and returns a queryset | 2657 | # boilerplate code that takes a request for an object type and returns a queryset |
2655 | # for that object type. copypasta for all needed table searches | 2658 | # for that object type. copypasta for all needed table searches |
2656 | (filter_string, search_term, ordering_string) = _search_tuple(request, Project) | 2659 | (filter_string, search_term, ordering_string) = _search_tuple(request, Project) |
2657 | queryset_with_search = _get_queryset(Project, queryset_all, None, search_term, ordering_string, 'updated:-') | 2660 | queryset_with_search = _get_queryset(Project, queryset_all, None, search_term, ordering_string, '-updated') |
2658 | queryset = _get_queryset(Project, queryset_all, filter_string, search_term, ordering_string, 'updated:-') | 2661 | queryset = _get_queryset(Project, queryset_all, filter_string, search_term, ordering_string, '-updated') |
2659 | 2662 | ||
2660 | # retrieve the objects that will be displayed in the table; projects a paginator and gets a page range to display | 2663 | # retrieve the objects that will be displayed in the table; projects a paginator and gets a page range to display |
2661 | project_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1)) | 2664 | project_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1)) |