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 from zerver.views.auth import config_error, login_page from zerver.views.development.email_log import clear_emails, email_page, generate_all_emails from zerver.views.development.integrations import ( check_send_webhook_fixture_message, dev_panel, get_fixtures, send_all_webhook_fixture_messages, ) from zerver.views.development.registration import ( confirmation_key, register_development_realm, register_development_user, ) # 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/', serve, {'document_root': os.path.join(settings.DEPLOY_ROOT, 'var/coverage'), 'show_indexes': True}), path('node-coverage/', serve, {'document_root': os.path.join(settings.DEPLOY_ROOT, 'var/node-coverage/lcov-report'), 'show_indexes': True}), path('docs/', serve, {'document_root': os.path.join(settings.DEPLOY_ROOT, 'docs/_build/html')}), # The special no-password login endpoint for development path('devlogin/', login_page, {'template_name': 'zerver/dev_login.html'}, name='login_page'), # Page for testing email templates path('emails/', email_page), path('emails/generate/', generate_all_emails), path('emails/clear/', 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/', register_development_user, name='register_dev_user'), path('devtools/register_realm/', register_development_realm, name='register_dev_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/', dev_panel), path('devtools/integrations/check_send_webhook_fixture_message', check_send_webhook_fixture_message), path('devtools/integrations/send_all_webhook_fixture_messages', send_all_webhook_fixture_messages), path('devtools/integrations//fixtures', get_fixtures), path('config-error/', config_error, name='config_error'), path('config-error/remoteuser/', config_error), ] # Serve static assets via the Django server if use_prod_static: urls += [ path('static/', 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/', confirmation_key), ] urls += i18n_urls # On a production instance, these files would be served by nginx. if settings.LOCAL_UPLOADS_DIR is not None: avatars_url = path( 'user_avatars/', serve, {'document_root': os.path.join(settings.LOCAL_UPLOADS_DIR, "avatars")}, ) urls += [avatars_url]