zulip/zproject/dev_urls.py
Anders Kaseorg 463929f349 urls: Migrate re_path routes to path.
Django treats path("<name>") like re_path(r"(?P<name>[^/]+)") and
path("<path:name>") like re_path(r"(?P<name>.+)").

This is more readable and consistent than the mix of slightly
different regexes we had before, and fixes various bugs:

• The r'apps/(.*)$' regex was missing a start anchor ^, so it
  incorrectly matched all URLs that included apps/ as a substring
  anywhere.
• The r'accounts/login/(google)/$' regex was missing a start anchor ^,
  so it incorrectly matched all URLs that ended with
  accounts/login/google/.
• The type annotation of zerver.views.realm_export.delete_realm_export
  takes export_id as an int, but it was previously passed as a string.
• The type annotation of zerver.views.users.avatar takes medium as a
  bool, but it was previously passed as a string.
• The [0-9A-Za-z]+ pattern for uidb64 was missing the - and _
  characters that can validly be part of a base64url encoded
  string (although I think the id is actually a decimal integer here,
  in which case only 012345ADEIMNOQTUYcgjkwxyz are present in its
  base64url encoding).

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2020-09-12 14:29:26 -07:00

93 lines
3.8 KiB
Python

import os
from urllib.parse import urlsplit
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.staticfiles.views import serve as staticfiles_serve
from django.http import HttpRequest, HttpResponse
from django.urls import path
from django.views.generic import TemplateView
from django.views.static import serve
import zerver.views.auth
import zerver.views.development.email_log
import zerver.views.development.integrations
import zerver.views.development.registration
# These URLs are available only in the development environment
use_prod_static = not settings.DEBUG
urls = [
# Serve useful development environment resources (docs, coverage reports, etc.)
path('coverage/<path:path>',
serve, {'document_root':
os.path.join(settings.DEPLOY_ROOT, 'var/coverage'),
'show_indexes': True}),
path('node-coverage/<path:path>',
serve, {'document_root':
os.path.join(settings.DEPLOY_ROOT, 'var/node-coverage/lcov-report'),
'show_indexes': True}),
path('docs/<path:path>',
serve, {'document_root':
os.path.join(settings.DEPLOY_ROOT, 'docs/_build/html')}),
# The special no-password login endpoint for development
path('devlogin/', zerver.views.auth.login_page,
{'template_name': 'zerver/dev_login.html'}, name='zerver.views.auth.login_page'),
# Page for testing email templates
path('emails/', zerver.views.development.email_log.email_page),
path('emails/generate/', zerver.views.development.email_log.generate_all_emails),
path('emails/clear/', zerver.views.development.email_log.clear_emails),
# Listing of useful URLs and various tools for development
path('devtools/', TemplateView.as_view(template_name='zerver/dev_tools.html')),
# Register New User and Realm
path('devtools/register_user/',
zerver.views.development.registration.register_development_user,
name='zerver.views.development.registration.register_development_user'),
path('devtools/register_realm/',
zerver.views.development.registration.register_development_realm,
name='zerver.views.development.registration.register_development_realm'),
# Have easy access for error pages
path('errors/404/', TemplateView.as_view(template_name='404.html')),
path('errors/5xx/', TemplateView.as_view(template_name='500.html')),
# Add a convenient way to generate webhook messages from fixtures.
path('devtools/integrations/', zerver.views.development.integrations.dev_panel),
path('devtools/integrations/check_send_webhook_fixture_message',
zerver.views.development.integrations.check_send_webhook_fixture_message),
path('devtools/integrations/send_all_webhook_fixture_messages',
zerver.views.development.integrations.send_all_webhook_fixture_messages),
path('devtools/integrations/<integration_name>/fixtures',
zerver.views.development.integrations.get_fixtures),
]
# Serve static assets via the Django server
if use_prod_static:
urls += [
path('static/<path:path>', serve, {'document_root': settings.STATIC_ROOT}),
]
else:
def serve_static(request: HttpRequest, path: str) -> HttpResponse:
response = staticfiles_serve(request, path)
response["Access-Control-Allow-Origin"] = "*"
return response
urls += static(urlsplit(settings.STATIC_URL).path, view=serve_static)
i18n_urls = [
path('confirmation_key/', zerver.views.development.registration.confirmation_key),
]
# On a production instance, these files would be served by nginx.
if settings.LOCAL_UPLOADS_DIR is not None:
avatars_url = path(
'user_avatars/<path:path>',
serve,
{'document_root': os.path.join(settings.LOCAL_UPLOADS_DIR, "avatars")},
)
urls += [avatars_url]