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