Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
course-discovery
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
course-discovery
Commits
4dfdb658
Commit
4dfdb658
authored
Apr 22, 2016
by
Clinton Blackburn
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #80 from edx/clintonb/api-docs-update
Requiring login for API docs
parents
2f2cb5a5
698763d8
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
63 additions
and
8 deletions
+63
-8
course_discovery/apps/api/tests/test_views.py
+31
-0
course_discovery/apps/api/views.py
+25
-0
course_discovery/apps/core/tests/test_throttles.py
+0
-5
course_discovery/apps/core/throttles.py
+5
-3
course_discovery/settings/base.py
+2
-0
No files found.
course_discovery/apps/api/tests/test_views.py
0 → 100644
View file @
4dfdb658
import
ddt
from
django.contrib.auth.models
import
AnonymousUser
from
django.core.exceptions
import
PermissionDenied
from
django.core.urlresolvers
import
reverse
from
django.test
import
TestCase
,
RequestFactory
from
course_discovery.apps.api.views
import
api_docs_permission_denied_handler
from
course_discovery.apps.core.tests.factories
import
UserFactory
@ddt.ddt
class
ApiDocsPermissionDeniedHandlerTests
(
TestCase
):
def
setUp
(
self
):
super
(
ApiDocsPermissionDeniedHandlerTests
,
self
)
.
setUp
()
self
.
request_path
=
'/'
self
.
request
=
RequestFactory
()
.
get
(
self
.
request_path
)
def
test_authenticated
(
self
):
""" Verify the view raises `PermissionDenied` if the request is authenticated. """
user
=
UserFactory
()
self
.
request
.
user
=
user
self
.
assertRaises
(
PermissionDenied
,
api_docs_permission_denied_handler
,
self
.
request
)
@ddt.data
(
None
,
AnonymousUser
())
def
test_not_authenticated
(
self
,
user
):
""" Verify the view redirects to the login page if the request is not authenticated. """
self
.
request
.
user
=
user
response
=
api_docs_permission_denied_handler
(
self
.
request
)
expected_url
=
'{path}?next={next}'
.
format
(
path
=
reverse
(
'login'
),
next
=
self
.
request_path
)
self
.
assertEqual
(
response
.
status_code
,
302
)
self
.
assertEqual
(
response
.
url
,
expected_url
)
course_discovery/apps/api/views.py
0 → 100644
View file @
4dfdb658
from
django.core.exceptions
import
PermissionDenied
from
django.core.urlresolvers
import
reverse
from
django.shortcuts
import
redirect
from
django.utils.translation
import
ugettext
as
_
def
api_docs_permission_denied_handler
(
request
):
"""
Permission denied handler for calls to the API documentation.
Args:
request (Request): Original request to the view the documentation
Raises:
PermissionDenied: The user is not authorized to view the API documentation.
Returns:
HttpResponseRedirect: Redirect to the login page if the user is not logged in. After a
successful login, the user will be redirected back to the original path.
"""
if
request
.
user
and
request
.
user
.
is_authenticated
():
raise
PermissionDenied
(
_
(
'You are not permitted to access the API documentation.'
))
login_url
=
'{path}?next={next}'
.
format
(
path
=
reverse
(
'login'
),
next
=
request
.
path
)
return
redirect
(
login_url
,
permanent
=
False
)
course_discovery/apps/core/tests/test_throttles.py
View file @
4dfdb658
from
django.core.cache
import
cache
from
django.core.cache
import
cache
from
django.core.urlresolvers
import
reverse
from
django.core.urlresolvers
import
reverse
from
rest_framework.test
import
APITestCase
from
rest_framework.test
import
APITestCase
from
course_discovery.apps.core.models
import
UserThrottleRate
from
course_discovery.apps.core.models
import
UserThrottleRate
...
@@ -48,7 +47,3 @@ class RateLimitingTest(APITestCase):
...
@@ -48,7 +47,3 @@ class RateLimitingTest(APITestCase):
self
.
user
.
save
()
self
.
user
.
save
()
response
=
self
.
_make_requests
()
response
=
self
.
_make_requests
()
self
.
assertEqual
(
response
.
status_code
,
200
)
self
.
assertEqual
(
response
.
status_code
,
200
)
def
test_anonymous_throttling
(
self
):
self
.
client
.
logout
()
self
.
test_rate_limiting
()
course_discovery/apps/core/throttles.py
View file @
4dfdb658
...
@@ -9,9 +9,10 @@ class OverridableUserRateThrottle(UserRateThrottle):
...
@@ -9,9 +9,10 @@ class OverridableUserRateThrottle(UserRateThrottle):
def
allow_request
(
self
,
request
,
view
):
def
allow_request
(
self
,
request
,
view
):
user
=
request
.
user
user
=
request
.
user
if
user
.
is_superuser
:
return
True
if
user
and
user
.
is_authenticated
():
if
not
user
.
is_anonymous
():
if
user
.
is_superuser
:
return
True
try
:
try
:
# Override this throttle's rate if applicable
# Override this throttle's rate if applicable
user_throttle
=
UserThrottleRate
.
objects
.
get
(
user
=
user
)
user_throttle
=
UserThrottleRate
.
objects
.
get
(
user
=
user
)
...
@@ -19,4 +20,5 @@ class OverridableUserRateThrottle(UserRateThrottle):
...
@@ -19,4 +20,5 @@ class OverridableUserRateThrottle(UserRateThrottle):
self
.
num_requests
,
self
.
duration
=
self
.
parse_rate
(
self
.
rate
)
self
.
num_requests
,
self
.
duration
=
self
.
parse_rate
(
self
.
rate
)
except
UserThrottleRate
.
DoesNotExist
:
except
UserThrottleRate
.
DoesNotExist
:
pass
pass
return
super
(
OverridableUserRateThrottle
,
self
)
.
allow_request
(
request
,
view
)
return
super
(
OverridableUserRateThrottle
,
self
)
.
allow_request
(
request
,
view
)
course_discovery/settings/base.py
View file @
4dfdb658
...
@@ -294,6 +294,8 @@ JWT_AUTH = {
...
@@ -294,6 +294,8 @@ JWT_AUTH = {
SWAGGER_SETTINGS
=
{
SWAGGER_SETTINGS
=
{
'api_version'
:
'v1'
,
'api_version'
:
'v1'
,
'doc_expansion'
:
'list'
,
'doc_expansion'
:
'list'
,
'is_authenticated'
:
True
,
'permission_denied_handler'
:
'course_discovery.apps.api.views.api_docs_permission_denied_handler'
}
}
ELASTICSEARCH_URL
=
'http://127.0.0.1:9200/'
ELASTICSEARCH_URL
=
'http://127.0.0.1:9200/'
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment