diff --git a/opal/models.py b/opal/models.py index f4f405d85..bd86f5483 100644 --- a/opal/models.py +++ b/opal/models.py @@ -200,11 +200,17 @@ def get_field_description(cls, name): @classmethod def get_field_enum(cls, name): field = cls._get_field(name) - choices = getattr(field, "choices", []) + choices = getattr(field, "choices", []) if choices: return [i[1] for i in choices] + yes_no = ["Yes", "No"] + if cls._get_field_type(name) == models.fields.BooleanField: + return yes_no + elif cls._get_field_type(name) == models.fields.NullBooleanField: + return yes_no + ["Unknown"] + @classmethod def get_lookup_list_api_name(cls, field_name): lookup_list = None diff --git a/opal/tests/models.py b/opal/tests/models.py index f6fc3df35..c363f22a4 100644 --- a/opal/tests/models.py +++ b/opal/tests/models.py @@ -37,6 +37,7 @@ class HatWearer(models.EpisodeSubrecord): name = dmodels.CharField(max_length=200) hats = dmodels.ManyToManyField(Hat, related_name="hat_wearers") wearing_a_hat = dmodels.BooleanField(default=True) + suits_a_hat = dmodels.NullBooleanField() class Meta: verbose_name = 'Wearer of Hats' diff --git a/opal/tests/test_models.py b/opal/tests/test_models.py index 24a7b29b7..76a3465d6 100644 --- a/opal/tests/test_models.py +++ b/opal/tests/test_models.py @@ -434,6 +434,14 @@ def test_enum(self): enum = FavouriteColour.get_field_enum('name') self.assertEqual(enum, ["purple", "yellow", "blue"]) + def test_get_field_enum_for_boolean_field(self): + enum = HatWearer.get_field_enum('wearing_a_hat') + self.assertEqual(enum, ['Yes', 'No']) + + def test_get_field_enum_for_null_boolean_field(self): + enum = HatWearer.get_field_enum('suits_a_hat') + self.assertEqual(enum, ['Yes', 'No', 'Unknown']) + def test_description(self): description = FavouriteColour.get_field_description('name') self.assertEqual(description, "orange is the new black") diff --git a/opal/tests/test_templatetags_forms.py b/opal/tests/test_templatetags_forms.py index cd3e90ece..6d2d88f0e 100644 --- a/opal/tests/test_templatetags_forms.py +++ b/opal/tests/test_templatetags_forms.py @@ -449,6 +449,20 @@ def test_radio_infer_lookuplists(self): rendered = template.render(Context({})) self.assertIn('purple', rendered) + def test_radio_infer_lookuplists_with_boolean(self): + template = Template('{% load forms %}{% radio field="HatWearer.wearing_a_hat" %}') + rendered = template.render(Context({})) + self.assertIn('Yes', rendered) + self.assertIn('No', rendered) + self.assertNotIn('Unknown', rendered) + + def test_radio_infer_lookuplists_with_quantum_boolean(self): + template = Template('{% load forms %}{% radio field="HatWearer.suits_a_hat" %}') + rendered = template.render(Context({})) + self.assertIn('Yes', rendered) + self.assertIn('No', rendered) + self.assertIn('Unknown', rendered) + def test_element_name(self): tpl = Template('{% load forms %}{% radio label="hai" model="bai" element_name="onions"%}') rendered = tpl.render(Context({}))