mirror of https://github.com/zulip/zulip.git
decorator: Add human_users_only decorator.
Applies it to presence.update_active_status_backend as an example of usage.
This commit is contained in:
parent
9400689f86
commit
e14c940ecc
|
@ -310,6 +310,16 @@ def add_logging_data(view_func):
|
||||||
return rate_limit()(view_func)(request, *args, **kwargs)
|
return rate_limit()(view_func)(request, *args, **kwargs)
|
||||||
return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927
|
return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927
|
||||||
|
|
||||||
|
def human_users_only(view_func):
|
||||||
|
# type: (ViewFuncT) -> ViewFuncT
|
||||||
|
@wraps(view_func)
|
||||||
|
def _wrapped_view_func(request, *args, **kwargs):
|
||||||
|
# type: (HttpRequest, *Any, **Any) -> HttpResponse
|
||||||
|
if request.user.is_bot:
|
||||||
|
return json_error(_("This endpoint does not accept bot requests."))
|
||||||
|
return view_func(request, *args, **kwargs)
|
||||||
|
return _wrapped_view_func # type: ignore # https://github.com/python/mypy/issues/1927
|
||||||
|
|
||||||
# Based on Django 1.8's @login_required
|
# Based on Django 1.8's @login_required
|
||||||
def zulip_login_required(function=None,
|
def zulip_login_required(function=None,
|
||||||
redirect_field_name=REDIRECT_FIELD_NAME,
|
redirect_field_name=REDIRECT_FIELD_NAME,
|
||||||
|
|
|
@ -889,6 +889,16 @@ class TestInternalNotifyView(TestCase):
|
||||||
self.assertTrue(is_local_addr('::1'))
|
self.assertTrue(is_local_addr('::1'))
|
||||||
self.assertFalse(is_local_addr('42.43.44.45'))
|
self.assertFalse(is_local_addr('42.43.44.45'))
|
||||||
|
|
||||||
|
class TestHumanUsersOnlyDecorator(ZulipTestCase):
|
||||||
|
def test_human_only_endpoints(self):
|
||||||
|
# type: () -> None
|
||||||
|
endpoints = [
|
||||||
|
"/api/v1/users/me/presence",
|
||||||
|
]
|
||||||
|
for endpoint in endpoints:
|
||||||
|
result = self.client_post(endpoint, **self.api_auth('default-bot@zulip.com'))
|
||||||
|
self.assert_json_error(result, "This endpoint does not accept bot requests.")
|
||||||
|
|
||||||
class TestAuthenticatedJsonPostViewDecorator(ZulipTestCase):
|
class TestAuthenticatedJsonPostViewDecorator(ZulipTestCase):
|
||||||
def test_authenticated_json_post_view_if_everything_is_correct(self):
|
def test_authenticated_json_post_view_if_everything_is_correct(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
|
|
|
@ -264,12 +264,6 @@ class SingleUserPresenceTests(ZulipTestCase):
|
||||||
result = self.client_post("/json/users/me/presence", req)
|
result = self.client_post("/json/users/me/presence", req)
|
||||||
self.assertEqual(result.json()['msg'], '')
|
self.assertEqual(result.json()['msg'], '')
|
||||||
|
|
||||||
def test_bot_post(self):
|
|
||||||
# type: () -> None
|
|
||||||
result = self.client_post("/api/v1/users/me/presence", {'status': 'active'},
|
|
||||||
**self.api_auth('default-bot@zulip.com'))
|
|
||||||
self.assert_json_error(result, "Presence is not supported for bot users.")
|
|
||||||
|
|
||||||
class UserPresenceAggregationTests(ZulipTestCase):
|
class UserPresenceAggregationTests(ZulipTestCase):
|
||||||
def _send_presence_for_aggregated_tests(self, email, status, validate_time):
|
def _send_presence_for_aggregated_tests(self, email, status, validate_time):
|
||||||
# type: (str, str, datetime.datetime) -> Dict[str, Dict[str, Any]]
|
# type: (str, str, datetime.datetime) -> Dict[str, Dict[str, Any]]
|
||||||
|
|
|
@ -10,7 +10,7 @@ from django.http import HttpRequest, HttpResponse
|
||||||
from django.utils.timezone import now as timezone_now
|
from django.utils.timezone import now as timezone_now
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
from zerver.decorator import authenticated_json_post_view
|
from zerver.decorator import authenticated_json_post_view, human_users_only
|
||||||
from zerver.lib.actions import get_status_dict, update_user_presence
|
from zerver.lib.actions import get_status_dict, update_user_presence
|
||||||
from zerver.lib.request import has_request_variables, REQ, JsonableError
|
from zerver.lib.request import has_request_variables, REQ, JsonableError
|
||||||
from zerver.lib.response import json_success, json_error
|
from zerver.lib.response import json_success, json_error
|
||||||
|
@ -52,14 +52,12 @@ def get_presence_backend(request, user_profile, email):
|
||||||
val.pop('pushable', None)
|
val.pop('pushable', None)
|
||||||
return json_success(result)
|
return json_success(result)
|
||||||
|
|
||||||
|
@human_users_only
|
||||||
@has_request_variables
|
@has_request_variables
|
||||||
def update_active_status_backend(request, user_profile, status=REQ(),
|
def update_active_status_backend(request, user_profile, status=REQ(),
|
||||||
ping_only=REQ(validator=check_bool, default=False),
|
ping_only=REQ(validator=check_bool, default=False),
|
||||||
new_user_input=REQ(validator=check_bool, default=False)):
|
new_user_input=REQ(validator=check_bool, default=False)):
|
||||||
# type: (HttpRequest, UserProfile, str, bool, bool) -> HttpResponse
|
# type: (HttpRequest, UserProfile, str, bool, bool) -> HttpResponse
|
||||||
if user_profile.is_bot:
|
|
||||||
return json_error(_('Presence is not supported for bot users.'))
|
|
||||||
|
|
||||||
status_val = UserPresence.status_from_string(status)
|
status_val = UserPresence.status_from_string(status)
|
||||||
if status_val is None:
|
if status_val is None:
|
||||||
raise JsonableError(_("Invalid status: %s") % (status,))
|
raise JsonableError(_("Invalid status: %s") % (status,))
|
||||||
|
|
Loading…
Reference in New Issue