wip: Big refactoring

autoreply extension OK.
This commit is contained in:
Antoine Nguyen
2013-08-20 16:53:40 +02:00
parent eabe53cea0
commit 3b3a2017e6
9 changed files with 71 additions and 61 deletions
+18
View File
@@ -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
@@ -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]
@@ -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']
@@ -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()
+17 -7
View File
@@ -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)
@@ -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
-22
View File
@@ -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
+2 -4
View File
@@ -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
+7 -1
View File
@@ -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()
)