mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
@@ -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
@@ -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"),
|
||||
]
|
||||
|
||||
@@ -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')),
|
||||
)
|
||||
]
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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"),
|
||||
]
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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"),
|
||||
)
|
||||
]
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user