bookwyrm/bookwyrm/urls.py

843 lines
28 KiB
Python
Raw Permalink Normal View History

2021-03-08 16:49:10 +00:00
""" url routing for the app and api """
2020-01-28 19:45:27 +00:00
from django.conf.urls.static import static
2020-09-21 17:25:26 +00:00
from django.contrib import admin
2023-09-18 21:57:52 +00:00
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import path, re_path, include
2021-03-29 21:12:15 +00:00
from django.views.generic.base import TemplateView
2021-01-20 22:15:15 +00:00
from bookwyrm import settings, views
2020-12-31 01:36:35 +00:00
from bookwyrm.utils import regex
2020-01-28 19:45:27 +00:00
2021-09-18 04:39:18 +00:00
USER_PATH = rf"^user/(?P<username>{regex.USERNAME})"
LOCAL_USER_PATH = rf"^user/(?P<username>{regex.LOCALNAME})"
2020-10-17 02:13:18 +00:00
status_types = [
2021-03-08 17:48:25 +00:00
"status",
"review",
"reviewrating",
"comment",
"quotation",
"boost",
"generatednote",
2020-10-17 02:13:18 +00:00
]
2021-09-18 04:39:18 +00:00
2021-09-20 23:44:59 +00:00
STATUS_TYPES_STRING = "|".join(status_types)
STATUS_PATH = rf"{USER_PATH}/({STATUS_TYPES_STRING})/(?P<status_id>\d+)"
2021-06-18 21:12:56 +00:00
BOOK_PATH = r"^book/(?P<book_id>\d+)"
2020-01-25 06:32:41 +00:00
2021-08-05 00:53:44 +00:00
STREAMS = "|".join(s["key"] for s in settings.STREAMS)
2021-08-05 00:25:31 +00:00
2020-01-25 06:32:41 +00:00
urlpatterns = [
2021-03-08 16:49:10 +00:00
path("admin/", admin.site.urls),
2021-03-29 21:12:15 +00:00
path(
"robots.txt",
TemplateView.as_view(template_name="robots.txt", content_type="text/plain"),
),
2023-09-07 12:41:31 +00:00
path(
"manifest.json",
2023-10-07 12:32:18 +00:00
TemplateView.as_view(
template_name="manifest.json", content_type="application/json"
),
2023-09-07 12:41:31 +00:00
),
2020-01-28 08:44:51 +00:00
# federation endpoints
2022-01-30 14:43:50 +00:00
re_path(r"^inbox/?$", views.Inbox.as_view(), name="inbox"),
re_path(rf"{LOCAL_USER_PATH}/inbox/?$", views.Inbox.as_view(), name="user_inbox"),
re_path(
rf"{LOCAL_USER_PATH}/outbox/?$", views.Outbox.as_view(), name="user_outbox"
),
2021-03-29 21:36:24 +00:00
re_path(r"^\.well-known/webfinger/?$", views.webfinger),
re_path(r"^\.well-known/nodeinfo/?$", views.nodeinfo_pointer),
re_path(r"^\.well-known/host-meta/?$", views.host_meta),
re_path(r"^nodeinfo/2\.0/?$", views.nodeinfo),
re_path(r"^api/v1/instance/?$", views.instance_info),
re_path(r"^api/v1/instance/peers/?$", views.peers),
2021-09-10 23:47:59 +00:00
re_path(r"^opensearch.xml$", views.opensearch, name="opensearch"),
2021-11-28 05:56:21 +00:00
re_path(r"^ostatus_subscribe/?$", views.ostatus_follow_request),
2021-01-19 00:32:02 +00:00
# polling updates
2022-01-23 03:01:42 +00:00
re_path(
2022-01-30 14:43:50 +00:00
"^api/updates/notifications/?$",
views.get_notification_count,
name="notification-updates",
),
re_path(
"^api/updates/stream/(?P<stream>[a-z]+)/?$",
views.get_unread_status_string,
name="stream-updates",
2022-01-23 03:01:42 +00:00
),
2022-02-17 18:02:42 +00:00
# instance setup
2022-02-17 21:01:36 +00:00
re_path(r"^setup/?$", views.InstanceConfig.as_view(), name="setup"),
2022-02-17 21:27:44 +00:00
re_path(r"^setup/admin/?$", views.CreateAdmin.as_view(), name="setup-admin"),
2021-01-12 16:19:08 +00:00
# authentication
re_path(r"^login/?$", views.Login.as_view(), name="login"),
2021-12-28 22:41:45 +00:00
re_path(r"^login/(?P<confirmed>confirmed)/?$", views.Login.as_view(), name="login"),
2021-03-08 16:49:10 +00:00
re_path(r"^register/?$", views.Register.as_view()),
2021-08-06 23:24:57 +00:00
re_path(r"confirm-email/?$", views.ConfirmEmail.as_view(), name="confirm-email"),
re_path(
r"confirm-email/(?P<code>[A-Za-z0-9]+)/?$",
views.ConfirmEmailCode.as_view(),
name="confirm-email-code",
),
2022-03-19 19:00:16 +00:00
re_path(r"^resend-link/?$", views.ResendConfirmEmail.as_view(), name="resend-link"),
2021-05-04 16:34:16 +00:00
re_path(r"^logout/?$", views.Logout.as_view(), name="logout"),
re_path(
r"^password-reset/?$",
views.PasswordResetRequest.as_view(),
name="password-reset",
),
2021-03-08 16:49:10 +00:00
re_path(
r"^password-reset/(?P<code>[A-Za-z0-9]+)/?$", views.PasswordReset.as_view()
),
2021-01-29 23:38:42 +00:00
# admin
2021-09-11 14:20:40 +00:00
re_path(
r"^settings/dashboard/?$", views.Dashboard.as_view(), name="settings-dashboard"
),
2021-04-19 22:40:51 +00:00
re_path(r"^settings/site-settings/?$", views.Site.as_view(), name="settings-site"),
re_path(
r"^settings/site-registration/?$",
views.RegistrationLimited.as_view(),
name="settings-registration-limited",
),
re_path(
r"^settings/site-registration-admin/?$",
views.Registration.as_view(),
name="settings-registration",
),
2022-02-27 18:00:50 +00:00
re_path(r"^settings/themes/?$", views.Themes.as_view(), name="settings-themes"),
2022-02-28 17:54:07 +00:00
re_path(
r"^settings/themes/(?P<theme_id>\d+)/delete/?$",
views.delete_theme,
name="settings-themes-delete",
),
re_path(
r"^settings/themes/(?P<theme_id>\d+)/test/?$",
views.test_theme,
name="settings-themes-test",
),
2021-05-19 21:55:01 +00:00
re_path(
r"^settings/announcements/?$",
views.Announcements.as_view(),
name="settings-announcements",
),
re_path(
2021-05-20 19:08:12 +00:00
r"^settings/announcements/(?P<announcement_id>\d+)/?$",
views.Announcement.as_view(),
2021-05-19 21:55:01 +00:00
name="settings-announcements",
),
2022-02-11 19:38:13 +00:00
re_path(
r"^settings/announcements/create/?$",
views.EditAnnouncement.as_view(),
name="settings-announcements-edit",
),
re_path(
r"^settings/announcements/(?P<announcement_id>\d+)/edit/?$",
views.EditAnnouncement.as_view(),
name="settings-announcements-edit",
),
2021-05-20 19:08:12 +00:00
re_path(
r"^settings/announcements/(?P<announcement_id>\d+)/delete/?$",
views.delete_announcement,
name="settings-announcements-delete",
),
re_path(
2021-04-19 22:40:51 +00:00
r"^settings/email-preview/?$",
views.admin.email_config.email_preview,
name="settings-email-preview",
),
2021-04-19 22:40:51 +00:00
re_path(
r"^settings/users/?$", views.UserAdminList.as_view(), name="settings-users"
),
re_path(
r"^settings/users/(?P<status>(local|federated|deleted))\/?$",
views.UserAdminList.as_view(),
name="settings-users",
),
2022-01-10 20:21:36 +00:00
re_path(
r"^settings/users/(?P<user_id>\d+)/(?P<report_id>\d+)?$",
2022-01-10 20:21:36 +00:00
views.UserAdmin.as_view(),
name="settings-user",
),
re_path(
r"^settings/users/(?P<user_id>\d+)/activate/?$",
views.ActivateUserAdmin.as_view(),
name="settings-activate-user",
),
2021-03-08 16:49:10 +00:00
re_path(
2021-09-11 21:41:52 +00:00
r"^settings/federation/(?P<status>(federated|blocked))?/?$",
2021-03-28 19:34:55 +00:00
views.Federation.as_view(),
name="settings-federation",
),
re_path(
r"^settings/federation/(?P<server>\d+)/?$",
views.FederatedServer.as_view(),
name="settings-federated-server",
2021-03-08 16:49:10 +00:00
),
2021-04-11 17:36:40 +00:00
re_path(
2021-12-28 22:41:45 +00:00
r"^settings/federation/(?P<server>\d+)/block/?$",
views.block_server,
2021-04-11 17:36:40 +00:00
name="settings-federated-server-block",
),
2021-04-10 18:06:28 +00:00
re_path(
2021-12-28 22:41:45 +00:00
r"^settings/federation/(?P<server>\d+)/unblock/?$",
views.unblock_server,
2021-04-10 18:06:28 +00:00
name="settings-federated-server-unblock",
),
2022-02-28 21:09:43 +00:00
re_path(
r"^settings/federation/(?P<server>\d+)/refresh/?$",
views.refresh_server,
name="settings-federated-server-refresh",
),
2021-04-07 20:06:29 +00:00
re_path(
r"^settings/federation/add/?$",
views.AddFederatedServer.as_view(),
name="settings-add-federated-server",
2021-04-07 20:17:51 +00:00
),
re_path(
r"^settings/federation/import/?$",
views.ImportServerBlocklist.as_view(),
name="settings-import-blocklist",
),
2021-03-08 16:49:10 +00:00
re_path(
r"^settings/invites/?$", views.ManageInvites.as_view(), name="settings-invites"
),
2021-03-21 02:39:08 +00:00
re_path(
r"^settings/requests/?$",
views.ManageInviteRequests.as_view(),
name="settings-invite-requests",
),
re_path(
2021-12-28 22:41:45 +00:00
r"^settings/requests/ignore/?$",
views.ignore_invite_request,
name="settings-invite-requests-ignore",
),
2021-03-21 02:14:41 +00:00
re_path(
r"^invite-request/?$", views.InviteRequest.as_view(), name="invite-request"
),
2022-01-30 14:43:50 +00:00
re_path(
r"^invite/(?P<code>[A-Za-z0-9]+)/?$", views.Invite.as_view(), name="invite"
),
2021-09-08 21:39:43 +00:00
re_path(
r"^settings/email-blocklist/?$",
views.EmailBlocklist.as_view(),
name="settings-email-blocks",
),
2021-09-08 23:24:13 +00:00
re_path(
r"^settings/email-blocks/(?P<domain_id>\d+)/delete/?$",
views.EmailBlocklist.as_view(),
name="settings-email-blocks-delete",
),
2022-01-10 23:27:33 +00:00
re_path(
r"^setting/link-domains/?$",
views.LinkDomain.as_view(),
name="settings-link-domain",
),
2022-01-10 18:11:00 +00:00
re_path(
2022-01-10 18:48:27 +00:00
r"^setting/link-domains/(?P<status>(pending|approved|blocked))/?$",
2022-01-10 18:38:05 +00:00
views.LinkDomain.as_view(),
name="settings-link-domain",
),
2022-01-12 17:16:24 +00:00
# pylint: disable=line-too-long
2022-01-10 18:38:05 +00:00
re_path(
2022-01-10 18:48:27 +00:00
r"^setting/link-domains/(?P<status>(pending|approved|blocked))/(?P<domain_id>\d+)/?$",
2022-01-10 18:11:00 +00:00
views.LinkDomain.as_view(),
name="settings-link-domain",
),
2022-01-10 19:19:20 +00:00
re_path(
r"^setting/link-domains/(?P<domain_id>\d+)/(?P<status>(pending|approved|blocked))/(?P<report_id>\d+)?$",
2022-01-10 19:19:20 +00:00
views.update_domain_status,
name="settings-link-domain-status",
),
2021-09-17 19:59:16 +00:00
re_path(
r"^settings/ip-blocklist/?$",
views.IPBlocklist.as_view(),
name="settings-ip-blocks",
),
re_path(
r"^settings/ip-blocks/(?P<block_id>\d+)/delete/?$",
views.IPBlocklist.as_view(),
name="settings-ip-blocks-delete",
),
2022-02-24 19:18:43 +00:00
# auto-moderation rules
re_path(r"^settings/automod/?$", views.AutoMod.as_view(), name="settings-automod"),
2022-02-24 20:15:31 +00:00
re_path(
2022-02-26 18:13:44 +00:00
r"^settings/automod/(?P<rule_id>\d+)/delete/?$",
2022-02-24 20:15:31 +00:00
views.automod_delete,
name="settings-automod-delete",
),
2022-02-26 18:13:44 +00:00
re_path(
r"^settings/automod/schedule/?$",
views.schedule_automod_task,
name="settings-automod-schedule",
),
2022-02-26 18:24:23 +00:00
re_path(
r"^settings/automod/unschedule/(?P<task_id>\d+)/?$",
views.unschedule_automod_task,
name="settings-automod-unschedule",
),
2022-02-26 18:13:44 +00:00
re_path(
r"^settings/automod/run/?$", views.run_automod, name="settings-automod-run"
),
2021-03-08 23:49:44 +00:00
# moderation
2022-01-10 22:55:10 +00:00
re_path(
r"^settings/reports/?$", views.ReportsAdmin.as_view(), name="settings-reports"
),
2021-03-08 23:49:44 +00:00
re_path(
2021-03-09 02:36:34 +00:00
r"^settings/reports/(?P<report_id>\d+)/?$",
2022-01-10 22:55:10 +00:00
views.ReportAdmin.as_view(),
2021-03-08 23:49:44 +00:00
name="settings-report",
),
2021-03-12 19:13:53 +00:00
re_path(
r"^settings/reports/(?P<user_id>\d+)/suspend/(?P<report_id>\d+)?$",
views.suspend_user,
name="settings-report-suspend",
2021-03-12 19:13:53 +00:00
),
2021-09-08 23:47:12 +00:00
re_path(
r"^settings/reports/(?P<user_id>\d+)/unsuspend/(?P<report_id>\d+)?$",
2021-09-08 23:47:12 +00:00
views.unsuspend_user,
name="settings-report-unsuspend",
),
2021-09-09 00:21:45 +00:00
re_path(
r"^settings/reports/(?P<user_id>\d+)/delete/(?P<report_id>\d+)?$",
2021-09-09 00:21:45 +00:00
views.moderator_delete_user,
name="settings-delete-user",
),
2021-03-12 18:22:03 +00:00
re_path(
r"^settings/reports/(?P<report_id>\d+)/resolve/?$",
views.resolve_report,
name="settings-report-resolve",
),
2022-01-10 22:55:10 +00:00
re_path(r"^report/?$", views.Report.as_view(), name="report"),
re_path(r"^report/(?P<user_id>\d+)/?$", views.Report.as_view(), name="report"),
re_path(
r"^report/(?P<user_id>\d+)/status/(?P<status_id>\d+)?$",
views.Report.as_view(),
name="report-status",
),
re_path(
2022-07-06 00:19:03 +00:00
r"^report/link/(?P<link_id>\d+)?$",
2022-01-10 22:55:10 +00:00
views.Report.as_view(),
name="report-link",
),
2022-11-02 01:59:04 +00:00
re_path(
2022-11-02 03:43:27 +00:00
r"^settings/imports/(?P<status>(complete|active))?/?$",
views.ImportList.as_view(),
name="settings-imports",
2022-11-02 01:59:04 +00:00
),
re_path(
2022-11-15 00:06:40 +00:00
r"^settings/imports/(?P<import_id>\d+)/complete/?$",
2022-11-02 03:43:27 +00:00
views.ImportList.as_view(),
name="settings-imports-complete",
),
re_path(
r"^settings/user-imports/(?P<import_id>\d+)/complete/?$",
views.set_user_import_completed,
name="settings-user-import-complete",
),
re_path(
r"^settings/imports/disable/?$",
views.disable_imports,
name="settings-imports-disable",
),
re_path(
r"^settings/user-exports/enable/?$",
views.enable_user_exports,
name="settings-user-exports-enable",
),
re_path(
r"^settings/user-exports/disable/?$",
views.disable_user_exports,
name="settings-user-exports-disable",
),
re_path(
r"^settings/imports/enable/?$",
views.enable_imports,
name="settings-imports-enable",
),
2022-12-06 22:11:03 +00:00
re_path(
r"^settings/imports/set-limit/?$",
views.set_import_size_limit,
name="settings-imports-set-limit",
),
re_path(
r"^settings/user-imports/set-limit/?$",
views.set_user_import_limit,
name="settings-user-imports-set-limit",
),
2022-09-15 01:57:08 +00:00
re_path(
r"^settings/celery/?$", views.CeleryStatus.as_view(), name="settings-celery"
),
re_path(
r"^settings/celery/ping/?$", views.celery_ping, name="settings-celery-ping"
),
2024-01-02 21:05:44 +00:00
re_path(
2024-02-03 16:00:07 +00:00
r"^settings/schedules/(?P<task_id>\d+)?$",
2024-01-02 21:05:44 +00:00
views.ScheduledTasks.as_view(),
name="settings-schedules",
),
re_path(
r"^settings/email-config/?$",
views.EmailConfig.as_view(),
name="settings-email-config",
),
2021-01-13 20:03:27 +00:00
# landing pages
2022-01-06 05:42:41 +00:00
re_path(r"^about/?$", views.about, name="about"),
re_path(r"^privacy/?$", views.privacy, name="privacy"),
re_path(r"^conduct/?$", views.conduct, name="conduct"),
2022-11-25 20:06:32 +00:00
re_path(r"^impressum/?$", views.impressum, name="impressum"),
path("", views.Home.as_view(), name="landing"),
2021-08-08 15:07:20 +00:00
re_path(r"^discover/?$", views.Discover.as_view(), name="discover"),
2021-05-04 16:34:16 +00:00
re_path(r"^notifications/?$", views.Notifications.as_view(), name="notifications"),
2021-05-07 20:55:41 +00:00
re_path(
r"^notifications/(?P<notification_type>mentions)/?$",
views.Notifications.as_view(),
name="notifications",
),
2021-03-21 23:37:52 +00:00
re_path(r"^directory/?", views.Directory.as_view(), name="directory"),
# hashtag
re_path(
r"^hashtag/(?P<hashtag_id>\d+)/?$", views.Hashtag.as_view(), name="hashtag"
),
re_path(
rf"^hashtag/(?P<hashtag_id>\d+){regex.SLUG}/?$",
views.Hashtag.as_view(),
name="hashtag",
),
2021-03-31 20:56:26 +00:00
# Get started
re_path(
2021-04-01 16:22:43 +00:00
r"^get-started/profile/?$",
views.GetStartedProfile.as_view(),
name="get-started-profile",
),
re_path(
r"^get-started/books/?$",
views.GetStartedBooks.as_view(),
name="get-started-books",
),
re_path(
r"^get-started/users/?$",
views.GetStartedUsers.as_view(),
name="get-started-users",
),
2021-01-29 18:25:31 +00:00
# feeds
2021-09-18 04:39:18 +00:00
re_path(rf"^(?P<tab>{STREAMS})/?$", views.Feed.as_view()),
2021-03-12 18:37:52 +00:00
re_path(
r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages"
),
2021-03-08 16:49:10 +00:00
re_path(
2021-12-28 22:41:45 +00:00
rf"^direct-messages/(?P<username>{regex.USERNAME})/?$",
2021-03-08 16:49:10 +00:00
views.DirectMessage.as_view(),
2021-03-12 18:37:52 +00:00
name="direct-messages-user",
2021-03-08 16:49:10 +00:00
),
2021-01-13 20:03:27 +00:00
# search
re_path(r"^search.json/?$", views.Search.as_view(), name="search"),
2021-05-01 01:35:09 +00:00
re_path(r"^search/?$", views.Search.as_view(), name="search"),
2021-01-12 19:28:03 +00:00
# imports
2021-05-04 16:34:16 +00:00
re_path(r"^import/?$", views.Import.as_view(), name="import"),
re_path(r"^user-import/?$", views.UserImport.as_view(), name="user-import"),
2021-11-12 23:06:23 +00:00
re_path(
2021-11-13 01:10:47 +00:00
r"^import/(?P<job_id>\d+)/?$",
views.ImportStatus.as_view(),
name="import-status",
),
2022-11-05 21:44:09 +00:00
re_path(
r"^import/(?P<job_id>\d+)/stop/?$",
views.stop_import,
name="import-stop",
),
2021-11-14 18:20:14 +00:00
re_path(
r"^import/(?P<job_id>\d+)/retry/(?P<item_id>\d+)/?$",
2021-11-14 18:58:46 +00:00
views.retry_item,
2021-11-14 18:20:14 +00:00
name="import-item-retry",
),
2021-11-13 01:10:47 +00:00
re_path(
r"^import/(?P<job_id>\d+)/failed/?$",
2021-11-12 23:06:23 +00:00
views.ImportTroubleshoot.as_view(),
name="import-troubleshoot",
),
2021-11-13 00:23:56 +00:00
re_path(
2021-11-13 01:10:47 +00:00
r"^import/(?P<job_id>\d+)/review/?$",
views.ImportManualReview.as_view(),
name="import-review",
),
re_path(
r"^import/(?P<job_id>\d+)/review/?$",
2021-11-13 00:23:56 +00:00
views.ImportManualReview.as_view(),
name="import-review",
),
2021-11-13 01:10:47 +00:00
re_path(
r"^import/(?P<job_id>\d+)/review/(?P<item_id>\d+)/approve/?$",
views.approve_import_item,
name="import-approve",
),
re_path(
r"^import/(?P<job_id>\d+)/review/(?P<item_id>\d+)/delete/?$",
views.delete_import_item,
name="import-delete",
),
2020-03-14 00:57:36 +00:00
# users
2021-09-18 04:39:18 +00:00
re_path(rf"{USER_PATH}\.json$", views.User.as_view()),
re_path(rf"{USER_PATH}/?$", views.User.as_view(), name="user-feed"),
2021-12-28 20:49:52 +00:00
re_path(rf"^@(?P<username>{regex.USERNAME})$", views.user_redirect),
2021-09-18 04:39:18 +00:00
re_path(rf"{USER_PATH}/rss/?$", views.rss_feed.RssFeed(), name="user-rss"),
2023-01-17 20:53:44 +00:00
re_path(
rf"{USER_PATH}/rss-reviews/?$",
views.rss_feed.RssReviewsOnlyFeed(),
name="user-reviews-rss",
),
re_path(
rf"{USER_PATH}/rss-quotes/?$",
views.rss_feed.RssQuotesOnlyFeed(),
name="user-quotes-rss",
),
re_path(
rf"{USER_PATH}/rss-comments/?$",
views.rss_feed.RssCommentsOnlyFeed(),
name="user-comments-rss",
),
2021-03-08 16:49:10 +00:00
re_path(
rf"{USER_PATH}/(?P<direction>(followers|following))(.json)?/?$",
views.Relationships.as_view(),
name="user-relationships",
2021-03-08 16:49:10 +00:00
),
2021-09-08 17:02:06 +00:00
re_path(r"^hide-suggestions/?$", views.hide_suggestions, name="hide-suggestions"),
re_path(
rf"{USER_PATH}/reviews-comments",
views.UserReviewsComments.as_view(),
name="user-reviews-comments",
),
# groups
2021-09-23 21:52:40 +00:00
re_path(rf"{USER_PATH}/groups/?$", views.UserGroups.as_view(), name="user-groups"),
2021-10-04 10:31:28 +00:00
re_path(
2022-03-12 04:14:45 +00:00
r"^group/(?P<group_id>\d+)(.json)?/?$", views.Group.as_view(), name="group"
),
re_path(
rf"^group/(?P<group_id>\d+){regex.SLUG}/?$", views.Group.as_view(), name="group"
2021-10-04 10:31:28 +00:00
),
2021-10-16 06:45:39 +00:00
re_path(
r"^group/delete/(?P<group_id>\d+)/?$", views.delete_group, name="delete-group"
),
2021-10-04 10:31:28 +00:00
re_path(
r"^group/(?P<group_id>\d+)/add-users/?$",
views.FindUsers.as_view(),
name="group-find-users",
),
re_path(r"^add-group-member/?$", views.invite_member, name="invite-group-member"),
2021-10-04 10:31:28 +00:00
re_path(
r"^remove-group-member/?$", views.remove_member, name="remove-group-member"
),
re_path(
r"^accept-group-invitation/?$",
views.accept_membership,
name="accept-group-invitation",
),
re_path(
r"^reject-group-invitation/?$",
views.reject_membership,
name="reject-group-invitation",
),
# lists
re_path(rf"{USER_PATH}/lists/?$", views.UserLists.as_view(), name="user-lists"),
2021-03-08 16:49:10 +00:00
re_path(r"^list/?$", views.Lists.as_view(), name="lists"),
2021-08-23 22:07:38 +00:00
re_path(r"^list/saved/?$", views.SavedLists.as_view(), name="saved-lists"),
2022-03-12 04:14:45 +00:00
re_path(r"^list/(?P<list_id>\d+)(\.json)?/?$", views.List.as_view(), name="list"),
2022-03-02 09:47:08 +00:00
re_path(
rf"^list/(?P<list_id>\d+){regex.SLUG}/?$", views.List.as_view(), name="list"
),
re_path(
r"^list/(?P<list_id>\d+)/item/(?P<list_item>\d+)/?$",
views.ListItem.as_view(),
name="list-item",
),
2021-09-06 17:38:37 +00:00
re_path(r"^list/delete/(?P<list_id>\d+)/?$", views.delete_list, name="delete-list"),
2022-01-25 01:41:21 +00:00
re_path(r"^list/add-book/?$", views.add_book, name="list-add-book"),
2021-03-08 16:49:10 +00:00
re_path(
r"^list/(?P<list_id>\d+)/remove/?$",
2022-01-25 01:41:21 +00:00
views.remove_book,
2021-03-08 16:49:10 +00:00
name="list-remove-book",
),
2021-04-08 16:05:21 +00:00
re_path(
r"^list-item/(?P<list_item_id>\d+)/set-position$",
2022-01-25 01:41:21 +00:00
views.set_book_position,
2021-04-08 16:05:21 +00:00
name="list-set-book-position",
),
2021-03-08 16:49:10 +00:00
re_path(
r"^list/(?P<list_id>\d+)/curate/?$", views.Curate.as_view(), name="list-curate"
),
2021-08-23 22:33:49 +00:00
re_path(r"^save-list/(?P<list_id>\d+)/?$", views.save_list, name="list-save"),
re_path(r"^unsave-list/(?P<list_id>\d+)/?$", views.unsave_list, name="list-unsave"),
2021-12-04 15:07:38 +00:00
re_path(
2021-12-28 22:40:11 +00:00
r"^list/(?P<list_id>\d+)/embed/(?P<list_key>[0-9a-f]+)/?$",
2021-12-04 15:07:38 +00:00
views.unsafe_embed_list,
name="embed-list",
),
2021-06-08 18:23:53 +00:00
# User books
2021-09-18 04:39:18 +00:00
re_path(rf"{USER_PATH}/books/?$", views.Shelf.as_view(), name="user-shelves"),
2021-03-31 16:34:16 +00:00
re_path(
2021-09-27 22:57:22 +00:00
rf"^{USER_PATH}/(shelf|books)/(?P<shelf_identifier>[\w-]+)(.json)?/?$",
2021-03-31 16:34:16 +00:00
views.Shelf.as_view(),
name="shelf",
),
re_path(
2021-09-18 04:39:18 +00:00
rf"^{LOCAL_USER_PATH}/(books|shelf)/(?P<shelf_identifier>[\w-]+)(.json)?/?$",
2021-03-31 16:34:16 +00:00
views.Shelf.as_view(),
2021-03-31 16:54:52 +00:00
name="shelf",
2021-03-31 16:34:16 +00:00
),
re_path(r"^create-shelf/?$", views.create_shelf, name="shelf-create"),
2021-12-28 22:41:45 +00:00
re_path(r"^delete-shelf/(?P<shelf_id>\d+)/?$", views.delete_shelf),
2021-03-31 16:34:16 +00:00
re_path(r"^shelve/?$", views.shelve),
re_path(r"^unshelve/?$", views.unshelve),
# goals
re_path(
2021-09-22 19:16:51 +00:00
rf"{LOCAL_USER_PATH}/goal/(?P<year>\d+)/?$",
2021-03-31 16:34:16 +00:00
views.Goal.as_view(),
name="user-goal",
),
re_path(r"^hide-goal/?$", views.hide_goal, name="hide-goal"),
2021-01-29 17:28:00 +00:00
# preferences
2021-03-08 16:49:10 +00:00
re_path(r"^preferences/profile/?$", views.EditUser.as_view(), name="prefs-profile"),
re_path(
r"^preferences/password/?$",
views.ChangePassword.as_view(),
name="prefs-password",
),
re_path(
r"^preferences/2fa/?$",
views.Edit2FA.as_view(),
name="prefs-2fa",
),
re_path(
r"^preferences/2fa-backup-codes/?$",
views.GenerateBackupCodes.as_view(),
name="generate-2fa-backup-codes",
),
re_path(
r"^preferences/confirm-2fa/?$",
views.Confirm2FA.as_view(),
name="conf-2fa",
),
re_path(
r"^preferences/disable-2fa/?$",
views.Disable2FA.as_view(),
name="disable-2fa",
),
re_path(
2022-10-14 10:53:51 +00:00
r"^2fa-check/?$",
views.LoginWith2FA.as_view(),
name="login-with-2fa",
),
re_path(
2022-10-14 10:53:51 +00:00
r"^2fa-prompt/?$",
views.Prompt2FA.as_view(),
name="prompt-2fa",
),
re_path(r"^preferences/export/?$", views.Export.as_view(), name="prefs-export"),
re_path(
r"^preferences/user-export/?$",
views.ExportUser.as_view(),
name="prefs-user-export",
),
path(
"preferences/user-export/<archive_id>",
views.ExportArchive.as_view(),
name="prefs-export-file",
),
re_path(r"^preferences/move/?$", views.MoveUser.as_view(), name="prefs-move"),
re_path(r"^preferences/alias/?$", views.AliasUser.as_view(), name="prefs-alias"),
re_path(
r"^preferences/remove-alias/?$", views.remove_alias, name="prefs-remove-alias"
),
re_path(r"^preferences/unmove/?$", views.unmove, name="prefs-unmove"),
2021-06-14 17:44:25 +00:00
re_path(r"^preferences/delete/?$", views.DeleteUser.as_view(), name="prefs-delete"),
re_path(
r"^preferences/deactivate/?$",
views.DeactivateUser.as_view(),
name="prefs-deactivate",
),
re_path(
r"^preferences/reactivate/?$",
views.ReactivateUser.as_view(),
name="prefs-reactivate",
),
2021-05-04 16:34:16 +00:00
re_path(r"^preferences/block/?$", views.Block.as_view(), name="prefs-block"),
2021-03-08 16:49:10 +00:00
re_path(r"^block/(?P<user_id>\d+)/?$", views.Block.as_view()),
re_path(r"^unblock/(?P<user_id>\d+)/?$", views.unblock),
2020-03-14 00:57:36 +00:00
# statuses
2021-09-18 04:39:18 +00:00
re_path(rf"{STATUS_PATH}(.json)?/?$", views.Status.as_view(), name="status"),
re_path(rf"{STATUS_PATH}{regex.SLUG}/?$", views.Status.as_view(), name="status"),
2021-09-18 04:39:18 +00:00
re_path(rf"{STATUS_PATH}/activity/?$", views.Status.as_view(), name="status"),
2021-04-03 19:38:12 +00:00
re_path(
2021-09-18 04:39:18 +00:00
rf"{STATUS_PATH}/replies(.json)?/?$", views.Replies.as_view(), name="replies"
2021-04-03 19:38:12 +00:00
),
2021-10-14 23:57:58 +00:00
re_path(
r"^edit/(?P<status_id>\d+)/?$", views.EditStatus.as_view(), name="edit-status"
),
2021-04-03 21:32:34 +00:00
re_path(
r"^post/?$",
views.CreateStatus.as_view(),
name="create-status",
),
2021-04-03 19:38:12 +00:00
re_path(
r"^post/(?P<status_type>\w+)/?$",
views.CreateStatus.as_view(),
name="create-status",
),
2021-10-15 00:13:54 +00:00
re_path(
r"^post/(?P<status_type>\w+)/(?P<existing_status_id>\d+)/?$",
views.CreateStatus.as_view(),
name="create-status",
),
2021-04-03 19:38:12 +00:00
re_path(
2023-05-30 18:35:47 +00:00
r"^delete-status/(?P<status_id>\d+)/?(?P<report_id>\d+)?$",
2021-04-03 19:38:12 +00:00
views.DeleteStatus.as_view(),
name="delete-status",
),
2021-01-12 21:47:00 +00:00
# interact
2021-08-23 20:15:35 +00:00
re_path(r"^favorite/(?P<status_id>\d+)/?$", views.Favorite.as_view(), name="fav"),
re_path(
r"^unfavorite/(?P<status_id>\d+)/?$", views.Unfavorite.as_view(), name="unfav"
),
2021-03-08 16:49:10 +00:00
re_path(r"^boost/(?P<status_id>\d+)/?$", views.Boost.as_view()),
re_path(r"^unboost/(?P<status_id>\d+)/?$", views.Unboost.as_view()),
2020-03-14 00:57:36 +00:00
# books
2021-09-18 04:39:18 +00:00
re_path(rf"{BOOK_PATH}(.json)?/?$", views.Book.as_view(), name="book"),
re_path(rf"{BOOK_PATH}{regex.SLUG}/?$", views.Book.as_view(), name="book"),
2023-01-24 13:14:06 +00:00
re_path(
r"^series/by/(?P<author_id>\d+)/?$",
views.BookSeriesBy.as_view(),
name="book-series-by",
),
2021-04-23 20:46:22 +00:00
re_path(
2021-09-18 04:39:18 +00:00
rf"{BOOK_PATH}/(?P<user_statuses>review|comment|quote)/?$",
2021-04-23 20:46:22 +00:00
views.Book.as_view(),
name="book-user-statuses",
),
2021-09-18 04:39:18 +00:00
re_path(rf"{BOOK_PATH}/edit/?$", views.EditBook.as_view(), name="edit-book"),
2022-05-19 16:32:01 +00:00
re_path(
rf"{BOOK_PATH}/confirm/?$",
views.ConfirmEditBook.as_view(),
name="edit-book-confirm",
),
2022-02-26 01:23:13 +00:00
re_path(
r"^create-book/data/?$", views.create_book_from_data, name="create-book-data"
),
2022-02-26 00:40:34 +00:00
re_path(r"^create-book/?$", views.CreateBook.as_view(), name="create-book"),
2022-05-19 16:32:01 +00:00
re_path(
r"^create-book/confirm/?$",
views.ConfirmEditBook.as_view(),
name="create-book-confirm",
),
2021-09-18 04:39:18 +00:00
re_path(rf"{BOOK_PATH}/editions(.json)?/?$", views.Editions.as_view()),
2021-03-18 17:03:53 +00:00
re_path(
r"^upload-cover/(?P<book_id>\d+)/?$", views.upload_cover, name="upload-cover"
),
2021-12-15 20:40:31 +00:00
re_path(
r"^add-description/(?P<book_id>\d+)/?$",
views.add_description,
name="add-description",
),
2022-01-12 18:07:49 +00:00
re_path(
rf"{BOOK_PATH}/filelink/?$", views.BookFileLinks.as_view(), name="file-link"
),
re_path(
2022-01-17 17:57:47 +00:00
rf"{BOOK_PATH}/filelink/(?P<link_id>\d+)/?$",
2022-01-12 18:07:49 +00:00
views.BookFileLinks.as_view(),
name="file-link",
),
2022-01-17 17:57:47 +00:00
re_path(
rf"{BOOK_PATH}/filelink/(?P<link_id>\d+)/delete/?$",
views.delete_link,
name="file-link-delete",
),
2022-01-12 18:07:49 +00:00
re_path(
rf"{BOOK_PATH}/filelink/add/?$",
views.AddFileLink.as_view(),
name="file-link-add",
),
2021-12-05 21:02:42 +00:00
re_path(r"^resolve-book/?$", views.resolve_book, name="resolve-book"),
re_path(r"^switch-edition/?$", views.switch_edition, name="switch-edition"),
re_path(
rf"{BOOK_PATH}/update/(?P<connector_identifier>[\w\.]+)/?$",
2021-12-05 21:02:42 +00:00
views.update_book_from_remote,
2021-12-05 21:24:40 +00:00
name="book-update-remote",
),
re_path(
r"^author/(?P<author_id>\d+)/update/(?P<connector_identifier>[\w\.]+)/?$",
2021-12-05 21:24:40 +00:00
views.update_author_from_remote,
name="author-update-remote",
2021-12-05 21:02:42 +00:00
),
2021-03-01 20:09:21 +00:00
# isbn
2022-08-29 20:41:49 +00:00
re_path(r"^isbn/(?P<isbn>[\dxX]+)(.json)?/?$", views.Isbn.as_view()),
2021-01-13 17:54:35 +00:00
# author
2021-12-05 21:24:40 +00:00
re_path(
2022-03-12 04:14:45 +00:00
r"^author/(?P<author_id>\d+)(.json)?/?$", views.Author.as_view(), name="author"
),
re_path(
2022-03-02 09:47:08 +00:00
rf"^author/(?P<author_id>\d+){regex.SLUG}/?$",
views.Author.as_view(),
name="author",
2021-12-05 21:24:40 +00:00
),
re_path(
r"^author/(?P<author_id>\d+)/edit/?$",
views.EditAuthor.as_view(),
name="edit-author",
),
2021-01-13 20:33:48 +00:00
# reading progress
2021-03-21 00:18:18 +00:00
re_path(r"^edit-readthrough/?$", views.edit_readthrough, name="edit-readthrough"),
2021-03-08 16:49:10 +00:00
re_path(r"^delete-readthrough/?$", views.delete_readthrough),
2022-01-11 18:41:33 +00:00
re_path(
r"^create-readthrough/?$",
views.ReadThrough.as_view(),
name="create-readthrough",
),
2021-03-08 16:49:10 +00:00
re_path(r"^delete-progressupdate/?$", views.delete_progressupdate),
2021-06-08 18:23:53 +00:00
# shelve actions
2021-09-29 17:59:36 +00:00
re_path(
r"^reading-status/update/(?P<book_id>\d+)/?$",
views.update_progress,
name="reading-status-update",
),
re_path(
2022-02-11 13:33:46 +00:00
r"^reading-status/(?P<status>want|start|finish|stop)/(?P<book_id>\d+)/?$",
views.ReadingStatus.as_view(),
name="reading-status",
),
2021-01-13 20:33:48 +00:00
# following
2021-03-13 22:48:15 +00:00
re_path(r"^follow/?$", views.follow, name="follow"),
re_path(r"^unfollow/?$", views.unfollow, name="unfollow"),
re_path(
r"^remove-follow/(?P<user_id>\d+)/?$", views.remove_follow, name="remove-follow"
),
2021-03-08 16:49:10 +00:00
re_path(r"^accept-follow-request/?$", views.accept_follow_request),
re_path(r"^delete-follow-request/?$", views.delete_follow_request),
2021-11-28 09:09:29 +00:00
re_path(r"^ostatus_follow/?$", views.remote_follow, name="remote-follow"),
re_path(r"^remote_follow/?$", views.remote_follow_page, name="remote-follow-page"),
2021-11-28 10:38:28 +00:00
re_path(
r"^ostatus_success/?$", views.ostatus_follow_success, name="ostatus-success"
),
2021-12-20 22:37:45 +00:00
# annual summary
2021-12-21 10:58:46 +00:00
re_path(
r"^my-year-in-the-books/(?P<year>\d+)/?$",
views.personal_annual_summary,
),
re_path(
rf"{LOCAL_USER_PATH}/(?P<year>\d+)-in-the-books/?$",
2021-12-21 10:58:46 +00:00
views.AnnualSummary.as_view(),
name="annual-summary",
),
2021-12-22 14:12:56 +00:00
re_path(r"^summary_add_key/?$", views.summary_add_key, name="summary-add-key"),
re_path(
r"^summary_revoke_key/?$", views.summary_revoke_key, name="summary-revoke-key"
),
path("guided-tour/<tour>", views.toggle_guided_tour),
2023-11-30 10:25:51 +00:00
re_path(r"^o/", include("oauth2_provider.urls", namespace="oauth2_provider")),
2020-01-28 06:49:56 +00:00
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2023-09-18 21:57:52 +00:00
# Serves /static when DEBUG is true.
urlpatterns.extend(staticfiles_urlpatterns())
# pylint: disable=invalid-name
handler500 = "bookwyrm.views.server_error"
2023-11-18 01:36:03 +00:00
# pylint: disable=invalid-name
2023-11-18 01:40:36 +00:00
handler403 = "bookwyrm.views.permission_denied"