mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-09 17:18:16 -06:00
Add deep merge for contexts
Using deepmerger config contexts are merged overriding everything but dicts.
This commit is contained in:
parent
7d1f6b7049
commit
5ad5856996
@ -1,6 +1,7 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from collections import OrderedDict
|
||||
from deepmerge import Merger
|
||||
from datetime import date
|
||||
|
||||
import graphviz
|
||||
@ -724,14 +725,24 @@ class ConfigContextModel(models.Model):
|
||||
Return the rendered configuration context for a device or VM.
|
||||
"""
|
||||
|
||||
# Create a merger overriding everithing but dicts to avoid merging array type configuration
|
||||
config_merger = Merger(
|
||||
[
|
||||
(list, ["override"]),
|
||||
(dict, ["merge"])
|
||||
],
|
||||
["override"],
|
||||
["override"]
|
||||
)
|
||||
|
||||
# Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs
|
||||
data = OrderedDict()
|
||||
data = {}
|
||||
for context in ConfigContext.objects.get_for_object(self):
|
||||
data.update(context.data)
|
||||
config_merger.merge(data, context.data)
|
||||
|
||||
# If the object has local config context data defined, that data overwrites all rendered data
|
||||
if self.local_context_data is not None:
|
||||
data.update(self.local_context_data)
|
||||
config_merger.merge(data, self.local_context_data)
|
||||
|
||||
return data
|
||||
|
||||
|
@ -20,4 +20,4 @@ psycopg2-binary==2.7.5
|
||||
py-gfm==0.1.3
|
||||
pycryptodome==3.6.4
|
||||
xmltodict==0.11.0
|
||||
|
||||
deepmerge==0.0.4
|
||||
|
Loading…
Reference in New Issue
Block a user