HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //lib/python3/dist-packages/postorius/urls.py
# -*- coding: utf-8 -*-
# Copyright (C) 1998-2023 by the Free Software Foundation, Inc.
#
# This file is part of Postorius.
#
# Postorius is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# Postorius is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# Postorius.  If not, see <http://www.gnu.org/licenses/>.

from django.conf.urls import include
from django.urls import re_path

from postorius.views import domain as domain_views
from postorius.views import list as list_views
from postorius.views import rest as rest_views
from postorius.views import system as system_views
from postorius.views import template as template_views
from postorius.views import user as user_views


list_patterns = [
    re_path(r'^csv_view/$', list_views.csv_view, name='csv_view'),
    re_path(
        r'^members/options/(?P<email>.+)$',
        list_views.list_member_options,
        name='list_member_options',
    ),
    re_path(
        r'^members/(?P<role>\w+)/$',
        list_views.ListMembersViews.as_view(),
        name='list_members',
    ),
    re_path(r'^$', list_views.ListSummaryView.as_view(), name='list_summary'),
    re_path(
        r'^subscribe$',
        list_views.ListSubscribeView.as_view(),
        name='list_subscribe',
    ),
    re_path(
        r'^anonymous_subscribe$',
        list_views.ListAnonymousSubscribeView.as_view(),
        name='list_anonymous_subscribe',
    ),
    re_path(
        r'^change_subscription$',
        list_views.ChangeSubscriptionView.as_view(),
        name='change_subscription',
    ),
    re_path(
        r'^unsubscribe/$',
        list_views.ListUnsubscribeView.as_view(),
        name='list_unsubscribe',
    ),
    re_path(
        r'^subscription_requests$',
        list_views.list_subscription_requests,
        name='list_subscription_requests',
    ),
    re_path(
        r'^unsubscription_requests$',
        list_views.list_unsubscription_requests,
        name='list_unsubscription_requests',
    ),
    re_path(
        r'^pending_confirmation$',
        list_views.list_pending_confirmations,
        name='list_pending_confirmation',
    ),
    re_path(
        r'^handle_subscription_request/(?P<request_id>[^/]+)/$',
        list_views.handle_subscription_request,
        name='handle_subscription_request',
    ),
    re_path(
        r'^mass_subscribe/$',
        list_views.list_mass_subscribe,
        name='mass_subscribe',
    ),
    re_path(
        r'^mass_removal/$',
        list_views.ListMassRemovalView.as_view(),
        name='mass_removal',
    ),
    re_path(r'^delete$', list_views.list_delete, name='list_delete'),
    re_path(
        r'^held_messages$',
        list_views.list_moderation,
        name='list_held_messages',
    ),
    re_path(
        r'^held_messages/moderate$',
        list_views.moderate_held_message,
        name='moderate_held_message',
    ),
    re_path(r'^bans/$', list_views.list_bans, name='list_bans'),
    re_path(
        r'^header-matches/$',
        list_views.list_header_matches,
        name='list_header_matches',
    ),
    re_path(
        r'^remove/(?P<role>[^/]+)/(?P<address>.+)$',
        list_views.remove_role,
        name='remove_role',
    ),
    re_path(
        r'^settings/(?P<visible_section>[^/]+)?$',
        list_views.list_settings,
        name='list_settings',
    ),
    re_path(
        r'^unsubscribe_all$',
        list_views.remove_all_subscribers,
        name='unsubscribe_all',
    ),
    re_path(r'^confirm/$', list_views.confirm_token, name='confirm_token'),
    re_path(
        r'^templates$',
        template_views.ListTemplateIndexView.as_view(),
        name='list_template_list',
    ),
    re_path(
        r'^templates/new$',
        template_views.ListTemplateCreateView.as_view(),
        name='list_template_new',
    ),
    re_path(
        r'^templates/(?P<pk>[^/]+)?/update$',
        template_views.ListTemplateUpdateView.as_view(),
        name='list_template_update',
    ),
    re_path(
        r'^templates/(?P<pk>[^/]+)?/delete$',
        template_views.ListTemplateDeleteView.as_view(),
        name='list_template_delete',
    ),
]

