Handle marker and limit.
authorAntony Chazapis <chazapis@gmail.com>
Wed, 20 Apr 2011 14:52:37 +0000 (17:52 +0300)
committerAntony Chazapis <chazapis@gmail.com>
Wed, 20 Apr 2011 14:52:37 +0000 (17:52 +0300)
api/functions.py
api/templates/containers.xml [new file with mode: 0644]
api/util.py

index 56f139c..908eab7 100644 (file)
@@ -3,9 +3,11 @@
 #\r
 \r
 from django.http import HttpResponse\r
+from django.template.loader import render_to_string\r
+from django.utils import simplejson as json\r
 \r
 from pithos.api.faults import Fault, BadRequest, Unauthorized\r
-from pithos.api.util import api_method\r
+from pithos.api.util import api_method, binary_search_name\r
 \r
 import logging\r
 \r
@@ -18,8 +20,6 @@ def authenticate(request):
     #                       unauthorized (401),\r
     #                       badRequest (400)\r
     \r
-    logging.debug('request.META: %s' % request.META)\r
-    \r
     x_auth_user = request.META.get('HTTP_X_AUTH_USER')\r
     x_auth_key = request.META.get('HTTP_X_AUTH_KEY')\r
     \r
@@ -76,7 +76,49 @@ def account_meta(request, v_account):
 \r
 @api_method('GET', format_allowed = True)\r
 def container_list(request, v_account):\r
-    return HttpResponse("container_list: %s" % v_account)\r
+    # Normal Response Codes: 200, 204\r
+    # Error Response Codes: serviceUnavailable (503),\r
+    #                       unauthorized (401),\r
+    #                       badRequest (400)\r
+    \r
+    containers = [\r
+            {'name': '1', 'count': 2, 'bytes': 123},\r
+            {'name': '2', 'count': 22, 'bytes': 245},\r
+            {'name': '3', 'count': 222, 'bytes': 83745},\r
+            {'name': 'four', 'count': 2222, 'bytes': 274365}\r
+        ]\r
+    \r
+    if len(containers) == 0:\r
+        return HttpResponse(status = 204)\r
+    \r
+    limit = request.GET.get('limit')\r
+    marker = request.GET.get('marker')\r
+    \r
+    start = 0\r
+    if marker:\r
+        try:\r
+            start = binary_search_name(containers, marker) + 1\r
+        except ValueError:\r
+            pass\r
+    if limit:\r
+        try:\r
+            limit = int(limit)\r
+        except ValueError:\r
+            limit = None\r
+    if not limit or limit > 10000:\r
+        limit = 10000\r
+    \r
+    containers = containers[start:start + limit]\r
+    if request.serialization == 'xml':\r
+        # TODO: The xml must include the account name as well.\r
+        data = render_to_string('containers.xml', {'containers': containers})\r
+    elif request.serialization  == 'json':\r
+        data = json.dumps(containers)\r
+    else:\r
+        data = '\n'.join(x['name'] for x in containers)\r
+    \r
+    # TODO: Return 404 when the account is not found.\r
+    return HttpResponse(data, status = 200)\r
 \r
 @api_method('HEAD')\r
 def container_meta(request, v_account, v_container):\r
diff --git a/api/templates/containers.xml b/api/templates/containers.xml
new file mode 100644 (file)
index 0000000..c82a1ea
--- /dev/null
@@ -0,0 +1,11 @@
+{% spaceless %}
+<?xml version="1.0" encoding="UTF-8"?>
+
+<account name="">
+  {% for container in containers %}
+  <container>
+    <name>{{ container.name }}</name>
+  </container>
+  {% endfor %}
+</account>
+{% endspaceless %}
index 0c058e2..f2d8505 100644 (file)
@@ -22,6 +22,19 @@ import datetime
 import dateutil.parser\r
 import logging\r
 \r
+def binary_search_name(a, x, lo = 0, hi = None):\r
+    if hi is None:\r
+        hi = len(a)\r
+    while lo < hi:\r
+        mid = (lo + hi) // 2\r
+        midval = a[mid]['name']\r
+        if midval < x:\r
+            lo = mid + 1\r
+        elif midval > x: \r
+            hi = mid\r
+        else:\r
+            return mid\r
+    raise ValueError()\r
 \r
 # class UTC(tzinfo):\r
 #     def utcoffset(self, dt):\r