From 74b75a15208d8e5aeab73c3193f1e510368d44c7 Mon Sep 17 00:00:00 2001
From: "alexander.pace@ligo.org" <alexander.pace@ligo.org>
Date: Fri, 14 Feb 2020 15:38:48 -0600
Subject: [PATCH] attempt #2 at turning off api caching

---
 gracedb/api/urls.py                | 34 +-------------
 gracedb/api/v1/events/urls.py      | 46 ++++++++++---------
 gracedb/api/v1/superevents/urls.py | 73 +++++++++++++++---------------
 gracedb/api/v1/urls.py             | 11 +++--
 4 files changed, 70 insertions(+), 94 deletions(-)

diff --git a/gracedb/api/urls.py b/gracedb/api/urls.py
index 52c71f792..d445b6b75 100644
--- a/gracedb/api/urls.py
+++ b/gracedb/api/urls.py
@@ -1,42 +1,12 @@
 from django.conf.urls import url, include
-# Test to disable caching on the /api/ part of the site. 
-# From django-snippets:
-# https://djangosnippets.org/snippets/355/ 
 
-from django.views.decorators.cache import never_cache
 from .v1 import urls as v1_urls
 from .v2 import urls as v2_urls
 
 app_name = 'api'
 
-def never_cache_patterns(prefix, *args):
-    raise ValueError(prefix,args)
-    pattern_list = [], tterns,
-    for t in args:
-        if isinstance(t, (list, tuple)): 
-            t = url(prefix=prefix, *t)
-        elif isinstance(t, RegexURLPattern):
-            t.add_prefix(prefix)
-    
-        t._callback = never_cache(t.callback)
-        pattern_list.append(t)
-
-    return pattern_list
-
-#urlpatterns = [
-#    url(r'^', include((never_cache(v1_urls), 'default'))),
-#    url(r'^v1/', include((never_cache(v1_urls), 'v1'))),
-#    url(r'^v2/', include((never_cache(v2_urls), 'v2'))),
-#]
-
-#urlpatterns = [
-#    url(r'^', include((v1_urls, 'default'))),
-#    url(r'^v1/', include((v1_urls, 'v1'))),
-#    url(r'^v2/', include((v2_urls, 'v2'))),
-#]
-
 urlpatterns = [
     url(r'^', include((v1_urls, 'default'))),
-    url(r'^v1/', never_cache(include((v1_urls, 'v1')))),
-    url(r'^v2/', never_cache(include((v2_urls, 'v2')))),
+    url(r'^v1/', include((v1_urls, 'v1'))),
+    url(r'^v2/', include((v2_urls, 'v2'))),
 ]
diff --git a/gracedb/api/v1/events/urls.py b/gracedb/api/v1/events/urls.py
index 4bb80dd44..da6a75026 100644
--- a/gracedb/api/v1/events/urls.py
+++ b/gracedb/api/v1/events/urls.py
@@ -1,4 +1,6 @@
 from django.conf.urls import url, include
+# Turn off api caching:
+from django.views.decorators.cache import never_cache
 
 from .views import * 
 
