mirror of
https://github.com/zulip/zulip.git
synced 2025-11-07 15:33:30 +00:00
Annotate debug.py, initial_password.py, narrow.py, response.py.
Also, fixed up the annotations for tornadoviews to better align with how narrows was defined as `Iterable[Sequence[str]]` rather than `List[Tuple[str, str]]`.
This commit is contained in:
@@ -3,10 +3,12 @@ import codecs
|
||||
import hashlib
|
||||
import hmac
|
||||
|
||||
from six import text_type
|
||||
|
||||
# Encodes the provided URL using the same algorithm used by the camo
|
||||
# caching https image proxy
|
||||
def get_camo_url(url):
|
||||
# type: (str) -> str
|
||||
# type: (text_type) -> text_type
|
||||
# Only encode the url if Camo is enabled
|
||||
if settings.CAMO_URI == '':
|
||||
return url
|
||||
|
||||
@@ -4,12 +4,17 @@ import code
|
||||
import traceback
|
||||
import signal
|
||||
|
||||
from types import FrameType
|
||||
|
||||
from typing import Optional
|
||||
|
||||
# Interactive debugging code from
|
||||
# http://stackoverflow.com/questions/132058/showing-the-stack-trace-from-a-running-python-application
|
||||
# (that link also points to code for an interactive remote debugger
|
||||
# setup, which we might want if we move Tornado to run in a daemon
|
||||
# rather than via screen).
|
||||
def interactive_debug(sig, frame):
|
||||
# type: (int, Optional[FrameType]) -> None
|
||||
"""Interrupt running process, and provide a python prompt for
|
||||
interactive debugging."""
|
||||
d = {'_frame': frame} # Allow access to frame object.
|
||||
@@ -24,5 +29,6 @@ def interactive_debug(sig, frame):
|
||||
# SIGUSR1 => Just print the stack
|
||||
# SIGUSR2 => Print stack + open interactive debugging shell
|
||||
def interactive_debug_listen():
|
||||
# type: () -> None
|
||||
signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))
|
||||
signal.signal(signal.SIGUSR2, interactive_debug)
|
||||
|
||||
@@ -5,7 +5,12 @@ from django.conf import settings
|
||||
import hashlib
|
||||
import base64
|
||||
|
||||
from typing import Optional
|
||||
from six import text_type
|
||||
|
||||
|
||||
def initial_password(email):
|
||||
# type: (text_type) -> Optional[text_type]
|
||||
"""Given an email address, returns the initial password for that account, as
|
||||
created by populate_db."""
|
||||
|
||||
|
||||
@@ -1,14 +1,19 @@
|
||||
from zerver.lib.request import JsonableError
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from typing import Iterable, Sequence, Callable, Dict
|
||||
from six import text_type
|
||||
|
||||
|
||||
def check_supported_events_narrow_filter(narrow):
|
||||
# type: (Iterable[Sequence[text_type]]) -> None
|
||||
for element in narrow:
|
||||
operator = element[0]
|
||||
if operator not in ["stream", "topic", "sender", "is"]:
|
||||
raise JsonableError(_("Operator %s not supported.") % (operator,))
|
||||
|
||||
def build_narrow_filter(narrow):
|
||||
# type: (Iterable[Sequence[text_type]]) -> Callable[[Dict[text_type, text_type]], bool]
|
||||
check_supported_events_narrow_filter(narrow)
|
||||
def narrow_filter(event):
|
||||
message = event["message"]
|
||||
|
||||
@@ -3,20 +3,27 @@ from __future__ import absolute_import
|
||||
from django.http import HttpResponse, HttpResponseNotAllowed
|
||||
import ujson
|
||||
|
||||
from typing import Optional, Any, Dict, List
|
||||
from six import text_type
|
||||
|
||||
|
||||
class HttpResponseUnauthorized(HttpResponse):
|
||||
status_code = 401
|
||||
|
||||
def __init__(self, realm):
|
||||
# type (text_type) -> None
|
||||
HttpResponse.__init__(self)
|
||||
self["WWW-Authenticate"] = 'Basic realm="%s"' % (realm,)
|
||||
|
||||
def json_unauthorized(message):
|
||||
# type: (text_type) -> text_type
|
||||
resp = HttpResponseUnauthorized("zulip")
|
||||
resp.content = ujson.dumps({"result": "error",
|
||||
"msg": message}) + "\n"
|
||||
return resp
|
||||
|
||||
def json_method_not_allowed(methods):
|
||||
# type: (List[text_type]) -> text_type
|
||||
resp = HttpResponseNotAllowed(methods)
|
||||
resp.content = ujson.dumps({"result": "error",
|
||||
"msg": "Method Not Allowed",
|
||||
@@ -24,6 +31,7 @@ def json_method_not_allowed(methods):
|
||||
return resp
|
||||
|
||||
def json_response(res_type="success", msg="", data=None, status=200):
|
||||
# type: (text_type, text_type, Optional[Dict[str, Any]], int) -> HttpResponse
|
||||
content = {"result": res_type, "msg": msg}
|
||||
if data is not None:
|
||||
content.update(data)
|
||||
@@ -31,10 +39,13 @@ def json_response(res_type="success", msg="", data=None, status=200):
|
||||
content_type='application/json', status=status)
|
||||
|
||||
def json_success(data=None):
|
||||
# type: (Optional[Dict[str, Any]]) -> HttpResponse
|
||||
return json_response(data=data)
|
||||
|
||||
def json_error(msg, data=None, status=400):
|
||||
# type: (str, Optional[Dict[str, Any]], int) -> HttpResponse
|
||||
return json_response(res_type="error", msg=msg, data=data, status=status)
|
||||
|
||||
def json_unhandled_exception():
|
||||
# type: () -> HttpResponse
|
||||
return json_response(res_type="error", msg="Internal server error", status=500)
|
||||
|
||||
@@ -4,9 +4,11 @@ from django.contrib.auth import SESSION_KEY, get_user_model
|
||||
from django.contrib.sessions.models import Session
|
||||
|
||||
from typing import Dict, Optional
|
||||
from six import text_type
|
||||
|
||||
|
||||
def get_session_dict_user(session_dict):
|
||||
# type: (Dict[str, int]) -> Optional[int]
|
||||
# type: (Dict[text_type, int]) -> Optional[int]
|
||||
# Compare django.contrib.auth._get_user_session_key
|
||||
try:
|
||||
return get_user_model()._meta.pk.to_python(session_dict[SESSION_KEY])
|
||||
|
||||
@@ -4,6 +4,8 @@ from django.utils.translation import ugettext as _
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from six import text_type
|
||||
|
||||
from zerver.models import get_client, UserProfile, Client
|
||||
|
||||
from zerver.decorator import asynchronous, \
|
||||
@@ -18,7 +20,7 @@ from zerver.lib.event_queue import allocate_client_descriptor, get_client_descri
|
||||
from zerver.lib.handlers import allocate_handler_id
|
||||
from zerver.lib.narrow import check_supported_events_narrow_filter
|
||||
|
||||
from typing import Union, Optional, Tuple, List, Any
|
||||
from typing import Union, Optional, Iterable, Sequence, List, Any
|
||||
import time
|
||||
import ujson
|
||||
import logging
|
||||
@@ -34,7 +36,7 @@ def notify(request):
|
||||
|
||||
@has_request_variables
|
||||
def cleanup_event_queue(request, user_profile, queue_id=REQ()):
|
||||
# type: (HttpRequest, UserProfile, str) -> HttpResponse
|
||||
# type: (HttpRequest, UserProfile, text_type) -> HttpResponse
|
||||
client = get_client_descriptor(queue_id)
|
||||
if client is None:
|
||||
return json_error(_("Bad event queue id: %s") % (queue_id,))
|
||||
@@ -61,7 +63,7 @@ def get_events_backend(request, user_profile, handler,
|
||||
dont_block = REQ(default=False, validator=check_bool),
|
||||
narrow = REQ(default=[], validator=check_list(None)),
|
||||
lifespan_secs = REQ(default=0, converter=int)):
|
||||
# type: (HttpRequest, UserProfile, Any, Optional[Client], Optional[int], Optional[List[str]], bool, bool, Optional[str], bool, List[Tuple[str, str]], int) -> Union[HttpResponse, _RespondAsynchronously]
|
||||
# type: (HttpRequest, UserProfile, Any, Optional[Client], Optional[int], Optional[List[text_type]], bool, bool, Optional[text_type], bool, Iterable[Sequence[text_type]], int) -> Union[HttpResponse, _RespondAsynchronously]
|
||||
if user_client is None:
|
||||
user_client = request.client
|
||||
|
||||
|
||||
Reference in New Issue
Block a user