c001626b85
The custom field database model has changed in Netbox 2.7. Therefore the initializer code, that was used before, broke. As a user, you will need to update your custom_fields.yml file as follows: - type must be lowercase - the `selection` type was changed to `select` - the filter_logic must be lower case This is to achieve compatibility with the naming schema that Netbox uses internally. It allows us to become forward compatible in case Netbox ever introduces a new type for custom fields. See the diff of this commit for further information how this is meant.
60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
from extras.models import CustomField, CustomFieldChoice
|
|
|
|
from ruamel.yaml import YAML
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
def get_class_for_class_path(class_path):
|
|
import importlib
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
module_name, class_name = class_path.rsplit(".", 1)
|
|
module = importlib.import_module(module_name)
|
|
clazz = getattr(module, class_name)
|
|
return ContentType.objects.get_for_model(clazz)
|
|
|
|
file = Path('/opt/netbox/initializers/custom_fields.yml')
|
|
if not file.is_file():
|
|
sys.exit()
|
|
|
|
with file.open('r') as stream:
|
|
yaml = YAML(typ='safe')
|
|
customfields = yaml.load(stream)
|
|
|
|
if customfields is not None:
|
|
for cf_name, cf_details in customfields.items():
|
|
custom_field, created = CustomField.objects.get_or_create(name = cf_name)
|
|
|
|
if created:
|
|
if cf_details.get('default', 0):
|
|
custom_field.default = cf_details['default']
|
|
|
|
if cf_details.get('description', 0):
|
|
custom_field.description = cf_details['description']
|
|
|
|
if cf_details.get('label', 0):
|
|
custom_field.label = cf_details['label']
|
|
|
|
for object_type in cf_details.get('on_objects', []):
|
|
custom_field.obj_type.add(get_class_for_class_path(object_type))
|
|
|
|
if cf_details.get('required', 0):
|
|
custom_field.required = cf_details['required']
|
|
|
|
if cf_details.get('type', 0):
|
|
custom_field.type = cf_details['type']
|
|
|
|
if cf_details.get('weight', 0):
|
|
custom_field.weight = cf_details['weight']
|
|
|
|
custom_field.save()
|
|
|
|
for idx, choice_details in enumerate(cf_details.get('choices', [])):
|
|
choice, _ = CustomFieldChoice.objects.get_or_create(
|
|
field=custom_field,
|
|
value=choice_details['value'],
|
|
defaults={'weight': idx * 10}
|
|
)
|
|
|
|
print("🔧 Created custom field", cf_name)
|