Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar_network/db
diff options
context:
space:
mode:
Diffstat (limited to 'sugar_network/db')
-rw-r--r--sugar_network/db/metadata.py48
-rw-r--r--sugar_network/db/routes.py32
2 files changed, 36 insertions, 44 deletions
diff --git a/sugar_network/db/metadata.py b/sugar_network/db/metadata.py
index 5282fd1..88d644b 100644
--- a/sugar_network/db/metadata.py
+++ b/sugar_network/db/metadata.py
@@ -16,8 +16,8 @@
import xapian
from sugar_network import toolkit
-from sugar_network.db import files
-from sugar_network.toolkit.router import ACL
+from sugar_network.db import blobs
+from sugar_network.toolkit.router import ACL, File
from sugar_network.toolkit.coroutine import this
from sugar_network.toolkit import i18n, http, enforce
@@ -33,6 +33,7 @@ def stored_property(klass=None, *args, **kwargs):
return func(self, value)
def decorate_setter(func, attr):
+ # pylint: disable-msg=W0212
attr.prop.setter = lambda self, value: \
self._set(attr.name, func(self, value))
attr.prop.on_set = func
@@ -297,12 +298,12 @@ class Blob(Property):
self.mime_type = mime_type
def typecast(self, value):
- if isinstance(value, toolkit.File):
+ if isinstance(value, File):
return value.digest
- if isinstance(value, files.Digest):
+ if isinstance(value, File.Digest):
return value
- enforce(value is None or isinstance(value, basestring) or \
+ enforce(value is None or isinstance(value, basestring) or
isinstance(value, dict) and value or hasattr(value, 'read'),
'Inappropriate blob value')
@@ -310,45 +311,38 @@ class Blob(Property):
return ''
if not isinstance(value, dict):
- return files.post(value, {
- 'mime_type': this.request.content_type or self.mime_type,
- }).digest
+ mime_type = this.request.content_type or self.mime_type
+ return blobs.post(value, mime_type).digest
digest = this.resource[self.name] if self.name else None
if digest:
- meta = files.get(digest)
+ orig = blobs.get(digest)
enforce('digest' not in value or value.pop('digest') == digest,
"Inappropriate 'digest' value")
- enforce(meta.path or 'url' in meta or 'url' in value,
+ enforce(orig.path or 'location' in orig or 'location' in value,
'Blob points to nothing')
- if 'url' in value and meta.path:
- files.delete(digest)
- meta.update(value)
- value = meta
+ if 'location' in value and orig.path:
+ blobs.delete(digest)
+ orig.update(value)
+ value = orig
else:
- enforce('url' in value, 'Blob points to nothing')
+ enforce('location' in value, 'Blob points to nothing')
enforce('digest' in value, "Missed 'digest' value")
- if 'mime_type' not in value:
- value['mime_type'] = self.mime_type
+ if 'content-type' not in value:
+ value['content-type'] = self.mime_type
digest = value.pop('digest')
- files.update(digest, value)
+ blobs.update(digest, value)
return digest
def reprcast(self, value):
if not value:
- return toolkit.File.AWAY
- meta = files.get(value)
- if 'url' not in meta:
- meta['url'] = '%s/blobs/%s' % (this.request.static_prefix, value)
- meta['size'] = meta.size
- meta['mtime'] = meta.mtime
- meta['digest'] = value
- return meta
+ return File.AWAY
+ return blobs.get(value)
def teardown(self, value):
if value:
- files.delete(value)
+ blobs.delete(value)
def assert_access(self, mode, value=None):
if mode == ACL.WRITE and not value:
diff --git a/sugar_network/db/routes.py b/sugar_network/db/routes.py
index 2f8fc69..d8d2fb4 100644
--- a/sugar_network/db/routes.py
+++ b/sugar_network/db/routes.py
@@ -15,14 +15,14 @@
import re
import time
-import json
import logging
from contextlib import contextmanager
from sugar_network import toolkit
-from sugar_network.db import files
+from sugar_network.db import blobs
from sugar_network.db.metadata import Aggregated
-from sugar_network.toolkit.router import ACL, route, preroute, fallbackroute
+from sugar_network.toolkit.router import ACL, File
+from sugar_network.toolkit.router import route, preroute, fallbackroute
from sugar_network.toolkit.coroutine import this
from sugar_network.toolkit import http, enforce
@@ -137,25 +137,20 @@ class Routes(object):
prop = directory.metadata[request.prop]
prop.assert_access(ACL.READ)
- meta = doc.meta(prop.name) or {}
- if 'value' in meta:
- value = _get_prop(doc, prop, meta.pop('value'))
- enforce(value is not toolkit.File.AWAY, http.NotFound, 'No blob')
+ meta = doc.meta(prop.name)
+ if meta:
+ value = meta['value']
+ response.last_modified = meta['mtime']
else:
value = prop.default
-
- response.meta = meta
- response.last_modified = meta.get('mtime')
- if isinstance(value, toolkit.File):
- response.content_length = value.get('size') or 0
- else:
- response.content_length = len(json.dumps(value))
+ value = _get_prop(doc, prop, value)
+ enforce(value is not File.AWAY, http.NotFound, 'No blob')
return value
@route('HEAD', [None, None, None])
def get_prop_meta(self, request, response):
- self.get_prop(request, response)
+ return self.get_prop(request, response)
@route('POST', [None, None, None],
acl=ACL.AUTH, mime_type='application/json')
@@ -193,7 +188,7 @@ class Routes(object):
@fallbackroute('GET', ['blobs'])
def blobs(self, request):
- return files.get(request.guid)
+ return blobs.get(request.guid)
def on_create(self, request, props):
ts = int(time.time())
@@ -280,7 +275,10 @@ class Routes(object):
result = {}
for name in props:
prop = doc.metadata[name]
- result[name] = _get_prop(doc, prop, doc.get(name))
+ value = _get_prop(doc, prop, doc.get(name))
+ if isinstance(value, File):
+ value = value.url
+ result[name] = value
return result
def _useradd(self, authors, user, role):