diff options
-rw-r--r-- | lib/toaster/toastergui/static/js/table.js | 5 | ||||
-rw-r--r-- | lib/toaster/toastergui/tables.py | 84 | ||||
-rw-r--r-- | lib/toaster/toastergui/templates/layerdetails.html | 2 | ||||
-rw-r--r-- | lib/toaster/toastergui/templates/toastertable-simple.html | 2 | ||||
-rw-r--r-- | lib/toaster/toastergui/templates/toastertable.html | 2 | ||||
-rw-r--r-- | lib/toaster/toastergui/urls.py | 30 | ||||
-rw-r--r-- | lib/toaster/toastergui/widgets.py | 47 |
7 files changed, 102 insertions, 70 deletions
diff --git a/lib/toaster/toastergui/static/js/table.js b/lib/toaster/toastergui/static/js/table.js index 2e35e3871..7588a4ab9 100644 --- a/lib/toaster/toastergui/static/js/table.js +++ b/lib/toaster/toastergui/static/js/table.js @@ -383,12 +383,13 @@ function tableInit(ctx){ */ var params = { 'name' : filterName, - 'search': tableParams.search + 'search': tableParams.search, + 'cmd': 'filterinfo', }; $.ajax({ type: "GET", - url: ctx.url + 'filterinfo', + url: ctx.url, data: params, headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, success: function (filterData) { diff --git a/lib/toaster/toastergui/tables.py b/lib/toaster/toastergui/tables.py index 9a93ff9aa..b75e56524 100644 --- a/lib/toaster/toastergui/tables.py +++ b/lib/toaster/toastergui/tables.py @@ -19,7 +19,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -from widgets import ToasterTable +from toastergui.widgets import ToasterTable from orm.models import Recipe, ProjectLayer, Layer_Version, Machine, Project from django.db.models import Q, Max from django.conf.urls import url @@ -29,9 +29,19 @@ class LayersTable(ToasterTable): """Table of layers in Toaster""" def __init__(self, *args, **kwargs): - ToasterTable.__init__(self) + super(LayersTable, self).__init__(*args, **kwargs) self.default_orderby = "layer__name" + def get_context_data(self, **kwargs): + context = super(LayersTable, self).get_context_data(**kwargs) + + context['project'] = Project.objects.get(pk=kwargs['pid']) + + context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) + + return context + + def setup_queryset(self, *args, **kwargs): prj = Project.objects.get(pk = kwargs['pid']) compatible_layers = prj.compatible_layerversions() @@ -132,14 +142,31 @@ class LayersTable(ToasterTable): static_data_name="add-del-layers", static_data_template='{% include "layer_btn.html" %}') +class LayerDetails(TemplateView): + def get_context_data(self, **kwargs): + context = super(LayerDetails, self).get_context_data(**kwargs) + + context['project'] = Project.objects.get(pk=kwargs['pid']) + context['layerversion'] = Layer_Version.objects.get(pk=kwargs['layerid']) + context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) + + return context + class MachinesTable(ToasterTable): """Table of Machines in Toaster""" def __init__(self, *args, **kwargs): - ToasterTable.__init__(self) + super(MachinesTable, self).__init__(*args, **kwargs) self.empty_state = "No machines maybe you need to do a build?" self.default_orderby = "name" + def get_context_data(self, **kwargs): + context = super(MachinesTable, self).get_context_data(**kwargs) + context['project'] = Project.objects.get(pk=kwargs['pid']) + context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) + return context + + def setup_queryset(self, *args, **kwargs): prj = Project.objects.get(pk = kwargs['pid']) compatible_layers = prj.compatible_layerversions() @@ -191,7 +218,13 @@ class LayerMachinesTable(MachinesTable): """ Smaller version of the Machines table for use in layer details """ def __init__(self, *args, **kwargs): - MachinesTable.__init__(self) + super(LayerMachinesTable, self).__init__(*args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(LayerMachinesTable, self).get_context_data(**kwargs) + context['layerversion'] = Layer_Version.objects.get(pk=kwargs['layerid']) + return context + def setup_queryset(self, *args, **kwargs): MachinesTable.setup_queryset(self, *args, **kwargs) @@ -219,10 +252,20 @@ class RecipesTable(ToasterTable): """Table of Recipes in Toaster""" def __init__(self, *args, **kwargs): - ToasterTable.__init__(self) + super(RecipesTable, self).__init__(*args, **kwargs) self.empty_state = "Toaster has no recipe information. To generate recipe information you can configure a layer source then run a build." self.default_orderby = "name" + def get_context_data(self, **kwargs): + context = super(RecipesTable, self).get_context_data(**kwargs) + + context['project'] = Project.objects.get(pk=kwargs['pid']) + + context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) + + return context + + def setup_queryset(self, *args, **kwargs): prj = Project.objects.get(pk = kwargs['pid']) @@ -293,10 +336,16 @@ class RecipesTable(ToasterTable): static_data_template='{% include "recipe_btn.html" %}') class LayerRecipesTable(RecipesTable): - """ Smaller version of the Machines table for use in layer details """ + """ Smaller version of the Recipes table for use in layer details """ def __init__(self, *args, **kwargs): - RecipesTable.__init__(self) + super(LayerRecipesTable, self).__init__(*args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(LayerRecipesTable, self).get_context_data(**kwargs) + context['layerversion'] = Layer_Version.objects.get(pk=kwargs['layerid']) + return context + def setup_queryset(self, *args, **kwargs): RecipesTable.setup_queryset(self, *args, **kwargs) @@ -320,24 +369,3 @@ class LayerRecipesTable(RecipesTable): self.add_column(title="Build recipe", static_data_name="add-del-layers", static_data_template=build_recipe_template) - - - -# This needs to be staticaly defined here as django reads the url patterns -# on start up -urlpatterns = ( - url(r'^machines/(?P<cmd>\w+)*', MachinesTable.as_view(), - name=MachinesTable.__name__.lower()), - url(r'^layers/(?P<cmd>\w+)*', LayersTable.as_view(), - name=LayersTable.__name__.lower()), - url(r'^recipes/(?P<cmd>\w+)*', RecipesTable.as_view(), - name=RecipesTable.__name__.lower()), - - # layer details tables - url(r'^layer/(?P<layerid>\d+)/recipes/(?P<cmd>\w+)*', - LayerRecipesTable.as_view(), - name=LayerRecipesTable.__name__.lower()), - url(r'^layer/(?P<layerid>\d+)/machines/(?P<cmd>\w+)*', - LayerMachinesTable.as_view(), - name=LayerMachinesTable.__name__.lower()), -) diff --git a/lib/toaster/toastergui/templates/layerdetails.html b/lib/toaster/toastergui/templates/layerdetails.html index 259a59ea0..c27d259a8 100644 --- a/lib/toaster/toastergui/templates/layerdetails.html +++ b/lib/toaster/toastergui/templates/layerdetails.html @@ -33,7 +33,7 @@ $(document).ready(function (){ var ctx = { - projectBuildUrl : "{% url 'xhr_build' %}", + projectBuildUrl : "{% url 'xhr_projectbuild' project.id %}", layerDetailsUrl : "{% url 'base_layerdetails' project.id %}", xhrUpdateLayerUrl : "{% url 'xhr_updatelayer' %}", layerVersion : { diff --git a/lib/toaster/toastergui/templates/toastertable-simple.html b/lib/toaster/toastergui/templates/toastertable-simple.html index 23a75260a..ea7b38e13 100644 --- a/lib/toaster/toastergui/templates/toastertable-simple.html +++ b/lib/toaster/toastergui/templates/toastertable-simple.html @@ -10,7 +10,7 @@ var ctx = { tableName : "{{table_name}}", - url : "{{ xhr_table_url }}", + url : "{{ xhr_table_url }}?format=json", title : "{{title}}", projectLayers : {{projectlayers|json}}, }; diff --git a/lib/toaster/toastergui/templates/toastertable.html b/lib/toaster/toastergui/templates/toastertable.html index 5c79ab4ae..c7c7a84bf 100644 --- a/lib/toaster/toastergui/templates/toastertable.html +++ b/lib/toaster/toastergui/templates/toastertable.html @@ -10,7 +10,7 @@ var ctx = { tableName : "{{table_name}}", - url : "{{ xhr_table_url }}", + url : "{{ xhr_table_url }}?format=json", title : "{{title}}", projectLayers : {{projectlayers|json}}, }; diff --git a/lib/toaster/toastergui/urls.py b/lib/toaster/toastergui/urls.py index 4e328dae1..e10e0bb15 100644 --- a/lib/toaster/toastergui/urls.py +++ b/lib/toaster/toastergui/urls.py @@ -20,8 +20,7 @@ from django.conf.urls import patterns, include, url from django.views.generic import RedirectView, TemplateView from django.http import HttpResponseBadRequest -import tables -from widgets import ToasterTemplateView +from toastergui import tables urlpatterns = patterns('toastergui.views', # landing page @@ -81,32 +80,46 @@ urlpatterns = patterns('toastergui.views', url(r'^project/(?P<pid>\d+)/configuration$', 'projectconf', name='projectconf'), url(r'^project/(?P<pid>\d+)/builds/$', 'projectbuilds', name='projectbuilds'), - url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$', - ToasterTemplateView.as_view(template_name='layerdetails.html'), - name='layerdetails'), url(r'^project/(?P<pid>\d+)/layer/$', lambda x,pid: HttpResponseBadRequest(), name='base_layerdetails'), # the import layer is a project-specific functionality; url(r'^project/(?P<pid>\d+)/importlayer$', 'importlayer', name='importlayer'), + + # the table pages that have been converted to ToasterTable widget url(r'^project/(?P<pid>\d+)/machines/$', - ToasterTemplateView.as_view(template_name="generic-toastertable-page.html"), + tables.MachinesTable.as_view(template_name="generic-toastertable-page.html"), { 'table_name': tables.MachinesTable.__name__.lower(), 'title' : 'All compatible machines' }, name="all-machines"), url(r'^project/(?P<pid>\d+)/recipes/$', - ToasterTemplateView.as_view(template_name="generic-toastertable-page.html"), + tables.RecipesTable.as_view(template_name="generic-toastertable-page.html"), { 'table_name': tables.RecipesTable.__name__.lower(), 'title' : 'All compatible recipes' }, name="all-targets"), url(r'^project/(?P<pid>\d+)/layers/$', - ToasterTemplateView.as_view(template_name="generic-toastertable-page.html"), + tables.LayersTable.as_view(template_name="generic-toastertable-page.html"), { 'table_name': tables.LayersTable.__name__.lower(), 'title' : 'All compatible layers' }, name="all-layers"), + url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$', + tables.LayerDetails.as_view(template_name='layerdetails.html'), + name='layerdetails'), + + url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/recipes/$', + tables.LayerRecipesTable.as_view(template_name="generic-toastertable-page.html"), + { 'table_name': tables.LayerRecipesTable.__name__.lower(), + 'title' : 'All recipes in layer' }, + name=tables.LayerRecipesTable.__name__.lower()), + + url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/machines/$', + tables.LayerMachinesTable.as_view(template_name="generic-toastertable-page.html"), + { 'table_name': tables.LayerMachinesTable.__name__.lower(), + 'title' : 'All machines in layer' }, + name=tables.LayerMachinesTable.__name__.lower()), url(r'^xhr_projectbuild/(?P<pid>\d+)$', 'xhr_projectbuild', name='xhr_projectbuild'), url(r'^xhr_projectinfo/$', 'xhr_projectinfo', name='xhr_projectinfo'), @@ -116,7 +129,6 @@ urlpatterns = patterns('toastergui.views', url(r'^xhr_datatypeahead/(?P<pid>\d+)$', 'xhr_datatypeahead', name='xhr_datatypeahead'), url(r'^xhr_importlayer/$', 'xhr_importlayer', name='xhr_importlayer'), url(r'^xhr_updatelayer/$', 'xhr_updatelayer', name='xhr_updatelayer'), - url(r'^xhr_tables/project/(?P<pid>\d+)/', include('toastergui.tables')), # dashboard for failed build requests url(r'^project/(?P<pid>\d+)/buildrequest/(?P<brid>\d+)$', 'buildrequestdetails', name='buildrequestdetails'), diff --git a/lib/toaster/toastergui/widgets.py b/lib/toaster/toastergui/widgets.py index 8cf6e1bc2..4347a3f08 100644 --- a/lib/toaster/toastergui/widgets.py +++ b/lib/toaster/toastergui/widgets.py @@ -32,29 +32,17 @@ from django.core.serializers.json import DjangoJSONEncoder from django.core.exceptions import FieldError from django.conf.urls import url, patterns -import urls import types import json import collections import operator -class ToasterTemplateView(TemplateView): - def get_context_data(self, **kwargs): - context = super(ToasterTemplateView, self).get_context_data(**kwargs) - if 'pid' in kwargs: - context['project'] = Project.objects.get(pk=kwargs['pid']) - - context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project'])) - - if 'layerid' in kwargs: - context['layerversion'] = Layer_Version.objects.get(pk=kwargs['layerid']) - - return context - - -class ToasterTable(View): - def __init__(self): +class ToasterTable(TemplateView): + def __init__(self, *args, **kwargs): + super(ToasterTable, self).__init__() + if 'template_name' in kwargs: + self.template_name = kwargs['template_name'] self.title = None self.queryset = None self.columns = [] @@ -66,20 +54,23 @@ class ToasterTable(View): self.default_orderby = "" def get(self, request, *args, **kwargs): - self.setup_queryset(*args, **kwargs) + if request.GET.get('format', None) == 'json': - # Put the project id into the context for the static_data_template - if 'pid' in kwargs: - self.static_context_extra['pid'] = kwargs['pid'] + self.setup_queryset(*args, **kwargs) + # Put the project id into the context for the static_data_template + if 'pid' in kwargs: + self.static_context_extra['pid'] = kwargs['pid'] - cmd = kwargs['cmd'] - if cmd and 'filterinfo' in cmd: - data = self.get_filter_info(request) - else: - # If no cmd is specified we give you the table data - data = self.get_data(request, **kwargs) + cmd = request.GET.get('cmd', None) + if cmd and 'filterinfo' in cmd: + data = self.get_filter_info(request) + else: + # If no cmd is specified we give you the table data + data = self.get_data(request, **kwargs) + + return HttpResponse(data, content_type="application/json") - return HttpResponse(data, content_type="application/json") + return super(ToasterTable, self).get(request, *args, **kwargs) def get_filter_info(self, request): data = None |