urlpatterns = [
    re_path(r'^$', list_views.list_index),  # noqa: W605 (bogus)
    re_path(
        r'^accounts/subscriptions/$',
        user_views.user_subscriptions,
        name='ps_user_profile',
    ),
    re_path(
        r'^accounts/per-address-preferences/$',
        user_views.UserAddressPreferencesView.as_view(),
        name='user_address_preferences',
    ),
    # if this URL changes, update Mailman's Member.options_url
    re_path(
        r'^accounts/per-subscription-preferences/$',
        user_views.UserSubscriptionPreferencesView.as_view(),
        name='user_subscription_preferences',
    ),
    re_path(
        r'^accounts/mailmansettings/$',
        user_views.UserMailmanSettingsView.as_view(),
        name='user_mailmansettings',
    ),
    re_path(
        r'^accounts/list-options/(?P<member_id>[^/]+)/$',
        user_views.UserListOptionsView.as_view(),
        name='user_list_options',
    ),
    # /domains/
    re_path(r'^domains/$', domain_views.domain_index, name='domain_index'),
    re_path(r'^domains/new/$', domain_views.domain_new, name='domain_new'),
    re_path(
        r'^domains/(?P<domain>[^/]+)/$',
        domain_views.domain_edit,
        name='domain_edit',
    ),
    re_path(
        r'^domains/(?P<domain>[^/]+)/delete$',
        domain_views.domain_delete,
        name='domain_delete',
    ),
    re_path(
        r'^domains/(?P<domain>[^/]+)/owners$',
        domain_views.domain_owners,
        name='domain_owners',
    ),
    re_path(
        r'^domains/(?P<domain>[^/]+)/owners/(?P<user_id>.+)/remove$',
        domain_views.remove_owners,
        name='remove_domain_owner',
    ),
    # Ideally, these paths should be accessible by domain_owners, however,
    # we don't have good ways to check that, so for now, this views are
    # protected by superuser privileges.
    # I know it is bad, but this will be fixed soon. See postorius#
    re_path(
        r'^domains/(?P<domain>[^/]+)/templates$',
        template_views.DomainTemplateIndexView.as_view(),
        name='domain_template_list',
    ),
    re_path(
        r'^domains/(?P<domain>[^/]+)/templates/new$',
        template_views.DomainTemplateCreateView.as_view(),
        name='domain_template_new',
    ),
    re_path(
        r'^domains/(?P<domain>[^/]+)/templates/(?P<pk>[^/]+)/update$',  # noqa: E501
        template_views.DomainTemplateUpdateView.as_view(),
        name='domain_template_update',
    ),
    re_path(
        r'^domains/(?P<domain>[^/]+)/templates/(?P<pk>[^/]+)/delete$',  # noqa: E501
        template_views.DomainTemplateDeleteView.as_view(),
        name='domain_template_delete',
    ),
    # /lists/
    re_path(r'^lists/$', list_views.list_index, name='list_index'),
    re_path(r'^lists/new/$', list_views.list_new, name='list_new'),
    re_path(r'^lists/(?P<list_id>[^/]+)/', include(list_patterns)),
    # /system/
    re_path(
        r'^system/$',
        system_views.system_information,
        name='system_information',
    ),
    # /bans/
    re_path(r'^bans/$', system_views.bans, name='global_bans'),
    # /api/
    re_path(
        r'^api/list/(?P<list_id>[^/]+)/held_message/(?P<held_id>\d+)/$',  # noqa: E501
        rest_views.get_held_message,
        name='rest_held_message',
    ),
    re_path(
        r'^api/list/(?P<list_id>[^/]+)/held_message/(?P<held_id>\d+)/'
        r'attachment/(?P<attachment_id>\d+)/$',
        rest_views.get_attachment_for_held_message,
        name='rest_attachment_for_held_message',
    ),
    # URL configuration for templates.
    re_path(
        r'^api/templates/(?P<context>[^/]+)/(?P<identifier>[^/]+)/(?P<name>[^/]+)',  # noqa: E501
        template_views.get_template_data,
        name='rest_template',
    ),
    # users.
    re_path(r'users$', user_views.list_users, name='list_users'),
    re_path(
        r'users/(?P<user_id>[^/]+)/manage$',
        user_views.manage_user,
        name='manage_user',
    ),
    re_path(
        r'users/(?P<user_id>[^/]+)/delete$',
        user_views.delete_user,
        name='delete_user',
    ),
]