diff options
Diffstat (limited to 'sugar_network/db')
-rw-r--r-- | sugar_network/db/metadata.py | 48 | ||||
-rw-r--r-- | sugar_network/db/routes.py | 32 |
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): |