diff options
| -rw-r--r-- | bitbake/lib/toaster/toastergui/tables.py | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py index 43b81a3e79..146a8ddeed 100644 --- a/bitbake/lib/toaster/toastergui/tables.py +++ b/bitbake/lib/toaster/toastergui/tables.py | |||
| @@ -26,6 +26,24 @@ from django.conf.urls import url | |||
| 26 | from django.core.urlresolvers import reverse | 26 | from django.core.urlresolvers import reverse |
| 27 | from django.views.generic import TemplateView | 27 | from django.views.generic import TemplateView |
| 28 | 28 | ||
| 29 | |||
| 30 | class ProjectFiltersMixin(object): | ||
| 31 | """Common mixin for recipe, machine in project filters""" | ||
| 32 | |||
| 33 | def filter_in_project(self, count_only=False): | ||
| 34 | query = self.queryset.filter(layer_version__in=self.project_layers) | ||
| 35 | if count_only: | ||
| 36 | return query.count() | ||
| 37 | |||
| 38 | self.queryset = query | ||
| 39 | |||
| 40 | def filter_not_in_project(self, count_only=False): | ||
| 41 | query = self.queryset.exclude(layer_version__in=self.project_layers) | ||
| 42 | if count_only: | ||
| 43 | return query.count() | ||
| 44 | |||
| 45 | self.queryset = query | ||
| 46 | |||
| 29 | class LayersTable(ToasterTable): | 47 | class LayersTable(ToasterTable): |
| 30 | """Table of layers in Toaster""" | 48 | """Table of layers in Toaster""" |
| 31 | 49 | ||
| @@ -37,12 +55,40 @@ class LayersTable(ToasterTable): | |||
| 37 | context = super(LayersTable, self).get_context_data(**kwargs) | 55 | context = super(LayersTable, self).get_context_data(**kwargs) |
| 38 | 56 | ||
| 39 | project = Project.objects.get(pk=kwargs['pid']) | 57 | project = Project.objects.get(pk=kwargs['pid']) |
| 58 | |||
| 40 | context['project'] = project | 59 | context['project'] = project |
| 41 | context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=project)) | 60 | context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=project)) |
| 42 | 61 | ||
| 43 | return context | 62 | return context |
| 44 | 63 | ||
| 45 | 64 | ||
| 65 | def setup_filters(self, *args, **kwargs): | ||
| 66 | project = Project.objects.get(pk=kwargs['pid']) | ||
| 67 | self.project_layers = ProjectLayer.objects.filter(project=project) | ||
| 68 | |||
| 69 | |||
| 70 | self.add_filter(title="Filter by project layers", | ||
| 71 | name="in_current_project", | ||
| 72 | filter_actions=[ | ||
| 73 | self.make_filter_action("in_project", "Layers added to this project", self.filter_in_project), | ||
| 74 | self.make_filter_action("not_in_project", "Layers not added to this project", self.filter_not_in_project) | ||
| 75 | ]) | ||
| 76 | |||
| 77 | def filter_in_project(self, count_only=False): | ||
| 78 | query = self.queryset.filter(projectlayer__in=self.project_layers) | ||
| 79 | if count_only: | ||
| 80 | return query.count() | ||
| 81 | |||
| 82 | self.queryset = query | ||
| 83 | |||
| 84 | def filter_not_in_project(self, count_only=False): | ||
| 85 | query = self.queryset.exclude(projectlayer__in=self.project_layers) | ||
| 86 | if count_only: | ||
| 87 | return query.count() | ||
| 88 | |||
| 89 | self.queryset = query | ||
| 90 | |||
| 91 | |||
| 46 | def setup_queryset(self, *args, **kwargs): | 92 | def setup_queryset(self, *args, **kwargs): |
| 47 | prj = Project.objects.get(pk = kwargs['pid']) | 93 | prj = Project.objects.get(pk = kwargs['pid']) |
| 48 | compatible_layers = prj.compatible_layerversions() | 94 | compatible_layers = prj.compatible_layerversions() |
| @@ -140,6 +186,7 @@ class LayersTable(ToasterTable): | |||
| 140 | self.add_column(title="Add | Delete", | 186 | self.add_column(title="Add | Delete", |
| 141 | help_text="Add or delete layers to / from your project", | 187 | help_text="Add or delete layers to / from your project", |
| 142 | hideable=False, | 188 | hideable=False, |
| 189 | filter_name="in_current_project", | ||
| 143 | static_data_name="add-del-layers", | 190 | static_data_name="add-del-layers", |
| 144 | static_data_template='{% include "layer_btn.html" %}') | 191 | static_data_template='{% include "layer_btn.html" %}') |
| 145 | 192 | ||
| @@ -169,7 +216,7 @@ class LayerDetails(ToasterTemplateView): | |||
| 169 | return context | 216 | return context |
| 170 | 217 | ||
| 171 | 218 | ||
| 172 | class MachinesTable(ToasterTable): | 219 | class MachinesTable(ToasterTable, ProjectFiltersMixin): |
| 173 | """Table of Machines in Toaster""" | 220 | """Table of Machines in Toaster""" |
| 174 | 221 | ||
| 175 | def __init__(self, *args, **kwargs): | 222 | def __init__(self, *args, **kwargs): |
| @@ -183,6 +230,16 @@ class MachinesTable(ToasterTable): | |||
| 183 | context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) | 230 | context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) |
| 184 | return context | 231 | return context |
| 185 | 232 | ||
| 233 | def setup_filters(self, *args, **kwargs): | ||
| 234 | project = Project.objects.get(pk=kwargs['pid']) | ||
| 235 | self.project_layers = project.projectlayer_equivalent_set() | ||
| 236 | |||
| 237 | self.add_filter(title="Filter by project machines", | ||
| 238 | name="in_current_project", | ||
| 239 | filter_actions=[ | ||
| 240 | self.make_filter_action("in_project", "Machines provided by layers added to this project", self.filter_in_project), | ||
| 241 | self.make_filter_action("not_in_project", "Machines provided by layers not added to this project", self.filter_not_in_project) | ||
| 242 | ]) | ||
| 186 | 243 | ||
| 187 | def setup_queryset(self, *args, **kwargs): | 244 | def setup_queryset(self, *args, **kwargs): |
| 188 | prj = Project.objects.get(pk = kwargs['pid']) | 245 | prj = Project.objects.get(pk = kwargs['pid']) |
| @@ -226,6 +283,7 @@ class MachinesTable(ToasterTable): | |||
| 226 | self.add_column(title="Select", | 283 | self.add_column(title="Select", |
| 227 | help_text="Sets the selected machine as the project machine. You can only have one machine per project", | 284 | help_text="Sets the selected machine as the project machine. You can only have one machine per project", |
| 228 | hideable=False, | 285 | hideable=False, |
| 286 | filter_name="in_current_project", | ||
| 229 | static_data_name="add-del-layers", | 287 | static_data_name="add-del-layers", |
| 230 | static_data_template='{% include "machine_btn.html" %}') | 288 | static_data_template='{% include "machine_btn.html" %}') |
| 231 | 289 | ||
| @@ -264,7 +322,7 @@ class LayerMachinesTable(MachinesTable): | |||
| 264 | static_data_template=select_btn_template) | 322 | static_data_template=select_btn_template) |
| 265 | 323 | ||
| 266 | 324 | ||
| 267 | class RecipesTable(ToasterTable): | 325 | class RecipesTable(ToasterTable, ProjectFiltersMixin): |
| 268 | """Table of Recipes in Toaster""" | 326 | """Table of Recipes in Toaster""" |
| 269 | 327 | ||
| 270 | def __init__(self, *args, **kwargs): | 328 | def __init__(self, *args, **kwargs): |
| @@ -282,6 +340,17 @@ class RecipesTable(ToasterTable): | |||
| 282 | 340 | ||
| 283 | return context | 341 | return context |
| 284 | 342 | ||
| 343 | def setup_filters(self, *args, **kwargs): | ||
| 344 | project = Project.objects.get(pk=kwargs['pid']) | ||
| 345 | self.project_layers = project.projectlayer_equivalent_set() | ||
| 346 | |||
| 347 | self.add_filter(title="Filter by project recipes", | ||
| 348 | name="in_current_project", | ||
| 349 | filter_actions=[ | ||
| 350 | self.make_filter_action("in_project", "Recipes provided by layers added to this project", self.filter_in_project), | ||
| 351 | self.make_filter_action("not_in_project", "Recipes provided by layers not added to this project", self.filter_not_in_project) | ||
| 352 | ]) | ||
| 353 | |||
| 285 | 354 | ||
| 286 | def setup_queryset(self, *args, **kwargs): | 355 | def setup_queryset(self, *args, **kwargs): |
| 287 | prj = Project.objects.get(pk = kwargs['pid']) | 356 | prj = Project.objects.get(pk = kwargs['pid']) |
| @@ -318,6 +387,7 @@ class RecipesTable(ToasterTable): | |||
| 318 | 387 | ||
| 319 | self.add_column(title="Recipe file", | 388 | self.add_column(title="Recipe file", |
| 320 | help_text="Path to the recipe .bb file", | 389 | help_text="Path to the recipe .bb file", |
| 390 | hidden=True, | ||
| 321 | static_data_name="recipe-file", | 391 | static_data_name="recipe-file", |
| 322 | static_data_template=recipe_file_template) | 392 | static_data_template=recipe_file_template) |
| 323 | 393 | ||
| @@ -348,6 +418,7 @@ class RecipesTable(ToasterTable): | |||
| 348 | self.add_column(title="Build", | 418 | self.add_column(title="Build", |
| 349 | help_text="Add or delete recipes to and from your project", | 419 | help_text="Add or delete recipes to and from your project", |
| 350 | hideable=False, | 420 | hideable=False, |
| 421 | filter_name="in_current_project", | ||
| 351 | static_data_name="add-del-layers", | 422 | static_data_name="add-del-layers", |
| 352 | static_data_template='{% include "recipe_btn.html" %}') | 423 | static_data_template='{% include "recipe_btn.html" %}') |
| 353 | 424 | ||
