diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2014-05-01 12:09:10 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2014-05-01 12:09:10 (GMT) |
commit | d575dade236cd1c5ca345b79dc7a29f5d9a6959e (patch) | |
tree | dcaed3340cf1f3de1c42c5788932c630a6d0ea27 /sugar_network | |
parent | 7b650854958d03386ae54e87cbbb2bc82053661e (diff) |
Return metadata for aggregated items in API gets
Diffstat (limited to 'sugar_network')
-rw-r--r-- | sugar_network/client/model.py | 24 | ||||
-rw-r--r-- | sugar_network/db/blobs.py | 8 | ||||
-rw-r--r-- | sugar_network/db/metadata.py | 9 | ||||
-rw-r--r-- | sugar_network/node/model.py | 10 |
4 files changed, 33 insertions, 18 deletions
diff --git a/sugar_network/client/model.py b/sugar_network/client/model.py index 0c5991f..0b3208b 100644 --- a/sugar_network/client/model.py +++ b/sugar_network/client/model.py @@ -65,24 +65,26 @@ def dump_volume(volume): if meta is None or 'seqno' not in meta: continue if isinstance(prop, db.Aggregated): - for aggid, value in doc.repr(name): + for agg in doc.repr(name): aggop = { 'method': 'POST', - 'path': [resource, doc.guid, name, aggid], + 'path': [resource, doc.guid, name, agg['key']], } - if isinstance(value, File): - value.meta['op'] = aggop - postfix.append(value) + aggvalue = agg['value'] + if isinstance(aggvalue, File): + aggvalue.meta['op'] = aggop + postfix.append(aggvalue) else: - postfix.append({'op': aggop, 'content': value}) + postfix.append({'op': aggop, 'content': aggvalue}) elif prop.acl & (ACL.WRITE | ACL.CREATE): if isinstance(prop, db.Blob): blob = volume.blobs.get(doc[name]) - blob.meta['op'] = { - 'method': 'PUT', - 'path': [resource, doc.guid, name], - } - postfix.append(blob) + if blob is not None: + blob.meta['op'] = { + 'method': 'PUT', + 'path': [resource, doc.guid, name], + } + postfix.append(blob) else: if isinstance(prop, db.Reference): keys.append(name) diff --git a/sugar_network/db/blobs.py b/sugar_network/db/blobs.py index 2faedb0..f283cb2 100644 --- a/sugar_network/db/blobs.py +++ b/sugar_network/db/blobs.py @@ -172,7 +172,7 @@ class Blobs(object): return blob def delete(self, path): - self._delete(self.path(path), None) + self._delete(path, self.path(path), None) def wipe(self, path): path = self.path(path) @@ -243,7 +243,7 @@ class Blobs(object): else: path = self._blob_path(patch.digest) if not patch.size: - self._delete(path, seqno) + self._delete(path.digest, path, seqno) return if not exists(dirname(path)): os.makedirs(dirname(path)) @@ -257,7 +257,9 @@ class Blobs(object): meta['x-seqno'] = str(seqno) _write_meta(path, meta, seqno) - def _delete(self, path, seqno): + def _delete(self, digest, path, seqno): + if digest.startswith('assets/'): + return if exists(path + _META_SUFFIX): if seqno is None: seqno = self._seqno.next() diff --git a/sugar_network/db/metadata.py b/sugar_network/db/metadata.py index 53034aa..53d3f40 100644 --- a/sugar_network/db/metadata.py +++ b/sugar_network/db/metadata.py @@ -390,7 +390,14 @@ class Aggregated(Composite): raise RuntimeError('Aggregated properties cannot be set directly') def reprcast(self, value): - return [(i, self.subreprcast(j['value'])) for i, j in value.items()] + result = [] + for key, aggvalue in value.items(): + if 'value' not in aggvalue: + continue + aggvalue['key'] = key + aggvalue['value'] = self._subtype.reprcast(aggvalue['value']) + result.append(aggvalue) + return result def encode(self, items): for agg in items.values(): diff --git a/sugar_network/node/model.py b/sugar_network/node/model.py index 310d2db..380963f 100644 --- a/sugar_network/node/model.py +++ b/sugar_network/node/model.py @@ -56,6 +56,7 @@ class _ReleaseValue(dict): class _Release(object): + _subcast = db.Dict() _package_subcast = db.Dict(db.List()) def typecast(self, value): @@ -71,6 +72,9 @@ class _Release(object): __, value = load_bundle(bundle, context=this.request.guid) return value.guid, value + def reprcast(self, value): + return self._subcast.reprcast(value) + def encode(self, value): return [] @@ -205,7 +209,7 @@ def diff_resource(in_r): blobs = [] def add_blob(blob): - if not isinstance(blob, File): + if not isinstance(blob, File) or 'x-seqno' not in blob.meta: return seqno = int(blob.meta['x-seqno']) ranges.include(out_r, seqno, seqno) @@ -215,8 +219,8 @@ def diff_resource(in_r): prop = doc.metadata[prop] value = prop.reprcast(meta['value']) if isinstance(prop, db.Aggregated): - for __, aggvalue in value: - add_blob(aggvalue) + for aggvalue in value: + add_blob(aggvalue['value']) else: add_blob(value) |