mirror of https://github.com/snachodog/mybuddy.git
Add timer restart and stop triggers
Restarting and stopping timers from the API was not allowed. This commit adds api/timer/{id}/[stop|restart]/ triggers that can be posted to through the REST-API to start/stop timers. Signed-off-by: Paul Konstantin Gerke <paulkgerke@craftware.info>
This commit is contained in:
parent
319ae220fe
commit
cf58ae6aba
28
api/tests.py
28
api/tests.py
|
@ -398,6 +398,34 @@ class TimerAPITestCase(TestBase.BabyBuddyAPITestCaseBase):
|
||||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
self.assertEqual(response.data, entry)
|
self.assertEqual(response.data, entry)
|
||||||
|
|
||||||
|
def test_start_stop_timer(self):
|
||||||
|
endpoint = '{}{}/'.format(self.endpoint, 1)
|
||||||
|
response = self.client.get(endpoint)
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertFalse(response.data["active"])
|
||||||
|
|
||||||
|
response = self.client.post(f"{endpoint}restart/")
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
response = self.client.get(endpoint)
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertTrue(response.data["active"])
|
||||||
|
|
||||||
|
# Restart twice fails
|
||||||
|
response = self.client.post(f"{endpoint}restart/")
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_412_PRECONDITION_FAILED)
|
||||||
|
|
||||||
|
response = self.client.post(f"{endpoint}stop/")
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
|
||||||
|
response = self.client.get(endpoint)
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||||
|
self.assertFalse(response.data["active"])
|
||||||
|
|
||||||
|
# Stopping twice fails
|
||||||
|
response = self.client.post(f"{endpoint}stop/")
|
||||||
|
self.assertEqual(response.status_code, status.HTTP_412_PRECONDITION_FAILED)
|
||||||
|
|
||||||
|
|
||||||
class TummyTimeAPITestCase(TestBase.BabyBuddyAPITestCaseBase):
|
class TummyTimeAPITestCase(TestBase.BabyBuddyAPITestCaseBase):
|
||||||
endpoint = reverse('api:tummytime-list')
|
endpoint = reverse('api:tummytime-list')
|
||||||
|
|
38
api/views.py
38
api/views.py
|
@ -1,5 +1,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets, status
|
||||||
|
from rest_framework.decorators import action
|
||||||
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from core import models
|
from core import models
|
||||||
|
|
||||||
|
@ -49,6 +51,40 @@ class TimerViewSet(viewsets.ModelViewSet):
|
||||||
serializer_class = serializers.TimerSerializer
|
serializer_class = serializers.TimerSerializer
|
||||||
filterset_class = filters.TimerFilter
|
filterset_class = filters.TimerFilter
|
||||||
|
|
||||||
|
def __timer_operation(self, pk, func):
|
||||||
|
try:
|
||||||
|
timer = models.Timer.objects.get(pk=pk)
|
||||||
|
return func(timer)
|
||||||
|
except models.Timer.DoesNotExist:
|
||||||
|
return Response(
|
||||||
|
{"detail": "timer does not exist"},
|
||||||
|
status=status.HTTP_404_NOT_FOUND
|
||||||
|
)
|
||||||
|
|
||||||
|
@action(detail=True, methods=['post'])
|
||||||
|
def stop(self, request, pk=None):
|
||||||
|
def do_stop(timer):
|
||||||
|
if not timer.active:
|
||||||
|
return Response(
|
||||||
|
{"detail": "timer already stopped"},
|
||||||
|
status=status.HTTP_412_PRECONDITION_FAILED
|
||||||
|
)
|
||||||
|
timer.stop()
|
||||||
|
return Response({"detail": "timer stopped"})
|
||||||
|
return self.__timer_operation(pk, do_stop)
|
||||||
|
|
||||||
|
@action(detail=True, methods=['post'])
|
||||||
|
def restart(self, request, pk=None):
|
||||||
|
def do_restart(timer):
|
||||||
|
if timer.active:
|
||||||
|
return Response(
|
||||||
|
{"detail": "timer already active"},
|
||||||
|
status=status.HTTP_412_PRECONDITION_FAILED
|
||||||
|
)
|
||||||
|
timer.restart()
|
||||||
|
return Response({"detail": "timer restarted"})
|
||||||
|
return self.__timer_operation(pk, do_restart)
|
||||||
|
|
||||||
|
|
||||||
class TummyTimeViewSet(TimerFieldSupportMixin, viewsets.ModelViewSet):
|
class TummyTimeViewSet(TimerFieldSupportMixin, viewsets.ModelViewSet):
|
||||||
queryset = models.TummyTime.objects.all()
|
queryset = models.TummyTime.objects.all()
|
||||||
|
|
Loading…
Reference in New Issue