diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-09-15 06:21:25 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-09-15 06:21:25 (GMT) |
commit | 105b730aa27977769375e6c09c50d7141eae0df2 (patch) | |
tree | df1e819727ce6b53a16f8ee4ac42188d189616cf | |
parent | 9d6db29ec91652e7a58b86006fba01d67a23eff3 (diff) |
Move "layer" property from library level
-rw-r--r-- | sugar_network/node/commands.py | 15 | ||||
-rw-r--r-- | sugar_network/resources/volume.py | 13 | ||||
-rwxr-xr-x | tests/units/node.py | 19 | ||||
-rwxr-xr-x | tests/units/volume.py | 20 |
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 = [] |