diff --git a/openwisp_radius/api/serializers.py b/openwisp_radius/api/serializers.py index b9b01165..ca018bb9 100644 --- a/openwisp_radius/api/serializers.py +++ b/openwisp_radius/api/serializers.py @@ -300,10 +300,11 @@ class Meta: class UserGroupCheckSerializer(serializers.ModelSerializer): result = serializers.SerializerMethodField() type = serializers.SerializerMethodField() + reset = serializers.SerializerMethodField() class Meta: model = RadiusGroupCheck - fields = ("attribute", "op", "value", "result", "type") + fields = ("attribute", "op", "value", "result", "type", "reset") def get_result(self, obj): try: @@ -329,6 +330,19 @@ def get_type(self, obj): else: return counter.get_attribute_type() + def get_reset(self, obj): + try: + Counter = app_settings.CHECK_ATTRIBUTE_COUNTERS_MAP[obj.attribute] + counter = Counter( + user=self.context["user"], + group=self.context["group"], + group_check=obj, + ) + _, end_time = counter.get_reset_timestamps() + return end_time + except (SkipCheck, ValueError, KeyError): + return None + class UserRadiusUsageSerializer(serializers.Serializer): def to_representation(self, obj): diff --git a/openwisp_radius/tests/test_api/test_api.py b/openwisp_radius/tests/test_api/test_api.py index d0a6f3d5..1ca94d14 100644 --- a/openwisp_radius/tests/test_api/test_api.py +++ b/openwisp_radius/tests/test_api/test_api.py @@ -1073,6 +1073,7 @@ def test_user_group_check_serializer_counter_does_not_exist(self): "result": None, "type": None, "value": "2000000000", + "reset": None, }, ) @@ -1581,6 +1582,7 @@ def test_user_radius_usage_view(self): "value": "10800", "result": 0, "type": "seconds", + "reset": checks[0]["reset"], }, ) self.assertDictEqual( @@ -1591,6 +1593,7 @@ def test_user_radius_usage_view(self): "value": "3000000000", "result": 0, "type": "bytes", + "reset": checks[1]["reset"], }, ) @@ -1622,6 +1625,7 @@ def test_user_radius_usage_view(self): "value": "10800", "result": 261, "type": "seconds", + "reset": checks[0]["reset"], }, ) self.assertDictEqual( @@ -1632,6 +1636,7 @@ def test_user_radius_usage_view(self): "value": "3000000000", "result": 2000000000, "type": "bytes", + "reset": checks[1]["reset"], }, ) @@ -1660,6 +1665,7 @@ def test_user_radius_usage_view(self): "value": "10800", "result": 522, "type": "seconds", + "reset": checks[0]["reset"], }, ) self.assertDictEqual( @@ -1670,6 +1676,7 @@ def test_user_radius_usage_view(self): "value": "3000000000", "result": 3000000000, "type": "bytes", + "reset": checks[1]["reset"], }, ) @@ -1698,6 +1705,7 @@ def test_user_radius_usage_view(self): "value": "10800", "result": 783, "type": "seconds", + "reset": checks[0]["reset"], }, ) self.assertDictEqual( @@ -1708,6 +1716,7 @@ def test_user_radius_usage_view(self): "value": "3000000000", "result": 3000000000, "type": "bytes", + "reset": checks[1]["reset"], }, ) @@ -1734,6 +1743,7 @@ def test_user_group_check_serializer_counter_does_not_exist(self): "result": None, "type": None, "value": "2000000000", + "reset": None, }, )