Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar_network
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2014-05-01 12:09:10 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2014-05-01 12:09:10 (GMT)
commitd575dade236cd1c5ca345b79dc7a29f5d9a6959e (patch)
treedcaed3340cf1f3de1c42c5788932c630a6d0ea27 /sugar_network
parent7b650854958d03386ae54e87cbbb2bc82053661e (diff)
Return metadata for aggregated items in API gets
Diffstat (limited to 'sugar_network')
-rw-r--r--sugar_network/client/model.py24
-rw-r--r--sugar_network/db/blobs.py8
-rw-r--r--sugar_network/db/metadata.py9
-rw-r--r--sugar_network/node/model.py10
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)