diff --git a/modoboa/extensions/admin/lib.py b/modoboa/extensions/admin/lib.py index e6c338228..8fbdfd7ca 100644 --- a/modoboa/extensions/admin/lib.py +++ b/modoboa/extensions/admin/lib.py @@ -1,13 +1,31 @@ # coding: utf-8 +from functools import wraps from django.db.models import Q from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.contrib.contenttypes.models import ContentType from modoboa.core.models import User from modoboa.lib import parameters +from modoboa.lib.exceptions import ModoboaException from modoboa.lib.emailutils import split_mailbox from modoboa.extensions.admin.models import Alias +def needs_mailbox(): + """Check if the current user owns at least one mailbox + + Some applications (the webmail for example) need a mailbox to + work. + """ + def decorator(f): + @wraps(f) + def wrapped_f(request, *args, **kwargs): + if request.user.mailbox_set.count(): + return f(request, *args, **kwargs) + raise ModoboaException() + return wrapped_f + return decorator + + def get_sort_order(qdict, default, allowed_values=None): """Return a sort order from a querydict object diff --git a/modoboa/extensions/postfix_autoreply/__init__.py b/modoboa/extensions/postfix_autoreply/__init__.py index 8ef596627..ff8dd915c 100644 --- a/modoboa/extensions/postfix_autoreply/__init__.py +++ b/modoboa/extensions/postfix_autoreply/__init__.py @@ -9,8 +9,8 @@ functionality into Postfix. from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _, ugettext_lazy from modoboa.lib import events, parameters -from modoboa.extensions import ModoExtension, exts_pool -from models import * +from modoboa.core.extensions import ModoExtension, exts_pool +from .models import Transport, Alias class PostfixAutoreply(ModoExtension): @@ -20,7 +20,7 @@ class PostfixAutoreply(ModoExtension): description = ugettext_lazy("Auto-reply (vacation) functionality using Postfix") def init(self): - from modoboa.admin.models import Domain + from modoboa.extensions.admin.models import Domain for dom in Domain.objects.all(): try: @@ -37,7 +37,7 @@ class PostfixAutoreply(ModoExtension): onCreateMailbox(None, mb) def load(self): - from app_settings import ParametersForm + from modoboa.extensions.postfix_autoreply.app_settings import ParametersForm parameters.register(ParametersForm, ugettext_lazy("Automatic replies")) def destroy(self): @@ -54,7 +54,8 @@ exts_pool.register_extension(PostfixAutoreply) @events.observe("ExtraUprefsRoutes") def extra_routes(): - return [(r'^autoreply/$', 'modoboa.extensions.postfix_autoreply.views.autoreply'),] + return [(r'^user/autoreply/$', + 'modoboa.extensions.postfix_autoreply.views.autoreply'), ] @events.observe("ExtraUprefsJS") @@ -62,7 +63,7 @@ def extra_js(user): return ["""function autoreply_cb() { $('#id_untildate').datepicker({format: 'yyyy-mm-dd', language: '%s'}); } -""" % parameters.get_user(user, "LANG", app="general") +""" % parameters.get_user(user, "LANG", app="core") ] @@ -70,7 +71,7 @@ def extra_js(user): def menu(target, user): if target != "uprefs_menu": return [] - if not user.has_mailbox: + if not user.mailbox_set.count(): return [] return [ {"name": "autoreply", @@ -105,7 +106,7 @@ def onCreateMailbox(user, mailbox): @events.observe("DeleteMailbox") def onDeleteMailbox(mailboxes): - from modoboa.admin.models import Mailbox + from modoboa.extensions.admin.models import Mailbox if isinstance(mailboxes, Mailbox): mailboxes = [mailboxes] diff --git a/modoboa/extensions/postfix_autoreply/forms.py b/modoboa/extensions/postfix_autoreply/forms.py index 4c4420a81..baeaa94b9 100644 --- a/modoboa/extensions/postfix_autoreply/forms.py +++ b/modoboa/extensions/postfix_autoreply/forms.py @@ -1,20 +1,21 @@ # coding: utf-8 -from django import forms -from models import ARmessage -from django.utils.translation import ugettext as _, ugettext_lazy import datetime +from django import forms +from django.utils.translation import ugettext as _, ugettext_lazy +from .models import ARmessage + class ARmessageForm(forms.ModelForm): untildate = forms.DateField( - label=ugettext_lazy('Until'), + label=ugettext_lazy('Until'), required=False, help_text=ugettext_lazy("Activate your auto reply until this date") - ) + ) class Meta: model = ARmessage fields = ('subject', 'content', 'enabled') - + def __init__(self, *args, **kwargs): super(ARmessageForm, self).__init__(*args, **kwargs) self.fields.keyOrder = ['subject', 'content', 'untildate', 'enabled'] diff --git a/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py b/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py index ed189fef4..0ef5d35b3 100644 --- a/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py +++ b/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py @@ -6,10 +6,11 @@ from django.core.management.base import BaseCommand, CommandError from django.utils import timezone from modoboa.lib import parameters from modoboa.lib.emailutils import split_mailbox, sendmail_simple -from modoboa.admin.models import Mailbox +from modoboa.extensions.admin.models import Mailbox from modoboa.extensions.postfix_autoreply import PostfixAutoreply from modoboa.extensions.postfix_autoreply.models import ARmessage, ARhistoric + def send_autoreply(sender, mailbox, armessage): if armessage.untildate is not None \ and armessage.untildate < datetime.date.today(): @@ -20,10 +21,10 @@ def send_autoreply(sender, mailbox, armessage): try: lastar = ARhistoric.objects.get(armessage=armessage.id, sender=sender) PostfixAutoreply().load() - timeout = parameters.get_admin("AUTOREPLIES_TIMEOUT", + timeout = parameters.get_admin("AUTOREPLIES_TIMEOUT", app="postfix_autoreply") delta = datetime.timedelta(seconds=int(timeout)) - now = timezone.make_aware(datetime.datetime.now(), + now = timezone.make_aware(datetime.datetime.now(), timezone.get_default_timezone()) if lastar.last_sent + delta > now: sys.exit(0) @@ -34,7 +35,7 @@ def send_autoreply(sender, mailbox, armessage): sendmail_simple(mailbox.user.encoded_address, sender, armessage.subject, armessage.content.encode('utf-8')) - + lastar.last_sent = datetime.datetime.now() lastar.save() diff --git a/modoboa/extensions/postfix_autoreply/models.py b/modoboa/extensions/postfix_autoreply/models.py index 5381f6a19..5eaaf9e31 100644 --- a/modoboa/extensions/postfix_autoreply/models.py +++ b/modoboa/extensions/postfix_autoreply/models.py @@ -1,25 +1,35 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ -from modoboa.admin.models import Domain, Mailbox +from modoboa.extensions.admin.models import Domain, Mailbox + class Transport(models.Model): domain = models.CharField(max_length=300) method = models.CharField(max_length=255) + class Alias(models.Model): full_address = models.CharField(max_length=255) autoreply_address = models.CharField(max_length=255) + class ARmessage(models.Model): mbox = models.ForeignKey(Mailbox) - subject = models.CharField(_('subject'), max_length=255, - help_text=_("The subject that will appear in sent emails")) - content = models.TextField(_('content'), - help_text=_("The content that will appear in sent emails")) - enabled = models.BooleanField(_('enabled'), - help_text=_("Activate/Deactivate your auto reply")) + subject = models.CharField( + _('subject'), max_length=255, + help_text=_("The subject that will appear in sent emails") + ) + content = models.TextField( + _('content'), + help_text=_("The content that will appear in sent emails") + ) + enabled = models.BooleanField( + _('enabled'), + help_text=_("Activate/Deactivate your auto reply") + ) untildate = models.DateField() + class ARhistoric(models.Model): armessage = models.ForeignKey(ARmessage) last_sent = models.DateTimeField(auto_now=True) diff --git a/modoboa/extensions/postfix_autoreply/views.py b/modoboa/extensions/postfix_autoreply/views.py index 8fa347d4b..2766d533e 100644 --- a/modoboa/extensions/postfix_autoreply/views.py +++ b/modoboa/extensions/postfix_autoreply/views.py @@ -1,17 +1,14 @@ # coding: utf-8 from datetime import date -from django.http import HttpResponse -from django.contrib.auth.decorators \ - import login_required -from django.contrib import messages -from django.core.urlresolvers import reverse +from django.contrib.auth.decorators import login_required from django.utils.translation import ugettext as _ from modoboa.lib.webutils import ( - ajax_simple_response, ajax_response, _render_to_string + ajax_simple_response, _render_to_string ) -from modoboa.lib.decorators import needs_mailbox -from forms import * -from models import * +from modoboa.extensions.admin.lib import needs_mailbox +from modoboa.extensions.admin.models import Mailbox +from .forms import ARmessageForm +from .models import ARmessage @login_required diff --git a/modoboa/lib/decorators.py b/modoboa/lib/decorators.py deleted file mode 100644 index 4dba8f235..000000000 --- a/modoboa/lib/decorators.py +++ /dev/null @@ -1,22 +0,0 @@ -# coding: utf-8 -""" -:mod:`decorators` --- common decorators ---------------------------------------- -""" -from functools import wraps -from exceptions import NeedsMailboxException - -def needs_mailbox(): - """Check if the current user owns at least one mailbox - - Some applications (the webmail for example) need a mailbox to - work. - """ - def decorator(f): - @wraps(f) - def wrapped_f(request, *args, **kwargs): - if request.user.has_mailbox: - return f(request, *args, **kwargs) - raise NeedsMailboxException() - return wrapped_f - return decorator diff --git a/modoboa/lib/exceptions.py b/modoboa/lib/exceptions.py index 39505abf0..026b72bd7 100644 --- a/modoboa/lib/exceptions.py +++ b/modoboa/lib/exceptions.py @@ -6,9 +6,11 @@ """ from django.utils.translation import ugettext as _ + class ModoboaException(Exception): pass + class PermDeniedException(ModoboaException): def __init__(self, msg=None): self.msg = msg @@ -17,7 +19,3 @@ class PermDeniedException(ModoboaException): if self.msg: return _("Permission denied: %s" % self.msg) return _("Permission denied") - -class NeedsMailboxException(ModoboaException): - pass - diff --git a/modoboa/urls.py b/modoboa/urls.py index d929f9195..8c85d6060 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import patterns, include, url from django.conf import settings from modoboa.core.extensions import exts_pool -from modoboa.lib import parameters +from modoboa.lib import parameters, events from modoboa.core import load_settings load_settings() @@ -25,7 +25,13 @@ urlpatterns = patterns('', (r'^user/$', 'modoboa.core.views.user.index'), (r'^user/preferences/$', 'modoboa.core.views.user.preferences'), (r'^user/profile/$', 'modoboa.core.views.user.profile'), +) +urlpatterns += patterns('', + *events.raiseQueryEvent("ExtraUprefsRoutes") +) + +urlpatterns += patterns('', *exts_pool.load_all() )