Skip to content

Commit

Permalink
fix: send document obj to detail perform_ methods
Browse files Browse the repository at this point in the history
  • Loading branch information
joaodaher committed Jun 23, 2021
1 parent 41b3587 commit ceac812
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions sanic_rest/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,18 @@ def _parse_pk(self, pk: str):
except ValueError as e:
raise exceptions.ValidationError(f"{pk_field_name} field must be {pk_field_type.__name__}") from e

def get_model(self, pk: str, query_filters: Dict = None) -> Document:
query_filters = query_filters or {}
try:
return self.model.documents.get(id=self._parse_pk(pk=pk), **query_filters)
except DoesNotExist as e:
raise exceptions.NotFoundError() from e

async def get(self, request: Request, pk: str) -> HTTPResponse:
current_obj = self.get_model(pk=pk)

try:
obj = await self.perform_get(pk=self._parse_pk(pk=pk), query_filters={})
obj = await self.perform_get(obj=current_obj, query_filters={})
except DoesNotExist as e:
raise exceptions.NotFoundError() from e
except ValidationError as e:
Expand All @@ -161,42 +170,46 @@ async def get(self, request: Request, pk: str) -> HTTPResponse:
data = obj.serialize()
return json(data, 200)

async def perform_get(self, pk: str, query_filters) -> Document:
return self.model.documents.get(id=pk, **query_filters)
async def perform_get(self, obj: Document, query_filters) -> Document:
return obj

async def put(self, request: Request, pk: str) -> HTTPResponse:
current_obj = self.get_model(pk=pk)

payload = request.json
self.validate(data=payload, partial=True)

try:
obj = await self.perform_create(pk=pk, data=payload)
obj = await self.perform_create(obj=current_obj, data=payload)
except ValidationError as e:
raise exceptions.ValidationError(message=str(e))

data = obj.serialize()
return json(data, 200)

async def perform_create(self, pk: str, data: PayloadType) -> Document:
obj = self.model.deserialize(**data)
async def perform_create(self, obj: Document, data: PayloadType) -> Document:
obj = self.model.deserialize(pk=obj.pk, **data)
return obj.save()

async def patch(self, request: Request, pk: str) -> HTTPResponse:
current_obj = self.get_model(pk=pk)

if request.files:
payload = {}
else:
payload = request.json
self.validate(data=payload, partial=True)

try:
obj = await self.perform_update(pk=self._parse_pk(pk=pk), data=payload, files=request.files)
obj = await self.perform_update(obj=current_obj, data=payload, files=request.files)
except ValidationError as e:
raise exceptions.ValidationError(message=str(e))

data = obj.serialize()
return json(data, 200)

async def perform_update(self, pk: str, data: PayloadType, files: RequestParameters) -> Document:
obj = self.model.documents.update(pk=pk, **data)
async def perform_update(self, obj: Document, data: PayloadType, files: RequestParameters) -> Document:
obj = self.model.documents.update(pk=obj.pk, **data)

file_updates: Dict[str, Any] = defaultdict(list)
for key, file in files.items():
Expand All @@ -210,7 +223,7 @@ async def perform_update(self, pk: str, data: PayloadType, files: RequestParamet
else:
key = key.split('__')[0]
file_updates[key].append(filepath)
obj = self.model.documents.update(pk=pk, **file_updates)
obj = self.model.documents.update(pk=obj.pk, **file_updates)

return obj

Expand Down

0 comments on commit ceac812

Please sign in to comment.