Django 1.0 support.

see #1024
This commit is contained in:
Antoine Nguyen
2017-02-10 14:29:21 +01:00
parent 27d364a046
commit 01f926ca95
18 changed files with 134 additions and 132 deletions
-1
View File
@@ -43,7 +43,6 @@ class MailboxFactory(PermissionFactory):
domain = factory.SubFactory(DomainFactory)
user = factory.SubFactory(UserFactory)
quota = 10
enabled = True
class AliasRecipientFactory(factory.django.DjangoModelFactory):
@@ -14,6 +14,7 @@ from django.core.management.base import BaseCommand
from django.template.loader import render_to_string
from django.utils.functional import cached_property
from django.utils.translation import ugettext as _
from django.utils import timezone
from modoboa.admin import constants
from modoboa.admin import models
@@ -72,7 +73,7 @@ class CheckMXRecords(BaseCommand):
DNS queries are not performed while `ttl` (in seconds) is still valid.
"""
now = datetime.now()
now = timezone.now()
records = models.MXRecord.objects.filter(domain=domain,
updated__gt=now)
if records.exists():
+49 -44
View File
@@ -1,71 +1,76 @@
"""Admin urls."""
from django.conf.urls import patterns, url
from django.conf.urls import url
from . import views
from .views import import_ as import_views
from .views import alias as alias_views
from .views import domain as domain_views
from .views import export as export_views
from .views import identity as identity_views
urlpatterns = patterns(
'modoboa.admin.views.domain',
url(r'^$', 'index', name="index"),
url(r'^domains/$', 'domains', name="domain_list"),
urlpatterns = [
url(r'^$', domain_views.index, name="index"),
url(r'^domains/$', domain_views.domains, name="domain_list"),
url(r'^domains/(?P<pk>\d+)/$', views.DomainDetailView.as_view(),
name="domain_detail"),
url(r'^domains/(?P<pk>\d+)/dnsbl/$', views.DNSBLDomainDetailView.as_view(),
name="dnsbl_domain_detail"),
url(r'^domains/(?P<pk>\d+)/mx/$', views.MXDomainDetailView.as_view(),
name="mx_domain_detail"),
url(r'^domains/list/$', '_domains', name="_domain_list"),
url(r'^domains/flatlist/$', 'domains_list', name="domain_flat_list"),
url(r'^domains/new/', 'newdomain', name='domain_add'),
url(r'^domains/(?P<dom_id>\d+)/edit/$', 'editdomain',
url(r'^domains/list/$', domain_views._domains, name="_domain_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<dom_id>\d+)/edit/$', domain_views.editdomain,
name="domain_change"),
url(r'^domains/(?P<dom_id>\d+)/delete/$', 'deldomain',
url(r'^domains/(?P<dom_id>\d+)/delete/$', domain_views.deldomain,
name="domain_delete"),
)
]
urlpatterns += patterns(
'modoboa.admin.views.identity',
url(r'^permissions/remove/$', 'remove_permission',
urlpatterns += [
url(r'^permissions/remove/$', identity_views.remove_permission,
name="permission_remove"),
url(r'^identities/$', 'identities', name="identity_list"),
url(r'^identities/list/$', '_identities', name="_identity_list"),
url(r'^identities/quotas/$', 'list_quotas', name="quota_list"),
url(r'^identities/page/$', 'get_next_page', name="identity_page"),
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="quota_list"),
url(r'^identities/page/$', identity_views.get_next_page,
name="identity_page"),
url(r'^accounts/list/$', 'accounts_list', name="account_list"),
url(r'^accounts/new/$', 'newaccount', name="account_add"),
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<pk>\d+)/$', views.AccountDetailView.as_view(),
name="account_detail"),
url(r'^accounts/(?P<pk>\d+)/edit/$', 'editaccount',
url(r'^accounts/(?P<pk>\d+)/edit/$', identity_views.editaccount,
name="account_change"),
url(r'^accounts/(?P<pk>\d+)/delete/$', 'delaccount',
url(r'^accounts/(?P<pk>\d+)/delete/$', identity_views.delaccount,
name="account_delete"),
)
]
urlpatterns += patterns(
'modoboa.admin.views.alias',
url(r'^aliases/new/$', 'newalias', name="alias_add"),
urlpatterns += [
url(r'^aliases/new/$', alias_views.newalias, name="alias_add"),
url(r'^aliases/(?P<pk>\d+)/$', views.AliasDetailView.as_view(),
name="alias_detail"),
url(r'^aliases/(?P<alid>\d+)/edit/$', 'editalias', name="alias_change"),
url(r'^aliases/delete/$', 'delalias', name="alias_delete"),
)
url(r'^aliases/(?P<alid>\d+)/edit/$', alias_views.editalias,
name="alias_change"),
url(r'^aliases/delete/$', alias_views.delalias, name="alias_delete"),
]
urlpatterns += patterns(
'modoboa.admin.views.import_',
urlpatterns += [
url(r'^domains/import/$', import_views.import_domains,
name="domain_import"),
url(r'^identities/import/$', import_views.import_identities,
name="identity_import"),
]
url(r'^domains/import/$', 'import_domains', name="domain_import"),
url(r'^identities/import/$', 'import_identities', name="identity_import"),
)
urlpatterns += patterns(
'modoboa.admin.views.export',
url(r'^domains/export/$', 'export_domains', name="domain_export"),
url(r'^identities/export/$', 'export_identities', name="identity_export"),
)
urlpatterns += [
url(r'^domains/export/$', export_views.export_domains,
name="domain_export"),
url(r'^identities/export/$', export_views.export_identities,
name="identity_export"),
]
+3 -4
View File
@@ -1,6 +1,5 @@
from django.conf.urls import patterns, include, url
from django.conf.urls import include, url
urlpatterns = patterns(
'',
urlpatterns = [
url(r'', include('modoboa.urls')),
)
]
+1 -1
View File
@@ -5,7 +5,7 @@ from . import signals
def top_notifications(request):
"""A context processor to include top notifications."""
if request.user.is_anonymous():
if request.user.is_anonymous:
return {}
interval = request.localconfig.parameters.get_value(
"top_notifications_check_interval")
+5 -3
View File
@@ -168,13 +168,15 @@ class User(PermissionsMixin):
def natural_key(self):
return (self.get_username(),)
@property
def is_anonymous(self):
"""
Always returns False. This is a way of comparing User objects to
anonymous users.
"""Always returns False.
This is a way of comparing User objects to anonymous users.
"""
return False
@property
def is_authenticated(self):
"""
Always return True. This is a way to tell if the user has been
+16 -26
View File
@@ -1,38 +1,28 @@
"""Core urls."""
from django.conf.urls import patterns, url
from django.conf.urls import url
from . import views
urlpatterns = patterns(
'',
urlpatterns = [
url(r'^$', views.RootDispatchView.as_view(), name="root"),
url(r'^dashboard/$', views.DashboardView.as_view(), name="dashboard"),
url(r'^accounts/login/$', 'modoboa.core.views.auth.dologin',
name="login"),
url(r'^accounts/logout/$', 'modoboa.core.views.auth.dologout',
name="logout"),
url(r'^accounts/login/$', views.dologin, name="login"),
url(r'^accounts/logout/$', views.dologout, name="logout"),
url(r'^core/$', 'modoboa.core.views.admin.viewsettings',
name="index"),
url(r'^core/parameters/$', 'modoboa.core.views.admin.parameters',
name="parameters"),
url(r'^core/info/$', 'modoboa.core.views.admin.information',
name="information"),
url(r'^core/logs/$', 'modoboa.core.views.admin.logs', name="log_list"),
url(r'^core/logs/page/$', 'modoboa.core.views.admin.logs_page',
name="logs_page"),
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/$',
'modoboa.core.views.admin.check_top_notifications',
name='top_notifications_check'),
views.check_top_notifications,
name="top_notifications_check"),
url(r'^user/$', 'modoboa.core.views.user.index', name="user_index"),
url(r'^user/preferences/$', 'modoboa.core.views.user.preferences',
url(r'^user/$', views.index, name="user_index"),
url(r'^user/preferences/$', views.preferences,
name="user_preferences"),
url(r'^user/profile/$', 'modoboa.core.views.user.profile',
name="user_profile"),
url(r'^user/api/$', 'modoboa.core.views.user.api_access',
name="user_api_access"),
)
url(r'^user/profile/$', views.profile, name="user_profile"),
url(r'^user/api/$', views.api_access, name="user_api_access"),
]
+17
View File
@@ -1,9 +1,26 @@
"""Core views."""
from .admin import (
check_top_notifications, information, logs, logs_page, parameters,
viewsettings)
from .auth import dologin, dologout
from .base import RootDispatchView
from .dashboard import DashboardView
from .user import api_access, index, preferences, profile
__all__ = [
"DashboardView",
"RootDispatchView",
"api_access",
"check_top_notifications",
"dologin",
"dologout",
"index",
"information",
"logs",
"logs_page",
"parameters",
"preferences",
"profile",
"viewsettings",
]
+1 -1
View File
@@ -74,7 +74,7 @@ dologin = never_cache(dologin)
def dologout(request):
"""Logout current user."""
if not request.user.is_anonymous():
if not request.user.is_anonymous:
signals.user_logout.send(sender="dologout", request=request)
logger = logging.getLogger("modoboa.auth")
logger.info(_("User {} logged out").format(request.user.username))
+1 -1
View File
@@ -17,7 +17,7 @@ class DashboardView(auth_mixins.AccessMixin, generic.TemplateView):
def dispatch(self, request, *args, **kwargs):
"""Check if user can access dashboard."""
if not request.user.is_authenticated() or not request.user.is_admin:
if not request.user.is_authenticated or not request.user.is_admin:
return self.handle_no_permission()
return super(DashboardView, self).dispatch(request, *args, **kwargs)
+1 -2
View File
@@ -21,8 +21,7 @@ def _render_to_string(request, tpl, user_context):
Just a wrapper which automatically adds a RequestContext instance
(useful to use settings variables like STATIC_URL inside templates)
"""
return render_to_string(tpl, user_context,
context_instance=template.RequestContext(request))
return render_to_string(tpl, user_context, request)
def _render_error(request, errortpl="error", user_context=None):
+8 -5
View File
@@ -1,8 +1,11 @@
from django.conf.urls import patterns, url
"""Relay domains urls."""
urlpatterns = patterns(
'modoboa.relaydomains.views',
from django.conf.urls import url
url(r'^scan_services/$', 'scan_for_services',
from . import views
urlpatterns = [
url(r'^scan_services/$', views.scan_for_services,
name="service_scan"),
)
]
+1 -2
View File
@@ -8,8 +8,7 @@
<link rel="stylesheet" type="text/css" href="{% static 'bootstrap/dist/css/bootstrap.min.css' %}" />
<script src="{% static 'bootstrap/dist/js/bootstrap.min.js' %}" type="text/javascript"></script>
<script src="{% static 'eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min.js' %}" type="text/javascript"></script>
{% url "django.views.i18n.javascript_catalog" as catalog_url %}
<script type="text/javascript" src="{{ catalog_url }}"></script>
<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
<style>
body {
padding-top: 60px;
+1 -2
View File
@@ -78,8 +78,7 @@
<script src="{% static 'js/notify.js' %}" type="text/javascript"></script>
<script src="{% static 'js/poller.js' %}" type="text/javascript"></script>
<script src="{% static 'js/top_notifications.js' %}" type="text/javascript"></script>
{% url "django.views.i18n.javascript_catalog" as catalog_url %}
<script type="text/javascript" src="{{ catalog_url }}"></script>
<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
<script type="text/javascript">
var top_notifications;
+1 -1
View File
@@ -60,7 +60,7 @@
{% if TEMPLATE_DEBUG %}
<script src="//maxcdn.bootstrapcdn.com/bootlint/0.4.0/bootlint.min.js"></script>
{% endif %}
<script type="text/javascript" src="{% url 'django.views.i18n.javascript_catalog' %}"></script>
<script type="text/javascript" src="{% url 'javascript-catalog' %}"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#id_username').focus();
+19 -28
View File
@@ -1,48 +1,39 @@
from django.conf import settings
from django.conf.urls import patterns, include, url
from django.conf.urls import include, url
from django.views.i18n import JavaScriptCatalog
from modoboa.admin.views.user import forward
from modoboa.core.extensions import exts_pool
from modoboa.core import signals as core_signals
urlpatterns = patterns(
'',
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog',
{'packages': ('modoboa', ), }),
('', include('modoboa.core.urls', namespace="core")),
url('^user/forward/', 'modoboa.admin.views.user.forward',
name='user_forward'),
('admin/', include('modoboa.admin.urls', namespace="admin")),
('relaydomains/',
include('modoboa.relaydomains.urls', namespace="relaydomains")),
)
urlpatterns = [
url(r'^jsi18n/$', JavaScriptCatalog.as_view(), name='javascript-catalog'),
url('', include('modoboa.core.urls', namespace="core")),
url('^user/forward/', forward, name="user_forward"),
url('admin/', include('modoboa.admin.urls', namespace="admin")),
url('relaydomains/',
include('modoboa.relaydomains.urls', namespace="relaydomains")),
]
urlpatterns += patterns(
'',
*exts_pool.load_all()
)
urlpatterns += exts_pool.load_all()
extra_routes = core_signals.extra_uprefs_routes.send(sender="urls")
if extra_routes:
extra_routes = reduce(
lambda a, b: a + b, [route[1] for route in extra_routes])
urlpatterns += patterns(
'',
*extra_routes
)
urlpatterns += extra_routes
# API urls
urlpatterns += patterns(
"",
("^api/v1/", include("modoboa.urls_api", namespace="external_api")),
urlpatterns += [
url("^api/v1/", include("modoboa.urls_api", namespace="external_api")),
url("^docs/api/", include('rest_framework_swagger.urls')),
)
]
if 'modoboa.demo' in settings.INSTALLED_APPS:
urlpatterns += patterns(
'',
(r'^demo/', include('modoboa.demo.urls', namespace="demo"))
)
urlpatterns += [
url(r'^demo/', include('modoboa.demo.urls', namespace="demo"))
]
if settings.DEBUG:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
+4 -6
View File
@@ -1,10 +1,8 @@
"""External API urls."""
from django.conf.urls import patterns, include
from django.conf.urls import include, url
urlpatterns = patterns(
"",
("", include("modoboa.admin.urls_api")),
)
urlpatterns = [
url("", include("modoboa.admin.urls_api")),
]
+4 -4
View File
@@ -1,4 +1,4 @@
django>=1.9,<=1.9.99
django>=1.10,<=1.10.99
django-reversion==1.10.2
dj-database-url
pycrypto
@@ -9,11 +9,11 @@ bcrypt==2.0.0
django-versionfield2>=0.3.3
requests
django-xforwardedfor-middleware
django-passwords==0.3.10
django-passwords==0.3.12
rfc6266
progressbar==2.3
djangorestframework==3.3.3
django-rest-swagger==0.3.5
djangorestframework==3.5.3
django-rest-swagger==0.3.10
django-subcommand2==0.1.1
gevent==1.1.1
ipaddress