Coverage for dcim/api/serializers_/power.py: 100%
30 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 dcim.choices import *
2from dcim.models import PowerFeed, PowerPanel
3from netbox.api.fields import ChoiceField, RelatedObjectCountField
4from netbox.api.serializers import PrimaryModelSerializer
5from tenancy.api.serializers_.tenants import TenantSerializer
7from .base import ConnectedEndpointsSerializer
8from .cables import CabledObjectSerializer
9from .racks import RackSerializer
10from .sites import LocationSerializer, SiteSerializer
12__all__ = (
13 'PowerFeedSerializer',
14 'PowerPanelSerializer',
15)
18class PowerPanelSerializer(PrimaryModelSerializer):
19 site = SiteSerializer(nested=True)
20 location = LocationSerializer(
21 nested=True,
22 required=False,
23 allow_null=True,
24 default=None
25 )
27 # Related object counts
28 powerfeed_count = RelatedObjectCountField('powerfeeds')
30 class Meta:
31 model = PowerPanel
32 fields = [
33 'id', 'url', 'display_url', 'display', 'site', 'location', 'name', 'description', 'owner', 'comments',
34 'tags', 'custom_fields', 'powerfeed_count', 'created', 'last_updated',
35 ]
36 brief_fields = ('id', 'url', 'display', 'name', 'description', 'powerfeed_count')
39class PowerFeedSerializer(PrimaryModelSerializer, CabledObjectSerializer, ConnectedEndpointsSerializer):
40 power_panel = PowerPanelSerializer(nested=True)
41 rack = RackSerializer(
42 nested=True,
43 required=False,
44 allow_null=True,
45 default=None
46 )
47 type = ChoiceField(
48 choices=PowerFeedTypeChoices,
49 default=lambda: PowerFeedTypeChoices.TYPE_PRIMARY,
50 )
51 status = ChoiceField(
52 choices=PowerFeedStatusChoices,
53 default=lambda: PowerFeedStatusChoices.STATUS_ACTIVE,
54 )
55 supply = ChoiceField(
56 choices=PowerFeedSupplyChoices,
57 default=lambda: PowerFeedSupplyChoices.SUPPLY_AC,
58 )
59 phase = ChoiceField(
60 choices=PowerFeedPhaseChoices,
61 default=lambda: PowerFeedPhaseChoices.PHASE_SINGLE,
62 )
63 tenant = TenantSerializer(
64 nested=True,
65 required=False,
66 allow_null=True
67 )
69 class Meta:
70 model = PowerFeed
71 fields = [
72 'id', 'url', 'display_url', 'display', 'power_panel', 'rack', 'name', 'status', 'type', 'supply',
73 'phase', 'voltage', 'amperage', 'max_utilization', 'mark_connected', 'cable', 'cable_end', 'link_peers',
74 'link_peers_type', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable',
75 'description', 'tenant', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
76 '_occupied',
77 ]
78 brief_fields = ('id', 'url', 'display', 'name', 'description', 'cable', '_occupied')