readthedocs.org/readthedocs/urls.py

153 lines
4.1 KiB
Python

# -*- coding: utf-8 -*-
# pylint: disable=missing-docstring
import os
from functools import reduce
from operator import add
from django.conf import settings
from django.conf.urls import include, url
from django.conf.urls.static import static
from django.contrib import admin
from django.views.generic.base import RedirectView, TemplateView
from tastypie.api import Api
from readthedocs.api.base import (
FileResource,
ProjectResource,
UserResource,
VersionResource,
)
from readthedocs.core.urls import core_urls, deprecated_urls, docs_urls
from readthedocs.core.views import (
HomepageView,
SupportView,
do_not_track,
server_error_404,
server_error_500,
)
from readthedocs.search import views as search_views
from readthedocs.search.api import PageSearchAPIView
v1_api = Api(api_name='v1')
v1_api.register(UserResource())
v1_api.register(ProjectResource())
v1_api.register(VersionResource())
v1_api.register(FileResource())
admin.autodiscover()
handler404 = server_error_404
handler500 = server_error_500
basic_urls = [
url(r'^$', HomepageView.as_view(), name='homepage'),
url(r'^support/', SupportView.as_view(), name='support'),
url(r'^security/', TemplateView.as_view(template_name='security.html')),
url(
r'^\.well-known/security.txt$',
TemplateView
.as_view(template_name='security.txt', content_type='text/plain'),
),
]
rtd_urls = [
url(r'^search/$', search_views.elastic_search, name='search'),
url(r'^dashboard/', include('readthedocs.projects.urls.private')),
url(r'^profiles/', include('readthedocs.profiles.urls.public')),
url(r'^accounts/', include('readthedocs.profiles.urls.private')),
url(r'^accounts/', include('allauth.urls')),
url(r'^notifications/', include('readthedocs.notifications.urls')),
url(r'^accounts/gold/', include('readthedocs.gold.urls')),
# For redirects
url(r'^builds/', include('readthedocs.builds.urls')),
# For testing the 404's with DEBUG on.
url(r'^404/$', handler404),
# For testing the 500's with DEBUG on.
url(r'^500/$', handler500),
]
project_urls = [
url(r'^projects/', include('readthedocs.projects.urls.public')),
]
api_urls = [
url(r'^api/', include(v1_api.urls)),
url(r'^api/v2/', include('readthedocs.restapi.urls')),
# Keep the `doc_search` at root level, so the test does not fail for other API
url(r'^api/v2/docsearch/$', PageSearchAPIView.as_view(), name='doc_search'),
url(
r'^api-auth/',
include('rest_framework.urls', namespace='rest_framework')
),
]
i18n_urls = [
url(r'^i18n/', include('django.conf.urls.i18n')),
]
admin_urls = [
url(r'^admin/', include(admin.site.urls)),
]
dnt_urls = [
url(r'^\.well-known/dnt/$', do_not_track),
# https://github.com/EFForg/dnt-guide#12-how-to-assert-dnt-compliance
url(
r'^\.well-known/dnt-policy.txt$',
TemplateView
.as_view(template_name='dnt-policy.txt', content_type='text/plain'),
),
]
debug_urls = []
for build_format in ('epub', 'htmlzip', 'json', 'pdf'):
debug_urls += static(
settings.MEDIA_URL + build_format,
document_root=os.path.join(settings.MEDIA_ROOT, build_format),
)
debug_urls += [
url(
'style-catalog/$',
TemplateView.as_view(template_name='style_catalog.html'),
),
# This must come last after the build output files
url(
r'^media/(?P<remainder>.+)$',
RedirectView.as_view(url=settings.STATIC_URL + '%(remainder)s'),
name='media-redirect',
),
]
# Export URLs
groups = [
basic_urls,
rtd_urls,
project_urls,
api_urls,
core_urls,
i18n_urls,
deprecated_urls,
]
if settings.DO_NOT_TRACK_ENABLED:
# Include Do Not Track URLs if DNT is supported
groups.append(dnt_urls)
if settings.READ_THE_DOCS_EXTENSIONS:
groups.append([
url(r'^', include('readthedocsext.urls'))
])
if not getattr(settings, 'USE_SUBDOMAIN', False) or settings.DEBUG:
groups.insert(0, docs_urls)
if getattr(settings, 'ALLOW_ADMIN', True):
groups.append(admin_urls)
if getattr(settings, 'DEBUG', False):
groups.append(debug_urls)
urlpatterns = reduce(add, groups)