diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index 0df5a6705..1f10a8520 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -1,6 +1,6 @@ """Admin urls.""" -from django.conf.urls import url +from django.urls import path from . import views from .views import ( @@ -8,71 +8,73 @@ from .views import ( identity as identity_views, import_ as import_views ) +app_name = "admin" + urlpatterns = [ - url(r'^$', domain_views.index, name="index"), - url(r'^domains/$', domain_views.domains, name="domain_list"), - url(r'^domains/(?P\d+)/$', views.DomainDetailView.as_view(), - name="domain_detail"), - url(r'^domains/(?P\d+)/dnsbl/$', views.DNSBLDomainDetailView.as_view(), - name="dnsbl_domain_detail"), - url(r'^domains/(?P\d+)/mx/$', views.MXDomainDetailView.as_view(), - name="mx_domain_detail"), - url(r'^domains/list/$', domain_views._domains, name="_domain_list"), - url(r'^domains/quotas/$', domain_views.list_quotas, - name="domain_quota_list"), - url(r'^domains/flatlist/$', domain_views.domains_list, - name="domain_flat_list"), - url(r'^domains/new/', domain_views.newdomain, name="domain_add"), - url(r'^domains/(?P\d+)/edit/$', domain_views.editdomain, - name="domain_change"), - url(r'^domains/(?P\d+)/delete/$', domain_views.deldomain, - name="domain_delete"), - url(r'^domains/page/$', domain_views.get_next_page, - name="domain_page"), + path('', domain_views.index, name="index"), + path('domains/', domain_views.domains, name="domain_list"), + path('domains//', views.DomainDetailView.as_view(), + name="domain_detail"), + path('domains//dnsbl/', views.DNSBLDomainDetailView.as_view(), + name="dnsbl_domain_detail"), + path('domains//mx/', views.MXDomainDetailView.as_view(), + name="mx_domain_detail"), + path('domains/list/', domain_views._domains, name="_domain_list"), + path('domains/quotas/', domain_views.list_quotas, + name="domain_quota_list"), + path('domains/flatlist/', domain_views.domains_list, + name="domain_flat_list"), + path('domains/new/', domain_views.newdomain, name="domain_add"), + path('domains//edit/', domain_views.editdomain, + name="domain_change"), + path('domains//delete/', domain_views.deldomain, + name="domain_delete"), + path('domains/page/', domain_views.get_next_page, + name="domain_page"), ] urlpatterns += [ - url(r'^permissions/remove/$', identity_views.remove_permission, - name="permission_remove"), + path('permissions/remove/', identity_views.remove_permission, + name="permission_remove"), - url(r'^identities/$', identity_views.identities, name="identity_list"), - url(r'^identities/list/$', identity_views._identities, - name="_identity_list"), - url(r'^identities/quotas/$', identity_views.list_quotas, - name="identity_quota_list"), - url(r'^identities/page/$', identity_views.get_next_page, - name="identity_page"), + path('identities/', identity_views.identities, name="identity_list"), + path('identities/list/', identity_views._identities, + name="_identity_list"), + path('identities/quotas/', identity_views.list_quotas, + name="identity_quota_list"), + path('identities/page/', identity_views.get_next_page, + name="identity_page"), - url(r'^accounts/list/$', identity_views.accounts_list, - name="account_list"), - url(r'^accounts/new/$', identity_views.newaccount, name="account_add"), - url(r'^accounts/(?P\d+)/$', views.AccountDetailView.as_view(), - name="account_detail"), - url(r'^accounts/(?P\d+)/edit/$', identity_views.editaccount, - name="account_change"), - url(r'^accounts/(?P\d+)/delete/$', identity_views.delaccount, - name="account_delete"), + path('accounts/list/', identity_views.accounts_list, + name="account_list"), + path('accounts/new/', identity_views.newaccount, name="account_add"), + path('accounts//', views.AccountDetailView.as_view(), + name="account_detail"), + path('accounts//edit/', identity_views.editaccount, + name="account_change"), + path('accounts//delete/', identity_views.delaccount, + name="account_delete"), ] urlpatterns += [ - url(r'^aliases/new/$', alias_views.newalias, name="alias_add"), - url(r'^aliases/(?P\d+)/$', views.AliasDetailView.as_view(), - name="alias_detail"), - url(r'^aliases/(?P\d+)/edit/$', alias_views.editalias, - name="alias_change"), - url(r'^aliases/delete/$', alias_views.delalias, name="alias_delete"), + path('aliases/new/', alias_views.newalias, name="alias_add"), + path('aliases//', views.AliasDetailView.as_view(), + name="alias_detail"), + path('aliases//edit/', alias_views.editalias, + name="alias_change"), + path('aliases/delete/', alias_views.delalias, name="alias_delete"), ] urlpatterns += [ - url(r'^domains/import/$', import_views.import_domains, - name="domain_import"), - url(r'^identities/import/$', import_views.import_identities, - name="identity_import"), + path('domains/import/', import_views.import_domains, + name="domain_import"), + path('identities/import/', import_views.import_identities, + name="identity_import"), ] urlpatterns += [ - url(r'^domains/export/$', export_views.export_domains, - name="domain_export"), - url(r'^identities/export/$', export_views.export_identities, - name="identity_export"), + path('domains/export/', export_views.export_domains, + name="domain_export"), + path('identities/export/', export_views.export_identities, + name="identity_export"), ] diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index 03190dc2f..3ea192dee 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -103,17 +103,15 @@ class ExtensionsPool(object): result = [] for ext_name in list(self.extensions.keys()): ext = self.get_extension(ext_name) - options = {} if category == "api": root = "" pattern = "{}.urls_api" else: root = r"^{}/".format(ext.get_url()) - options.update({"namespace": ext_name}) pattern = "{}.urls" try: result.append( - url(root, include(pattern.format(ext_name), **options)) + url(root, include(pattern.format(ext_name))) ) except ImportError: # No urls for this extension diff --git a/modoboa/core/migrations/0018_auto_20200104_1714.py b/modoboa/core/migrations/0018_auto_20200104_1714.py new file mode 100644 index 000000000..c2789e28f --- /dev/null +++ b/modoboa/core/migrations/0018_auto_20200104_1714.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.13 on 2020-01-04 17:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0017_auto_20190705_1045'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='last_name', + field=models.CharField(blank=True, max_length=150, verbose_name='last name'), + ), + ] diff --git a/modoboa/core/urls.py b/modoboa/core/urls.py index 1d086effd..38e2cd865 100644 --- a/modoboa/core/urls.py +++ b/modoboa/core/urls.py @@ -1,28 +1,30 @@ """Core urls.""" -from django.conf.urls import url +from django.urls import path from . import views +app_name = "core" + urlpatterns = [ - url(r'^$', views.RootDispatchView.as_view(), name="root"), - url(r'^dashboard/$', views.DashboardView.as_view(), name="dashboard"), + path('', views.RootDispatchView.as_view(), name="root"), + path('dashboard/', views.DashboardView.as_view(), name="dashboard"), - url(r'^accounts/login/$', views.dologin, name="login"), - url(r'^accounts/logout/$', views.dologout, name="logout"), + path('accounts/login/', views.dologin, name="login"), + path('accounts/logout/', views.dologout, name="logout"), - url(r'^core/$', views.viewsettings, name="index"), - url(r'^core/parameters/$', views.parameters, name="parameters"), - url(r'^core/info/$', views.information, name="information"), - url(r'^core/logs/$', views.logs, name="log_list"), - url(r'^core/logs/page/$', views.logs_page, name="logs_page"), - url(r'^core/top_notifications/check/$', - views.check_top_notifications, - name="top_notifications_check"), + path('core/', views.viewsettings, name="index"), + path('core/parameters/', views.parameters, name="parameters"), + path('core/info/', views.information, name="information"), + path('core/logs/', views.logs, name="log_list"), + path('core/logs/page/', views.logs_page, name="logs_page"), + path('core/top_notifications/check/', + views.check_top_notifications, + name="top_notifications_check"), - url(r'^user/$', views.index, name="user_index"), - url(r'^user/preferences/$', views.preferences, - name="user_preferences"), - url(r'^user/profile/$', views.profile, name="user_profile"), - url(r'^user/api/$', views.api_access, name="user_api_access"), + path('user/', views.index, name="user_index"), + path('user/preferences/', views.preferences, + name="user_preferences"), + path('user/profile/', views.profile, name="user_profile"), + path('user/api/', views.api_access, name="user_api_access"), ] diff --git a/modoboa/dnstools/urls.py b/modoboa/dnstools/urls.py index ecbc96491..2c43d053f 100644 --- a/modoboa/dnstools/urls.py +++ b/modoboa/dnstools/urls.py @@ -1,17 +1,18 @@ """App related urls.""" -from django.conf.urls import url +from django.urls import path from . import views +app_name = "dnstools" urlpatterns = [ - url(r'^dnsrecords/(?P\d+)/$', views.DNSRecordDetailView.as_view(), - name="dns_record_detail"), - url(r'^dnsrecords/autoconfig/(?P\d+)/$', - views.AutoConfigRecordsStatusView.as_view(), - name="autoconfig_records_status"), - url(r'^configuration/(?P\d+)/$', - views.DomainDNSConfigurationView.as_view(), - name="domain_dns_configuration"), + path('dnsrecords//', views.DNSRecordDetailView.as_view(), + name="dns_record_detail"), + path('dnsrecords/autoconfig//', + views.AutoConfigRecordsStatusView.as_view(), + name="autoconfig_records_status"), + path('configuration//', + views.DomainDNSConfigurationView.as_view(), + name="domain_dns_configuration"), ] diff --git a/modoboa/urls.py b/modoboa/urls.py index 2cb29acd8..94039bfe4 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -3,39 +3,41 @@ from functools import reduce from ckeditor_uploader import views as cku_views from django.conf import settings -from django.conf.urls import include, url from django.contrib.auth import views as auth_views from django.contrib.auth.decorators import login_required +from django.urls import include, path from django.views.generic import TemplateView from django.views.i18n import JavaScriptCatalog from rest_framework.renderers import JSONOpenAPIRenderer from rest_framework.schemas import get_schema_view -from modoboa.admin.views.user import forward +from modoboa.admin.views import user as user_views from modoboa.core import signals as core_signals, views as core_views from modoboa.core.extensions import exts_pool urlpatterns = [ - url(r'^jsi18n/$', JavaScriptCatalog.as_view(), name="javascript-catalog"), - url(r'^ckeditor/upload/', login_required(cku_views.upload), - name="ckeditor_upload"), - url(r'^ckeditor/browse/', login_required(cku_views.browse), - name="ckeditor_browse"), - url("", include("modoboa.core.urls", namespace="core")), - url("^user/forward/", forward, name="user_forward"), - url("admin/", include("modoboa.admin.urls", namespace="admin")), - url("dnstools/", include("modoboa.dnstools.urls", namespace="dnstools")), - # No namespace - url(r'^accounts/password_reset/$', core_views.password_reset, - name="password_reset"), - url(r'^accounts/password_reset/done/$', auth_views.password_reset_done, - name="password_reset_done"), - url(r'^reset/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', # noqa - auth_views.password_reset_confirm, name="password_reset_confirm"), - url(r'^reset/done/$', auth_views.password_reset_complete, - name="password_reset_complete"), + path('jsi18n/', JavaScriptCatalog.as_view(), name="javascript-catalog"), + path('ckeditor/upload/', login_required(cku_views.upload), + name="ckeditor_upload"), + path('ckeditor/browse/', login_required(cku_views.browse), + name="ckeditor_browse"), + + path('', include("modoboa.core.urls")), + path('admin/', include("modoboa.admin.urls")), + path('dnstools/', include("modoboa.dnstools.urls")), + + path('user/forward/', user_views.forward, name="user_forward"), + + path('accounts/password_reset/', core_views.password_reset, + name="password_reset"), + path('accounts/password_reset/done/', auth_views.password_reset_done, + name="password_reset_done"), + path('reset///', auth_views.password_reset_confirm, + name="password_reset_confirm"), + path('reset/done/', auth_views.password_reset_complete, + name="password_reset_complete"), ] exts_pool.load_all() @@ -55,10 +57,10 @@ schema_view = get_schema_view( renderer_classes=[JSONOpenAPIRenderer], ) urlpatterns += [ - url(r'^docs/openapi.json$', schema_view, name="openapi_schema"), - url(r'^docs/api/', login_required( + path('docs/openapi.json', schema_view, name="openapi_schema"), + path('docs/api/', login_required( TemplateView.as_view(template_name="swagger-ui.html"))), - url("^api/v1/", include("modoboa.urls_api", namespace="api")), + path('api/v1/', include("modoboa.urls_api")), ] if settings.DEBUG: diff --git a/modoboa/urls_api.py b/modoboa/urls_api.py index 6c223f539..3e65ccc00 100644 --- a/modoboa/urls_api.py +++ b/modoboa/urls_api.py @@ -1,12 +1,13 @@ """External API urls.""" -from django.conf.urls import include, url +from django.urls import include, path from modoboa.core.extensions import exts_pool +app_name = "api" + urlpatterns = [ - url("", include("modoboa.admin.urls_api")), - url("", include("modoboa.limits.urls_api")), - url("", include("modoboa.relaydomains.urls_api")), -] -urlpatterns += exts_pool.get_urls(category="api") + path('', include("modoboa.admin.urls_api")), + path('', include("modoboa.limits.urls_api")), + path('', include("modoboa.relaydomains.urls_api")), +] + exts_pool.get_urls(category="api") diff --git a/requirements.txt b/requirements.txt index 2f92b4af0..f61b2dc60 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -django>=1.11.8,<=1.11.99 +django>=2.0,<2.1 django-braces==1.14.0 django-ckeditor==5.8.0 django-reversion==3.0.5