diff --git a/modoboa/bin/modoboa-admin.py b/bin/modoboa-admin.py similarity index 100% rename from modoboa/bin/modoboa-admin.py rename to bin/modoboa-admin.py diff --git a/modoboa/core/__init__.py b/modoboa/core/__init__.py index cf4bc5c04..824c49add 100644 --- a/modoboa/core/__init__.py +++ b/modoboa/core/__init__.py @@ -1,11 +1,47 @@ from django.utils.translation import ugettext_lazy from modoboa.lib import parameters, events +base_events = [ + "CanCreate", + + "AccountCreated", + "AccountAutoCreated", + "AccountModified", + "AccountDeleted", + "AccountExported", + "AccountImported", + "PasswordUpdated", + "ExtraAccountActions", + "RoleChanged", + "GetExtraRoles", + "PasswordChange", + + "UserMenuDisplay", + "AdminMenuDisplay", + "GetStaticContent", + + "ExtEnabled", + "ExtDisabled", + + "UserLogin", + "UserLogout", + + "GetAnnouncement", + + "TopNotifications", + "ExtraAdminContent", + + "ExtraUprefsRoutes", + "ExtraUprefsJS" +] + def load_settings(): - from app_settings import GeneralParametersForm, UserSettings + from .app_settings import GeneralParametersForm, UserSettings + parameters.register(GeneralParametersForm, ugettext_lazy("General")) parameters.register(UserSettings, ugettext_lazy("General")) + events.declare(base_events) @events.observe("ExtDisabled") diff --git a/modoboa/lib/management/__init__.py b/modoboa/core/management/__init__.py similarity index 100% rename from modoboa/lib/management/__init__.py rename to modoboa/core/management/__init__.py diff --git a/modoboa/lib/management/commands/__init__.py b/modoboa/core/management/commands/__init__.py similarity index 100% rename from modoboa/lib/management/commands/__init__.py rename to modoboa/core/management/commands/__init__.py diff --git a/modoboa/lib/management/commands/cleanlogs.py b/modoboa/core/management/commands/cleanlogs.py similarity index 91% rename from modoboa/lib/management/commands/cleanlogs.py rename to modoboa/core/management/commands/cleanlogs.py index e25ba7604..3da28798f 100644 --- a/modoboa/lib/management/commands/cleanlogs.py +++ b/modoboa/core/management/commands/cleanlogs.py @@ -1,13 +1,12 @@ #!/usr/bin/env python # coding: utf-8 - import datetime from optparse import make_option from django.core.management.base import BaseCommand from django.utils import timezone +from modoboa.core import load_settings +from modoboa.core.models import Log from modoboa.lib import parameters -from modoboa.lib.models import Log -from modoboa.admin import AdminConsole class Command(BaseCommand): @@ -38,8 +37,8 @@ class Command(BaseCommand): l.addHandler(logging.StreamHandler()) self.verbose = options["verbose"] - AdminConsole().load() - log_maximum_age = int(parameters.get_admin("LOG_MAXIMUM_AGE", app="admin")) + load_settings() + log_maximum_age = int(parameters.get_admin("LOG_MAXIMUM_AGE")) self.__vprint("Deleting logs older than %d days..." % log_maximum_age) limit = timezone.now() - datetime.timedelta(log_maximum_age) Log.objects.filter(date_created__lt=limit).delete() diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 71364982d..6d51a3aac 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -358,6 +358,26 @@ class User(AbstractBaseUser, PermissionsMixin): reversion.register(User) +def populate_callback(user): + """Populate callback + + If the LDAP authentication backend is in use, this callback will + be called each time a new user authenticates succesfuly to + Modoboa. This function is in charge of creating the mailbox + associated to the provided ``User`` object. + + :param user: a ``User`` instance + """ + from modoboa.lib.permissions import grant_access_to_object + + sadmins = User.objects.filter(is_superuser=True) + user.set_role("SimpleUsers") + user.post_create(sadmins[0]) + for su in sadmins[1:]: + grant_access_to_object(su, user) + events.raiseEvent("AccountAutoCreated", user) + + class ObjectAccess(models.Model): user = models.ForeignKey(User) content_type = models.ForeignKey(ContentType) diff --git a/modoboa/core/templates/core/information.html b/modoboa/core/templates/core/information.html index 80f7500a3..8dcdf1a52 100644 --- a/modoboa/core/templates/core/information.html +++ b/modoboa/core/templates/core/information.html @@ -1,4 +1,4 @@ -{% load i18n libextras %} +{% load i18n core_tags libextras %}
| {% trans "Name" %} | -{% trans "Group name" %} | -{% trans "Last login" %} | -
|---|---|---|
| {{ u.username }} | -{{ u.group }} | -{{ u.last_login }} | -
%s" % content @@ -181,6 +180,7 @@ class Email(object): body = re.sub("<(/?)body", lambda m: "<%sdiv" % m.group(1), body) return body + def split_mailbox(mailbox): """Tries to split a mailbox in two parts (local part and domain name) @@ -199,6 +199,7 @@ def split_mailbox(mailbox): address = "@".join(parts[:-1]) return (address, domain) + def decode(s, encodings=('utf8', 'latin1', 'windows-1252', 'ascii'), charset=None): if charset is not None: try: @@ -270,6 +271,7 @@ def __sendmail(sender, rcpt, msgstring, server='localhost', port=25): return False, "SMTP error: %s" % str(e) return True, None + def sendmail_simple(sender, rcpt, subject="Sample message", content="", **kwargs): """Simple way to send a text message @@ -288,9 +290,10 @@ def sendmail_simple(sender, rcpt, subject="Sample message", content="", **kwargs set_email_headers(msg, subject, sender, rcpt) return __sendmail(sender, rcpt, msg.as_string(), **kwargs) + def sendmail_fromfile(sender, rcpt, fname): """Send a message contained within a file - + The given file name must represent a valid message structure. It must not include the From: and To: headers, they are automatically added by the function. @@ -312,4 +315,3 @@ To: %s fp.close() return __sendmail(sender, rcpt, content) - diff --git a/modoboa/lib/events.py b/modoboa/lib/events.py index 85284b1f2..5abb9df6d 100644 --- a/modoboa/lib/events.py +++ b/modoboa/lib/events.py @@ -13,39 +13,7 @@ import inspect import re from django.conf import settings -events = [ - "CanCreate", - - "AccountCreated", - "AccountModified", - "AccountDeleted", - "AccountExported", - "AccountImported", - "PasswordUpdated", - "ExtraAccountActions", - "RoleChanged", - "GetExtraRoles", - "PasswordChange", - - "UserMenuDisplay", - "AdminMenuDisplay", - "GetStaticContent", - - "ExtEnabled", - "ExtDisabled", - - "UserLogin", - "UserLogout", - - "GetAnnouncement", - - "TopNotifications", - "ExtraAdminContent", - - "ExtraUprefsRoutes", - "ExtraUprefsJS" -] - +events = [] callbacks = {} diff --git a/modoboa/lib/templatetags/libextras.py b/modoboa/lib/templatetags/libextras.py index 7c8f9cc81..904f9d4a2 100644 --- a/modoboa/lib/templatetags/libextras.py +++ b/modoboa/lib/templatetags/libextras.py @@ -1,14 +1,10 @@ # coding: utf-8 -import os -from django.utils import timezone -from django.conf import settings +from datetime import datetime from django import template from django.contrib import messages from django.template import Template, Context from django.template.loader import render_to_string from django.core.urlresolvers import reverse -from django.contrib.sessions.models import Session -from datetime import datetime from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib import events from modoboa.lib.sysutils import exec_cmd @@ -17,10 +13,6 @@ from modoboa.lib.formutils import SeparatorField register = template.Library() -@register.simple_tag -def get_version(): - import pkg_resources - return pkg_resources.get_distribution("modoboa").version @register.simple_tag def join(items, sep=','): @@ -31,53 +23,11 @@ def join(items, sep=','): res += "%s : '%s'" % (k, v) return res + @register.simple_tag def tolist(values): - return "[%s]" % ",".join(map(lambda v: '"%s"' % v, values)) + return "[%s]" % ",".join(['"%s"' % v for v in values]) -@register.simple_tag -def display_messages(msgs): - from django.contrib import messages - - text = "" - level = "info" - for m in msgs: - level = m.tags - text += unicode(m) + "\\\n" - - if level == "info": - level = "success" - timeout = "2000" - else: - timeout = "undefined" - - return """ - -""" % (level, text, timeout) - -@register.simple_tag -def extra_head_content(user): - tpl = Template("{% for sc in static_content %}{{ sc|safe }}{% endfor %}") - return tpl.render( - Context( - dict(static_content=events.raiseQueryEvent("GetStaticContent", user)) - ) - ) - -@register.simple_tag -def load_optionalmenu(user): - menu = events.raiseQueryEvent("UserMenuDisplay", "top_menu_middle", user) - return template.loader.render_to_string('common/menulist.html', - {"entries" : menu, "user" : user}) - -@register.simple_tag -def load_notifications(user): - content = events.raiseQueryEvent("TopNotifications", user) - return "".join(content) @register.simple_tag def render_form(form, tpl=None): @@ -89,20 +39,25 @@ def render_form(form, tpl=None): ret += "%s\n" % render_field(field) return ret + @register.simple_tag def render_field(field, help_display_mode="tooltip"): + from modoboa.core.templatetags.core_tags import visirule + if type(field.form.fields[field.name]) is SeparatorField: return "