@@ -6,76 +8,76 @@ from .views import *
 urlpatterns = [
     # Event Resources
     # events/[{graceid}[/{version}]]
-    url(r'^$', EventList.as_view(), name='event-list'),
-    url(r'^(?P<graceid>[GEHMT]\d+)$', EventDetail.as_view(),
+    url(r'^$', never_cache(EventList.as_view()), name='event-list'),
+    url(r'^(?P<graceid>[GEHMT]\d+)$', never_cache(EventDetail.as_view()),
         name='event-detail'),
     url(r'^(?P<graceid>[GEHMT]\d+)/update-grbevent/$',
-        GrbEventPatchView.as_view(), name='update-grbevent'),
+        never_cache(GrbEventPatchView.as_view()), name='update-grbevent'),
 
     # Event Log Resources
     # events/{graceid}/logs/[{logid}]
-    url(r'^(?P<graceid>[GEHMT]\d+)/log/$', EventLogList.as_view(),
+    url(r'^(?P<graceid>[GEHMT]\d+)/log/$', never_cache(EventLogList.as_view()),
         name='eventlog-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/log/(?P<n>\d+)$',
-        EventLogDetail.as_view(), name='eventlog-detail'),
+        never_cache(EventLogDetail.as_view()), name='eventlog-detail'),
 
     # VOEvent Resources
     # events/{graceid}/voevent/[{serial_number}]
-    url(r'^(?P<graceid>[GEHMT]\d+)/voevent/$', VOEventList.as_view(),
+    url(r'^(?P<graceid>[GEHMT]\d+)/voevent/$', never_cache(VOEventList.as_view()),
         name='voevent-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/voevent/(?P<n>\d+)$',
-        VOEventDetail.as_view(), name='voevent-detail'),
+        never_cache(VOEventDetail.as_view()), name='voevent-detail'),
 
     # EMBB Resources
     # events/{graceid}/logs/[{logid}]
-    url(r'^(?P<graceid>[GEHMT]\d+)/embb/$', EMBBEventLogList.as_view(),
+    url(r'^(?P<graceid>[GEHMT]\d+)/embb/$', never_cache(EMBBEventLogList.as_view()),
         name='embbeventlog-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/embb/(?P<n>\d+)$',
-        EMBBEventLogDetail.as_view(), name='embbeventlog-detail'),
+        never_cache(EMBBEventLogDetail.as_view()), name='embbeventlog-detail'),
     url(r'^(?P<graceid>[GEHMT]\d+)/emobservation/$',
-        EMObservationList.as_view(), name='emobservation-list'),
+        never_cache(EMObservationList.as_view()), name='emobservation-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/emobservation/(?P<n>\d+)$',
-        EMObservationDetail.as_view(), name='emobservation-detail'),
+        never_cache(EMObservationDetail.as_view()), name='emobservation-detail'),
 #    url(r'(?P<graceid>[GEHMT]\d+)/emobservation/(?P<n>\d+)/emfootprint/$',
 #        EMFootprintList.as_view(), name='emfootprint-list'),
 #    url(r'(?P<graceid>[GEHMT]\d+)/emobservation/(?P<n>\d+)/emfootprint/(?P<m>\d+)$',
 #        EMFootprintDetail.as_view(), name='emfootprint-detail'),
 
     # Tag Resources
-    url(r'^(?P<graceid>[GEHMT]\d+)/tag/$', EventTagList.as_view(),
+    url(r'^(?P<graceid>[GEHMT]\d+)/tag/$', never_cache(EventTagList.as_view()),
         name='eventtag-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/tag/(?P<tagname>.+)$',
-        EventTagDetail.as_view(), name='eventtag-detail'),
+        never_cache(EventTagDetail.as_view()), name='eventtag-detail'),
     url(r'^(?P<graceid>[GEHMT]\d+)/log/(?P<n>\d+)/tag/$',
-        EventLogTagList.as_view(), name='eventlogtag-list'),
+        never_cache(EventLogTagList.as_view()), name='eventlogtag-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/log/(?P<n>\d+)/tag/(?P<tagname>.+)$',
-        EventLogTagDetail.as_view(), name='eventlogtag-detail'),
+        never_cache(EventLogTagDetail.as_view()), name='eventlogtag-detail'),
 
     # Permission Resources
     url(r'^(?P<graceid>[GEHMT]\d+)/perms/$',
-        EventPermissionList.as_view(), name='eventpermission-list'),
+        never_cache(EventPermissionList.as_view()), name='eventpermission-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/perms/(?P<group_name>.+)/$', 
-        GroupEventPermissionList.as_view(), name='groupeventpermission-list'),
+        never_cache(GroupEventPermissionList.as_view()), name='groupeventpermission-list'),
     url(r'^(?P<graceid>[GEHMT]\d+)/perms/(?P<group_name>.+)/(?P<perm_shortname>\w+)$', 
-        GroupEventPermissionDetail.as_view(), name='groupeventpermission-detail'),
+        never_cache(GroupEventPermissionDetail.as_view()), name='groupeventpermission-detail'),
 
     # Event File Resources
     # events/{graceid}/files/[{filename}[/{version}]]
     url(r'^(?P<graceid>\w[\d]+)/files/(?P<filename>.+)?$',
-        Files.as_view(), name="files"),
+        never_cache(Files.as_view()), name="files"),
 
     # Event Labels
     # events/{graceid}/labels/[{label}]
     url(r'^(?P<graceid>\w[\d]+)/labels/(?P<label>.+)?$',
-        EventLabel.as_view(), name="labels"),
+        never_cache(EventLabel.as_view()), name="labels"),
 
     # Event Neighbors
     # events/{graceid}/neighbors/[?delta=(N|(N,N))]
