Skip to content

Commit 0b06825

Browse files
authored
Upgrade to Django 4 (and dependencies) (#80)
* Upgrade to Django 4 (and dependencies) Provide upgrade to the latest Django version 4.1 and all requirements. Modifications required to work correctly with the deprecated methods or functions. * Add DEFAULT_AUTO_FIELD and required context_processors By switching to the latest Django version it's required to define a default auto field model. Also the context_processor is required in this version.
1 parent 419ab37 commit 0b06825

25 files changed

+92
-89
lines changed

LICENSE

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright (c) 2021 SkyLime GmbH, All rights reserved.
1+
Copyright (c) 2022 SkyLime GmbH, All rights reserved.
22

33
Permission is hereby granted, free of charge, to any person obtaining a copy
44
of this software and associated documentation files (the "Software"), to deal

cron/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.db import models
22
from django.conf import settings
3-
from django.utils.translation import ugettext_lazy as _
3+
from django.utils.translation import gettext_lazy as _
44

55
WHEN = (
66
('* * * * *', _('every minute')),

cron/urls.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from django.conf.urls import url
1+
from django.urls import re_path
22
from cron import views
33

44
urlpatterns = [
5-
url(r'^job/$', views.CronjobList.as_view(), name='cronjob_list'),
6-
url(r'^job/add$', views.CronjobCreate.as_view(), name='cronjob_add'),
7-
url(r'^job/(?P<pk>\d+)/update$', views.CronjobUpdate.as_view(), name='cronjob_update'),
8-
url(r'^job/(?P<pk>\d+)/delete$', views.CronjobDelete.as_view(), name='cronjob_delete'),
5+
re_path(r'^job/$', views.CronjobList.as_view(), name='cronjob_list'),
6+
re_path(r'^job/add$', views.CronjobCreate.as_view(), name='cronjob_add'),
7+
re_path(r'^job/(?P<pk>\d+)/update$', views.CronjobUpdate.as_view(), name='cronjob_update'),
8+
re_path(r'^job/(?P<pk>\d+)/delete$', views.CronjobDelete.as_view(), name='cronjob_delete'),
99
]

cron/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.contrib.messages.views import SuccessMessageMixin
55
from django.contrib import messages
66
from django.conf import settings
7-
from django.utils.translation import ugettext as _
7+
from django.utils.translation import gettext as _
88
from kumquat.utils import LoginRequiredMixin, SuccessActionFormMixin, SuccessActionDeleteMixin
99
from cron.models import Cronjob
1010

ftp/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.db import models
2-
from django.utils.translation import ugettext_lazy as _
2+
from django.utils.translation import gettext_lazy as _
33
from passlib.hash import sha512_crypt
44
from web.models import VHost
55

ftp/urls.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from django.conf.urls import url
1+
from django.urls import re_path
22
from ftp import views
33

44
urlpatterns = [
5-
url(r'^accounts/$', views.AccountList.as_view(), name='ftp_account_list'),
6-
url(r'^accounts/add$', views.AccountCreate.as_view(), name='ftp_account_add'),
7-
url(r'^accounts/(?P<pk>\d+)/update$', views.AccountUpdate.as_view(), name='ftp_account_update'),
8-
url(r'^accounts/(?P<pk>\d+)/delete$', views.AccountDelete.as_view(), name='ftp_account_delete'),
9-
]
5+
re_path(r'^accounts/$', views.AccountList.as_view(), name='ftp_account_list'),
6+
re_path(r'^accounts/add$', views.AccountCreate.as_view(), name='ftp_account_add'),
7+
re_path(r'^accounts/(?P<pk>\d+)/update$', views.AccountUpdate.as_view(), name='ftp_account_update'),
8+
re_path(r'^accounts/(?P<pk>\d+)/delete$', views.AccountDelete.as_view(), name='ftp_account_delete'),
9+
]

ftp/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.urls import reverse_lazy
22
from django.views.generic import ListView
33
from django.views.generic.edit import CreateView, UpdateView, DeleteView
4-
from django.utils.translation import ugettext as _
4+
from django.utils.translation import gettext as _
55
from django.contrib.messages.views import SuccessMessageMixin
66
from kumquat.utils import LoginRequiredMixin
77
from ftp.models import Account

kumquat/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.db import models
2-
from django.utils.translation import ugettext_lazy as _
2+
from django.utils.translation import gettext_lazy as _
33
from kumquat.utils import DomainNameValidator
44

55
class Domain(models.Model):

kumquat/urls.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from django.conf.urls import url
1+
from django.urls import re_path
22
from kumquat import views
33

44
urlpatterns = [
5-
url(r'^domains/$', views.DomainList.as_view(), name='domain_list'),
6-
url(r'^domains/add$', views.DomainCreate.as_view(), name='domain_add'),
7-
url(r'^domains/(?P<pk>\d+)/delete$', views.DomainDelete.as_view(), name='domain_delete'),
8-
]
5+
re_path(r'^domains/$', views.DomainList.as_view(), name='domain_list'),
6+
re_path(r'^domains/add$', views.DomainCreate.as_view(), name='domain_add'),
7+
re_path(r'^domains/(?P<pk>\d+)/delete$', views.DomainDelete.as_view(), name='domain_delete'),
8+
]

