From e8f3b10484e3f18b6c0086c34ae9918c2bdb9966 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Sat, 20 Feb 2021 13:08:04 +0000 Subject: urls: Convert to flask-style URL patterns These are easier to grok that the old regex based paths, though three of these are retained as an alternative to creating custom path converters [1]. [1] https://docs.djangoproject.com/en/3.0/topics/http/urls/#registering-custom-path-converters Signed-off-by: Stephen Finucane --- patchwork/urls.py | 250 ++++++++++++++++++++++++++---------------------------- 1 file changed, 121 insertions(+), 129 deletions(-) diff --git a/patchwork/urls.py b/patchwork/urls.py index be388ac..6ac9b81 100644 --- a/patchwork/urls.py +++ b/patchwork/urls.py @@ -6,7 +6,10 @@ from django.conf import settings from django.contrib import admin from django.contrib.auth import views as auth_views -from django.urls import include, re_path, reverse_lazy +from django.urls import include +from django.urls import path +from django.urls import re_path +from django.urls import reverse_lazy from patchwork.views import about as about_views from patchwork.views import api as api_views @@ -26,20 +29,20 @@ from patchwork.views import xmlrpc as xmlrpc_views admin.autodiscover() urlpatterns = [ - re_path(r'^admin/', admin.site.urls), - re_path(r'^$', project_views.project_list, name='project-list'), - re_path( - r'^project/(?P[^/]+)/list/$', + path('admin/', admin.site.urls), + path('', project_views.project_list, name='project-list'), + path( + 'project//list/', patch_views.patch_list, name='patch-list', ), - re_path( - r'^project/(?P[^/]+)/bundles/$', + path( + 'project//bundles/', bundle_views.bundle_list, name='bundle-list', ), - re_path( - r'^project/(?P[^/]+)/$', + path( + 'project//', project_views.project_detail, name='project-detail', ), @@ -55,139 +58,130 @@ urlpatterns = [ # work, but it is RECOMMENDED by the RFC that the right hand side of the @ # contains a domain, so I think breaking on messages that have "domains" # ending in /raw/ or /mbox/ is good enough. - re_path( - r'^project/(?P[^/]+)/patch/(?P.+)/raw/$', + path( + 'project//patch//raw/', patch_views.patch_raw, name='patch-raw', ), - re_path( - r'^project/(?P[^/]+)/patch/(?P.+)/mbox/$', + path( + 'project//patch//mbox/', patch_views.patch_mbox, name='patch-mbox', ), - re_path( - r'^project/(?P[^/]+)/patch/(?P.+)/$', + path( + 'project//patch//', patch_views.patch_detail, name='patch-detail', ), # ... old-style /patch/N/* urls - re_path( - r'^patch/(?P\d+)/raw/$', + path( + 'patch//raw/', patch_views.patch_raw_by_id, name='patch-raw-redirect', ), - re_path( - r'^patch/(?P\d+)/mbox/$', + path( + 'patch//mbox/', patch_views.patch_mbox_by_id, name='patch-mbox-redirect', ), - re_path( - r'^patch/(?P\d+)/$', + path( + 'patch//', patch_views.patch_by_id, name='patch-id-redirect', ), # cover views - re_path( - r'^project/(?P[^/]+)/cover/(?P.+)/mbox/$', + path( + 'project//cover//mbox/', cover_views.cover_mbox, name='cover-mbox', ), - re_path( - r'^project/(?P[^/]+)/cover/(?P.+)/$', + path( + 'project//cover//', cover_views.cover_detail, name='cover-detail', ), # ... old-style /cover/N/* urls - re_path( - r'^cover/(?P\d+)/mbox/$', + path( + 'cover//mbox/', cover_views.cover_mbox_by_id, name='cover-mbox-redirect', ), - re_path( - r'^cover/(?P\d+)/$', + path( + 'cover//', cover_views.cover_by_id, name='cover-id-redirect', ), # comment views - re_path( - r'^comment/(?P\d+)/$', + path( + 'comment//', comment_views.comment, name='comment-redirect', ), # series views - re_path( - r'^series/(?P\d+)/mbox/$', + path( + 'series//mbox/', series_views.series_mbox, name='series-mbox', ), # logged-in user stuff - re_path(r'^user/$', user_views.profile, name='user-profile'), - re_path(r'^user/todo/$', user_views.todo_lists, name='user-todos'), - re_path( - r'^user/todo/(?P[^/]+)/$', - user_views.todo_list, - name='user-todo', - ), - re_path(r'^user/bundles/$', bundle_views.bundle_list, name='user-bundles'), - re_path(r'^user/link/$', user_views.link, name='user-link'), - re_path( - r'^user/unlink/(?P[^/]+)/$', - user_views.unlink, - name='user-unlink', - ), + path('user/', user_views.profile, name='user-profile'), + path('user/todo/', user_views.todo_lists, name='user-todos'), + path('user/todo//', user_views.todo_list, name='user-todo'), + path('user/bundles/', bundle_views.bundle_list, name='user-bundles'), + path('user/link/', user_views.link, name='user-link'), + path('user/unlink//', user_views.unlink, name='user-unlink'), # password change - re_path( - r'^user/password-change/$', + path( + 'user/password-change/', auth_views.PasswordChangeView.as_view(), name='password_change', ), - re_path( - r'^user/password-change/done/$', + path( + 'user/password-change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done', ), - re_path( - r'^user/password-reset/$', + path( + 'user/password-reset/', auth_views.PasswordResetView.as_view(), name='password_reset', ), - re_path( - r'^user/password-reset/mail-sent/$', + path( + 'user/password-reset/mail-sent/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done', ), - re_path( - r'^user/password-reset/(?P[0-9A-Za-z_\-]+)/' - r'(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,32})/$', + path( + 'user/password-reset///', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm', ), - re_path( - r'^user/password-reset/complete/$', + path( + 'user/password-reset/complete/', auth_views.PasswordResetCompleteView.as_view(), name='password_reset_complete', ), # login/logout - re_path( - r'^user/login/$', + path( + 'user/login/', auth_views.LoginView.as_view(template_name='patchwork/login.html'), name='auth_login', ), - re_path( - r'^user/logout/$', + path( + 'user/logout/', auth_views.LogoutView.as_view(next_page=reverse_lazy('project-list')), name='auth_logout', ), # registration - re_path(r'^register/', user_views.register, name='user-register'), + path('register/', user_views.register, name='user-register'), # public view for bundles - re_path( - r'^bundle/(?P[^/]*)/(?P[^/]*)/$', + path( + 'bundle///', bundle_views.bundle_detail, name='bundle-detail', ), - re_path( - r'^bundle/(?P[^/]*)/(?P[^/]*)/mbox/$', + path( + 'bundle///mbox/', bundle_views.bundle_mbox, name='bundle-mbox', ), @@ -197,38 +191,36 @@ urlpatterns = [ name='confirm', ), # submitter autocomplete - re_path(r'^submitter/$', api_views.submitters, name='api-submitters'), - re_path(r'^delegate/$', api_views.delegates, name='api-delegates'), + path('submitter/', api_views.submitters, name='api-submitters'), + path('delegate/', api_views.delegates, name='api-delegates'), # email setup - re_path(r'^mail/$', mail_views.settings, name='mail-settings'), - re_path(r'^mail/optout/$', mail_views.optout, name='mail-optout'), - re_path(r'^mail/optin/$', mail_views.optin, name='mail-optin'), + path('mail/', mail_views.settings, name='mail-settings'), + path('mail/optout/', mail_views.optout, name='mail-optout'), + path('mail/optin/', mail_views.optin, name='mail-optin'), # about - re_path(r'^about/$', about_views.about, name='about'), + path('about/', about_views.about, name='about'), # legacy redirects - re_path(r'^help/$', about_views.redirect, name='help'), - re_path(r'^help/about/$', about_views.redirect, name='help-about'), + path('help/', about_views.redirect, name='help'), + path('help/about/', about_views.redirect, name='help-about'), ] if 'debug_toolbar' in settings.INSTALLED_APPS: import debug_toolbar # noqa urlpatterns += [ - re_path(r'^__debug__/', include(debug_toolbar.urls)), + path('__debug__/', include(debug_toolbar.urls)), ] if settings.ENABLE_XMLRPC: urlpatterns += [ - re_path(r'xmlrpc/$', xmlrpc_views.xmlrpc, name='xmlrpc'), - re_path( - r'^project/(?P[^/]+)/pwclientrc/$', + path('xmlrpc/', xmlrpc_views.xmlrpc, name='xmlrpc'), + path( + 'project//pwclientrc/', pwclient_views.pwclientrc, name='pwclientrc', ), # legacy redirect - re_path( - r'^help/pwclient/$', about_views.redirect, name='help-pwclient' - ), + path('help/pwclient/', about_views.redirect, name='help-pwclient'), ] if settings.ENABLE_REST_API: @@ -250,102 +242,102 @@ if settings.ENABLE_REST_API: from patchwork.api import user as api_user_views # noqa api_patterns = [ - re_path(r'^$', api_index_views.IndexView.as_view(), name='api-index'), - re_path( - r'^users/$', + path('', api_index_views.IndexView.as_view(), name='api-index'), + path( + 'users/', api_user_views.UserList.as_view(), name='api-user-list', ), - re_path( - r'^users/(?P[^/]+)/$', + path( + 'users//', api_user_views.UserDetail.as_view(), name='api-user-detail', ), - re_path( - r'^people/$', + path( + 'people/', api_person_views.PersonList.as_view(), name='api-person-list', ), - re_path( - r'^people/(?P[^/]+)/$', + path( + 'people//', api_person_views.PersonDetail.as_view(), name='api-person-detail', ), - re_path( - r'^covers/$', + path( + 'covers/', api_cover_views.CoverList.as_view(), name='api-cover-list', ), - re_path( - r'^covers/(?P[^/]+)/$', + path( + 'covers//', api_cover_views.CoverDetail.as_view(), name='api-cover-detail', ), - re_path( - r'^patches/$', + path( + 'patches/', api_patch_views.PatchList.as_view(), name='api-patch-list', ), - re_path( - r'^patches/(?P[^/]+)/$', + path( + 'patches//', api_patch_views.PatchDetail.as_view(), name='api-patch-detail', ), - re_path( - r'^patches/(?P[^/]+)/checks/$', + path( + 'patches//checks/', api_check_views.CheckListCreate.as_view(), name='api-check-list', ), - re_path( - r'^patches/(?P[^/]+)/checks/(?P[^/]+)/$', + path( + 'patches//checks//', api_check_views.CheckDetail.as_view(), name='api-check-detail', ), - re_path( - r'^series/$', + path( + 'series/', api_series_views.SeriesList.as_view(), name='api-series-list', ), - re_path( - r'^series/(?P[^/]+)/$', + path( + 'series//', api_series_views.SeriesDetail.as_view(), name='api-series-detail', ), - re_path( - r'^bundles/$', + path( + 'bundles/', api_bundle_views.BundleList.as_view(), name='api-bundle-list', ), - re_path( - r'^bundles/(?P[^/]+)/$', + path( + 'bundles//', api_bundle_views.BundleDetail.as_view(), name='api-bundle-detail', ), - re_path( - r'^projects/$', + path( + 'projects/', api_project_views.ProjectList.as_view(), name='api-project-list', ), - re_path( - r'^projects/(?P[^/]+)/$', + path( + 'projects//', api_project_views.ProjectDetail.as_view(), name='api-project-detail', ), - re_path( - r'^events/$', + path( + 'events/', api_event_views.EventList.as_view(), name='api-event-list', ), ] api_1_1_patterns = [ - re_path( - r'^patches/(?P[^/]+)/comments/$', + path( + 'patches//comments/', api_comment_views.PatchCommentList.as_view(), name='api-patch-comment-list', ), - re_path( - r'^covers/(?P[^/]+)/comments/$', + path( + 'covers//comments/', api_comment_views.CoverCommentList.as_view(), name='api-cover-comment-list', ), @@ -359,8 +351,8 @@ if settings.ENABLE_REST_API: r'^api/(?:(?P(1.1|1.2))/)?', include(api_1_1_patterns) ), # token change - re_path( - r'^user/generate-token/$', + path( + 'user/generate-token/', user_views.generate_token, name='generate_token', ), @@ -370,13 +362,13 @@ if settings.ENABLE_REST_API: # redirect from old urls if settings.COMPAT_REDIR: urlpatterns += [ - re_path( - r'^user/bundle/(?P[^/]+)/$', + path( + 'user/bundle//', bundle_views.bundle_detail_redir, name='bundle-redir', ), - re_path( - r'^user/bundle/(?P[^/]+)/mbox/$', + path( + 'user/bundle//mbox/', bundle_views.bundle_mbox_redir, name='bundle-mbox-redir', ), -- cgit v1.2.3