Skip to content

Commit

Permalink
Merge 325aa85 into 7189378
Browse files Browse the repository at this point in the history
  • Loading branch information
Aryamanz29 committed May 25, 2023
2 parents 7189378 + 325aa85 commit 0f3e765
Show file tree
Hide file tree
Showing 9 changed files with 477 additions and 5 deletions.
57 changes: 57 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2586,6 +2586,63 @@ and sending of data by the OpenWISP Monitoring Agent
<https://github.com/openwisp/openwrt-openwisp-monitoring#collecting-vs-sending>`_,
this feature allows sending data collected while the device is offline.

List wifi session
#################

.. code-block:: text
GET /api/v1/monitoring/wifi-session/
**Available filters**

The list of wifi session provides the following filters:

- ``device__organization`` (Organization ID of the device)
- ``device`` (Device ID)
- ``device__group`` (Device group ID)
- ``start_time`` (Start time of the wifi session)
- ``stop_time`` (Stop time of the wifi session)

Here's a few examples:

.. code-block:: text
GET /api/v1/monitoring/wifi-session/?device__organization={organization_id}
GET /api/v1/monitoring/wifi-session/?device={device_id}
GET /api/v1/monitoring/wifi-session/?device__group={group_id}
GET /api/v1/monitoring/wifi-session/?start_time={stop_time}
GET /api/v1/monitoring/wifi-session/?stop_time={stop_time}
**Note:** Both `start_time` and `stop_time` support
greater than or equal to, as well as less than or equal to, filter lookups.

For example:

.. code-block:: text
GET /api/v1/monitoring/wifi-session/?start_time__gt={start_time}
GET /api/v1/monitoring/wifi-session/?start_time__gte={start_time}
GET /api/v1/monitoring/wifi-session/?stop_time__lt={stop_time}
GET /api/v1/monitoring/wifi-session/?stop_time__lte={stop_time}
Get wifi session
################

.. code-block:: text
GET /api/v1/monitoring/wifi-session/{id}/
Pagination
##########

Wifi session endpoint support the ``page_size`` parameter
that allows paginating the results in conjunction with the page parameter.

.. code-block:: text
GET /api/v1/monitoring/wifi-session/?page_size=10
GET /api/v1/monitoring/wifi-session/?page_size=10&page=1
Signals
-------

Expand Down
18 changes: 17 additions & 1 deletion openwisp_monitoring/device/api/filters.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,24 @@
from swapper import load_model

from openwisp_users.api.filters import OrganizationManagedFilter
from openwisp_users.api.filters import (
FilterDjangoByOrgManaged,
OrganizationManagedFilter,
)

Device = load_model('config', 'Device')
WifiSession = load_model('device_monitoring', 'WifiSession')


class WifiSessionFilter(FilterDjangoByOrgManaged):
class Meta:
model = WifiSession
fields = {
'device__organization': ['exact'],
'device': ['exact'],
'device__group': ['exact'],
'start_time': ['exact', 'gt', 'gte', 'lt', 'lte'],
'stop_time': ['exact', 'gt', 'gte', 'lt', 'lte'],
}


class MonitoringDeviceFilter(OrganizationManagedFilter):
Expand Down
66 changes: 66 additions & 0 deletions openwisp_monitoring/device/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@

Device = load_model('config', 'Device')
DeviceMonitoring = load_model('device_monitoring', 'DeviceMonitoring')
Device = load_model('config', 'Device')
WifiSession = load_model('device_monitoring', 'WifiSession')
WifiClient = load_model('device_monitoring', 'WifiClient')


class BaseDeviceMonitoringSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -78,3 +81,66 @@ class MonitoringGeoJsonLocationSerializer(GeoJsonLocationSerializer):
problem_count = serializers.IntegerField()
critical_count = serializers.IntegerField()
unknown_count = serializers.IntegerField()


class WifiClientSerializer(serializers.ModelSerializer):
wifi6 = serializers.CharField(source='he', read_only=True)
wifi5 = serializers.CharField(source='vht', read_only=True)
wifi4 = serializers.CharField(source='ht', read_only=True)

class Meta:
model = WifiClient
fields = [
'mac_address',
'vendor',
'wifi6',
'wifi5',
'wifi4',
'wmm',
'wds',
'wps',
]


class WifiSessionListSerializer(serializers.ModelSerializer):
organization = serializers.CharField(source='device.organization', read_only=True)
device = serializers.CharField(source='device.name', read_only=True)
wifi6 = serializers.CharField(source='wifi_client.he', read_only=True)
wifi5 = serializers.CharField(source='wifi_client.vht', read_only=True)
wifi4 = serializers.CharField(source='wifi_client.ht', read_only=True)