kumquat/utils.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib.auth.decorators import login_required
22
from django.utils.decorators import method_decorator
3-
from django.utils.encoding import smart_text
3+
from django.utils.encoding import smart_str
44
from django.core.exceptions import ValidationError
55
from django.core.validators import RegexValidator
66
import re
@@ -54,7 +54,7 @@ def __call__(self, value):
5454
if not value: raise
5555
# convert it unicode -> ascii
5656
try:
57-
asciival = smart_text(value).encode('idna').decode('ascii')
57+
asciival = smart_str(value).encode('idna').decode('ascii')
5858
except UnicodeError:
5959
raise e # raise the original ASCII error
6060
# validate the ascii encoding of it

kumquat/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.urls import reverse_lazy
22
from django.views.generic import ListView
33
from django.views.generic.edit import CreateView, UpdateView, DeleteView
4-
from django.utils.translation import ugettext as _
4+
from django.utils.translation import gettext as _
55
from django.contrib.messages.views import SuccessMessageMixin
66
from kumquat.models import Domain
77
from kumquat.utils import LoginRequiredMixin

kumquat_web/settings.py

+3
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
'debug': True,
6969
'context_processors': [
7070
'django.contrib.auth.context_processors.auth',
71+
'django.template.context_processors.request',
7172
'django.template.context_processors.debug',
7273
'django.template.context_processors.i18n',
7374
'django.template.context_processors.media',
@@ -124,6 +125,8 @@
124125

125126
LOGIN_REDIRECT_URL = '/'
126127

128+
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
129+
127130
# Logging
128131
# https://docs.djangoproject.com/en/dev/topics/logging/
129132
LOGGING = {

kumquat_web/urls.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.conf import settings
2-
from django.conf.urls import include, url
2+
from django.urls import include, re_path
33
from django.conf.urls.static import static
44
from django.contrib import admin
55
from django.contrib.auth import views as auth_views
@@ -10,17 +10,17 @@
1010

1111

1212
urlpatterns = [
13-
url(r'^$', status, name='status'),
14-
url(r'^system/', include('kumquat.urls')),
15-
url(r'^ftp/', include('ftp.urls')),
16-
url(r'^mysql/', include('mysql.urls')),
17-
url(r'^web/', include('web.urls')),
18-
url(r'^mail/', include('mail.urls')),
19-
url(r'^cron/', include('cron.urls')),
20-
url(r'^admin/', admin.site.urls),
13+
re_path(r'^$', status, name='status'),
14+
re_path(r'^system/', include('kumquat.urls')),
15+
re_path(r'^ftp/', include('ftp.urls')),
16+
re_path(r'^mysql/', include('mysql.urls')),
17+
re_path(r'^web/', include('web.urls')),
18+
re_path(r'^mail/', include('mail.urls')),
19+
re_path(r'^cron/', include('cron.urls')),
20+
re_path(r'^admin/', admin.site.urls),
2121

22-
url(r'', include('django.contrib.auth.urls')),
22+
re_path(r'', include('django.contrib.auth.urls')),
2323

24-
url(r'^accounts/login/$', auth_views.LoginView.as_view(), name='login'),
25-
url(r'^accounts/logout/$', logout_then_login, name='logout_then_login'),
24+
re_path(r'^accounts/login/$', auth_views.LoginView.as_view(), name='login'),
25+
re_path(r'^accounts/logout/$', logout_then_login, name='logout_then_login'),
2626
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

mail/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.db import models
2-
from django.utils.translation import ugettext_lazy as _
2+
from django.utils.translation import gettext_lazy as _
33
from passlib.hash import sha512_crypt
44
from kumquat.models import Domain
55

mail/urls.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
from django.conf.urls import url
1+
from django.urls import re_path
22
from mail import views
33

44
urlpatterns = [
5-
url(r'^accounts/$', views.AccountList.as_view(), name='mail_account_list'),
6-
url(r'^accounts/add$', views.AccountCreate.as_view(), name='mail_account_add'),
7-
url(r'^accounts/(?P<pk>\d+)/update$', views.AccountUpdate.as_view(), name='mail_account_update'),
8-
url(r'^accounts/(?P<pk>\d+)/delete$', views.AccountDelete.as_view(), name='mail_account_delete'),
5+
re_path(r'^accounts/$', views.AccountList.as_view(), name='mail_account_list'),
6+
re_path(r'^accounts/add$', views.AccountCreate.as_view(), name='mail_account_add'),
7+
re_path(r'^accounts/(?P<pk>\d+)/update$', views.AccountUpdate.as_view(), name='mail_account_update'),
8+
re_path(r'^accounts/(?P<pk>\d+)/delete$', views.AccountDelete.as_view(), name='mail_account_delete'),
99

10-
url(r'^redirect/$', views.RedirectList.as_view(), name='mail_redirect_list'),
11-
url(r'^redirect/add$', views.RedirectCreate.as_view(), name='mail_redirect_add'),
12-
url(r'^redirect/(?P<pk>\d+)/update$', views.RedirectUpdate.as_view(), name='mail_redirect_update'),
13-
url(r'^redirect/(?P<pk>\d+)/delete$', views.RedirectDelete.as_view(), name='mail_redirect_delete'),
10+
re_path(r'^redirect/$', views.RedirectList.as_view(), name='mail_redirect_list'),
11+
re_path(r'^redirect/add$', views.RedirectCreate.as_view(), name='mail_redirect_add'),
12+
re_path(r'^redirect/(?P<pk>\d+)/update$', views.RedirectUpdate.as_view(), name='mail_redirect_update'),
13+
re_path(r'^redirect/(?P<pk>\d+)/delete$', views.RedirectDelete.as_view(), name='mail_redirect_delete'),
1414

15-
url(r'^export.json$', views.export, name='mail_export'),
15+
re_path(r'^export.json$', views.export, name='mail_export'),
1616

17-
]
17+
]

mail/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.conf import settings
44
from django.views.generic import ListView
55
from django.views.generic.edit import CreateView, UpdateView, DeleteView
6-
from django.utils.translation import ugettext as _
6+
from django.utils.translation import gettext as _
77
from django.contrib.messages.views import SuccessMessageMixin
88
from django.http import HttpResponse
99
from kumquat.utils import LoginRequiredMixin

mysql/forms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django import forms
2-
from django.utils.translation import ugettext_lazy as _
2+
from django.utils.translation import gettext_lazy as _
33
from django.db import connections, transaction
44

55
def dbname(username):

mysql/urls.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from django.conf.urls import url
1+
from django.urls import re_path
22
from mysql import views
33

44
urlpatterns = [
5-
url(r'^databases/$', views.DatabaseList.as_view(), name='mysql_database_list'),
6-
url(r'^databases/add$', views.DatabaseCreate.as_view(), name='mysql_database_add'),
7-
url(r'^databases/(?P<slug>[a-z0-9_]+)/update$', views.databaseUpdate, name='mysql_database_update'),
8-
url(r'^databases/(?P<slug>[a-z0-9_]+)/delete$', views.databaseDelete, name='mysql_database_delete'),
9-
]
5+
re_path(r'^databases/$', views.DatabaseList.as_view(), name='mysql_database_list'),
6+
re_path(r'^databases/add$', views.DatabaseCreate.as_view(), name='mysql_database_add'),
7+
re_path(r'^databases/(?P<slug>[a-z0-9_]+)/update$', views.databaseUpdate, name='mysql_database_update'),
8+
re_path(r'^databases/(?P<slug>[a-z0-9_]+)/delete$', views.databaseDelete, name='mysql_database_delete'),
9+
]

mysql/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.core.exceptions import PermissionDenied
55
from django.shortcuts import render, redirect
66
from django.contrib.auth.decorators import login_required
7-
from django.utils.translation import ugettext as _
7+
from django.utils.translation import gettext as _
88
from django.contrib.messages.views import SuccessMessageMixin
99
from django.db import connections, transaction
1010
from django.http import Http404

requirements.txt

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
acme==1.10.1
1+
acme==1.22.0
22
cryptography==3.3.2
3-
Django==2.2.28
4-
django-annoying==0.10.3
5-
django-bootstrap3==14.2.0
3+
Django==4.1.1
4+
django-annoying==0.10.6
5+
django-bootstrap3==22.1
66
django-messagegroups==0.4.5
77
django-settings-export==1.2.1
8-
mysqlclient==2.0.1
8+
mysqlclient==2.1.1
99
passlib==1.7.4
10-
pyOpenSSL==19.1.0
10+
pyOpenSSL==21.0.0
1111
zerorpc==0.6.3

templates/base.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{% load i18n %}
22
{% load bootstrap3 %}
3-
{% load staticfiles %}
3+
{% load static %}
44
{% load messagegroups %}
55
<!DOCTYPE html>
66
<html lang="{{ LANGUAGE_CODE }}">

web/forms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django import forms
2-
from django.utils.translation import ugettext_lazy as _
2+
from django.utils.translation import gettext_lazy as _
33
from OpenSSL import SSL, crypto
44
from .models import VHostAlias
55

web/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.db import models
22
from django.conf import settings
3-
from django.utils.translation import ugettext_lazy as _
3+
from django.utils.translation import gettext_lazy as _
44
from django.utils import timezone
55
from OpenSSL import SSL, crypto
66
from annoying.fields import AutoOneToOneField

web/urls.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
from django.conf.urls import url
1+
from django.urls import re_path
22
from web import views
33

44
urlpatterns = [
5-
url(r'^vhost/$', views.VHostList.as_view(), name='web_vhost_list'),
6-
url(r'^vhost/add$', views.VHostCreate.as_view(), name='web_vhost_add'),
7-
url(r'^vhost/(?P<pk>\d+)/update$', views.VHostUpdate.as_view(), name='web_vhost_update'),
8-
url(r'^vhost/(?P<pk>\d+)/delete$', views.VHostDelete.as_view(), name='web_vhost_delete'),
5+
re_path(r'^vhost/$', views.VHostList.as_view(), name='web_vhost_list'),
6+
re_path(r'^vhost/add$', views.VHostCreate.as_view(), name='web_vhost_add'),
7+
re_path(r'^vhost/(?P<pk>\d+)/update$', views.VHostUpdate.as_view(), name='web_vhost_update'),
8+
re_path(r'^vhost/(?P<pk>\d+)/delete$', views.VHostDelete.as_view(), name='web_vhost_delete'),
99

10-
url(r'^vhost/(?P<pk>\d+)/catchall$', views.vhostCatchallSet, name='web_vhost_catchall_set'),
11-
url(r'^vhost/catchall/(?P<pk>\d+)/delete$', views.vhostCatchallDelete, name='web_vhost_catchall_delete'),
10+
re_path(r'^vhost/(?P<pk>\d+)/catchall$', views.vhostCatchallSet, name='web_vhost_catchall_set'),
11+
re_path(r'^vhost/catchall/(?P<pk>\d+)/delete$', views.vhostCatchallDelete, name='web_vhost_catchall_delete'),
1212

13-
url(r'^vhost/(?P<pk>\d+)/errorlog$', views.vhostErrorLogList, name='web_vhost_errorlog_list'),
13+
re_path(r'^vhost/(?P<pk>\d+)/errorlog$', views.vhostErrorLogList, name='web_vhost_errorlog_list'),
1414

15-
url(r'^vhost/(?P<pk>\d+)/alias$', views.vhostAliasList, name='web_vhost_alias_list'),
16-
url(r'^vhost/(?P<pk>\d+)/alias/add$', views.vhostAliasAdd, name='web_vhost_alias_add'),
17-
url(r'^vhost/alias/(?P<pk>\d+)/delete$', views.vhostAliasDelete, name='web_vhost_alias_delete'),
15+
re_path(r'^vhost/(?P<pk>\d+)/alias$', views.vhostAliasList, name='web_vhost_alias_list'),
16+
re_path(r'^vhost/(?P<pk>\d+)/alias/add$', views.vhostAliasAdd, name='web_vhost_alias_add'),
17+
re_path(r'^vhost/alias/(?P<pk>\d+)/delete$', views.vhostAliasDelete, name='web_vhost_alias_delete'),
1818

19-
url(r'^vhost/(?P<pk>\d+)/snapshot$', views.vhostSnapshotList, name='web_vhost_snapshot_list'),
20-
url(r'^vhost/(?P<pk>\d+)/snapshot/add$', views.vhostSnapshotCreate, name='web_vhost_snapshot_add'),
21-
# url(r'^vhost/(?P<pk>\d+)/snapshot/(?P<name>[A-Za-z0-9_-]+)/download$', views.vhostSnapshotDownload, name='web_vhost_snapshot_download'),
22-
url(r'^vhost/(?P<pk>\d+)/snapshot/(?P<name>[A-Za-z0-9_-]+)/rollback$', views.vhostSnapshotRollback, name='web_vhost_snapshot_rollback'),
23-
url(r'^vhost/(?P<pk>\d+)/snapshot/(?P<name>[A-Za-z0-9_-]+)/delete$', views.vhostSnapshotDelete, name='web_vhost_snapshot_delete'),
19+
re_path(r'^vhost/(?P<pk>\d+)/snapshot$', views.vhostSnapshotList, name='web_vhost_snapshot_list'),
20+
re_path(r'^vhost/(?P<pk>\d+)/snapshot/add$', views.vhostSnapshotCreate, name='web_vhost_snapshot_add'),
21+
# re_path(r'^vhost/(?P<pk>\d+)/snapshot/(?P<name>[A-Za-z0-9_-]+)/download$', views.vhostSnapshotDownload, name='web_vhost_snapshot_download'),
22+
re_path(r'^vhost/(?P<pk>\d+)/snapshot/(?P<name>[A-Za-z0-9_-]+)/rollback$', views.vhostSnapshotRollback, name='web_vhost_snapshot_rollback'),
23+
re_path(r'^vhost/(?P<pk>\d+)/snapshot/(?P<name>[A-Za-z0-9_-]+)/delete$', views.vhostSnapshotDelete, name='web_vhost_snapshot_delete'),
2424

25-
url(r'^sslcert/$', views.SSLCertList.as_view(), name='web_sslcert_list'),
26-
url(r'^sslcert/expired/$', views.ExpiredSSLCertList.as_view(), name='web_sslcert_list_expired'),
27-
url(r'^sslcert/add$', views.sslcertCreate, name='web_sslcert_add'),
28-
url(r'^sslcert/(?P<pk>\d+)/delete$', views.SSLCertDelete.as_view(), name='web_sslcert_delete'),
29-
url(r'^sslcert/expired/delete/$', views.sslcertDeleteExpired, name='web_sslcert_delete_expired'),
25+
re_path(r'^sslcert/$', views.SSLCertList.as_view(), name='web_sslcert_list'),
26+
re_path(r'^sslcert/expired/$', views.ExpiredSSLCertList.as_view(), name='web_sslcert_list_expired'),
27+
re_path(r'^sslcert/add$', views.sslcertCreate, name='web_sslcert_add'),
28+
re_path(r'^sslcert/(?P<pk>\d+)/delete$', views.SSLCertDelete.as_view(), name='web_sslcert_delete'),
29+
re_path(r'^sslcert/expired/delete/$', views.sslcertDeleteExpired, name='web_sslcert_delete_expired'),
3030
]

web/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.shortcuts import render, redirect, get_object_or_404
55
from django.views.decorators.http import require_POST
66
from django.contrib.auth.decorators import login_required
7-
from django.utils.translation import ugettext as _
7+
from django.utils.translation import gettext as _
88
from django.utils.timezone import now
99
from django.contrib.messages.views import SuccessMessageMixin
1010
from django.contrib import messages

0 commit comments

Comments
 (0)