From 6376be50a0337d1aaa11ab921fd0e18d4d7f3b59 Mon Sep 17 00:00:00 2001
From: Branson Stephens <stephenb@uwm.edu>
Date: Mon, 6 May 2013 17:06:29 -0500
Subject: [PATCH] ordering log messages with [-created,-N] and addressing log
 messages via N.

---
 gracedb/api.py    | 50 ++++++++++++++++++++---------------------------
 gracedb/models.py |  1 +
 gracedb/views.py  |  4 ++--
 3 files changed, 24 insertions(+), 31 deletions(-)

diff --git a/gracedb/api.py b/gracedb/api.py
index a43e03877..43d309a73 100644
--- a/gracedb/api.py
+++ b/gracedb/api.py
@@ -534,17 +534,14 @@ class EventLabel(APIView):
 # EventLog
 
 # Janky serialization
-def eventLogToDict(log, n=None, request=None):
-    # XXX Messy.  n should not be here but in the model.
+def eventLogToDict(log, request=None):
     taglist_uri = None
-    if (n is None) and request:
-        uri = request.build_absolute_uri()
-    elif n is not None and request:
+    if request:
         uri = reverse("eventlog-detail",
-                args=[log.event.graceid(), n],
+                args=[log.event.graceid(), log.N],
                 request=request)
         taglist_uri = reverse("eventlogtag-list",
-                args=[log.event.graceid(), n],
+                args=[log.event.graceid(), log.N],
                 request=request)
     else:
         uri = None
@@ -571,11 +568,11 @@ class EventLogList(APIView):
             # XXX Real error message.
             return Response("Event does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
-        logset = event.eventlog_set.order_by("created")
+        logset = event.eventlog_set.order_by("created","N")
         count = logset.count()
 
-        log = [ eventLogToDict(log, n, request)
-                for (n, log) in zip(range(0,count+2), logset.iterator()) ]
+        log = [ eventLogToDict(log, request)
+                for log in logset.iterator() ]
 
         rv = {
                 'start': 0,
@@ -597,15 +594,14 @@ class EventLogList(APIView):
                 event=event,
                 issuer=request.ligouser,
                 comment=message)
-        logset = event.eventlog_set.order_by("created")
-        n = len(logset)
+        logset = event.eventlog_set.order_by("created","N")
         try:
             logentry.save()
         except Exception as e:
             # Since this is likely due to race conditions, we will return 503
             return Response("Failed to save log entry: %s" % str(e),
                     status=status.HTTP_503_SERVICE_UNAVAILABLE)
-        rv = eventLogToDict(logentry, n, request=request)
+        rv = eventLogToDict(logentry, request=request)
         response = Response(rv, status=status.HTTP_201_CREATED)
         response['Location'] = rv['self']
 
@@ -628,13 +624,15 @@ class EventLogDetail(APIView):
         try:
             event = Event.getByGraceid(graceid)
         except Event.DoesNotExist:
-            # XXX Real error message.
-            return Response("Log Entry Not Found",
+            return Response("Event Not Found",
+                    status=status.HTTP_404_NOT_FOUND)
+        try:
+            rv = event.eventlog_set.filter(N=n)[0]
+        except:
+            return Response("Log Message Not Found",
                     status=status.HTTP_404_NOT_FOUND)
-        rv = event.eventlog_set.order_by("created").all()[int(n)]
-        # XXX I (Branson) put the n argument here.  Why not?  
-        # We might as well since we have it, right?
-        return Response(eventLogToDict(rv, n, request=request))
+
+        return Response(eventLogToDict(rv, request=request))
 
 #==================================================================
 # Tags
@@ -770,13 +768,11 @@ class EventLogTagList(APIView):
         # Return a list of links to tags associated with a given log message
         try:
             event = Event.getByGraceid(graceid)
-            eventlog = event.eventlog_set.order_by("created").all()[int(n)]
+            eventlog = event.eventlog_set.filter(N=n)[0]
         except Event.DoesNotExist:
-            # XXX Real error message.
             return Response("Event does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
         except:
-            # XXX Real error message.
             return Response("Log does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
 
@@ -799,13 +795,11 @@ class EventLogTagDetail(APIView):
     def get(self, request, graceid, n, tagname):
         try:
             event = Event.getByGraceid(graceid)
-            eventlog = event.eventlog_set.order_by("created").all()[int(n)]
+            eventlog = event.eventlog_set.filter(N=n)[0]
         except Event.DoesNotExist:
-            # XXX Real error message.
             return Response("Event does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
         except:
-            # XXX Real error message.
             return Response("Log does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
         try:
@@ -818,13 +812,11 @@ class EventLogTagDetail(APIView):
     def put(self, request, graceid, n, tagname):
         try:
             event = Event.getByGraceid(graceid)
-            eventlog = event.eventlog_set.order_by("created").all()[int(n)]
+            eventlog = event.eventlog_set.filter(N=n)[0]
         except Event.DoesNotExist:
-            # XXX Real error message.
             return Response("Event does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
         except:
-            # XXX Real error message.
             return Response("Log does not exist.",
                     status=status.HTTP_404_NOT_FOUND)
         try:
@@ -866,7 +858,7 @@ class EventLogTagDetail(APIView):
     def delete(self, request, graceid, n, tagname):
         try:
             event = Event.getByGraceid(graceid)
-            eventlog = event.eventlog_set.order_by("created").all()[int(n)]
+            eventlog = event.eventlog_set.filter(N=n)[0]
         except Event.DoesNotExist:
             # XXX Real error message.
             return Response("Event does not exist.",
diff --git a/gracedb/models.py b/gracedb/models.py
index 8d4469273..5e8d585d1 100644
--- a/gracedb/models.py
+++ b/gracedb/models.py
@@ -194,6 +194,7 @@ class Event(models.Model):
 
 class EventLog(models.Model):
     class Meta:
+        ordering = ['-created','-N']
         unique_together = ("event","N")
     event = models.ForeignKey(Event, null=False)
     created = models.DateTimeField(auto_now_add=True)
diff --git a/gracedb/views.py b/gracedb/views.py
index c57f162dc..a30737d31 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -498,7 +498,7 @@ def logentry(request, graceid, num=None):
 
     else:
         try:
-            elog = event.eventlog_set.order_by('created').all()[int(num)]
+            elog = event.eventlog_set.filter(N=num)[0]
         except Exception, e:
             raise Http404
 
@@ -1048,7 +1048,7 @@ def latest(request):
 def taglogentry(request, graceid, num, tagname):
     try:
         event = Event.getByGraceid(graceid)
-        eventlog = event.eventlog_set.order_by("created").all()[int(num)]
+        eventlog = event.eventlog_set.filter(N=num)[0]
     except:
         # Either the event or the log does not exist.
         raise Http404
-- 
GitLab