From ae68c14396166c1579ac089f168e54a570243df7 Mon Sep 17 00:00:00 2001 From: tonio Date: Fri, 12 Jun 2009 16:37:44 +0200 Subject: [PATCH] First working implementation of ticket #3. --- admin/forms.py | 11 +++++++++ main/forms.py | 5 ++++ main/models.py | 6 ++++- main/views.py | 3 +++ scripts/autoreply.py | 44 ++++++++++++++++++++++++++++++++++ settings_sample.py | 3 +++ static/pics/user.png | Bin 0 -> 628 bytes static/stylesheets/basic.css | 12 ++++++++++ static/stylesheets/box.css | 9 ++++++- templates/layout.html | 14 +++++++++++ templates/main/autoreply.html | 2 +- templates/main/header.html | 7 ++++++ templates/main/index.html | 9 +++++++ templates/main/menu.html | 5 ++-- 14 files changed, 125 insertions(+), 5 deletions(-) create mode 100755 scripts/autoreply.py create mode 100644 static/pics/user.png create mode 100644 templates/main/index.html diff --git a/admin/forms.py b/admin/forms.py index 3fde9708a..3b67a4333 100644 --- a/admin/forms.py +++ b/admin/forms.py @@ -6,6 +6,11 @@ from mailng.admin.templatetags.admin_extras import gender class DomainForm(forms.ModelForm): class Meta: model = Domain + + def __init__(self, *args, **kwargs): + super(DomainForm, self).__init__(*args, **kwargs) + for f in ['name', 'quota']: + self.fields[f].widget.attrs['size'] = 14 class MailboxForm(forms.ModelForm): quota = forms.IntegerField(label=_("Quota"), required=False) @@ -17,6 +22,11 @@ class MailboxForm(forms.ModelForm): model = Mailbox fields = ('name', 'address') + def __init__(self, *args, **kwargs): + super(MailboxForm, self).__init__(*args, **kwargs) + for f in ['name', 'address', 'quota', 'password1', 'password2']: + self.fields[f].widget.attrs['size'] = 14 + def clean_password2(self): if self.cleaned_data["password1"] != self.cleaned_data["password2"]: raise forms.ValidationError(_("Passwords mismatch")) @@ -29,6 +39,7 @@ class AliasForm(forms.ModelForm): domain = kwargs["domain"] del kwargs["domain"] super(AliasForm, self).__init__(*args, **kwargs) + self.fields['address'].widget.attrs['size'] = 14 if domain: self.fields['mbox'].queryset = Mailbox.objects.filter(domain=domain.id) diff --git a/main/forms.py b/main/forms.py index 589c1e04d..d3614f582 100644 --- a/main/forms.py +++ b/main/forms.py @@ -1,8 +1,13 @@ from django import forms from mailng.main.models import ARmessage +from django.utils.translation import ugettext as _ class ARmessageForm(forms.ModelForm): class Meta: model = ARmessage fields = ('subject', 'content', 'enabled') + def __init__(self, *args, **kwargs): + super(ARmessageForm, self).__init__(*args, **kwargs) + self.fields['subject'].widget.attrs['size'] = 40 + self.fields['content'].widget.attrs['cols'] = 50 diff --git a/main/models.py b/main/models.py index 2ebc947f9..054c814e4 100644 --- a/main/models.py +++ b/main/models.py @@ -3,7 +3,11 @@ from mailng.admin.models import Mailbox class ARmessage(models.Model): mbox = models.ForeignKey(Mailbox) - last_sent = models.DateField(auto_now=True) subject = models.CharField(max_length=255) content = models.TextField() enabled = models.BooleanField() + +class ARhistoric(models.Model): + armessage = models.ForeignKey(ARmessage) + last_sent = models.DateTimeField(auto_now=True) + sender = models.TextField() diff --git a/main/views.py b/main/views.py index 75d17a798..73219ac82 100644 --- a/main/views.py +++ b/main/views.py @@ -29,6 +29,9 @@ def autoreply(request): arm = form.save(commit=False) arm.mbox = mb arm.save() + request.user.message_set.create( + message="Auto reply message updated successfully." + ) form = ARmessageForm(instance=arm) return _render(request, "main/autoreply.html", { diff --git a/scripts/autoreply.py b/scripts/autoreply.py new file mode 100755 index 000000000..a9d261172 --- /dev/null +++ b/scripts/autoreply.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +from email.mime.text import MIMEText +import datetime +from django.conf import settings +from mailng.admin.models import Mailbox +from mailng.main.models import ARmessage, ARhistoric + +if __name__ == "__main__": + if len(sys.argv) != 3: + print "Not enough arguments, aborting." + sys.exit(1) + + sender = sys.argv[1] + mailbox = sys.argv[2] + mbox = Mailbox.objects.get(full_address=mailbox) + try: + armessage = ARmessage.objects.get(mbox=mbox.id, enabled=True) + except ARmessage.DoesNotExist: + sys.exit(0) + try: + lastar = ARhistoric.objects.get(armessage=armessage.id, sender=sender) + try: + timeout = getattr(settings, "AUTOREPLIES_TIMEOUT") + except AttributeError: + timeout = 86400 # 24h + delta = datetime.timedelta(seconds=timeout) + if lastar.last_sent + delta > datetime.datetime.now(): + sys.exit(0) + except ARhistoric.DoesNotExist: + lastar = ARhistoric() + lastar.armessage = armessage + lastar.sender = sender + + msg = MIMEText(armessage.content.encode('utf-8'), _charset='utf-8') + msg['Subject'] = armessage.subject + msg['From'] = mailbox + msg['To'] = sender + print msg + lastar.last_sent = datetime.datetime.now() + lastar.save() + sys.exit(0) diff --git a/settings_sample.py b/settings_sample.py index 443a3a7a2..dd5c35d4a 100644 --- a/settings_sample.py +++ b/settings_sample.py @@ -94,3 +94,6 @@ VIRTUAL_GID = "vmail" # Mailboxes format: maildir (default) or mbox # MAILBOX_TYPE = "" + +# Autoreplies sending timeout (default: 86400s) +# AUTOREPLIES_TIMEOUT = diff --git a/static/pics/user.png b/static/pics/user.png new file mode 100644 index 0000000000000000000000000000000000000000..46573fff69011e6e19afcc5e8161da333af7b298 GIT binary patch literal 628 zcmV-)0*n2LP)Jed}|-^E>z4Yp9T&OuxanN3r9* zrs~v5#G6scEjUz8JyvYgga>b#sU`QrO0c#1IjBdV1*Y?%o|m1Xaa#U4T8o)0t7;6{=WyK2NB)L*Ce=qaEn8 z5r(ckWNB#$RRusq=s>kl&-TwhzOqN;ro6$MQv?uP|$bz0attPv$2^i3u?kqEXzh!i9{l( zYWW_FF+qWdVB0ozhmP%kM5{{ user.username }} {% endif %}