Coverage for netbox/utils.py: 85%
22 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from netbox.registry import registry
2from utilities.choices import Choice
4__all__ = (
5 'get_data_backend_choices',
6 'register_data_backend',
7 'register_model_feature',
8 'register_request_processor',
9)
12def get_data_backend_choices():
13 return [
14 (None, '---------'),
15 *[
16 Choice(name, cls.label) for name, cls in registry['data_backends'].items()
17 ]
18 ]
21def register_data_backend():
22 """
23 Decorator for registering a DataBackend class.
24 """
25 def _wrapper(cls):
26 registry['data_backends'][cls.name] = cls
27 return cls
29 return _wrapper
32def register_model_feature(name, func=None):
33 """
34 Register a model feature with its qualifying function.
36 The qualifying function must accept a single `model` argument. It will be called to determine whether the given
37 model supports the corresponding feature.
39 This function can be used directly:
41 register_model_feature('my_feature', my_func)
43 Or as a decorator:
45 @register_model_feature('my_feature')
46 def my_func(model):
47 ...
48 """
49 def decorator(f):
50 registry['model_features'][name] = f
51 return f
53 if name in registry['model_features']: 53 ↛ 54line 53 didn't jump to line 54 because the condition on line 53 was never true
54 raise ValueError(f"A model feature named {name} is already registered.")
56 if func is None: 56 ↛ 57line 56 didn't jump to line 57 because the condition on line 56 was never true
57 return decorator
58 return decorator(func)
61def register_request_processor(func):
62 """
63 Decorator for registering a request processor.
64 """
65 registry['request_processors'].append(func)
67 return func