mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
* WIP * Convert checkout() context manager to a class * Misc cleanup * Drop unique constraint from Change model * Extend staging tests * Misc cleanup * Incorporate M2M changes * Don't cancel wipe out creation records when an object is deleted * Rename Change to StagedChange * Add documentation for change staging
This commit is contained in:
@ -6,7 +6,8 @@ from decimal import Decimal
|
||||
from itertools import count, groupby
|
||||
|
||||
import bleach
|
||||
from django.core.serializers import serialize
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.core import serializers
|
||||
from django.db.models import Count, OuterRef, Subquery
|
||||
from django.db.models.functions import Coalesce
|
||||
from django.http import QueryDict
|
||||
@ -135,14 +136,14 @@ def count_related(model, field):
|
||||
return Coalesce(subquery, 0)
|
||||
|
||||
|
||||
def serialize_object(obj, extra=None):
|
||||
def serialize_object(obj, resolve_tags=True, extra=None):
|
||||
"""
|
||||
Return a generic JSON representation of an object using Django's built-in serializer. (This is used for things like
|
||||
change logging, not the REST API.) Optionally include a dictionary to supplement the object data. A list of keys
|
||||
can be provided to exclude them from the returned dictionary. Private fields (prefaced with an underscore) are
|
||||
implicitly excluded.
|
||||
"""
|
||||
json_str = serialize('json', [obj])
|
||||
json_str = serializers.serialize('json', [obj])
|
||||
data = json.loads(json_str)[0]['fields']
|
||||
|
||||
# Exclude any MPTTModel fields
|
||||
@ -154,8 +155,9 @@ def serialize_object(obj, extra=None):
|
||||
if hasattr(obj, 'custom_field_data'):
|
||||
data['custom_fields'] = data.pop('custom_field_data')
|
||||
|
||||
# Include any tags. Check for tags cached on the instance; fall back to using the manager.
|
||||
if is_taggable(obj):
|
||||
# Resolve any assigned tags to their names. Check for tags cached on the instance;
|
||||
# fall back to using the manager.
|
||||
if resolve_tags and is_taggable(obj):
|
||||
tags = getattr(obj, '_tags', None) or obj.tags.all()
|
||||
data['tags'] = sorted([tag.name for tag in tags])
|
||||
|
||||
@ -172,6 +174,24 @@ def serialize_object(obj, extra=None):
|
||||
return data
|
||||
|
||||
|
||||
def deserialize_object(model, fields, pk=None):
|
||||
"""
|
||||
Instantiate an object from the given model and field data. Functions as
|
||||
the complement to serialize_object().
|
||||
"""
|
||||
content_type = ContentType.objects.get_for_model(model)
|
||||
if 'custom_fields' in fields:
|
||||
fields['custom_field_data'] = fields.pop('custom_fields')
|
||||
data = {
|
||||
'model': '.'.join(content_type.natural_key()),
|
||||
'pk': pk,
|
||||
'fields': fields,
|
||||
}
|
||||
instance = list(serializers.deserialize('python', [data]))[0]
|
||||
|
||||
return instance
|
||||
|
||||
|
||||
def dict_to_filter_params(d, prefix=''):
|
||||
"""
|
||||
Translate a dictionary of attributes to a nested set of parameters suitable for QuerySet filtering. For example:
|
||||
|
Reference in New Issue
Block a user