From 18976cac34728484dcd68ad1757cd3529b7d802f Mon Sep 17 00:00:00 2001
From: Brian Moe <brian.moe@ligo.org>
Date: Fri, 8 Jun 2012 14:02:34 -0500
Subject: [PATCH] CLI file download. Begin transition to RESTier API

---
 gracedb/api.py       | 26 ++++++++++++++++++++++++++
 gracedb/models.py    |  4 ++++
 gracedb/urls_rest.py |  6 ++++++
 urls.py              |  1 +
 4 files changed, 37 insertions(+)
 create mode 100644 gracedb/api.py
 create mode 100644 gracedb/urls_rest.py

diff --git a/gracedb/api.py b/gracedb/api.py
new file mode 100644
index 000000000..286ef6317
--- /dev/null
+++ b/gracedb/api.py
@@ -0,0 +1,26 @@
+
+from django.http import HttpResponse, HttpResponseNotFound
+
+from gracedb.models import Event
+
+import os
+
+def download(request, graceid, filename=None):
+    #response = HttpResponse(buildVOEvent(event), content_type="application/xml")
+    if not filename:
+        response = HttpResponseNotFound("Not Implemented.")
+        response.status_code = 404
+    try:
+        event = Event.getByGraceid(graceid)
+        filepath = os.path.join(event.datadir(), filename)
+        if not os.path.exists(filepath):
+            response = HttpResponseNotFound("File does not exist")
+        elif not os.access(filepath, os.R_OK):
+            response = HttpResponseNotFound("File not readable")
+        else:
+            response = HttpResponse(open(filepath, "r"), content_type="application/octet-stream")
+            response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(filename)
+    except Event.DoesNotExist:
+        response = HttpResponseNotFound("Event does not exist")
+
+    return response
diff --git a/gracedb/models.py b/gracedb/models.py
index 49f793f99..4a2114b16 100644
--- a/gracedb/models.py
+++ b/gracedb/models.py
@@ -95,6 +95,10 @@ class Event(models.Model):
         #return "pcdev1.phys.uwm.edu:/archive/gracedb/data/%s" % self.graceid()
         return "file://pcdev1.phys.uwm.edu/archive/gracedb/data/%s" % self.graceid()
 
+    def datadir(self):
+        # Move to this.  Not the (more) ad hoc crap that's floating around.
+        return os.path.join(settings.GRACEDB_DATA_DIR, self.graceid(), "private")
+
     def ligoApproved(self):
         return self.approval_set.filter(approvingCollaboration='L').count()
 
diff --git a/gracedb/urls_rest.py b/gracedb/urls_rest.py
new file mode 100644
index 000000000..a067ec3c1
--- /dev/null
+++ b/gracedb/urls_rest.py
@@ -0,0 +1,6 @@
+
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('gracedb.api',
+    url (r'^event/(?P<graceid>[\w\d]+)/files/(?P<filename>.+)?$', 'download', name="download"),
+)
diff --git a/urls.py b/urls.py
index 3f5836eba..6684532c1 100644
--- a/urls.py
+++ b/urls.py
@@ -16,6 +16,7 @@ urlpatterns = patterns('',
 
     url (r'^$', 'gracedb.views.index', name="home"),
     (r'^events/', include('gracedb.urls')),
+    (r'^api/', include('gracedb.urls_rest')),
     (r'^options/', include('userprofile.urls')),
     (r'^cli/create', 'gracedb.views.create'),
     (r'^cli/ping', 'gracedb.views.ping'),
-- 
GitLab