class Meta:
model = WifiSession
fields = [
'id',
'mac_address',
'vendor',
'organization',
'device',
'ssid',
'wifi6',
'wifi5',
'wifi4',
'start_time',
'stop_time',
]


class WifiSessionDetailSerializer(serializers.ModelSerializer):
client = WifiClientSerializer(source='wifi_client')
organization = serializers.CharField(source='device.organization', read_only=True)
device = serializers.CharField(source='device.name', read_only=True)

class Meta:
model = WifiSession
fields = [
'id',
'organization',
'device',
'ssid',
'interface_name',
'client',
'start_time',
'stop_time',
'modified',
]
10 changes: 10 additions & 0 deletions openwisp_monitoring/device/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,14 @@
views.monitoring_location_device_list,
name='api_location_device_list',
),
path(
'api/v1/monitoring/wifi-session/',
views.wifi_session_list,
name='api_wifi_session_list',
),
re_path(
r'^api/v1/monitoring/wifi-session/(?P<pk>[^/]+)/$',
views.wifi_session_detail,
name='api_wifi_session_detail',
),
]
43 changes: 40 additions & 3 deletions openwisp_monitoring/device/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from django.utils.translation import gettext_lazy as _
from django_filters.rest_framework import DjangoFilterBackend
from pytz import UTC
from rest_framework import serializers, status
from rest_framework.generics import GenericAPIView
from rest_framework import pagination, serializers, status
from rest_framework.generics import GenericAPIView, ListAPIView, RetrieveAPIView
from rest_framework.permissions import SAFE_METHODS
from rest_framework.response import Response
from swapper import load_model
Expand All @@ -22,17 +22,20 @@
LocationDeviceList,
ProtectedAPIMixin,
)
from openwisp_users.api.mixins import FilterByOrganizationManaged

from ...views import MonitoringApiViewMixin
from ..schema import schema
from ..signals import device_metrics_received
from ..tasks import write_device_metrics
from .filters import MonitoringDeviceFilter
from .filters import MonitoringDeviceFilter, WifiSessionFilter
from .serializers import (
MonitoringDeviceDetailSerializer,
MonitoringDeviceListSerializer,
MonitoringGeoJsonLocationSerializer,
MonitoringLocationDeviceSerializer,
WifiSessionDetailSerializer,
WifiSessionListSerializer,
)

logger = logging.getLogger(__name__)
Expand All @@ -43,6 +46,13 @@
DeviceMonitoring = load_model('device_monitoring', 'DeviceMonitoring')
DeviceData = load_model('device_monitoring', 'DeviceData')
Location = load_model('geo', 'Location')
WifiSession = load_model('device_monitoring', 'WifiSession')


class ListViewPagination(pagination.PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 100


class DeviceMetricView(MonitoringApiViewMixin, GenericAPIView):
Expand Down Expand Up @@ -202,3 +212,30 @@ def get_queryset(self):


monitoring_device_list = MonitoringDeviceList.as_view()


class WifiSessionListView(ProtectedAPIMixin, FilterByOrganizationManaged, ListAPIView):
queryset = WifiSession.objects.select_related(
'device', 'wifi_client', 'device__organization', 'device__group'
)
organization_field = 'device__organization'
filter_backends = [DjangoFilterBackend]
pagination_class = ListViewPagination
filterset_class = WifiSessionFilter
serializer_class = WifiSessionListSerializer


wifi_session_list = WifiSessionListView.as_view()


class WifiSessionDetailView(
ProtectedAPIMixin, FilterByOrganizationManaged, RetrieveAPIView
):
queryset = WifiSession.objects.select_related(
'device', 'wifi_client', 'device__organization'
)
organization_field = 'device__organization'
serializer_class = WifiSessionDetailSerializer


wifi_session_detail = WifiSessionDetailView.as_view()
1 change: 1 addition & 0 deletions openwisp_monitoring/device/base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ class AbstractWifiClient(TimeStampedEditableModel):
class Meta:
abstract = True
verbose_name = _('WiFi Client')
ordering = ('-created',)


class AbstractWifiSession(TimeStampedEditableModel):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.0.4 on 2022-06-03 11:36

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('device_monitoring', '0007_add_wificlient_field_he'),
]

operations = [
migrations.AlterModelOptions(
name='wificlient',
options={'ordering': ('-created',), 'verbose_name': 'WiFi Client'},
),
]
Loading

0 comments on commit 0f3e765

Please sign in to comment.