summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui
diff options
context:
space:
mode:
authorAlexandru DAMIAN <alexandru.damian@intel.com>2014-11-14 17:07:06 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-11-21 11:49:23 +0000
commit0b6859cdf3a4b66bb8b94361681a5b6b362f93ae (patch)
tree37bf5c650e99b023bd0e0605b63a53cc0ebd0b72 /bitbake/lib/toaster/toastergui
parent5b0616ad7d7c3734f1818a56b631a2d254271678 (diff)
downloadpoky-0b6859cdf3a4b66bb8b94361681a5b6b362f93ae.tar.gz
bitbake: toastergui: layer name correlation
This patch modifies how layers are identified and matched. Layers were primarely organized by the source of layer information, and Releases were separated by both layer git branches and originating source of layer information. This setup prevented mixing layers from different sources for a certain release, which didn't match the way people use Yocto Project / bitbake. This patch brings name-based indentification, where layers with the same name are assumed to be equivalent, in the sense of being able to substitute one another. To facilitate this identification to humans, layers are differentiated by GIT URI instead of layer sources, which was a rather arbitrary abstraction. Additional changes include modification to models in order accomodate for the new data structure, and to config file loading to match the new toasterconf.json layout. (Bitbake rev: 4357200aed522ad56cfd84917f877645b83b6a70) 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')
-rw-r--r--bitbake/lib/toaster/toastergui/static/js/projectapp.js2
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layers.html6
-rw-r--r--bitbake/lib/toaster/toastergui/templates/project.html4
-rwxr-xr-xbitbake/lib/toaster/toastergui/views.py84
4 files changed, 55 insertions, 41 deletions
diff --git a/bitbake/lib/toaster/toastergui/static/js/projectapp.js b/bitbake/lib/toaster/toastergui/static/js/projectapp.js
index 9f9a06476a..e9b07c7848 100644
--- a/bitbake/lib/toaster/toastergui/static/js/projectapp.js
+++ b/bitbake/lib/toaster/toastergui/static/js/projectapp.js
@@ -173,6 +173,8 @@ projectApp.controller('prjCtrl', function($scope, $modal, $http, $interval, $loc
173 if (_data.error != "ok") { 173 if (_data.error != "ok") {
174 alert("Failed XHR request (" + _status + "): " + _data.error); 174 alert("Failed XHR request (" + _status + "): " + _data.error);
175 console.error("Failed XHR request: ", _data, _status, _headers, _config); 175 console.error("Failed XHR request: ", _data, _status, _headers, _config);
176 // stop refreshing hte page
177 $interval.cancel($scope.pollHandle);
176 deffered.reject(_data.error); 178 deffered.reject(_data.error);
177 } 179 }
178 else { 180 else {
diff --git a/bitbake/lib/toaster/toastergui/templates/layers.html b/bitbake/lib/toaster/toastergui/templates/layers.html
index 8cb079d0a3..2bca84b503 100644
--- a/bitbake/lib/toaster/toastergui/templates/layers.html
+++ b/bitbake/lib/toaster/toastergui/templates/layers.html
@@ -9,9 +9,9 @@
9{% block projectinfomain %} 9{% block projectinfomain %}
10 <div class="page-header"> 10 <div class="page-header">
11 <h1> 11 <h1>
12 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %} 12 {% if request.GET.filter and total_count > 0 or request.GET.search and total_count > 0 %}
13 {{objects.paginator.count}} layer{{objects.paginator.count|pluralize}} found 13 {{total_count}} layer{{total_count|pluralize}} found
14 {% elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %} 14 {% elif request.GET.filter and total_count == 0 or request.GET.search and total_count == 0 %}
15 No layers found 15 No layers found
16 {%else%} 16 {%else%}
17 All layers 17 All layers
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index 4e8a7e29aa..e1ef824779 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -236,9 +236,9 @@ vim: expandtab tabstop=2
236 <p><a href="{% url 'layers' %}">View all layers</a> | <a href="{% url 'importlayer' %}">Import layer</a></p> 236 <p><a href="{% url 'layers' %}">View all layers</a> | <a href="{% url 'importlayer' %}">Import layer</a></p>
237 <ul class="unstyled configuration-list"> 237 <ul class="unstyled configuration-list">
238 <li ng-repeat="l in layers track by l.id" class="animate-repeat"> 238 <li ng-repeat="l in layers track by l.id" class="animate-repeat">
239 <a href="{[l.layerdetailurl]}" target="_#" class="layer-info" data-toggle="tooltip" tooltip="{[l.branch.layersource]} | {[l.branch.name]}">{[l.name]} </a> 239 <a href="{[l.layerdetailurl]}" target="_#" class="layer-info" data-toggle="tooltip" tooltip="{[l.giturl]} | {[l.branch.name]}">{[l.name]}</a>
240 <i class="icon-trash" ng-click="layerDel(l.id)" tooltip="Delete"></i> 240 <i class="icon-trash" ng-click="layerDel(l.id)" tooltip="Delete"></i>
241 </li> 241 </li>
242 </ul> 242 </ul>
243 </div> 243 </div>
244 244
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 5e92c24a8d..1b4bb9ff69 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -1881,7 +1881,10 @@ if toastermain.settings.MANAGED:
1881 "MANAGED" : toastermain.settings.MANAGED 1881 "MANAGED" : toastermain.settings.MANAGED
1882 } 1882 }
1883 if 'project_id' in request.session: 1883 if 'project_id' in request.session:
1884 ret['project'] = Project.objects.get(pk = request.session['project_id']) 1884 try:
1885 ret['project'] = Project.objects.get(pk = request.session['project_id'])
1886 except Project.DoesNotExist:
1887 del request.session['project_id']
1885 return ret 1888 return ret
1886 1889
1887 # new project 1890 # new project
@@ -1989,6 +1992,7 @@ if toastermain.settings.MANAGED:
1989 "id": x.layercommit.pk, 1992 "id": x.layercommit.pk,
1990 "orderid": x.pk, 1993 "orderid": x.pk,
1991 "name" : x.layercommit.layer.name, 1994 "name" : x.layercommit.layer.name,
1995 "giturl": x.layercommit.layer.vcs_url,
1992 "url": x.layercommit.layer.layer_index_url, 1996 "url": x.layercommit.layer.layer_index_url,
1993 "layerdetailurl": reverse("layerdetails", args=(x.layercommit.layer.pk,)), 1997 "layerdetailurl": reverse("layerdetails", args=(x.layercommit.layer.pk,)),
1994 "branch" : { "name" : x.layercommit.up_branch.name, "layersource" : x.layercommit.up_branch.layer_source.name}}, 1998 "branch" : { "name" : x.layercommit.up_branch.name, "layersource" : x.layercommit.up_branch.layer_source.name}},
@@ -2053,6 +2057,9 @@ if toastermain.settings.MANAGED:
2053 except Exception as e: 2057 except Exception as e:
2054 return HttpResponse(jsonfilter({"error":str(e) + "\n" + traceback.format_exc()}), content_type = "application/json") 2058 return HttpResponse(jsonfilter({"error":str(e) + "\n" + traceback.format_exc()}), content_type = "application/json")
2055 2059
2060
2061
2062
2056 def xhr_projectedit(request, pid): 2063 def xhr_projectedit(request, pid):
2057 try: 2064 try:
2058 prj = Project.objects.get(id = pid) 2065 prj = Project.objects.get(id = pid)
@@ -2078,11 +2085,14 @@ if toastermain.settings.MANAGED:
2078 # we need to change the layers 2085 # we need to change the layers
2079 for i in prj.projectlayer_set.all(): 2086 for i in prj.projectlayer_set.all():
2080 # find and add a similarly-named layer on the new branch 2087 # find and add a similarly-named layer on the new branch
2081 lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__release = prj.release) 2088 try:
2082 if lv.count() == 1: 2089 lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__name = prj.release.branch_name)[0].get_equivalents_wpriority(prj)[0]
2083 ProjectLayer.objects.get_or_create(project = prj, layercommit = lv[0]) 2090 ProjectLayer.objects.get_or_create(project = prj, layercommit = lv)
2084 # get rid of the old entry 2091 except IndexError:
2085 i.delete() 2092 pass
2093 finally:
2094 # get rid of the old entry
2095 i.delete()
2086 2096
2087 if 'machineName' in request.POST: 2097 if 'machineName' in request.POST:
2088 machinevar = prj.projectvariable_set.get(name="MACHINE") 2098 machinevar = prj.projectvariable_set.get(name="MACHINE")
@@ -2092,7 +2102,7 @@ if toastermain.settings.MANAGED:
2092 # return all project settings 2102 # return all project settings
2093 return HttpResponse(jsonfilter( { 2103 return HttpResponse(jsonfilter( {
2094 "error": "ok", 2104 "error": "ok",
2095 "layers" : map(lambda x: {"id": x.layercommit.pk, "orderid" : x.pk, "name" : x.layercommit.layer.name, "url": x.layercommit.layer.layer_index_url, "layerdetailurl": reverse("layerdetails", args=(x.layercommit.layer.pk,)), "branch" : { "name" : x.layercommit.up_branch.name, "layersource" : x.layercommit.up_branch.layer_source.name}}, prj.projectlayer_set.all().order_by("id")), 2105 "layers" : map(lambda x: {"id": x.layercommit.pk, "orderid" : x.pk, "name" : x.layercommit.layer.name, "giturl" : x.layercommit.layer.vcs_url, "url": x.layercommit.layer.layer_index_url, "layerdetailurl": reverse("layerdetails", args=(x.layercommit.layer.pk,)), "branch" : { "name" : x.layercommit.up_branch.name, "layersource" : x.layercommit.up_branch.layer_source.name}}, prj.projectlayer_set.all().order_by("id")),
2096 "builds" : _project_recent_build_list(prj), 2106 "builds" : _project_recent_build_list(prj),
2097 "variables": map(lambda x: (x.name, x.value), prj.projectvariable_set.all()), 2107 "variables": map(lambda x: (x.name, x.value), prj.projectvariable_set.all()),
2098 "machine": {"name": prj.projectvariable_set.get(name="MACHINE").value}, 2108 "machine": {"name": prj.projectvariable_set.get(name="MACHINE").value},
@@ -2107,45 +2117,46 @@ if toastermain.settings.MANAGED:
2107 @csrf_exempt 2117 @csrf_exempt
2108 def xhr_datatypeahead(request): 2118 def xhr_datatypeahead(request):
2109 try: 2119 try:
2120 prj = None
2121 if 'project_id' in request.session:
2122 prj = Project.objects.get(pk = request.session['project_id'])
2123
2110 # returns layers for current project release that are not in the project set 2124 # returns layers for current project release that are not in the project set
2111 if request.GET['type'] == "layers": 2125 if request.GET['type'] == "layers":
2112 queryset_all = Layer_Version.objects.all() 2126 queryset_all = Layer_Version.objects.filter(layer__name__icontains=request.GET.get('value',''))
2113 if 'project_id' in request.session: 2127 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()))])
2114 prj = Project.objects.get(pk = request.session['project_id']) 2128
2115 queryset_all = queryset_all.filter(up_branch__release = prj.release).exclude(pk__in = map(lambda x: x.layercommit_id, prj.projectlayer_set.all())) 2129 queryset_all = set([x.get_equivalents_wpriority(prj)[0] for x in queryset_all[:8]])
2116 queryset_all = queryset_all.filter(layer__name__icontains=request.GET.get('value','')) 2130
2117 return HttpResponse(jsonfilter( { "error":"ok", 2131 return HttpResponse(jsonfilter( { "error":"ok",
2118 "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+")")}, 2132 "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+")")},
2119 queryset_all[:8]) 2133 queryset_all)
2120 }), content_type = "application/json") 2134 }), content_type = "application/json")
2121 2135
2136
2122 # returns layer dependencies for a layer, excluding current project layers 2137 # returns layer dependencies for a layer, excluding current project layers
2123 if request.GET['type'] == "layerdeps": 2138 if request.GET['type'] == "layerdeps":
2124 queryset_all = LayerVersionDependency.objects.filter(layer_version_id = request.GET['value']) 2139 queryset_all = LayerVersionDependency.objects.filter(layer_version_id = request.GET['value'])
2125 2140 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())))
2126 if 'project_id' in request.session:
2127 prj = Project.objects.get(pk = request.session['project_id'])
2128 queryset_all = queryset_all.exclude(depends_on__in = map(lambda x: x.layercommit, prj.projectlayer_set.all()))
2129
2130 queryset_all.order_by("-up_id"); 2141 queryset_all.order_by("-up_id");
2131 2142
2132 return HttpResponse(jsonfilter( { "error":"ok", 2143 return HttpResponse(jsonfilter( { "error":"ok",
2133 "list" : map( 2144 "list" : map(
2134 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+")"), 2145 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+")"),
2135 "layerdetailurl" : reverse('layerdetails', args=(x.pk,))}, 2146 "giturl": x.layer.vcs_url, "layerdetailurl" : reverse('layerdetails', args=(x.pk,))},
2136 map(lambda x: x.depends_on, queryset_all)) 2147 map(lambda x: x.depends_on.get_equivalents_wpriority(prj)[0], queryset_all))
2137 }), content_type = "application/json") 2148 }), content_type = "application/json")
2138 2149
2150
2139 # returns layer versions that would be deleted on the new release__pk 2151 # returns layer versions that would be deleted on the new release__pk
2140 if request.GET['type'] == "versionlayers": 2152 if request.GET['type'] == "versionlayers":
2141 if not 'project_id' in request.session: 2153 if not 'project_id' in request.session:
2142 raise Exception("This call cannot makes no sense outside a project context") 2154 raise Exception("This call cannot makes no sense outside a project context")
2143 2155
2144 retval = [] 2156 retval = []
2145 prj = Project.objects.get(pk = request.session['project_id'])
2146 for i in prj.projectlayer_set.all(): 2157 for i in prj.projectlayer_set.all():
2147 lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__release__pk=request.GET['value']) 2158 lv = Layer_Version.objects.filter(layer__name = i.layercommit.layer.name, up_branch__name = Release.objects.get(pk=request.GET['value']).branch_name)
2148 if lv.count() != 1: # there is no layer_version with the new release id, and the same name 2159 if lv.count() < 1: # there is no layer_version with the new release id, and the same name
2149 retval.append(i) 2160 retval.append(i)
2150 2161
2151 return HttpResponse(jsonfilter( {"error":"ok", 2162 return HttpResponse(jsonfilter( {"error":"ok",
@@ -2153,11 +2164,11 @@ if toastermain.settings.MANAGED:
2153 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+")")}, 2164 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+")")},
2154 retval) }), content_type = "application/json") 2165 retval) }), content_type = "application/json")
2155 2166
2167
2156 # returns targets provided by current project layers 2168 # returns targets provided by current project layers
2157 if request.GET['type'] == "targets": 2169 if request.GET['type'] == "targets":
2158 queryset_all = Recipe.objects.all() 2170 queryset_all = Recipe.objects.all()
2159 if 'project_id' in request.session: 2171 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))))
2160 queryset_all = queryset_all.filter(layer_version__layer__in = map(lambda x: x.layercommit.layer, ProjectLayer.objects.filter(project_id=request.session['project_id'])))
2161 return HttpResponse(jsonfilter({ "error":"ok", 2172 return HttpResponse(jsonfilter({ "error":"ok",
2162 "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 "]")}, 2173 "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 "]")},
2163 queryset_all.filter(name__icontains=request.GET.get('value',''))[:8]), 2174 queryset_all.filter(name__icontains=request.GET.get('value',''))[:8]),
@@ -2208,13 +2219,14 @@ if toastermain.settings.MANAGED:
2208 queryset_all = Layer_Version.objects.all() 2219 queryset_all = Layer_Version.objects.all()
2209 2220
2210 prj = Project.objects.get(pk = request.session['project_id']) 2221 prj = Project.objects.get(pk = request.session['project_id'])
2211 queryset_all = queryset_all.filter(up_branch__release = prj.release) 2222 queryset_all = queryset_all.filter(up_branch__name = prj.release.branch_name)
2212 2223
2213 queryset_with_search = _get_queryset(Layer_Version, queryset_all, None, search_term, ordering_string, '-layer__name') 2224 queryset_all = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name')
2214 queryset = _get_queryset(Layer_Version, queryset_all, filter_string, search_term, ordering_string, '-layer__name') 2225
2226 objects_all= list(set([x.get_equivalents_wpriority(prj)[0] for x in queryset_all[:pagesize]]))
2215 2227
2216 # retrieve the objects that will be displayed in the table; layers a paginator and gets a page range to display 2228 # retrieve the objects that will be displayed in the table; layers a paginator and gets a page range to display
2217 layer_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1)) 2229 layer_info = _build_page_range(Paginator(objects_all, request.GET.get('count', 10)),request.GET.get('page', 1))
2218 2230
2219 2231
2220 context = { 2232 context = {
@@ -2222,7 +2234,7 @@ if toastermain.settings.MANAGED:
2222 'objects' : layer_info, 2234 'objects' : layer_info,
2223 'objectname' : "layers", 2235 'objectname' : "layers",
2224 'default_orderby' : 'layer__name:+', 2236 'default_orderby' : 'layer__name:+',
2225 'total_count': queryset_with_search.count(), 2237 'total_count': queryset_all.count(),
2226 2238
2227 'tablecols' : [ 2239 'tablecols' : [
2228 { 'name': 'Layer', 2240 { 'name': 'Layer',
@@ -2241,7 +2253,7 @@ if toastermain.settings.MANAGED:
2241 'filter': { 2253 'filter': {
2242 'class': 'layer', 2254 'class': 'layer',
2243 'label': 'Show:', 2255 'label': 'Show:',
2244 'options': map(lambda x: (x.name + " layers", 'layer_source__pk:' + str(x.id), queryset_with_search.filter(layer_source__pk = x.id).count() ), LayerSource.objects.all()), 2256 'options': map(lambda x: (x.name + " layers", 'layer_source__pk:' + str(x.id), queryset_all.filter(layer_source__pk = x.id).count() ), LayerSource.objects.all()),
2245 } 2257 }
2246 }, 2258 },
2247 { 'name': 'Git repository URL', 2259 { 'name': 'Git repository URL',
@@ -2269,8 +2281,8 @@ if toastermain.settings.MANAGED:
2269 'class': 'add-del-layers', 2281 'class': 'add-del-layers',
2270 'label': 'Show:', 2282 'label': 'Show:',
2271 'options': [ 2283 'options': [
2272 ('Layers added to this project', "projectlayer__project:" + str(prj.id), queryset_with_search.filter(projectlayer__project = prj.id).count()), 2284 ('Layers added to this project', "projectlayer__project:" + str(prj.id), queryset_all.filter(projectlayer__project = prj.id).count()),
2273 ('Layers not added to this project', "projectlayer__project:NOT" + str(prj.id), queryset_with_search.exclude(projectlayer__project = prj.id).count()), 2285 ('Layers not added to this project', "projectlayer__project:NOT" + str(prj.id), queryset_all.exclude(projectlayer__project = prj.id).count()),
2274 ] 2286 ]
2275 2287
2276 } 2288 }
@@ -2300,7 +2312,7 @@ if toastermain.settings.MANAGED:
2300 (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe) 2312 (filter_string, search_term, ordering_string) = _search_tuple(request, Recipe)
2301 2313
2302 prj = Project.objects.get(pk = request.session['project_id']) 2314 prj = Project.objects.get(pk = request.session['project_id'])
2303 queryset_all = Recipe.objects.filter(Q(layer_version__up_branch__release = prj.release) | Q(layer_version__build__in = prj.build_set.all())) 2315 queryset_all = Recipe.objects.filter(Q(layer_version__up_branch__name= prj.release.name) | Q(layer_version__build__in = prj.build_set.all()))
2304 2316
2305 queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name') 2317 queryset_with_search = _get_queryset(Recipe, queryset_all, None, search_term, ordering_string, '-name')
2306 2318
@@ -2404,7 +2416,7 @@ if toastermain.settings.MANAGED:
2404 2416
2405 queryset_all = Machine.objects.all() 2417 queryset_all = Machine.objects.all()
2406# if 'project_id' in request.session: 2418# if 'project_id' in request.session:
2407# 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())) 2419# queryset_all = queryset_all.filter(Q(layer_version__up_branch__name = Project.objects.get(request.session['project_id']).release.branch_name) | Q(layer_version__build__in = Project.objects.get(request.session['project_id']).build_set.all()))
2408 2420
2409 queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name') 2421 queryset_with_search = _get_queryset(Machine, queryset_all, None, search_term, ordering_string, '-name')
2410 queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name') 2422 queryset = _get_queryset(Machine, queryset_all, filter_string, search_term, ordering_string, '-name')