Skip to content

Commit e1fbd92

Browse files
author
Dmitry Berezovsky
committed
Fixed related field validation and serialization
1 parent 49894e8 commit e1fbd92

File tree

8 files changed

+73
-12
lines changed

8 files changed

+73
-12
lines changed

README.rst README.MD

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
1-
==================
21
Django API commons
32
==================
43

54
Common library for building django based web api applications
65

7-
``````````````````````
8-
Development procedures
9-
``````````````````````
6+
7+
## Development procedures
108

119
Ensure that all python sources contain license notice:
12-
::
10+
11+
```
1312
./development/copyright-update
13+
```
1414

1515
Building distribution package:
1616

17-
::
17+
```
1818
./build.sh clean build
19+
```
1920

2021
Uploading package to PyPi:
2122

22-
::
23-
./build.sh publish
23+
```
24+
./build.sh publish
25+
```

api_commons/dto.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
from collections import Iterable
2525
from django.conf import settings
26+
from rest_framework.exceptions import ValidationError
2627
from rest_framework.fields import empty, Field
2728
from rest_framework.serializers import Serializer
2829

@@ -112,13 +113,22 @@ def __init__(self, dto_class, required: bool = None, default=empty, initial=empt
112113
self.dto_class = dto_class
113114

114115
def to_representation(self, instance: BaseDto):
115-
return instance.to_dict()
116+
if isinstance(instance, BaseDto):
117+
return instance.to_dict()
118+
elif isinstance(instance, dict):
119+
return instance
120+
else:
121+
raise ValueError("Unexpected value passed to to_representation method. " + str(instance))
116122

117123
def to_internal_value(self, data: dict):
118124
dto = self.dto_class.from_dict(data)
119125
dto.is_valid()
120126
return dto
121127

128+
def run_validators(self, value):
129+
if not value.is_valid():
130+
raise ValidationError(value.errors)
131+
122132

123133
class PaginationOptions(object):
124134
""" Pagination options class, has offset and limit parameters."""

example_service/api/hierarchy/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from django.http import HttpRequest
2+
3+
from api_commons.decorator import inject_dto
4+
from example_service.api import errors
5+
from api_commons.common import ApiResponse
6+
from example_service.api.calculator.dto import CalculationRequestDto, CalculationResultDto
7+
from example_service.api.common import ExampleController
8+
from example_service.api.hierarchy.dto import ParentDto
9+
from example_service.core.services import CalculationService
10+
11+
12+
class HierarchyController(ExampleController):
13+
def get(self, request: HttpRequest):
14+
return ApiResponse.not_found(errors.NOT_SUPPORTED)
15+
16+
@inject_dto(ParentDto)
17+
def post(self, request: HttpRequest, dto: ParentDto):
18+
if not dto.is_valid():
19+
return ApiResponse.bad_request(dto)
20+
return ApiResponse.success(dto)

example_service/api/hierarchy/dto.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from rest_framework import serializers
2+
3+
from api_commons.dto import BaseDto, RelatedDtoField
4+
5+
6+
def child_validator(value):
7+
try:
8+
int(value)
9+
except ValueError:
10+
raise serializers.ValidationError("Should be integer")
11+
12+
13+
class ChildDto(BaseDto):
14+
child_param_1 = serializers.CharField(required=True, validators=[child_validator])
15+
16+
17+
class ParentDto(BaseDto):
18+
param_1 = serializers.CharField(required=True, validators=[child_validator])
19+
child = RelatedDtoField(ChildDto, required=False)

example_service/api/hierarchy/urls.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.conf.urls import url
2+
3+
from .controllers import *
4+
5+
urlpatterns = [
6+
url(r'^$', HierarchyController.as_view()),
7+
]

example_service/api/urls.py

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
urlpatterns = [
66
url(r'^ping/?', include('api.ping.urls')),
77
url(r'^calc/?', include('api.calculator.urls')),
8+
url(r'^hierarchy/?', include('api.hierarchy.urls')),
89
]
910

1011
handler404 = api_commons.common.error_404_handler

setup.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
from codecs import open
88
from os import path
99

10-
version = "1.0.4"
10+
version = "1.0.5"
1111
root_dir = path.abspath(path.dirname(__file__))
1212
src_dir = root_dir
1313
# Get the long description from the README file
14-
with open(path.join(root_dir, 'README.rst'), encoding='utf-8') as f:
15-
long_description = f.read()
14+
with open(path.join(root_dir, 'README.MD'), encoding='utf-8') as f:
15+
# long_description = f.read()
16+
long_description = '''Common library for building django based web api applications'''
1617

1718
setup(
1819
name='django_api_commons',
@@ -21,6 +22,7 @@
2122
version=version,
2223
description='Common library for building django based web api applications',
2324
long_description=long_description,
25+
long_description_content_type="text/markdown",
2426
url='https://github.com/Logicify/python-api',
2527
keywords='django webservices api rest djangorestframework json jsonapi',
2628

0 commit comments

Comments
 (0)