Enable E128 check for line indentation

E127/E128 checks helps us to keep code more readable, so these rules
should be allowed, when pep8 runs.
Enabled check E128 - continuation line under-indented for visual indent.

Change-Id: Ic17a7ba47d555183ff26a5dc5f6ec27c0461725a
This commit is contained in:
Victor Sergeyev 2013-10-28 10:43:02 +02:00
parent 772aafbce6
commit e85b19e619
27 changed files with 123 additions and 91 deletions

View File

@ -32,10 +32,9 @@ downloadcache = ~/cache/pip
[flake8]
builtins = _
exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,panel_template,dash_template,local_settings.py
# E128 continuation line under-indented for visual indent
# F403 'from <smth> import *' used; unable to detect undefined names
# F999 syntax error in doctest
# H4xx docstrings
# H701 empty localization string
# H702 Formatting operation should be outside of localization method call
ignore = E128,F403,F999,H4,H701,H702
ignore = F403,F999,H4,H701,H702

View File

@ -47,11 +47,13 @@ def tuskarclient(request):
def baremetalclient(request):
def create_remote_nova_client_baremetal():
nc = nova.nova_client.Client(REMOTE_NOVA_BAREMETAL_CREDS['user'],
REMOTE_NOVA_BAREMETAL_CREDS['password'],
REMOTE_NOVA_BAREMETAL_CREDS['tenant'],
auth_url=REMOTE_NOVA_BAREMETAL_CREDS['auth_url'],
bypass_url=REMOTE_NOVA_BAREMETAL_CREDS['bypass_url'])
nc = nova.nova_client.Client(
REMOTE_NOVA_BAREMETAL_CREDS['user'],
REMOTE_NOVA_BAREMETAL_CREDS['password'],
REMOTE_NOVA_BAREMETAL_CREDS['tenant'],
auth_url=REMOTE_NOVA_BAREMETAL_CREDS['auth_url'],
bypass_url=REMOTE_NOVA_BAREMETAL_CREDS['bypass_url'],
)
return nc
def create_nova_client_baremetal():
@ -205,7 +207,7 @@ class BaremetalNode(StringIdAPIResourceWrapper):
node.ip_address_other = (", "
.join([addr['addr'] for addr in addresses]))
node.status = (nova_instance._apiresource.
_info['OS-EXT-STS:vm_state'])
_info['OS-EXT-STS:vm_state'])
node.power_management = ""
if node.pm_user:
node.power_management = node.pm_user + "/********"
@ -452,7 +454,7 @@ class Rack(StringIdAPIResourceWrapper):
def list_baremetal_nodes(self):
if not hasattr(self, '_baremetal_nodes'):
self._baremetal_nodes = [node.nova_baremetal_node
for node in self.list_nodes]
for node in self.list_nodes]
return self._baremetal_nodes
@property
@ -739,8 +741,9 @@ class ResourceClass(StringIdAPIResourceWrapper):
def aggregated_alerts(self):
# FIXME: for now return only list of racks (particular alerts are not
# used)
return [rack for rack in self.list_racks if (rack.alerts +
rack.aggregated_alerts)]
return [rack
for rack in self.list_racks
if rack.alerts + rack.aggregated_alerts]
@property
def has_provisioned_rack(self):

View File

