Преглед изворни кода

Adds hide-if-unset to custom field (#12723)

* adds hide-if-unset to custom field #12597

* moved hide logic from template to python

* fix indentation

* Update logic for omit_hidden under get_custom_fields()

* Update docs

* Account for False values

---------

Co-authored-by: jeremystretch <jstretch@netboxlabs.com>
Abhimanyu Saharan пре 2 година
родитељ
комит
d7ca453f26
3 измењених фајлова са 17 додато и 8 уклоњено
  1. 6 5
      docs/models/extras/customfield.md
  2. 2 0
      netbox/extras/choices.py
  3. 9 3
      netbox/netbox/models/features.py

+ 6 - 5
docs/models/extras/customfield.md

@@ -68,11 +68,12 @@ Defines how filters are evaluated against custom field values.
 
 
 Controls how and whether the custom field is displayed within the NetBox user interface.
 Controls how and whether the custom field is displayed within the NetBox user interface.
 
 
-| Option     | Description                          |
-|------------|--------------------------------------|
-| Read/write | Display and permit editing (default) |
-| Read-only  | Display field but disallow editing   |
-| Hidden     | Do not display field in the UI       |
+| Option            | Description                                      |
+|-------------------|--------------------------------------------------|
+| Read/write        | Display and permit editing (default)             |
+| Read-only         | Display field but disallow editing               |
+| Hidden            | Do not display field in the UI                   |
+| Hidden (if unset) | Display in the UI only when a value has been set |
 
 
 ### Default
 ### Default
 
 

+ 2 - 0
netbox/extras/choices.py

@@ -56,11 +56,13 @@ class CustomFieldVisibilityChoices(ChoiceSet):
     VISIBILITY_READ_WRITE = 'read-write'
     VISIBILITY_READ_WRITE = 'read-write'
     VISIBILITY_READ_ONLY = 'read-only'
     VISIBILITY_READ_ONLY = 'read-only'
     VISIBILITY_HIDDEN = 'hidden'
     VISIBILITY_HIDDEN = 'hidden'
+    VISIBILITY_HIDDEN_IFUNSET = 'hidden-ifunset'
 
 
     CHOICES = (
     CHOICES = (
         (VISIBILITY_READ_WRITE, 'Read/Write'),
         (VISIBILITY_READ_WRITE, 'Read/Write'),
         (VISIBILITY_READ_ONLY, 'Read-only'),
         (VISIBILITY_READ_ONLY, 'Read-only'),
         (VISIBILITY_HIDDEN, 'Hidden'),
         (VISIBILITY_HIDDEN, 'Hidden'),
+        (VISIBILITY_HIDDEN_IFUNSET, 'Hidden (if unset)'),
     )
     )
 
 
 
 

+ 9 - 3
netbox/netbox/models/features.py

@@ -197,11 +197,15 @@ class CustomFieldsMixin(models.Model):
         data = {}
         data = {}
 
 
         for field in CustomField.objects.get_for_model(self):
         for field in CustomField.objects.get_for_model(self):
+            value = self.custom_field_data.get(field.name)
+
             # Skip fields that are hidden if 'omit_hidden' is set
             # Skip fields that are hidden if 'omit_hidden' is set
-            if omit_hidden and field.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN:
-                continue
+            if omit_hidden:
+                if field.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN:
+                    continue
+                if field.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN_IFUNSET and not value:
+                    continue
 
 
-            value = self.custom_field_data.get(field.name)
             data[field] = field.deserialize(value)
             data[field] = field.deserialize(value)
 
 
         return data
         return data
@@ -227,6 +231,8 @@ class CustomFieldsMixin(models.Model):
 
 
         for cf in visible_custom_fields:
         for cf in visible_custom_fields:
             value = self.custom_field_data.get(cf.name)
             value = self.custom_field_data.get(cf.name)
+            if value in (None, []) and cf.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN_IFUNSET:
+                continue
             value = cf.deserialize(value)
             value = cf.deserialize(value)
             groups[cf.group_name][cf] = value
             groups[cf.group_name][cf] = value