Coverage for extras/api/serializers_/configtemplates.py: 100%

28 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django.utils.translation import gettext_lazy as _ 

2from drf_spectacular.extensions import OpenApiSerializerExtension 

3from rest_framework import serializers 

4 

5from core.api.serializers_.data import DataFileSerializer, DataSourceSerializer 

6from extras.models import ConfigTemplate 

7from netbox.api.serializers import ChangeLogMessageSerializer, ValidatedModelSerializer 

8from netbox.api.serializers.features import TaggableModelSerializer 

9from users.api.serializers_.mixins import OwnerMixin 

10 

11__all__ = ( 

12 'ConfigTemplateSerializer', 

13 'RenderConfigInputSerializer', 

14 'RenderedConfigSerializer', 

15) 

16 

17 

18class ConfigTemplateSerializer( 

19 OwnerMixin, 

20 ChangeLogMessageSerializer, 

21 TaggableModelSerializer, 

22 ValidatedModelSerializer 

23): 

24 data_source = DataSourceSerializer( 

25 nested=True, 

26 required=False 

27 ) 

28 data_file = DataFileSerializer( 

29 nested=True, 

30 required=False, 

31 allow_null=True 

32 ) 

33 

34 class Meta: 

35 model = ConfigTemplate 

36 fields = [ 

37 'id', 'url', 'display_url', 'display', 'name', 'description', 'environment_params', 'template_code', 

38 'mime_type', 'file_name', 'file_extension', 'as_attachment', 'debug', 'data_source', 'data_path', 

39 'data_file', 'auto_sync_enabled', 'data_synced', 'owner', 'tags', 'created', 'last_updated', 

40 ] 

41 brief_fields = ('id', 'url', 'display', 'name', 'description') 

42 model_clean_fields = ('data_source', 'data_path', 'auto_sync_enabled', 'data_synced', 'template_code') 

43 

44 

45class RenderConfigInputSerializer(serializers.Serializer): 

46 """ 

47 Describes the request body for the device/VM /render-config/ endpoints. Any additional keys 

48 supplied are passed through as context variables to the rendered template. 

49 """ 

50 config_template_id = serializers.IntegerField( 

51 required=False, 

52 help_text=_( 

53 "Optional ID of the ConfigTemplate to render. If omitted, the object's assigned " 

54 "config template is used." 

55 ) 

56 ) 

57 

58 

59class RenderConfigInputSerializerExtension(OpenApiSerializerExtension): 

60 """ 

61 Augment the schema for `RenderConfigInputSerializer` to advertise that additional keys 

62 (beyond `config_template_id`) are accepted and forwarded as template context variables. 

63 """ 

64 target_class = 'extras.api.serializers_.configtemplates.RenderConfigInputSerializer' 

65 

66 def map_serializer(self, auto_schema, direction): 

67 schema = auto_schema._map_serializer(self.target, direction, bypass_extensions=True) 

68 schema['additionalProperties'] = True 

69 return schema 

70 

71 

72class RenderedConfigSerializer(serializers.Serializer): 

73 """ 

74 Describes the JSON response returned by the /render-config/ and /render/ endpoints. 

75 """ 

76 configtemplate = ConfigTemplateSerializer(read_only=True, nested=True) 

77 content = serializers.CharField( 

78 read_only=True, 

79 help_text=_("The rendered template output.") 

80 )