Przeglądaj źródła

8749 clone custom fields

Arthur 3 lat temu
rodzic
commit
f7150645a1

+ 1 - 1
netbox/extras/api/serializers.py

@@ -98,7 +98,7 @@ class CustomFieldSerializer(ValidatedModelSerializer):
         model = CustomField
         fields = [
             'id', 'url', 'display', 'content_types', 'type', 'object_type', 'data_type', 'name', 'label', 'group_name',
-            'description', 'required', 'search_weight', 'filter_logic', 'ui_visibility', 'default', 'weight',
+            'description', 'required', 'search_weight', 'filter_logic', 'ui_visibility', 'is_cloneable', 'default', 'weight',
             'validation_minimum', 'validation_maximum', 'validation_regex', 'choices', 'created', 'last_updated',
         ]
 

+ 4 - 0
netbox/extras/forms/bulk_edit.py

@@ -44,6 +44,10 @@ class CustomFieldBulkEditForm(BulkEditForm):
         required=False,
         initial=''
     )
+    is_cloneable = forms.NullBooleanField(
+        required=False,
+        widget=BulkEditNullBooleanSelect()
+    )
 
     nullable_fields = ('group_name', 'description',)
 

+ 1 - 1
netbox/extras/forms/bulk_import.py

@@ -51,7 +51,7 @@ class CustomFieldImportForm(CSVModelForm):
         fields = (
             'name', 'label', 'group_name', 'type', 'content_types', 'object_type', 'required', 'description',
             'search_weight', 'filter_logic', 'default', 'choices', 'weight', 'validation_minimum', 'validation_maximum',
-            'validation_regex', 'ui_visibility',
+            'validation_regex', 'ui_visibility', 'is_cloneable',
         )
 
 

+ 1 - 1
netbox/extras/forms/model_forms.py

@@ -47,7 +47,7 @@ class CustomFieldForm(BootstrapMixin, forms.ModelForm):
         ('Custom Field', (
             'content_types', 'name', 'label', 'group_name', 'type', 'object_type', 'required', 'description',
         )),
-        ('Behavior', ('search_weight', 'filter_logic', 'ui_visibility', 'weight')),
+        ('Behavior', ('search_weight', 'filter_logic', 'ui_visibility', 'is_cloneable', 'weight')),
         ('Values', ('default', 'choices')),
         ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')),
     )

+ 18 - 0
netbox/extras/migrations/0085_customfield_is_cloneable.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.1.2 on 2022-11-17 18:25
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('extras', '0084_staging'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='customfield',
+            name='is_cloneable',
+            field=models.BooleanField(default=False),
+        ),
+    ]

+ 6 - 1
netbox/extras/models/customfields.py

@@ -163,13 +163,18 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel):
         verbose_name='UI visibility',
         help_text=_('Specifies the visibility of custom field in the UI')
     )
+    is_cloneable = models.BooleanField(
+        default=False,
+        verbose_name='Cloneable',
+        help_text='If true, this field will be copied over when cloning objects.'
+    )
 
     objects = CustomFieldManager()
 
     clone_fields = (
         'content_types', 'type', 'object_type', 'group_name', 'description', 'required', 'search_weight',
         'filter_logic', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'choices',
-        'ui_visibility',
+        'ui_visibility', 'is_cloneable',
     )
 
     class Meta:

+ 1 - 1
netbox/extras/tables/tables.py

@@ -34,7 +34,7 @@ class CustomFieldTable(NetBoxTable):
         model = CustomField
         fields = (
             'pk', 'id', 'name', 'content_types', 'label', 'type', 'group_name', 'required', 'default', 'description',
-            'search_weight', 'filter_logic', 'ui_visibility', 'weight', 'choices', 'created', 'last_updated',
+            'search_weight', 'filter_logic', 'ui_visibility', 'is_cloneable', 'weight', 'choices', 'created', 'last_updated',
         )
         default_columns = ('pk', 'name', 'content_types', 'label', 'group_name', 'type', 'required', 'description')
 

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

@@ -121,6 +121,15 @@ class CloningMixin(models.Model):
         if is_taggable(self):
             attrs['tags'] = [tag.pk for tag in self.tags.all()]
 
+        # check custom fields
+        if hasattr(self, 'custom_field_data'):
+            from extras.models import CustomField
+
+            for field in CustomField.objects.get_for_model(self):
+                if field.is_cloneable:
+                    value = self.custom_field_data.get(field.name)
+                    attrs[f'cf_{field.name}'] = field.deserialize(value)
+
         return attrs
 
 

+ 4 - 0
netbox/templates/extras/customfield.html

@@ -60,6 +60,10 @@
             <th scope="row">UI Visibility</th>
             <td>{{ object.get_ui_visibility_display }}</td>
           </tr>
+          <tr>
+            <th scope="row">Cloneable</th>
+            <td>{% checkmark object.is_cloneable %}</td>
+          </tr>
         </table>
       </div>
     </div>