From 16a53dadc0f8cde6d805173339f28fba082e48ca Mon Sep 17 00:00:00 2001 From: Arkadiusz Hiler Date: Tue, 23 Jun 2020 15:04:47 +0300 Subject: [PATCH] api: Add endpoint returning current server time To be used with the recently added event 'until' filtering. Signed-off-by: Arkadiusz Hiler --- docs/rest.rst | 19 +++++++++++++++++++ patchwork/tests/test_rest.py | 10 ++++++++++ patchwork/urls.py | 1 + patchwork/views/api.py | 8 +++++++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/rest.rst b/docs/rest.rst index c432e01..9721f19 100644 --- a/docs/rest.rst +++ b/docs/rest.rst @@ -90,6 +90,25 @@ API Metadata The list of API revisions and the changes introduced by each of them is documented in `API Revisions`_. +Current Server Time +~~~~~~~~~~~~~~~~~~~ + +.. http:get:: /api/1.0/now + + Current server time. + + .. sourcecode:: http + + GET /api/1.0/now HTTP/1.1 + Accept: application/json + + + .. sourcecode:: http + + HTTP/1.1 200 OK + Vary: Accept + Content-Type: application/json + "2020-06-23T15:02:39.640818" Projects ~~~~~~~~ diff --git a/patchwork/tests/test_rest.py b/patchwork/tests/test_rest.py index 5da27a6..fc711c2 100644 --- a/patchwork/tests/test_rest.py +++ b/patchwork/tests/test_rest.py @@ -1176,3 +1176,13 @@ class AccessControlAllowOriginTest(APITestBase): def testPost(self): response = self.client.post('/api/1.0') self.assertTrue('Access-Control-Allow-Origin' not in response) + + +class TestServerTimeApiEndpoint(APITestBase): + def testNow(self): + before = datetime.datetime.now() + now = datetime.datetime.fromisoformat(self.get_json('/now')) + after = datetime.datetime.now() + + self.assertTrue(before <= now) + self.assertTrue(after >= now) diff --git a/patchwork/urls.py b/patchwork/urls.py index e231b1c..dce8d84 100644 --- a/patchwork/urls.py +++ b/patchwork/urls.py @@ -85,6 +85,7 @@ urlpatterns = [ # API url(r'^api/1.0/$', api.API.as_view(), name='api-root'), + url(r'^api/1.0/now$', api.now), url(r'^api/1.0/', include(project_router.urls)), url(r'^api/1.0/', include(patches_list_router.urls)), url(r'^api/1.0/', include(series_list_router.urls)), diff --git a/patchwork/views/api.py b/patchwork/views/api.py index 606b559..328541c 100644 --- a/patchwork/views/api.py +++ b/patchwork/views/api.py @@ -23,7 +23,7 @@ from django.core.exceptions import FieldDoesNotExist, PermissionDenied from django.conf import settings from django.core import mail from django.db.models import Q -from django.http import HttpResponse, HttpResponseNotFound +from django.http import HttpResponse, HttpResponseNotFound, JsonResponse from patchwork.tasks import send_reviewer_notification from patchwork.models import (Project, Series, SeriesRevision, Patch, EventLog, State, Test, TestResult, TestState, Person, @@ -44,12 +44,18 @@ from patchwork.permissions import Can from patchwork.utils import group from django_filters.rest_framework import DjangoFilterBackend +from datetime import datetime + import django_filters API_REVISION = 4 +def now(request): + return JsonResponse(datetime.now().isoformat(), safe=False) + + class RelatedOrderingFilter(filters.OrderingFilter): """ Extends OrderingFilter to support ordering by fields in related models. -- GitLab