-    url(r'^(?P<graceid>\w[\d]+)/neighbors/$', EventNeighbors.as_view(),
+    url(r'^(?P<graceid>\w[\d]+)/neighbors/$', never_cache(EventNeighbors.as_view()),
         name="neighbors"),
 
     # Operator Signoff Resources
     url(r'^(?P<graceid>[GEHMT]\d+)/signoff/$',
-        OperatorSignoffList.as_view(), name='signoff-list'),
+        never_cache(OperatorSignoffList.as_view()), name='signoff-list'),
 
 ]
diff --git a/gracedb/api/v1/superevents/urls.py b/gracedb/api/v1/superevents/urls.py
index 0ba80993f..6f9fc6aa1 100644
--- a/gracedb/api/v1/superevents/urls.py
+++ b/gracedb/api/v1/superevents/urls.py
@@ -1,4 +1,5 @@
 from django.conf.urls import url, include
+from django.views.decorators.cache import never_cache
 
 from .views import *
 from .settings import SUPEREVENT_LOOKUP_REGEX
@@ -13,94 +14,94 @@ SUPEREVENT_DETAIL_ROOT = '(?P<{lookup_url_kwarg}>{regex})'.format(
 # These are included under a superevent's id URL prefix (see below)
 suburlpatterns = [
     # Superevent detail and update
-    url(r'^$', SupereventViewSet.as_view({'get': 'retrieve',
-        'patch': 'partial_update'}), name='superevent-detail'),
+    url(r'^$', never_cache(SupereventViewSet.as_view({'get': 'retrieve',
+        'patch': 'partial_update'})), name='superevent-detail'),
     # Superevent GW confirmation
-    url(r'^confirm-as-gw/$', SupereventViewSet.as_view(
-        {'post': 'confirm_as_gw'}), name='superevent-confirm-as-gw'),
+    url(r'^confirm-as-gw/$', never_cache(SupereventViewSet.as_view(
+        {'post': 'confirm_as_gw'})), name='superevent-confirm-as-gw'),
 
     # Event list and creation (addition to superevent)
-    url(r'^events/$', SupereventEventViewSet.as_view({'get': 'list',
-        'post': 'create'}), name='superevent-event-list'),
+    url(r'^events/$', never_cache(SupereventEventViewSet.as_view({'get': 'list',
+        'post': 'create'})), name='superevent-event-list'),
     # Event detail and delete (remove from superevent)
     url(r'^events/(?P<{lookup_url_kwarg}>[GEHMT]\d+)/$'.format(
         lookup_url_kwarg=SupereventEventViewSet.lookup_url_kwarg),
-        SupereventEventViewSet.as_view({'get': 'retrieve',
-        'delete': 'destroy'}), name='superevent-event-detail'),
+        never_cache(SupereventEventViewSet.as_view({'get': 'retrieve',
+        'delete': 'destroy'})), name='superevent-event-detail'),
 
     # Labelling list and creation
-    url(r'^labels/$', SupereventLabelViewSet.as_view({'get': 'list',
-        'post': 'create'}), name='superevent-label-list'),
+    url(r'^labels/$', never_cache(SupereventLabelViewSet.as_view({'get': 'list',
+        'post': 'create'})), name='superevent-label-list'),
     # Labelling detail and deletion
     url(r'^labels/(?P<{lookup_url_kwarg}>.+)/$'.format(lookup_url_kwarg=
         SupereventLabelViewSet.lookup_url_kwarg),
-        SupereventLabelViewSet.as_view({'get': 'retrieve',
-        'delete': 'destroy'}), name='superevent-label-detail'),
+        never_cache(SupereventLabelViewSet.as_view({'get': 'retrieve',
+        'delete': 'destroy'})), name='superevent-label-detail'),
 
     # Log list and creation
