+
+ uri = request.build_absolute_uri()
+ if '?' in uri:
+ uri = uri[:uri.find('?')]
+
+ response['X-Auth-Token'] = x_auth_key
+ response['X-Storage-Url'] = uri + ('' if uri.endswith('/') else '/') + x_auth_user
+ return response
+
+@api_method('GET', format_allowed=True)
+def account_list(request):
+ # Normal Response Codes: 200, 204
+ # Error Response Codes: serviceUnavailable (503),
+ # badRequest (400)
+
+ response = HttpResponse()
+
+ marker = request.GET.get('marker')
+ limit = get_int_parameter(request.GET.get('limit'))
+ if not limit:
+ limit = 10000
+
+ accounts = request.backend.list_accounts(request.user_uniq, marker, limit)
+
+ if request.serialization == 'text':
+ if len(accounts) == 0:
+ # The cloudfiles python bindings expect 200 if json/xml.
+ response.status_code = 204
+ return response
+ response.status_code = 200
+ response.content = '\n'.join(accounts) + '\n'
+ return response
+
+ account_meta = []
+ for x in accounts:
+ if x == request.user_uniq:
+ continue
+ try:
+ meta = request.backend.get_account_meta(request.user_uniq, x, 'pithos')
+ groups = request.backend.get_account_groups(request.user_uniq, x)
+ except NotAllowedError:
+ raise Forbidden('Not allowed')
+ else:
+ rename_meta_key(meta, 'modified', 'last_modified')
+ rename_meta_key(meta, 'until_timestamp', 'x_account_until_timestamp')
+ m = dict([(k[15:], v) for k, v in meta.iteritems() if k.startswith('X-Account-Meta-')])
+ for k in m:
+ del(meta['X-Account-Meta-' + k])
+ if m:
+ meta['X-Account-Meta'] = printable_header_dict(m)
+ if groups:
+ meta['X-Account-Group'] = printable_header_dict(dict([(k, ','.join(v)) for k, v in groups.iteritems()]))
+ account_meta.append(printable_header_dict(meta))
+ if request.serialization == 'xml':
+ data = render_to_string('accounts.xml', {'accounts': account_meta})
+ elif request.serialization == 'json':
+ data = json.dumps(account_meta)
+ response.status_code = 200
+ response.content = data