from __future__ import absolute_import from typing import Optional, Any, Dict from collections import OrderedDict from django.views.generic import TemplateView from django.conf import settings from django.http import HttpRequest, HttpResponse import ujson from zerver.lib import bugdown from zerver.lib.integrations import INTEGRATIONS from zerver.lib.utils import get_subdomain from zproject.jinja2 import render_to_response def add_api_uri_context(context, request): # type: (Dict[str, Any], HttpRequest) -> None if settings.REALMS_HAVE_SUBDOMAINS: subdomain = get_subdomain(request) if subdomain: display_subdomain = subdomain html_settings_links = True else: display_subdomain = 'yourZulipDomain' html_settings_links = False external_api_path_subdomain = '%s.%s' % (display_subdomain, settings.EXTERNAL_API_PATH) else: external_api_path_subdomain = settings.EXTERNAL_API_PATH html_settings_links = True external_api_uri_subdomain = '%s%s' % (settings.EXTERNAL_URI_SCHEME, external_api_path_subdomain) context['external_api_path_subdomain'] = external_api_path_subdomain context['external_api_uri_subdomain'] = external_api_uri_subdomain context["html_settings_links"] = html_settings_links class ApiURLView(TemplateView): def get_context_data(self, **kwargs): # type: (Optional[Dict[str, Any]]) -> Dict[str, str] context = super(ApiURLView, self).get_context_data(**kwargs) add_api_uri_context(context, self.request) return context class APIView(ApiURLView): template_name = 'zerver/api.html' class IntegrationView(ApiURLView): template_name = 'zerver/integrations.html' def get_context_data(self, **kwargs): # type: (Optional[Dict[str, Any]]) -> Dict[str, Any] context = super(IntegrationView, self).get_context_data(**kwargs) # type: Dict[str, Any] alphabetical_sorted_integration = OrderedDict(sorted(INTEGRATIONS.items())) context['integrations_dict'] = alphabetical_sorted_integration if context["html_settings_links"]: settings_html = 'Zulip settings page' subscriptions_html = 'subscriptions page' else: settings_html = 'Zulip settings page' subscriptions_html = 'subscriptions page' context['settings_html'] = settings_html context['subscriptions_html'] = subscriptions_html return context def api_endpoint_docs(request): # type: (HttpRequest) -> HttpResponse context = {} # type: Dict[str, Any] add_api_uri_context(context, request) raw_calls = open('templates/zerver/api_content.json', 'r').read() calls = ujson.loads(raw_calls) langs = set() for call in calls: call["endpoint"] = "%s/v1/%s" % (context["external_api_uri_subdomain"], call["endpoint"]) call["example_request"]["curl"] = call["example_request"]["curl"].replace("https://api.zulip.com", context["external_api_uri_subdomain"]) response = call['example_response'] if '\n' not in response: # For 1-line responses, pretty-print them extended_response = response.replace(", ", ",\n ") else: extended_response = response call['rendered_response'] = bugdown.convert("~~~ .py\n" + extended_response + "\n~~~\n", "default") for example_type in ('request', 'response'): for lang in call.get('example_' + example_type, []): langs.add(lang) return render_to_response( 'zerver/api_endpoints.html', { 'content': calls, 'langs': langs, }, request=request)