From aa1ff34eda74e95a96e3e1bfb92b3a4ebbea42ba Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Thu, 15 Nov 2012 16:09:51 -0600
Subject: [PATCH] Added some documentation

---
 gracedb/api.py | 80 ++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 64 insertions(+), 16 deletions(-)

diff --git a/gracedb/api.py b/gracedb/api.py
index 403ec47b9..a4a1e9533 100644
--- a/gracedb/api.py
+++ b/gracedb/api.py
@@ -1,7 +1,10 @@
 
-from django.http import HttpResponse, HttpResponseNotFound, HttpResponseForbidden, HttpResponseServerError
+from django.http import HttpResponse, HttpResponseNotFound
+from django.http import HttpResponseForbidden, HttpResponseServerError
 from django.core.urlresolvers import reverse as django_reverse
 
+from django.conf import settings
+
 import simplejson
 
 from gracedb.models import Event
@@ -9,18 +12,21 @@ from gracedb.models import Event
 import os
 import urllib
 
+
 ##################################################################
-# Piston
 
+REST_FRAMEWORK_SETTINGS = getattr(settings, 'REST_FRAMEWORK', {})
+PAGINATE_BY = REST_FRAMEWORK_SETTINGS.get('PAGINATE_BY', 10)
 
 ##################################################################
 # rest_framework
 from rest_framework import serializers, status
 from rest_framework.response import Response
-#from rest_framework.renderers import JSONRenderer, JSONPRenderer, YAMLRenderer, XMLRenderer
+#from rest_framework.renderers import JSONRenderer, JSONPRenderer
+#from rest_framework.renderers import YAMLRenderer, XMLRenderer
 from forms import CreateEventForm
 from views import _createEventFromForm
-from rest_framework import parsers # YAMLParser, MultiPartParser
+from rest_framework import parsers      # YAMLParser, MultiPartParser
 
 #from rest_framework.permissions import IsAuthenticated
 #from rest_framework.permissions import AllowAny
@@ -44,37 +50,77 @@ class EventSerializer(serializers.Serializer):
     group        = serializers.CharField(required=True, max_length=100)
     analysisType = serializers.CharField(required=True, max_length=100)
 
+
 def eventToDict(event, columns=None, request=None):
     """Convert an Event to a dictionary so it can be serialized.  (ugh)"""
+
     # XXX Seems wrong.  Need to understand serializers.
 
     rv = {}
 
+    graceid = event.graceid()
     rv['submitter'] = event.submitter.name
     rv['created'] = event.created
     rv['group'] = event.group.name
-    rv['graceid'] = event.graceid()
+    rv['graceid'] = graceid
     rv['analysisType'] = event.get_analysisType_display()
     rv['instruments'] = event.instruments
     rv['nevents'] = event.nevents
     rv['far'] = event.far
     rv['likelihood'] = event.likelihood
-    rv['labels'] = [labelling.label.name for labelling in event.labelling_set.all()]
-    rv['labels'] = [labelling.label.name for labelling in event.labelling_set.all()]
+    rv['labels'] = [labelling.label.name
+            for labelling in event.labelling_set.all()]
     rv['links'] = {
             "neighbors" : dict(
                 [(e.gpstime, reverse("event-detail", args=[e.graceid()]))
                     for e in event.neighbors()]),
-            "data" : event.weburl(),
-            "log" : reverse("eventlog-list", args=[event.graceid()], request=request),
-            "files" : reverse("files", args=[event.graceid()], request=request),
-            "filemeta" : reverse("filemeta", args=[event.graceid()], request=request),
-            "self" : reverse("event-detail", args=[event.graceid()], request=request),
+            "data"  : event.weburl(),
+            "log"   : reverse("eventlog-list", args=[graceid], request=request),
+            "files" : reverse("files", args=[graceid], request=request),
+            "filemeta" : reverse("filemeta", args=[graceid], request=request),
+            "self"  : reverse("event-detail", args=[graceid], request=request),
             }
     return rv
 
 class EventList(APIView):
-    """Docstring for *EventList* class!"""
+    """
+    This resource represents the candidate events in GraceDB.
+
+    ### GET
+    Retrieve events. You may use the following parameters:
+
+    * `query=Q` : use any query string as one might use on the query page.
+    * `limit=N` : the maximum number of events in a response. (default: 10)
+    * `page=N` : events starting with the (limit*(page-1))th event. (default: 1)
+    * `orderby=O` : how to order events.  (default: -created)
+
+    Example:
+    `curl -X GET --insecure --cert $X509_USER_PROXY https://gracedb.ligo.org/api/events/?query=LowMass%20EM_READY&orderby=-far`
+
+    ### POST
+    To create an event.  Expects `multipart/form-data` mime-type with
+    parameters, `group`, `type` and a file part, `eventFile` containing
+    the analysis data.
+
+    Groups: `Test` `CBC` `Burst` `Stochastic` `Coherent`
+
+    Analysis Types:
+
+    * `LM` :  Low Mass
+    * `HM` :  High Mass
+    * `GRB` : GRB
+    * `RD` :  Ringdown
+    * `OM` :  Omega
+    * `Q` :   Q
+    * `X` :   X
+    * `CWB` : CWB
+    * `MBTA` : MBTA Online
+    * `HWINJ` : Hardware Injection
+
+    Example:
+    `curl -X POST -F "group=Test" -F "type=LM" -F "eventFile=@coinc.xml" --insecure --cert $X509_USER_PROXY https://gracedb.ligo.org/api/events/`
+
+    """
     #model = Event
     #serializer_class = EventSerializer
     ##renderer_classes = (JSONRenderer, JSONPRenderer, YAMLRenderer, XMLRenderer)
@@ -86,14 +132,14 @@ class EventList(APIView):
     def get(self, request):
         """I am the GET docstring for EventList"""
         query = request.QUERY_PARAMS.get("query")
-        limit = request.QUERY_PARAMS.get("limit", 10)
+        limit = request.QUERY_PARAMS.get("limit", PAGINATE_BY)
         page = request.QUERY_PARAMS.get("page", 1)
         orderby = request.QUERY_PARAMS.get("orderby", "-created")
         if query is not None:
             return Response("Query not implemented")
         page = int(page)
         limit = int(limit)
-        first = page*limit
+        first = (page-1)*limit
         events = Event.objects.order_by(orderby)
         count = events.count()
         last = max(0, (count / limit) - 1)
@@ -194,7 +240,9 @@ class EventLogDetail(APIView):
         return Response(eventLogToDict(rv, request=request))
 
 class GracedbRoot(APIView):
-    """Root of the Gracedb REST API"""
+    """
+        Root of the Gracedb REST API
+    """
     authentication_classes = (LigoAuthentication,)
     parser_classes = ()
     def get(self, request):
-- 
GitLab