Skip to content

Commit 9a677dc

Browse files
author
Marc
committed
Merge remote-tracking branch 'upstream/master'
# Conflicts: # rest_framework_docs/__init__.py # rest_framework_docs/api_endpoint.py # tests/tests.py
2 parents 27e5d8e + 411eb1f commit 9a677dc

File tree

10 files changed

+75
-20
lines changed

10 files changed

+75
-20
lines changed

.travis.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@ env:
1111
- DJANGO_VERSION=1.8
1212
- DJANGO_VERSION=1.9
1313

14+
cache:
15+
- pip
16+
- directories:
17+
- rest_framework_docs/static/node_modules/
18+
19+
before_install:
20+
- nvm install 5
21+
1422
install:
1523
- cd rest_framework_docs/static/ && npm install && cd ../../
1624
- pip install -r requirements.txt

codecov.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
coverage:
2+
precision: 2
3+
round: down
4+
range: "70...100"
5+
6+
status:
7+
project: false
8+
patch: false
9+
changes: false
10+
11+
comment: off

docs/changelog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ title: "Changelog"
33
source_filename: "changelog"
44
---
55

6+
### Release 0.0.10
7+
8+
- Use get_serializer_class for Views without serlaizer_class attribute [#92](https://github.com/ekonstantinidis/django-rest-framework-docs/pull/92)
9+
10+
611
### Release 0.0.9
712

813
- Support for more types of `ROOT_URLCONF`

docs/installation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ Finally include the `rest_framework_docs` urls in your `urls.py`:
2222
url(r'^docs/', include('rest_framework_docs.urls')),
2323
]
2424

