• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

openwisp / openwisp-monitoring / 21801692450

08 Feb 2026 04:44PM UTC coverage: 98.429% (-0.1%) from 98.561%
21801692450

Pull #738

github

web-flow
Merge 4e08f7c01 into 331fca2bf
Pull Request #738: [gsoc25] Add indoor maps, enhanced dashboard map UI, shareable URLs and real-time device position updates

3885 of 3947 relevant lines covered (98.43%)

10.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.63
openwisp_monitoring/device/api/serializers.py
1
from rest_framework import serializers
11✔
2
from swapper import load_model
11✔
3

4
from openwisp_controller.config.api.serializers import DeviceListSerializer
11✔
5
from openwisp_controller.geo.api.serializers import (
11✔
6
    GeoJsonLocationSerializer,
7
    IndoorCoordinatesSerializer,
8
    LocationDeviceSerializer,
9
)
10
from openwisp_users.api.mixins import FilterSerializerByOrgManaged
11✔
11

12
Device = load_model("config", "Device")
11✔
13
DeviceMonitoring = load_model("device_monitoring", "DeviceMonitoring")
11✔
14
DeviceData = load_model("device_monitoring", "DeviceData")
11✔
15
Device = load_model("config", "Device")
11✔
16
DeviceLocation = load_model("geo", "DeviceLocation")
11✔
17
WifiSession = load_model("device_monitoring", "WifiSession")
11✔
18
WifiClient = load_model("device_monitoring", "WifiClient")
11✔
19

20

21
class BaseDeviceMonitoringSerializer(serializers.ModelSerializer):
11✔
22
    class Meta:
11✔
23
        model = DeviceMonitoring
11✔
24
        fields = ("status",)
11✔
25

26

27
class DeviceMonitoringLocationSerializer(BaseDeviceMonitoringSerializer):
11✔
28
    status_label = serializers.SerializerMethodField()
11✔
29

30
    def get_status_label(self, obj):
11✔
31
        return obj.get_status_display()
11✔
32

33
    class Meta(BaseDeviceMonitoringSerializer.Meta):
11✔
34
        fields = BaseDeviceMonitoringSerializer.Meta.fields + ("status_label",)
11✔
35

36

37
class DeviceMonitoringSerializer(BaseDeviceMonitoringSerializer):
11✔
38
    related_metrics = serializers.SerializerMethodField()
11✔
39

40
    def get_related_metrics(self, obj):
11✔
41
        return obj.related_metrics.values("name", "is_healthy").order_by("name")
11✔
42

43
    class Meta(BaseDeviceMonitoringSerializer.Meta):
11✔
44
        fields = BaseDeviceMonitoringSerializer.Meta.fields + ("related_metrics",)
11✔
45

46

47
class MonitoringLocationDeviceSerializer(LocationDeviceSerializer):
11✔
48
    monitoring = DeviceMonitoringLocationSerializer()
11✔
49

50

51
class MonitoringIndoorCoordinatesSerializer(IndoorCoordinatesSerializer):
11✔
52
    monitoring = DeviceMonitoringLocationSerializer(
11✔
53
        source="content_object.monitoring", read_only=True
54
    )
55

56
    class Meta(IndoorCoordinatesSerializer.Meta):
11✔
57
        fields = IndoorCoordinatesSerializer.Meta.fields + ["monitoring"]
11✔
58

59

60
class MonitoringNearbyDeviceSerializer(
11✔
61
    FilterSerializerByOrgManaged, serializers.ModelSerializer
62
):
63
    monitoring_status = serializers.CharField(source="monitoring.status")
11✔
64
    distance = serializers.SerializerMethodField("get_distance")
11✔
65
    monitoring_data = serializers.SerializerMethodField("get_monitoring_data")
11✔
66

67
    class Meta(DeviceListSerializer.Meta):
11✔
68
        model = Device
11✔
69
        fields = [
11✔
70
            "id",
71
            "name",
72
            "organization",
73
            "group",
74
            "mac_address",
75
            "management_ip",
76
            "model",
77
            "os",
78
            "system",
79
            "notes",
80
            "distance",
81
            "monitoring_status",
82
            "monitoring_data",
83
        ]
84

85
    def get_distance(self, obj):
11✔
86
        return obj.distance.m
11✔
87

88
    def get_monitoring_data(self, obj):
11✔
89
        return DeviceData.objects.only("id").get(id=obj.id).data
11✔
90

91

92
class MonitoringDeviceListSerializer(DeviceListSerializer):
11✔
93
    monitoring = BaseDeviceMonitoringSerializer(read_only=True)
11✔
94

95
    def get_status(self, obj):
11✔
96
        return obj.get_status_display()
×
97

98
    class Meta:
11✔
99
        model = Device
11✔
100
        fields = [
11✔
101
            "id",
102
            "name",
103
            "organization",
104
            "group",
105
            "mac_address",
106
            "key",
107
            "last_ip",
108
            "management_ip",
109
            "model",
110
            "os",
111
            "system",
112
            "notes",
113
            "config",
114
            "monitoring",
115
            "created",
116
            "modified",
117
        ]
118

119

120
class MonitoringDeviceDetailSerializer(MonitoringDeviceListSerializer):
11✔
121
    monitoring = DeviceMonitoringSerializer(read_only=True)
11✔
122

123

124
class MonitoringGeoJsonLocationSerializer(GeoJsonLocationSerializer):
11✔
125
    ok_count = serializers.IntegerField()
11✔
126
    problem_count = serializers.IntegerField()
11✔
127
    critical_count = serializers.IntegerField()
11✔
128
    unknown_count = serializers.IntegerField()
11✔
129

130

131
class WifiClientSerializer(serializers.ModelSerializer):
11✔
132
    wifi6 = serializers.CharField(source="he", read_only=True)
11✔
133
    wifi5 = serializers.CharField(source="vht", read_only=True)
11✔
134
    wifi4 = serializers.CharField(source="ht", read_only=True)
11✔
135

136
    class Meta:
11✔
137
        model = WifiClient
11✔
138
        fields = [
11✔
139
            "mac_address",
140
            "vendor",
141
            "wifi6",
142
            "wifi5",
143
            "wifi4",
144
            "wmm",
145
            "wds",
146
            "wps",
147
        ]
148

149

150
class WifiSessionSerializer(serializers.ModelSerializer):
11✔
151
    client = WifiClientSerializer(source="wifi_client")
11✔
152
    organization = serializers.CharField(source="device.organization", read_only=True)
11✔
153
    device = serializers.CharField(source="device.name", read_only=True)
11✔
154

155
    class Meta:
11✔
156
        model = WifiSession
11✔
157
        fields = [
11✔
158
            "id",
159
            "organization",
160
            "device",
161
            "ssid",
162
            "interface_name",
163
            "client",
164
            "start_time",
165
            "stop_time",
166
            "modified",
167
        ]
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc