summaryrefslogtreecommitdiff
path: root/tuskar_ui/tables.py
diff options
context:
space:
mode:
Diffstat (limited to 'tuskar_ui/tables.py')
-rw-r--r--tuskar_ui/tables.py177
1 files changed, 0 insertions, 177 deletions
diff --git a/tuskar_ui/tables.py b/tuskar_ui/tables.py
deleted file mode 100644
index c780bbb5..00000000
--- a/tuskar_ui/tables.py
+++ /dev/null
@@ -1,177 +0,0 @@
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import itertools
-import logging
-import sys
-
-from django import template
-from django.template import loader
-from django.utils import datastructures
-from horizon.tables import base as horizon_tables
-
-
-LOG = logging.getLogger(__name__)
-STRING_SEPARATOR = "__"
-
-
-class FormsetCell(horizon_tables.Cell):
- """A DataTable cell that knows about its field from the fieldset."""
-
- def __init__(self, *args, **kwargs):
- super(FormsetCell, self).__init__(*args, **kwargs)
- try:
- self.field = (self.row.form or {})[self.column.name]
- except KeyError:
- self.field = None
- else:
- if self.field.errors:
- self.attrs['class'] = (
- '%s error control-group' % self.attrs.get('class', ''))
- self.attrs['title'] = ' '.join(
- unicode(error) for error in self.field.errors)
-
-
-class FormsetRow(horizon_tables.Row):
- """A DataTable row that knows about its form from the fieldset."""
-
- template_path = 'formset_table/_row.html'
-
- def __init__(self, column, datum, form):
- self.form = form
- super(FormsetRow, self).__init__(column, datum)
- if self.cells == []:
- # We need to be able to handle empty rows, because there may
- # be extra empty forms in a formset. The original DataTable breaks
- # on this, because it sets self.cells to [], but later expects a
- # SortedDict. We just fill self.cells with empty Cells.
- cells = []
- for column in self.table.columns.values():
- cell = self.table._meta.cell_class(None, column, self)
- cells.append((column.name or column.auto, cell))
- self.cells = datastructures.SortedDict(cells)
-
- def render(self):
- return loader.render_to_string(self.template_path,
- {"row": self, "form": self.form})
-
-
-class FormsetDataTableMixin(object):
- """A mixin for DataTable to support Django Formsets.
-
- This works the same as the ``FormsetDataTable`` below, but can be used
- to add to existing DataTable subclasses.
- """
- formset_class = None
-
- def __init__(self, *args, **kwargs):
- super(FormsetDataTableMixin, self).__init__(*args, **kwargs)
- self._formset = None
-
- # Override Meta settings, because we need custom Form and Cell classes,
- # and also our own template.
- self._meta.row_class = FormsetRow
- self._meta.cell_class = FormsetCell
- self._meta.template = 'formset_table/_table.html'
-
- def get_required_columns(self):
- """Lists names of columns that have required fields."""
- required_columns = []
- if self.formset_class:
- empty_form = self.get_formset().empty_form
- for column in self.columns.values():
- field = empty_form.fields.get(column.name)
- if field and field.required:
- required_columns.append(column.name)
- return required_columns
-
- def _get_formset_data(self):
- """Formats the self.filtered_data in a way suitable for a formset."""
- data = []
- for datum in self.filtered_data:
- form_data = {}
- for column in self.columns.values():
- value = column.get_data(datum)
- form_data[column.name] = value
- form_data['id'] = self.get_object_id(datum)
- data.append(form_data)
- return data
-
- def get_formset(self):
- """Provide the formset corresponding to this DataTable.
-
- Use this to validate the formset and to get the submitted data back.
- """
- if self._formset is None:
- self._formset = self.formset_class(
- self.request.POST or None,
- initial=self._get_formset_data(),
- prefix=self._meta.name)
- return self._formset
-
- def get_empty_row(self):
- """Return a row with no data, for adding at the end of the table."""
- return self._meta.row_class(self, None, self.get_formset().empty_form)
-
- def get_rows(self):
- """Return the row data for this table broken out by columns.
-
- The row objects get an additional ``form`` parameter, with the
- formset form corresponding to that row.
- """
- try:
- rows = []
- if self.formset_class is None:
- formset = []
- else:
- formset = self.get_formset()
- formset.is_valid()
- for datum, form in itertools.izip_longest(self.filtered_data,
- formset):
- row = self._meta.row_class(self, datum, form)
- if self.get_object_id(datum) == self.current_item_id:
- self.selected = True
- row.classes.append('current_selected')
- rows.append(row)
- except Exception:
- # Exceptions can be swallowed at the template level here,
- # re-raising as a TemplateSyntaxError makes them visible.
- LOG.exception("Error while rendering table rows.")
- exc_info = sys.exc_info()
- raise template.TemplateSyntaxError, exc_info[1], exc_info[2]
- return rows
-
- def get_object_id(self, datum):
- # We need to support ``None`` when there are more forms than data.
- if datum is None:
- return None
- return super(FormsetDataTableMixin, self).get_object_id(datum)
-
-
-class FormsetDataTable(FormsetDataTableMixin, horizon_tables.DataTable):
- """A DataTable with support for Django Formsets.
-
- Note that :attr:`~horizon.tables.DataTableOptions.row_class` and
- :attr:`~horizon.tables.DataTaleOptions.cell_class` are overwritten in this
- class, so setting them in ``Meta`` has no effect.
-
- .. attribute:: formset_class
-
- A classs made with :function:`~django.forms.formsets.formset_factory`
- containing the definition of the formset to use with this data table.
-
- The columns that are named the same as the formset fields will be
- replaced with form widgets in the table. Any hidden fields from the
- formset will also be included. The fields that are not hidden and
- don't correspond to any column will not be included in the form.
- """