[Kimchi-devel] [PATCH V2] Issue #737: Fix to remove twice calls of resource lookup on GET OPERATION
archus at linux.vnet.ibm.com
archus at linux.vnet.ibm.com
Tue Nov 3 18:54:33 UTC 2015
From: Archana Singh <archus at linux.vnet.ibm.com>
Incase of GET lookup was called twice.
Once lookup() before is_authorized() and then in self.get().
This added overhead to system when lookup() is called
for each value in list from get_list() of Collection.
So to avoid this overhead, lookup() should not be called
before self.get().
1) Added lookup() call from Resource's update(), delete().
2) Removed lookup() call from Resource's index().
2) As is_authorized() calls self.data which calls self.info.
Added check to make sure that self.data only get called
if self.info is not None. And intialized self.info as None
in __init__. As its value is getting assigned in lookup().
3) In _generate_action_handler_base(), lookup() was getting
called before is_authorized(), move its call after is_authorized().
---
src/wok/control/base.py | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/wok/control/base.py b/src/wok/control/base.py
index 638e196..4f25ac9 100644
--- a/src/wok/control/base.py
+++ b/src/wok/control/base.py
@@ -58,6 +58,7 @@ class Resource(object):
self.model_args = (ident,)
self.role_key = None
self.admin_methods = []
+ self.info = None
def _redirect(self, action_result, code=303):
if isinstance(action_result, list):
@@ -102,10 +103,9 @@ class Resource(object):
def wrapper(*args, **kwargs):
validate_method(('POST'), self.role_key, self.admin_methods)
try:
- self.lookup()
if not self.is_authorized():
raise UnauthorizedError('WOKAPI0009E')
-
+ self.lookup()
model_args = list(self.model_args)
if action_args is not None:
request = parse_request()
@@ -145,6 +145,7 @@ class Resource(object):
def delete(self):
try:
+ self.lookup()
fn = getattr(self.model, model_fn(self, 'delete'))
fn(*self.model_args)
cherrypy.response.status = 204
@@ -163,10 +164,8 @@ class Resource(object):
self.role_key, self.admin_methods)
try:
- self.lookup()
if not self.is_authorized():
raise UnauthorizedError('WOKAPI0009E')
-
return {'GET': self.get,
'DELETE': self.delete,
'PUT': self.update}[method](*args, **kargs)
@@ -188,8 +187,12 @@ class Resource(object):
user_groups = cherrypy.session.get(USER_GROUPS, [])
user_role = cherrypy.session.get(USER_ROLES, {}).get(self.role_key)
- users = self.data.get("users", None)
- groups = self.data.get("groups", None)
+ users = None
+ groups = None
+
+ if self.info:
+ users = self.data.get("users", None)
+ groups = self.data.get("groups", None)
if (users is None and groups is None) or user_role == 'admin':
return True
@@ -198,6 +201,7 @@ class Resource(object):
def update(self, *args, **kargs):
try:
+ self.lookup()
update = getattr(self.model, model_fn(self, 'update'))
except AttributeError:
e = InvalidOperation('WOKAPI0003E', {'resource':
--
2.1.4
More information about the Kimchi-devel
mailing list