-    url(r'^logs/$', SupereventLogViewSet.as_view({'get': 'list',
-        'post': 'create'}), name='superevent-log-list'),
+    url(r'^logs/$', never_cache(SupereventLogViewSet.as_view({'get': 'list',
+        'post': 'create'})), name='superevent-log-list'),
     # Log detail
     url(r'^logs/(?P<{lookup_url_kwarg}>\d+)/$'.format(lookup_url_kwarg=
-        SupereventLogViewSet.lookup_url_kwarg), SupereventLogViewSet.as_view({
-        'get': 'retrieve'}), name='superevent-log-detail'),
+        SupereventLogViewSet.lookup_url_kwarg), never_cache(SupereventLogViewSet.as_view({
+        'get': 'retrieve'})), name='superevent-log-detail'),
     # Tag list (for log) and creation (addition of tag to log)
     url(r'^logs/(?P<{lookup_url_kwarg}>\d+)/tags/$'.format(
         lookup_url_kwarg=SupereventLogViewSet.lookup_url_kwarg),
-        SupereventLogTagViewSet.as_view({'get': 'list', 'post': 'create'}),
+        never_cache(SupereventLogTagViewSet.as_view({'get': 'list', 'post': 'create'})),
         name='superevent-log-tag-list'),
     # Tag detail and deletion (removal of tag from log)
     url(r'^logs/(?P<{log_lookup}>\d+)/tags/(?P<{tag_lookup}>.+)/$'.format(
         log_lookup=SupereventLogViewSet.lookup_url_kwarg, tag_lookup=
         SupereventLogTagViewSet.lookup_url_kwarg),
-        SupereventLogTagViewSet.as_view({'get': 'retrieve',
-        'delete': 'destroy'}), name='superevent-log-tag-detail'),
+        never_cache(SupereventLogTagViewSet.as_view({'get': 'retrieve',
+        'delete': 'destroy'})), name='superevent-log-tag-detail'),
 
     # File list
-    url(r'^files/$', SupereventFileViewSet.as_view({'get': 'list',}),
+    url(r'^files/$', never_cache(SupereventFileViewSet.as_view({'get': 'list',})),
         name='superevent-file-list'),
     # File detail (download)
     url(r'^files/(?P<{lookup_url_kwarg}>.+)$'.format(lookup_url_kwarg=
-        SupereventFileViewSet.lookup_url_kwarg), SupereventFileViewSet.as_view(
-        {'get': 'retrieve'}), name='superevent-file-detail'),
+        SupereventFileViewSet.lookup_url_kwarg), never_cache(SupereventFileViewSet.as_view(
+        {'get': 'retrieve'})), name='superevent-file-detail'),
     # Note: no option for POST since file uploads should be handled
     # by writing a log message
 
     # VOEvent list and creation
-    url(r'^voevents/$', SupereventVOEventViewSet.as_view({'get': 'list',
-        'post': 'create'}), name='superevent-voevent-list'),
+    url(r'^voevents/$', never_cache(SupereventVOEventViewSet.as_view({'get': 'list',
+        'post': 'create'})), name='superevent-voevent-list'),
     # VOEvent detail
     url(r'^voevents/(?P<{lookup_url_kwarg}>\d+)/$'.format(lookup_url_kwarg=
         SupereventVOEventViewSet.lookup_url_kwarg),
-        SupereventVOEventViewSet.as_view({'get': 'retrieve'}),
+        never_cache(SupereventVOEventViewSet.as_view({'get': 'retrieve'})),
         name='superevent-voevent-detail'),
 
     # EMObservation list and creation
