Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-09-15 06:21:25 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-09-15 06:21:25 (GMT)
commit105b730aa27977769375e6c09c50d7141eae0df2 (patch)
treedf1e819727ce6b53a16f8ee4ac42188d189616cf
parent9d6db29ec91652e7a58b86006fba01d67a23eff3 (diff)
Move "layer" property from library level
-rw-r--r--sugar_network/node/commands.py15
-rw-r--r--sugar_network/resources/volume.py13
-rwxr-xr-xtests/units/node.py19
-rwxr-xr-xtests/units/volume.py20
4 files changed, 66 insertions, 1 deletions
diff --git a/sugar_network/node/commands.py b/sugar_network/node/commands.py
index 2ac3eb9..74adad2 100644
--- a/sugar_network/node/commands.py
+++ b/sugar_network/node/commands.py
@@ -105,6 +105,14 @@ class NodeCommands(ad.VolumeCommands):
blobs = reply & self._blobs[document]
reply = list(reply - blobs)
+ layer = kwargs.get('layer', ['public'])
+ if isinstance(layer, basestring):
+ layer = [layer]
+ if 'deleted' in layer:
+ _logger.warning('Requesting "deleted" layer')
+ layer.remove('deleted')
+ kwargs['layer'] = layer
+
result = ad.VolumeCommands.find(self, document, request, offset, limit,
query, reply, order_by, group_by, **kwargs)
@@ -122,7 +130,14 @@ class NodeCommands(ad.VolumeCommands):
blobs = reply & self._blobs[document]
reply = list(reply - blobs)
+ if not reply:
+ reply = ['guid', 'layer']
+ else:
+ reply.append('layer')
+
result = ad.VolumeCommands.get(self, document, guid, request, reply)
+ enforce('deleted' not in result['layer'], ad.NotFound,
+ 'Document is not found')
if blobs:
self._mixin_blob(document, blobs, result)
diff --git a/sugar_network/resources/volume.py b/sugar_network/resources/volume.py
index 0f1f4ba..7344f5a 100644
--- a/sugar_network/resources/volume.py
+++ b/sugar_network/resources/volume.py
@@ -29,6 +29,11 @@ _logger = logging.getLogger('resources.volume')
class Resource(ad.Document):
+ @ad.active_property(prefix='RL', full_text=True, typecast=[],
+ default=['public'])
+ def layer(self, value):
+ return value
+
@ad.active_property(prefix='RA', full_text=True, default=[], typecast=[],
permissions=ad.ACCESS_READ)
def author(self, value):
@@ -58,6 +63,14 @@ class Volume(ad.SingleVolume):
document_classes = Volume.RESOURCES
ad.SingleVolume.__init__(self, root, document_classes, lazy_open)
+ def notify(self, event):
+ if event['event'] == 'update' and 'props' in event and \
+ 'deleted' in event['props'].get('layer', []):
+ event['event'] = 'delete'
+ del event['props']
+
+ ad.SingleVolume.notify(self, event)
+
def merge(self, record, increment_seqno=True):
coroutine.dispatch()
if record.get('content_type') == 'blob':
diff --git a/tests/units/node.py b/tests/units/node.py
index 4152ece..4ddae32 100755
--- a/tests/units/node.py
+++ b/tests/units/node.py
@@ -321,6 +321,25 @@ class NodeTest(tests.Test):
],
call(cp, method='GET', document='report', reply=['guid', 'data'])['result'])
+ def test_DeletedDocuments(self):
+ volume = Volume('db')
+ cp = NodeCommands(volume)
+
+ guid = call(cp, method='POST', document='context', principal='principal', content={
+ 'type': 'activity',
+ 'title': 'title1',
+ 'summary': 'summary',
+ 'description': 'description',
+ })
+
+ call(cp, method='GET', document='context', guid=guid)
+ self.assertNotEqual([], call(cp, method='GET', document='context')['result'])
+
+ volume['context'].update(guid, layer=['deleted'])
+
+ self.assertRaises(ad.NotFound, call, cp, method='GET', document='context', guid=guid)
+ self.assertEqual([], call(cp, method='GET', document='context')['result'])
+
def call(cp, principal=None, content=None, **kwargs):
request = ad.Request(**kwargs)
diff --git a/tests/units/volume.py b/tests/units/volume.py
index 98a73e0..a635b82 100755
--- a/tests/units/volume.py
+++ b/tests/units/volume.py
@@ -6,7 +6,7 @@ from __init__ import tests
import active_document as ad
from sugar_network.toolkit.collection import Sequence
from sugar_network.toolkit.sneakernet import InPacket, OutBufferPacket, DiskFull
-from sugar_network.resources.volume import Volume
+from sugar_network.resources.volume import Volume, Resource
class VolumeTest(tests.Test):
@@ -142,6 +142,24 @@ class VolumeTest(tests.Test):
],
read_packet(packet))
+ def test_SimulateDeleteEvents(self):
+
+ class Document(Resource):
+ pass
+
+ events = []
+ volume = Volume('db', [Document])
+ volume.connect(lambda event: events.append(event))
+
+ volume['document'].create(guid='guid')
+ del events[:]
+ volume['document'].update('guid', layer=['deleted'])
+
+ self.assertEqual([
+ {'event': 'delete', 'document': 'document', 'seqno': 2, 'guid': 'guid'},
+ ],
+ events)
+
def read_packet(packet):
result = []