Skip to content

Commit 40791e9

Browse files
authored
Merge pull request #22 from CodeTeam/validation_kwargs
validate accepts kwargs; item_id is passed to validate in ItemHandler…
2 parents 7ad524c + 70769f5 commit 40791e9

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

tcrudge/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
Supports JSON and MessagePack responses.
77
"""
88

9-
__version__ = "0.8.0"
9+
__version__ = "0.8.1"
1010

tcrudge/handlers.py

+26-20
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def write_error(self, status_code, **kwargs):
103103
self.write(getattr(exc_info[1], 'body', None))
104104
self.finish()
105105

106-
async def validate(self, data, schema):
106+
async def validate(self, data, schema, **kwargs):
107107
"""
108108
Method to validate parameters.
109109
Raises HTTPError(400) with error info for invalid data.
@@ -723,6 +723,10 @@ class ApiItemHandler(ApiHandler):
723723
Supports R, U, D from CRUDL.
724724
"""
725725

726+
def __init__(self, *args, **kwargs):
727+
super(ApiItemHandler, self).__init__(*args, **kwargs)
728+
self._instance = None
729+
726730
@property
727731
def get_schema_input(self):
728732
"""
@@ -782,28 +786,30 @@ def delete_schema_output(self): # pragma: no cover
782786
async def get_item(self, item_id):
783787
"""
784788
Fetches item from database by PK.
789+
Result is cached in self._instance for multiple calls
785790
786791
:raises: HTTP 404 if no item found.
787792
:returns: raw object if exists.
788793
:rtype: ORM model instance.
789794
"""
790-
try:
791-
return await self.application.objects.get(self.model_cls,
792-
**{
793-
self.model_cls._meta.primary_key.name: item_id})
794-
except (self.model_cls.DoesNotExist, ValueError) as e:
795-
raise HTTPError(
796-
404,
797-
body=self.get_response(
798-
errors=[
799-
{
800-
'code': '',
801-
'message': 'Item not found',
802-
'detail': str(e)
803-
}
804-
]
795+
if not self._instance:
796+
try:
797+
self._instance = await self.application.objects.get(self.model_cls,
798+
**{self.model_cls._meta.primary_key.name: item_id})
799+
except (self.model_cls.DoesNotExist, ValueError) as e:
800+
raise HTTPError(
801+
404,
802+
body=self.get_response(
803+
errors=[
804+
{
805+
'code': '',
806+
'message': 'Item not found',
807+
'detail': str(e)
808+
}
809+
]
810+
)
805811
)
806-
)
812+
return self._instance
807813

808814
async def get(self, item_id):
809815
"""
@@ -813,7 +819,7 @@ async def get(self, item_id):
813819
2. Writes serialized object of ORM model instance to response.
814820
"""
815821
await self.validate({k: self.get_argument(k) for k in self.request.query_arguments.keys()},
816-
self.get_schema_input)
822+
self.get_schema_input, item_id=item_id)
817823
item = await self.get_item(item_id)
818824

819825
self.response(result=await self.serialize(item))
@@ -835,7 +841,7 @@ async def put(self, item_id):
835841
"""
836842
item = await self.get_item(item_id)
837843

838-
data = await self.validate(self.request.body, self.put_schema_input)
844+
data = await self.validate(self.request.body, self.put_schema_input, item_id=item_id)
839845
try:
840846
item = await item._update(self.application, data)
841847
except AttributeError as e:
@@ -881,7 +887,7 @@ async def delete(self, item_id):
881887
:raises: HTTPError 405 if model object is not deletable.
882888
"""
883889
# DELETE usually does not have body to validate.
884-
await self.validate(self.request.body or {}, self.delete_schema_input)
890+
await self.validate(self.request.body or {}, self.delete_schema_input, item_id=item_id)
885891
item = await self.get_item(item_id)
886892
try:
887893
# We can only delete item if model method _delete() is implemented

0 commit comments

Comments
 (0)