diff options
author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2014-11-24 12:52:49 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-11-28 14:02:58 +0000 |
commit | 4c82dfbb70477c3b48327f235de62ec7ce203c11 (patch) | |
tree | 363a4ab8cf66ee88ec82fbafaa701282426f052a /bitbake/lib/toaster/toastergui/views.py | |
parent | 152e2d9cc533c70cf3172c165d00ee177fb4aa78 (diff) | |
download | poky-4c82dfbb70477c3b48327f235de62ec7ce203c11.tar.gz |
bitbake: toastergui: update layer search criteria
In order to accomodate the designs around imported layer,
we add a "project" field for in the layer versions.
The field must be set if and only if the layer is manually
imported in the project. This will prevent information leakage
between different projects.
The views have been updated to perform relevant layer queries
in a single location.
(Bitbake rev: e1f7ec868b0702dfd27d5708581c134aaa6f4ae8)
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/toaster/toastergui/views.py')
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index a0dcf8797a..11c373a84d 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -1935,7 +1935,21 @@ if toastermain.settings.MANAGED: | |||
1935 | 1935 | ||
1936 | raise Exception("Invalid HTTP method for this page") | 1936 | raise Exception("Invalid HTTP method for this page") |
1937 | 1937 | ||
1938 | # returns a queryset of compatible layers for a project | ||
1939 | def _compatible_layerversions_for_project(prj, release = None, layer_name = None): | ||
1940 | if release == None: | ||
1941 | release = prj.release | ||
1942 | # layers on the same branch or layers specifically set for this project | ||
1943 | return Layer_Version.objects.filter((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = prj)) | ||
1938 | 1944 | ||
1945 | |||
1946 | # returns the equivalence group for all the layers currently set in the project | ||
1947 | def _project_equivalent_layerversions(prj): | ||
1948 | return reduce(lambda x, y: list(x) + list(y), | ||
1949 | # take all equivalent layers for each entry | ||
1950 | map(lambda x: x.layercommit.get_equivalents_wpriority(prj), prj.projectlayer_set.all()) , []) | ||
1951 | |||
1952 | # returns a list for most recent builds; for use in the Project page, xhr_ updates, and other places, as needed | ||
1939 | def _project_recent_build_list(prj): | 1953 | def _project_recent_build_list(prj): |
1940 | return map(lambda x: { | 1954 | return map(lambda x: { |
1941 | "id": x.pk, | 1955 | "id": x.pk, |
@@ -2101,7 +2115,7 @@ if toastermain.settings.MANAGED: | |||
2101 | for i in prj.projectlayer_set.all(): | 2115 | for i in prj.projectlayer_set.all(): |
2102 | # find and add a similarly-named layer on the new branch | 2116 | # find and add a similarly-named layer on the new branch |
2103 | try: | 2117 | try: |
2104 | lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__name = prj.release.branch_name)[0].get_equivalents_wpriority(prj)[0] | 2118 | lv = _compatible_layerversions_for_project(prj).filter(layer__name = i.layer.name).get_equivalents_wpriority(prj)[0] |
2105 | ProjectLayer.objects.get_or_create(project = prj, layercommit = lv) | 2119 | ProjectLayer.objects.get_or_create(project = prj, layercommit = lv) |
2106 | except IndexError: | 2120 | except IndexError: |
2107 | pass | 2121 | pass |
@@ -2140,30 +2154,32 @@ if toastermain.settings.MANAGED: | |||
2140 | else: | 2154 | else: |
2141 | raise Exception("No valid project selected") | 2155 | raise Exception("No valid project selected") |
2142 | 2156 | ||
2143 | # returns layers for current project release that are not in the project set | 2157 | |
2158 | def _lv_to_dict(x): | ||
2159 | return {"id": x.pk, "name": x.layer.name, | ||
2160 | "detail": "(" + x.layer.vcs_url + (")" if x.up_branch == None else " | "+x.up_branch.name+")"), | ||
2161 | "giturl": x.layer.vcs_url, "layerdetailurl" : reverse('layerdetails', args=(x.pk,))} | ||
2162 | |||
2163 | |||
2164 | # returns layers for current project release that are not in the project set, matching the name | ||
2144 | if request.GET['type'] == "layers": | 2165 | if request.GET['type'] == "layers": |
2145 | queryset_all = Layer_Version.objects.filter(layer__name__icontains=request.GET.get('value','')) | 2166 | queryset_all = _compatible_layerversions_for_project(prj).filter(layer__name__icontains=request.GET.get('value','')) |
2146 | queryset_all = queryset_all.filter(up_branch__name= prj.release.branch_name).exclude(pk__in = [x.id for x in reduce(lambda x, y: list(x) + list(y), map(lambda x: x.layercommit.get_equivalents_wpriority(prj), prj.projectlayer_set.all()))]) | 2167 | |
2168 | queryset_all = queryset_all.exclude(pk__in = [x.id for x in _project_equivalent_layerversions(prj)]) | ||
2147 | 2169 | ||
2148 | queryset_all = set([x.get_equivalents_wpriority(prj)[0] for x in queryset_all[:8]]) | 2170 | queryset_all = set([x.get_equivalents_wpriority(prj)[0] for x in queryset_all[:8]]) |
2149 | 2171 | ||
2150 | return HttpResponse(jsonfilter( { "error":"ok", | 2172 | return HttpResponse(jsonfilter( { "error":"ok", "list" : map( _lv_to_dict, queryset_all) }), content_type = "application/json") |
2151 | "list" : map( lambda x: {"id": x.pk, "name": "%s" % (x.layer.name, ), "detail": "(" + x.layer.vcs_url + (")" if x.up_branch == None else " | "+x.up_branch.name+")")}, | ||
2152 | queryset_all) | ||
2153 | }), content_type = "application/json") | ||
2154 | 2173 | ||
2155 | 2174 | ||
2156 | # returns layer dependencies for a layer, excluding current project layers | 2175 | # returns layer dependencies for a layer, excluding current project layers |
2157 | if request.GET['type'] == "layerdeps": | 2176 | if request.GET['type'] == "layerdeps": |
2158 | queryset_all = LayerVersionDependency.objects.filter(layer_version_id = request.GET['value']) | 2177 | queryset_all = LayerVersionDependency.objects.filter(layer_version_id = request.GET['value']) |
2159 | queryset_all = queryset_all.exclude(depends_on__in = reduce(lambda x, y: list(x) + list(y), map(lambda x: x.layercommit.get_equivalents_wpriority(prj), prj.projectlayer_set.all()))) | 2178 | queryset_all = queryset_all.exclude(depends_on__in = _project_equivalent_layerversions(prj)) |
2160 | queryset_all.order_by("-up_id"); | 2179 | queryset_all.order_by("-up_id"); |
2161 | 2180 | ||
2162 | return HttpResponse(jsonfilter( { "error":"ok", | 2181 | return HttpResponse(jsonfilter( { "error":"ok", |
2163 | "list" : map( | 2182 | "list" : map( _lv_to_dict, map(lambda x: x.depends_on.get_equivalents_wpriority(prj)[0], queryset_all)) |
2164 | 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+")"), | ||
2165 | "giturl": x.layer.vcs_url, "layerdetailurl" : reverse('layerdetails', args=(x.pk,))}, | ||
2166 | map(lambda x: x.depends_on.get_equivalents_wpriority(prj)[0], queryset_all)) | ||
2167 | }), content_type = "application/json") | 2183 | }), content_type = "application/json") |
2168 | 2184 | ||
2169 | 2185 | ||
@@ -2174,20 +2190,20 @@ if toastermain.settings.MANAGED: | |||
2174 | 2190 | ||
2175 | retval = [] | 2191 | retval = [] |
2176 | for i in prj.projectlayer_set.all(): | 2192 | for i in prj.projectlayer_set.all(): |
2177 | lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__name = Release.objects.get(pk=request.GET['value']).branch_name) | 2193 | lv = _compatible_layerversions_for_project(prj, release = Release.objects.get(pk=request.GET['value'])) |
2178 | if lv.count() < 1: # there is no layer_version with the new release id, and the same name | 2194 | # there is no layer_version with the new release id, and the same name |
2195 | if lv.count() < 1: | ||
2179 | retval.append(i) | 2196 | retval.append(i) |
2180 | 2197 | ||
2181 | return HttpResponse(jsonfilter( {"error":"ok", | 2198 | return HttpResponse(jsonfilter( {"error":"ok", |
2182 | "list": map( | 2199 | "list" : map( _lv_to_dict, map(lambda x: x.layercommit, retval )) |
2183 | 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+")")}, | 2200 | }), content_type = "application/json") |
2184 | retval) }), content_type = "application/json") | ||
2185 | 2201 | ||
2186 | 2202 | ||
2187 | # returns targets provided by current project layers | 2203 | # returns targets provided by current project layers |
2188 | if request.GET['type'] == "targets": | 2204 | if request.GET['type'] == "targets": |
2189 | queryset_all = Recipe.objects.all() | 2205 | queryset_all = Recipe.objects.all() |
2190 | queryset_all = queryset_all.filter(layer_version__in = reduce(lambda x, y: list(x) + list(y), map(lambda x: x.layercommit.get_equivalents_wpriority(prj), ProjectLayer.objects.filter(project = prj)))) | 2206 | queryset_all = queryset_all.filter(layer_version__in = reduce(lambda x, y: list(x) + list(y), map(lambda x: x.layercommit.get_equivalents_wpriority(prj), prj.projectlayer_set.all()), [])) |
2191 | return HttpResponse(jsonfilter({ "error":"ok", | 2207 | return HttpResponse(jsonfilter({ "error":"ok", |
2192 | "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 "]")}, | 2208 | "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 "]")}, |
2193 | queryset_all.filter(name__icontains=request.GET.get('value',''))[:8]), | 2209 | queryset_all.filter(name__icontains=request.GET.get('value',''))[:8]), |
@@ -2243,10 +2259,9 @@ if toastermain.settings.MANAGED: | |||
2243 | # for that object type. copypasta for all needed table searches | 2259 | # for that object type. copypasta for all needed table searches |
2244 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) | 2260 | (filter_string, search_term, ordering_string) = _search_tuple(request, Layer_Version) |
2245 | 2261 | ||
2246 | queryset_all = Layer_Version.objects.all() | ||
2247 | |||
2248 | prj = Project.objects.get(pk = request.session['project_id']) | 2262 | prj = Project.objects.get(pk = request.session['project_id']) |
2249 | queryset_all = queryset_all.filter(up_branch__name = prj.release.branch_name) | 2263 | |
2264 | queryset_all = _compatible_layerversions_for_project(prj) | ||
2250 | 2265 | ||
2251 | queryset_all = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name') | 2266 | queryset_all = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name') |
2252 | 2267 | ||