Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar_network/db/routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'sugar_network/db/routes.py')
-rw-r--r--sugar_network/db/routes.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/sugar_network/db/routes.py b/sugar_network/db/routes.py
index 123e001..19ad26c 100644
--- a/sugar_network/db/routes.py
+++ b/sugar_network/db/routes.py
@@ -25,6 +25,7 @@ from contextlib import contextmanager
from os.path import exists
from sugar_network import toolkit
+from sugar_network.db.metadata import AggregatedType
from sugar_network.db.metadata import BlobProperty, StoredProperty, LIST_TYPES
from sugar_network.toolkit.router import Blob, ACL, route
from sugar_network.toolkit import http, enforce
@@ -114,6 +115,52 @@ class Routes(object):
def get_prop_meta(self, request, response):
self._prop_meta(request, response)
+ @route('POST', [None, None, None],
+ acl=ACL.AUTH, mime_type='application/json')
+ def insert_to_aggprop(self, request):
+ content = request.content or {}
+ enforce(isinstance(content, dict), http.BadRequest, 'Invalid value')
+
+ directory = self.volume[request.resource]
+ prop = directory.metadata[request.prop]
+
+ enforce(prop.typecast is AggregatedType, http.BadRequest,
+ 'Property is not aggregated')
+ prop.assert_access(ACL.INSERT)
+ self.on_aggprop_update(request, prop, None)
+
+ if request.principal:
+ authors = content['author'] = {}
+ self._useradd(authors, request.principal, ACL.ORIGINAL)
+ guid = content.pop('guid') if 'guid' in content else toolkit.uuid()
+ props = {request.prop: {guid: content}}
+ event = {}
+ self.on_update(request, props, event)
+ directory.update(request.guid, props, event)
+
+ return guid
+
+ @route('DELETE', [None, None, None, None],
+ acl=ACL.AUTH, mime_type='application/json')
+ def remove_from_aggprop(self, request):
+ directory = self.volume[request.resource]
+ doc = directory.get(request.guid)
+ prop = directory.metadata[request.prop]
+
+ enforce(prop.typecast is AggregatedType, http.BadRequest,
+ 'Property is not aggregated')
+ prop.assert_access(ACL.REMOVE)
+
+ guid = request.path[3]
+ enforce(guid in doc[request.prop], http.NotFound,
+ 'No such aggregated item')
+ self.on_aggprop_update(request, prop, doc[request.prop][guid])
+
+ props = {request.prop: {guid: {}}}
+ event = {}
+ self.on_update(request, props, event)
+ directory.update(request.guid, props, event)
+
@route('PUT', [None, None], cmd='useradd',
arguments={'role': 0}, acl=ACL.AUTH | ACL.AUTHOR)
def useradd(self, request, user, role):
@@ -145,6 +192,9 @@ class Routes(object):
def on_update(self, request, props, event):
props['mtime'] = int(time.time())
+ def on_aggprop_update(self, request, prop, value):
+ pass
+
def after_post(self, doc):
pass