|
@@ -24,6 +24,7 @@ from extras.models import (
|
|
|
EventRule,
|
|
EventRule,
|
|
|
ExportTemplate,
|
|
ExportTemplate,
|
|
|
ImageAttachment,
|
|
ImageAttachment,
|
|
|
|
|
+ TableConfig,
|
|
|
Tag,
|
|
Tag,
|
|
|
TaggedItem,
|
|
TaggedItem,
|
|
|
)
|
|
)
|
|
@@ -31,6 +32,7 @@ from extras.models.mixins import RenderTemplateMixin
|
|
|
from tenancy.models import Tenant, TenantGroup
|
|
from tenancy.models import Tenant, TenantGroup
|
|
|
from utilities.exceptions import AbortRequest
|
|
from utilities.exceptions import AbortRequest
|
|
|
from utilities.jinja2 import render_jinja2
|
|
from utilities.jinja2 import render_jinja2
|
|
|
|
|
+from utilities.tables import get_table_for_model
|
|
|
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
|
|
from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine
|
|
|
|
|
|
|
|
|
|
|
|
@@ -190,6 +192,25 @@ class ImageAttachmentTestCase(TestCase):
|
|
|
self.assertCountEqual(storage.files.keys(), {base_name, suffixed_name})
|
|
self.assertCountEqual(storage.files.keys(), {base_name, suffixed_name})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class TableConfigTestCase(TestCase):
|
|
|
|
|
+ @classmethod
|
|
|
|
|
+ def setUpTestData(cls):
|
|
|
|
|
+ cls.site_ct = ContentType.objects.get_for_model(Site)
|
|
|
|
|
+ cls.table_name = get_table_for_model(Site).__name__
|
|
|
|
|
+
|
|
|
|
|
+ def test_clean_accepts_ordering_none(self):
|
|
|
|
|
+ """clean() must accept ordering=None (field is null=True)."""
|
|
|
|
|
+ tc = TableConfig(
|
|
|
|
|
+ object_type=self.site_ct,
|
|
|
|
|
+ table=self.table_name,
|
|
|
|
|
+ name='No ordering',
|
|
|
|
|
+ columns=['name'],
|
|
|
|
|
+ # ordering left unset (defaults to None)
|
|
|
|
|
+ )
|
|
|
|
|
+ # Must not raise TypeError: 'NoneType' object is not iterable
|
|
|
|
|
+ tc.full_clean()
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class TagTestCase(TestCase):
|
|
class TagTestCase(TestCase):
|
|
|
|
|
|
|
|
def test_default_ordering_weight_then_name_is_set(self):
|
|
def test_default_ordering_weight_then_name_is_set(self):
|