1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

11933 saved filters clone of content-types and add m2m field cloning (#12014)

* 11933 saved filters clone of content-types and add m2m field cloning

* Fix JSON rendering

* Add content_types to CustomLink.clone()

---------

Co-authored-by: jeremystretch <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson
2023-03-28 06:53:57 -07:00
committed by GitHub
parent 879aabe2f9
commit 654e32cbbe
3 changed files with 12 additions and 7 deletions

View File

@ -1,6 +1,7 @@
import json
from django import forms from django import forms
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.http import QueryDict
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup
@ -128,11 +129,10 @@ class SavedFilterForm(BootstrapMixin, forms.ModelForm):
def __init__(self, *args, initial=None, **kwargs): def __init__(self, *args, initial=None, **kwargs):
# Convert any parameters delivered via initial data to a dictionary # Convert any parameters delivered via initial data to JSON data
if initial and 'parameters' in initial: if initial and 'parameters' in initial:
if type(initial['parameters']) is str: if type(initial['parameters']) is str:
# TODO: Make a utility function for this initial['parameters'] = json.loads(initial['parameters'])
initial['parameters'] = dict(QueryDict(initial['parameters']).lists())
super().__init__(*args, initial=initial, **kwargs) super().__init__(*args, initial=initial, **kwargs)

View File

@ -245,7 +245,7 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, WebhooksMixin, ChangeLogged
) )
clone_fields = ( clone_fields = (
'enabled', 'weight', 'group_name', 'button_class', 'new_window', 'content_types', 'enabled', 'weight', 'group_name', 'button_class', 'new_window',
) )
class Meta: class Meta:
@ -410,7 +410,7 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, WebhooksMixin, ChangeLogge
parameters = models.JSONField() parameters = models.JSONField()
clone_fields = ( clone_fields = (
'enabled', 'weight', 'content_types', 'weight', 'enabled', 'parameters',
) )
class Meta: class Meta:

View File

@ -1,3 +1,4 @@
import json
from collections import defaultdict from collections import defaultdict
from functools import cached_property from functools import cached_property
@ -111,7 +112,11 @@ class CloningMixin(models.Model):
for field_name in getattr(self, 'clone_fields', []): for field_name in getattr(self, 'clone_fields', []):
field = self._meta.get_field(field_name) field = self._meta.get_field(field_name)
field_value = field.value_from_object(self) field_value = field.value_from_object(self)
if field_value not in (None, ''): if field_value and isinstance(field, models.ManyToManyField):
attrs[field_name] = [v.pk for v in field_value]
elif field_value and isinstance(field, models.JSONField):
attrs[field_name] = json.dumps(field_value)
elif field_value not in (None, ''):
attrs[field_name] = field_value attrs[field_name] = field_value
# Include tags (if applicable) # Include tags (if applicable)