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.py157
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))