-    url(r'^emobservations/$', SupereventEMObservationViewSet.as_view(
-        {'get': 'list', 'post': 'create'}),
+    url(r'^emobservations/$', never_cache(SupereventEMObservationViewSet.as_view(
+        {'get': 'list', 'post': 'create'})),
         name='superevent-emobservation-list'),
     # EMObservation detail
     url(r'^emobservations/(?P<{lookup_url_kwarg}>\d+)/$'.format(
         lookup_url_kwarg=SupereventEMObservationViewSet.lookup_url_kwarg),
-        SupereventEMObservationViewSet.as_view({'get': 'retrieve'}),
+        never_cache(SupereventEMObservationViewSet.as_view({'get': 'retrieve'})),
         name='superevent-emobservation-detail'),
 
     # Signoff list and creation
-    url(r'signoffs/$', SupereventSignoffViewSet.as_view(
-        {'get': 'list', 'post': 'create'}), name='superevent-signoff-list'),
+    url(r'signoffs/$', never_cache(SupereventSignoffViewSet.as_view(
+        {'get': 'list', 'post': 'create'})), name='superevent-signoff-list'),
     # Signoff detail
     url(r'signoffs/(?P<{lookup_url_kwarg}>.+)/$'.format(lookup_url_kwarg=
         SupereventSignoffViewSet.lookup_url_kwarg),
-        SupereventSignoffViewSet.as_view({'get': 'retrieve',
-        'patch': 'partial_update', 'delete': 'destroy'}),
+        never_cache(SupereventSignoffViewSet.as_view({'get': 'retrieve',
+        'patch': 'partial_update', 'delete': 'destroy'})),
         name='superevent-signoff-detail'),
 
     # Permissions list and creation
-    url(r'permissions/$', SupereventGroupObjectPermissionViewSet.as_view(
-        {'get': 'list'}), name='superevent-permission-list'),
+    url(r'permissions/$', never_cache(SupereventGroupObjectPermissionViewSet.as_view(
+        {'get': 'list'})), name='superevent-permission-list'),
     # Permissions modification (expose/hide superevent).
     url(r'^permissions/modify/$',
-        SupereventGroupObjectPermissionViewSet.as_view({'post': 'modify'}),
+        never_cache(SupereventGroupObjectPermissionViewSet.as_view({'post': 'modify'})),
         name='superevent-permission-modify'),
 ]
 
@@ -108,7 +109,7 @@ suburlpatterns = [
 urlpatterns = [
 
     # Superevent list and creation
-    url(r'^$', SupereventViewSet.as_view({'get': 'list', 'post': 'create'}),
+    url(r'^$', never_cache(SupereventViewSet.as_view({'get': 'list', 'post': 'create'})),
         name='superevent-list'),
 
     # All sub-URLs for a single superevent
diff --git a/gracedb/api/v1/urls.py b/gracedb/api/v1/urls.py
index b4d4597b8..75abc0395 100644
--- a/gracedb/api/v1/urls.py
+++ b/gracedb/api/v1/urls.py
@@ -8,20 +8,23 @@ from .main.views import GracedbRoot, PerformanceInfo, TagList, UserInfoView, \
 from .events import urls as event_urls
 from .superevents import urls as superevent_urls
 
+# Turn off api caching:
+from django.views.decorators.cache import never_cache
+
 
 urlpatterns = [
     # Root level API resources ------------------------------------------------
     # API root
-    url(r'^$', GracedbRoot.as_view(), name="root"),
+    url(r'^$', never_cache(GracedbRoot.as_view()), name="root"),
 
     # User information
-    url(r'^user-info/', UserInfoView.as_view(), name='user-info'),
+    url(r'^user-info/', never_cache(UserInfoView.as_view()), name='user-info'),
 
     # Tags
-    url(r'^tag/', TagList.as_view(), name='tag-list'),
+    url(r'^tag/', never_cache(TagList.as_view()), name='tag-list'),
 
     # Performance stats
-    url(r'^performance/', PerformanceInfo.as_view(), name='performance-info'),
+    url(r'^performance/', never_cache(PerformanceInfo.as_view()), name='performance-info'),
 
     # Certificate debugging
     #url(r'^cert-debug/', CertDebug.as_view(), name='cert-debug'),
-- 
GitLab