25-
You can now visit [http://0.0.0.0:/8000/docs/](http://0.0.0.0:/8000/docs/) to view your Web API's docs.
25+
You can now visit [http://0.0.0.0:/8000/docs/](http://0.0.0.0:8000/docs/) to view your Web API's docs.

docs/templates.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ To hide the GitHub badge from the page, just override it with an empty block.
3636
{% block jumbotron %}
3737
<div class="jumbotron">
3838
<h1>Project Title</h1>
39-
<h3>Documentantion of the project 'Example'.</h3>
39+
<h3>Documentation of the project 'Example'.</h3>
4040
</div>
4141
{% endblock %}
4242

@@ -65,7 +65,7 @@ File location: `templates/rest_framework_docs/docs.html`
6565
{% block jumbotron %}
6666
<div class="jumbotron">
6767
<h1>'Project Name' Web API</h1>
68-
<h3>Documentantion of the 'Project Name' Web API.</h3>
68+
<h3>Documentation of the 'Project Name' Web API.</h3>
6969
</div>
7070
{% endblock %}
7171

rest_framework_docs/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = '0.0.9'
1+
__version__ = '0.0.10'
22

33
SERIALIZER_FIELDS = {}

rest_framework_docs/api_endpoint.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ def __init__(self, pattern, parent_pattern=None):
3535
self.path = self.__get_path__(parent_pattern)
3636
self.allowed_methods = self.__get_allowed_methods__()
3737
self.errors = None
38-
self.nb_recurse = 0
3938
self.fields = self.__get_serializer_fields__()
4039
self.fields_json = self.__get_serializer_fields_json__()
4140
self.permissions = self.__get_permissions_class__()
@@ -64,18 +63,20 @@ def __get_permissions_class__(self):
6463

6564
def __get_serializer_fields__(self):
6665
fields = []
66+
serializer = None
6767

68-
if hasattr(self.callback.cls, 'serializer_class') and hasattr(self.callback.cls.serializer_class, 'get_fields'):
68+
if hasattr(self.callback.cls, 'serializer_class'):
6969
serializer = self.callback.cls.serializer_class
70-
if hasattr(serializer, 'get_fields'):
71-
try:
72-
fields = self.__get_fields__(serializer)
73-
except KeyError as e:
74-
self.errors = e
75-
fields = []
76-
77-
# FIXME:
78-
# Show more attibutes of `field`?
70+
71+
elif hasattr(self.callback.cls, 'get_serializer_class'):
72+
serializer = self.callback.cls.get_serializer_class(self.pattern.callback.cls())
73+
74+
if hasattr(serializer, 'get_fields'):
75+
try:
76+
fields = self.__get_fields__(serializer)
77+
except KeyError as e:
78+
self.errors = e
79+
fields = []
7980

8081
return fields
8182

tests/tests.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,27 @@ def test_index_view_with_endpoints(self):
2828
response = self.client.get(reverse('drfdocs'))
2929

3030
self.assertEqual(response.status_code, 200)
31-
self.assertEqual(len(response.context["endpoints"]), 10)
31+
self.assertEqual(len(response.context["endpoints"]), 11)
3232

3333
# Test the login view
34+
self.assertEqual(response.context["endpoints"][0].name_parent, "accounts")
35+
self.assertEqual(response.context["endpoints"][0].allowed_methods, ['POST', 'OPTIONS'])
36+
self.assertEqual(response.context["endpoints"][0].path, "/accounts/login/")
37+
self.assertEqual(response.context["endpoints"][0].docstring, "A view that allows users to login providing their username and password.")
38+
self.assertEqual(len(response.context["endpoints"][0].fields), 2)
39+
self.assertEqual(response.context["endpoints"][0].fields[0]["type"], "CharField")
40+
self.assertTrue(response.context["endpoints"][0].fields[0]["required"])
41+
3442
self.assertEqual(response.context["endpoints"][1].name_parent, "accounts")
35-
self.assertEqual(response.context["endpoints"][1].allowed_methods, ['OPTIONS', 'POST'])
36-
self.assertEqual(response.context["endpoints"][1].path, "/accounts/login/")
37-
self.assertEqual(response.context["endpoints"][1].docstring, "A view that allows users to login providing their username and password.")
43+
self.assertEqual(response.context["endpoints"][1].allowed_methods, ['POST', 'OPTIONS'])
44+
self.assertEqual(response.context["endpoints"][1].path, "/accounts/login2/")
45+
self.assertEqual(response.context["endpoints"][1].docstring, "A view that allows users to login providing their username and password. Without serializer_class")
3846
self.assertEqual(len(response.context["endpoints"][1].fields), 2)
3947
self.assertEqual(response.context["endpoints"][1].fields[0]["type"], "CharField")
4048
self.assertTrue(response.context["endpoints"][1].fields[0]["required"])
4149

4250
# The view "OrganisationErroredView" (organisations/(?P<slug>[\w-]+)/errored/) should contain an error.
43-
self.assertEqual(str(response.context["endpoints"][7].errors), "'test_value'")
51+
self.assertEqual(str(response.context["endpoints"][9].errors), "'test_value'")
4452

4553
def test_index_search_with_endpoints(self):
4654
response = self.client.get("%s?search=reset-password" % reverse("drfdocs"))

tests/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
accounts_urls = [
99
url(r'^login/$', views.LoginView.as_view(), name="login"),
10+
url(r'^login2/$', views.LoginWithSerilaizerClassView.as_view(), name="login2"),
1011
url(r'^register/$', views.UserRegistrationView.as_view(), name="register"),
1112
url(r'^reset-password/$', view=views.PasswordResetView.as_view(), name="reset-password"),
1213
url(r'^reset-password/confirm/$', views.PasswordResetConfirmView.as_view(), name="reset-password-confirm"),

tests/views.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,24 @@ def delete(self, request, *args, **kwargs):
111111
class OrganisationErroredView(generics.ListAPIView):
112112

113113
serializer_class = serializers.OrganisationErroredSerializer
114+
115+
116+
class LoginWithSerilaizerClassView(APIView):
117+
"""
118+
A view that allows users to login providing their username and password. Without serializer_class
119+
"""
120+
121+
throttle_classes = ()
122+
permission_classes = ()
123+
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
124+
renderer_classes = (renderers.JSONRenderer,)
125+
126+
def post(self, request):
127+
serializer = self.serializer_class(data=request.data)
128+
serializer.is_valid(raise_exception=True)
129+
user = serializer.validated_data['user']
130+
token, created = Token.objects.get_or_create(user=user)
131+
return Response({'token': token.key})
132+
133+
def get_serializer_class(self):
134+
return AuthTokenSerializer

0 commit comments

Comments
 (0)