@ -17,6 +17,7 @@ from django.conf.urls import defaults
from tuskar_ui.infrastructure.overview import views
urlpatterns = defaults.patterns('',
urlpatterns = defaults.patterns(
'',
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
)

View File

@ -36,7 +36,8 @@ class FlavorForm(forms.Form):
name = forms.RegexField(label=_("Name"),
max_length=25,
regex=r'^[\w\.\- ]+$',
error_messages={'invalid': _('Name may only '
error_messages={'invalid': _(
'Name may only '
'contain letters, numbers, underscores, '
'periods and hyphens.')},
widget=forms.TextInput(attrs={

View File

@ -63,6 +63,7 @@ class FlavorsTests(test.BaseAdminViewTests):
args=[resource_class.id, flavor.id])
res = self.client.get(url)
self.assertRedirectsNoFollow(res,
self.assertRedirectsNoFollow(
res,
urlresolvers.reverse('horizon:infrastructure:resource_management:'
'index'))

View File

@ -21,7 +21,8 @@ from tuskar_ui.infrastructure.resource_management.flavors import views
VIEW_MOD = 'tuskar_ui.infrastructure.' \
'resource_management.flavors.views'
urlpatterns = defaults.patterns(VIEW_MOD,
urlpatterns = defaults.patterns(
VIEW_MOD,
defaults.url(r'^(?P<flavor_id>[^/]+)/$',
views.DetailView.as_view(),
name='detail')

View File

@ -19,27 +19,33 @@ import tuskar_ui.forms
class NodeForm(django.forms.Form):
id = django.forms.IntegerField(required=False,
id = django.forms.IntegerField(
required=False,
widget=django.forms.HiddenInput())
service_host = django.forms.CharField(label=_("Service Host"),
service_host = django.forms.CharField(
label=_("Service Host"),
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
required=True)
mac_address = tuskar_ui.forms.MACField(label=_("MAC Address"),
mac_address = tuskar_ui.forms.MACField(
label=_("MAC Address"),
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
required=True)
# Hardware Specifications
cpus = django.forms.IntegerField(label=_("CPUs"), required=True,
cpus = django.forms.IntegerField(
label=_("CPUs"), required=True,
min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
'class': 'input number_input_slim',
}))
memory_mb = django.forms.IntegerField(label=_("Memory"),
required=True, min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
memory_mb = django.forms.IntegerField(
label=_("Memory"), required=True, min_value=1,
widget=tuskar_ui.forms.NumberInput(attrs={
'class': 'input number_input_slim',
}))
local_gb = django.forms.IntegerField(label=_("Local Disk (GB)"),
min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
local_gb = django.forms.IntegerField(
label=_("Local Disk (GB)"), min_value=1,
widget=tuskar_ui.forms.NumberInput(attrs={
'class': 'input number_input_slim',
}), required=True)
@ -47,15 +53,19 @@ class NodeForm(django.forms.Form):
pm_address = django.forms.GenericIPAddressField(
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
label=_("Power Management IP"), required=False)
pm_user = django.forms.CharField(label=_("Power Management User"),
pm_user = django.forms.CharField(
label=_("Power Management User"),
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
required=False)
pm_password = django.forms.CharField(label=_("Power Management Password"),
required=False, widget=django.forms.PasswordInput(render_value=False,
pm_password = django.forms.CharField(
label=_("Power Management Password"),
required=False, widget=django.forms.PasswordInput(
render_value=False,
attrs={'class': 'input input-mini'}))
# Access
terminal_port = django.forms.IntegerField(label=_("Terminal Port"),
terminal_port = django.forms.IntegerField(
label=_("Terminal Port"),
required=False, min_value=0, max_value=1024,
widget=tuskar_ui.forms.NumberInput(attrs={
'class': 'input number_input_slim',
@ -84,5 +94,5 @@ class BaseNodeFormSet(django.forms.formsets.BaseFormSet):
values[field][value] = form
NodeFormset = django.forms.formsets.formset_factory(NodeForm, extra=1,
can_delete=True, formset=BaseNodeFormSet)
NodeFormset = django.forms.formsets.formset_factory(
NodeForm, extra=1, can_delete=True, formset=BaseNodeFormSet)

View File

@ -32,8 +32,8 @@ class DeleteNodes(tables.DeleteAction):
node = tuskar.Node.get(request, obj_id)
rack = node.rack
nodes = [{'id': node_id}
for node_id in rack.node_ids
if node_id != obj_id]
for node_id in rack.node_ids
if node_id != obj_id]
tuskar.Rack.update(request, rack.id, {'nodes': nodes})
except Exception:
exceptions.handle(request, _("Error deleting node."))
@ -54,7 +54,7 @@ class NodesTable(tables.DataTable):
link=("horizon:infrastructure:resource_management:nodes:detail"))
mac_address = tables.Column("mac_address", verbose_name=_("MAC Address"))
pm_address = tables.Column("pm_address",
verbose_name=_("Management Address"))
verbose_name=_("Management Address"))
status = tables.Column("status", verbose_name=_("Status"))
usage = tables.Column("usage", verbose_name=_("Usage"))
@ -87,13 +87,13 @@ class NodesFormsetTable(tuskar_ui.tables.FormsetDataTable):
local_gb = tables.Column('local_gb', verbose_name=_("Local Disk (GB)"))
pm_address = tables.Column('pm_address',
verbose_name=_("Power Management IP"))
verbose_name=_("Power Management IP"))
pm_user = tables.Column('pm_user', verbose_name=_("Power Management User"))
pm_password = tables.Column('pm_password',
verbose_name=_("Power Management Password"))
verbose_name=_("Power Management Password"))
terminal_port = tables.Column('terminal_port',
verbose_name=_("Terminal Port"))
verbose_name=_("Terminal Port"))
# This is needed for the formset with can_delete=True
DELETE = tables.Column('DELETE', verbose_name=_("Delete"))

View File

@ -32,7 +32,8 @@ class OverviewTab(tabs.Tab):
running_instances = len(node.running_virtual_machines)
except requests.exceptions.ConnectionError:
running_instances = _("Unknown")
messages.warning(request,
messages.warning(
request,
_("Can't retrieve the running instances from the overcloud."))
return {
'node': node,

View File

@ -34,8 +34,9 @@ class NodeViewTests(test.BaseAdminViewTests):
self.mox.ReplayAll()
res = self.client.get(self.unracked_page)
self.assertTemplateUsed(res,
'infrastructure/resource_management/nodes/unracked.html')
self.assertTemplateUsed(
res,
'infrastructure/resource_management/nodes/unracked.html')
unracked_nodes_table = res.context['unracked_nodes_table'].data
self.assertItemsEqual(unracked_nodes_table, unracked_nodes)
@ -86,6 +87,7 @@ class NodeViewTests(test.BaseAdminViewTests):
args=[node.id])
res = self.client.get(url)
self.assertRedirectsNoFollow(res,
self.assertRedirectsNoFollow(
res,
urlresolvers.reverse('horizon:infrastructure:resource_management:'
'index'))

View File

@ -21,7 +21,8 @@ NODES = r'^(?P<node_id>[^/]+)/%s$'
VIEW_MOD = 'tuskar_ui.infrastructure.resource_management.nodes.views'
urlpatterns = defaults.patterns(VIEW_MOD,
urlpatterns = defaults.patterns(
VIEW_MOD,
defaults.url(NODES % 'detail', views.DetailView.as_view(), name='detail'),
defaults.url(r'^unracked/$',
views.UnrackedView.as_view(),

View File

@ -77,7 +77,7 @@ class UploadRack(forms.SelfHandlingForm):
racks = CSVRack.from_str(base64.b64decode(racks_str))
# get the resource class ids by resource class names
rclass_ids = dict((rc.name, rc.id) for rc in
tuskar.ResourceClass.list(request))
tuskar.ResourceClass.list(request))
for rack in racks:
try:
tuskar.Rack.create(

View File

@ -117,7 +117,7 @@ class RackViewTests(test.BaseAdminViewTests):
self.mox.ReplayAll()
url = urlresolvers.reverse('horizon:infrastructure:'
'resource_management:racks:edit', args=[1])
'resource_management:racks:edit', args=[1])
res = self.client.get(url)
self.assertEqual(res.status_code, 200)
self.assertTemplateUsed(res, 'infrastructure/_workflow_base.html')
@ -232,12 +232,12 @@ class RackViewTests(test.BaseAdminViewTests):
rack = self.client.get(url)
self.assertEqual(rack.status_code, 200)
self.assertTemplateUsed(rack,
'infrastructure/resource_management/racks/upload.html')
self.assertTemplateUsed(
rack, 'infrastructure/resource_management/racks/upload.html')
def test_upload_rack_upload(self):
csv_data = ('Rack1,rclass1,192.168.111.0/24,regionX,f0:dd:f1:da:f9:b5 '
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
temp_file = tempfile.TemporaryFile()
temp_file.write(csv_data)
temp_file.flush()
@ -247,37 +247,37 @@ class RackViewTests(test.BaseAdminViewTests):
url = urlresolvers.reverse('horizon:infrastructure:'
'resource_management:racks:upload')
resp = self.client.post(url, data)
self.assertTemplateUsed(resp,
'infrastructure/resource_management/racks/upload.html')
self.assertTemplateUsed(
resp, 'infrastructure/resource_management/racks/upload.html')
self.assertNoFormErrors(resp)
self.assertEqual(resp.context['form']['uploaded_data'].value(),
base64.b64encode(csv_data))
base64.b64encode(csv_data))
def test_upload_rack_upload_with_error(self):
data = {'upload': '1'}
url = urlresolvers.reverse('horizon:infrastructure:'
'resource_management:racks:upload')
resp = self.client.post(url, data)
self.assertTemplateUsed(resp,
'infrastructure/resource_management/racks/upload.html')
self.assertTemplateUsed(
resp, 'infrastructure/resource_management/racks/upload.html')
self.assertFormErrors(resp, 1)
self.assertEqual(resp.context['form']['uploaded_data'].value(),
None)
None)
@test.create_stubs({tuskar.Rack: ('create',),
tuskar.ResourceClass: ('list',)})
def test_upload_rack_create(self):
tuskar.Rack.create(mox.IsA(http.HttpRequest),
name='Rack1',
resource_class_id='1',
location='regionX',
subnet='192.168.111.0/24').AndReturn(None)
name='Rack1',
resource_class_id='1',
location='regionX',
subnet='192.168.111.0/24').AndReturn(None)
tuskar.ResourceClass.list(
mox.IsA(http.HttpRequest)).AndReturn(
self.tuskar_resource_classes.list())
self.mox.ReplayAll()
csv_data = ('Rack1,rclass1,192.168.111.0/24,regionX,f0:dd:f1:da:f9:b5 '
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
data = {'uploaded_data': base64.b64encode(csv_data), 'add_racks': '1'}
url = urlresolvers.reverse('horizon:infrastructure:'
@ -369,7 +369,7 @@ class RackViewTests(test.BaseAdminViewTests):
@test.create_stubs({
tuskar.Rack: ('get', 'list_nodes', 'list_flavors', 'update',
'node_ids'),
'node_ids'),
tuskar.ResourceClass: ('get',),
tuskar.Node: ('get',),
tuskar.BaremetalNode: ('get',),
@ -387,12 +387,13 @@ class RackViewTests(test.BaseAdminViewTests):
tuskar.Rack.get(mox.IsA(http.HttpRequest), rack.id).AndReturn(rack)
tuskar.Node.get(mox.IsA(http.HttpRequest),
baremetal_node.id).AndReturn(tuskar_node)
baremetal_node.id).AndReturn(tuskar_node)
tuskar.Rack.get(None, rack.id).AndReturn(rack) # called by node.rack
tuskar.Rack.update(mox.IsA(http.HttpRequest), rack.id,
{'nodes': [{'id': node_id}
for node_id in tuskar.Rack.node_ids
if node_id != baremetal_node.id]}).AndReturn(rack)
{'nodes': [{'id': node_id}
for node_id in tuskar.Rack.node_ids
if node_id != baremetal_node.id]}
).AndReturn(rack)
self.mox.ReplayAll()
url = urlresolvers.reverse(

View File

@ -20,7 +20,8 @@ RACKS = r'^(?P<rack_id>[^/]+)/%s$'
VIEW_MOD = 'tuskar_ui.infrastructure.resource_management.racks.views'
urlpatterns = urls.patterns(VIEW_MOD,
urlpatterns = urls.patterns(
VIEW_MOD,
urls.url(r'^create/$', views.CreateView.as_view(), name='create'),
urls.url(r'^upload/$', views.UploadView.as_view(), name='upload'),
urls.url(r'^usage_data$',

View File

@ -33,7 +33,8 @@ class RackCreateInfoAction(workflows.Action):
name = forms.RegexField(label=_("Name"),
max_length=25,
regex=r'^[\w\.\- ]+$',
error_messages={'invalid': _('Name may only '
error_messages={'invalid': _(
'Name may only '
'contain letters, numbers, underscores, '
'periods and hyphens.')})
location = forms.CharField(label=_("Location"))
@ -50,7 +51,7 @@ class RackCreateInfoAction(workflows.Action):
except Exception:
racks = []
exceptions.check_message(['Connection', 'refused'],
_("Unable to retrieve rack list."))
_("Unable to retrieve rack list."))
raise
# Validations: detect duplicates
@ -213,7 +214,8 @@ class CreateRack(workflows.Workflow):
node_ids.append({'id': node_id})
try:
# Then, register the Rack, including the nodes
tuskar.Rack.create(request, name=data['name'],
tuskar.Rack.create(
request, name=data['name'],
resource_class_id=data['resource_class_id'],
location=data['location'], subnet=data['subnet'],
nodes=node_ids)
@ -239,7 +241,7 @@ class EditRack(CreateRack):
def handle(self, request, data):
node_ids = [{'id': self.create_or_update_node(node_data)}
for node_data in data['nodes']]
for node_data in data['nodes']]
try:
rack_id = self.context['rack_id']
data['nodes'] = node_ids

View File

@ -70,14 +70,15 @@ class ResourcesClassFilterAction(tables.FilterAction):
class ResourceClassesTable(tables.DataTable):
name = tables.Column("name", link=("horizon:infrastructure:"
"resource_management:resource_classes:detail"),
name = tables.Column(
"name", link=("horizon:infrastructure:"
"resource_management:resource_classes:detail"),
verbose_name=_("Class Name"))
service_type = tables.Column("service_type", verbose_name=_("Class Type"))
racks_count = tables.Column("racks_count", verbose_name=_("Racks"),
empty_value="0")
empty_value="0")
nodes_count = tables.Column("nodes_count", verbose_name=_("Nodes"),
empty_value="0")
empty_value="0")
class Meta:
name = "resource_classes"
@ -130,7 +131,7 @@ class UpdateRacksClass(tables.LinkAction):
def get_link_url(self, datum=None):
url = ("horizon:infrastructure:resource_management:resource_classes:"
"update_racks")
"update_racks")
return "%s?step=%s" % (
urlresolvers.reverse(
url,
@ -145,7 +146,7 @@ class UpdateFlavorsClass(tables.LinkAction):
def get_link_url(self, datum=None):
url = ("horizon:infrastructure:resource_management:resource_classes:"
"update_flavors")
"update_flavors")
resource_class_id = self.table.kwargs.get('resource_class_id')
return "%s?step=%s" % (
urlresolvers.reverse(url, args=(resource_class_id,)),
@ -200,7 +201,7 @@ class FlavorsTable(tables.DataTable):
class FlavorsFormsetTable(tuskar_ui.tables.FormsetDataTableMixin,
FlavorsTable):
FlavorsTable):
name = tables.Column(
'name',

View File

@ -56,7 +56,7 @@ class FlavorsTab(tabs.TableTab):
name = _("Flavors")
slug = "flavors"
template_name = ("infrastructure/resource_management/resource_classes/"
"_detail_flavors.html")
"_detail_flavors.html")
def get_flavors_table_data(self):
try:

View File

@ -149,7 +149,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests):
'racks-MAX_NUM_FORMS': 1000,
}
res = self.client.post(url, form_data)
self.assertRedirectsNoFollow(res,
self.assertRedirectsNoFollow(
res,
("%s?tab=resource_management_tabs__resource_classes_tab" %
urlresolvers.
reverse("horizon:infrastructure:resource_management:index")))
@ -354,7 +355,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests):
self.assertItemsEqual(res.context['flavors_table_table'].data, flavors)
self.assertItemsEqual(res.context['racks_table_table'].data, racks)
self.assertEqual(res.status_code, 200)
self.assertTemplateUsed(res,
self.assertTemplateUsed(
res,
'infrastructure/resource_management/resource_classes/detail.html')
@test.create_stubs({

View File

@ -63,7 +63,7 @@ class UpdateView(tuskar_workflows.WorkflowView):
resource_class_id)
except Exception:
redirect = urlresolvers.reverse('horizon:infrastructure:'
'resource_management:index')
'resource_management:index')
msg = _('Unable to retrieve resource class details.')
exceptions.handle(self.request, msg, redirect=redirect)

View File

@ -65,7 +65,7 @@ class ResourceClassInfoAction(workflows.Action):
images, more = glance.image_list_detailed(self.request)
except Exception:
exceptions.handle(self.request,
_('Unable to retrieve image list.'))
_('Unable to retrieve image list.'))
else:
self.fields['image_id'].choices = [
(image.id, image.name) for image in images]
@ -141,7 +141,7 @@ class CreateResourceClassFlavors(tuskar_ui.workflows.TableStep):
except Exception:
flavors = []
exceptions.handle(self.workflow.request,
_('Unable to retrieve resource flavors list.'))
_('Unable to retrieve resource flavors list.'))
return flavors

View File

@ -71,7 +71,7 @@ class RacksTab(ProvisioningInfoMixin, tabs.TableTab):
name = _("Racks")
slug = "racks_tab"
template_name = ("infrastructure/resource_management/"
"racks/_index_table.html")
"racks/_index_table.html")
def get_racks_data(self):
try:
@ -98,7 +98,7 @@ class ResourceClassesTab(ProvisioningInfoMixin, tabs.TableTab):
name = _("Classes")
slug = "resource_classes_tab"
template_name = ("infrastructure/resource_management/"
"resource_classes/_index_table.html")
"resource_classes/_index_table.html")
#preload = False buggy, checkboxes doesn't work wit table actions
def get_resource_classes_data(self):

View File

@ -25,7 +25,8 @@ from tuskar_ui.infrastructure.resource_management import views
from tuskar_ui.test import urls as test_urls
urlpatterns = defaults.patterns('',
urlpatterns = defaults.patterns(
'',
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
defaults.url(r'^provision$', views.ProvisionView.as_view(),
name='provision'),
@ -39,5 +40,6 @@ urlpatterns = defaults.patterns('',
)
if conf.settings.DEBUG:
urlpatterns += defaults.patterns('', defaults.url(r'^qunit$',
defaults.include(test_urls, namespace='tests')))
urlpatterns += defaults.patterns(
'', defaults.url(r'^qunit$',
defaults.include(test_urls, namespace='tests')))

View File

@ -17,6 +17,7 @@ from django.conf.urls import defaults
from tuskar_ui.infrastructure.service_management import views
urlpatterns = defaults.patterns('',
urlpatterns = defaults.patterns(
'',
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
)

View File

@ -110,8 +110,8 @@ class FormsetCell(BaseCell):
self.field = None
else:
if self.field.errors:
self.attrs['class'] = (self.attrs.get('class', '') +
' error control-group')
self.attrs['class'] = (
'%s error control-group' % self.attrs.get('class', ''))
self.attrs['title'] = ' '.join(
unicode(error) for error in self.field.errors)
@ -137,7 +137,7 @@ class FormsetRow(BaseRow):
def render(self):
return loader.render_to_string(self.template_path,
{"row": self, "form": self.form})
{"row": self, "form": self.form})
class FormsetDataTableMixin(object):

View File

@ -58,7 +58,8 @@ class TuskarApiTests(test.APITestCase):
node = self.baremetalclient_nodes.first()
self.mox.StubOutWithMock(baremetal.BareMetalNodeManager, 'create')
baremetal.BareMetalNodeManager.create('node', 1, 1024, 10,
baremetal.BareMetalNodeManager.create(
'node', 1, 1024, 10,
'aa:bb:cc:dd:ee', None, None, '', None).AndReturn(node)
self.mox.ReplayAll()

View File

@ -37,7 +37,7 @@ class FormsetTableTests(test.TestCase):
value = django.forms.IntegerField()
TableFormset = django.forms.formsets.formset_factory(TableForm,
extra=0)
extra=0)
class Table(tuskar_ui.tables.FormsetDataTable):
formset_class = TableFormset

View File

@ -16,6 +16,7 @@ from django.conf.urls import defaults
from django.views import generic
urlpatterns = defaults.patterns('', defaults.url(r'^$',
urlpatterns = defaults.patterns('', defaults.url(
r'^$',
generic.TemplateView.as_view(template_name="infrastructure/qunit.html"),
name='qunit_tests'))