Removed useless fields (full_address) and added associated migrations. SQL queries used by postfix or dovecot will need to be updated. (as the documentation)

see #103

Big refactoring of objects creation and edition. (javascript cleanup, forms factoring, etc.)
This commit is contained in:
tonio
2011-01-01 16:32:52 +01:00
parent 3580ed5204
commit c43fdc2371
30 changed files with 495 additions and 416 deletions
+54 -11
View File
@@ -1,3 +1,4 @@
# coding: utf8
from django import forms
from modoboa.admin.models import *
from django.utils.translation import ugettext as _
@@ -14,12 +15,26 @@ class DomainForm(forms.ModelForm):
for f in ['name', 'quota']:
self.fields[f].widget.attrs['size'] = 14
class DomainAliasForm(forms.ModelForm):
class ProxyForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
super(ProxyForm, self).__init__(*args, **kwargs)
if user.is_superuser:
self._domain = None
else:
self._domain = user.mailbox_set.all()[0].domain
class DomainAliasForm(ProxyForm):
class Meta:
model = DomainAlias
fields = ('name', 'target', 'enabled')
class MailboxForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(DomainAliasForm, self).__init__(*args, **kwargs)
if self._domain is not None:
self.fields["target"].queryset = Domain.objects.filter(pk=self._domain.id)
class MailboxForm(ProxyForm):
quota = forms.IntegerField(label=_("Quota"), required=False,
help_text=_("Mailbox quota in MB (default to domain quota if blank)"))
password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput,
@@ -38,6 +53,15 @@ class MailboxForm(forms.ModelForm):
super(MailboxForm, self).__init__(*args, **kwargs)
for f in ['name', 'address', 'quota', 'password1', 'password2']:
self.fields[f].widget.attrs['size'] = 14
if self._domain is not None:
self.fields["domain"].queryset = Domain.objects.filter(pk=self._domain.id)
self.fields["domain"].initial = self._domain
if kwargs.has_key("instance"):
self.fields['quota'].initial = kwargs["instance"].quota
self.fields['enabled'].initial = kwargs["instance"].user.is_active
self.fields['password1'].initial = "é"
self.fields['password2'].initial = "é"
def clean_address(self):
if self.cleaned_data["address"].find('@') != -1:
@@ -57,17 +81,37 @@ class MailboxForm(forms.ModelForm):
quota=self.cleaned_data["quota"])
return m
class AliasForm(forms.ModelForm):
class AliasForm(ProxyForm):
domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"),
required=True,
empty_label=_("Select a domain"),
help_text=_("Select a domain in the list"))
def __init__(self, *args, **kwargs):
domain = None
if kwargs.has_key("domain"):
domain = kwargs["domain"]
del kwargs["domain"]
super(AliasForm, self).__init__(*args, **kwargs)
self.fields['address'].widget.attrs['size'] = 14
self.fields['mboxes'].widget.attrs['size'] = 5
if domain:
self.fields['mboxes'].queryset = Mailbox.objects.filter(domain=domain.id)
# This part is a little bit tricky. As 'domain' is not a
# member of Alias, we need to fill it manually. if
# self._domain exists, it means a DomainAdmin is going to
# create a new alias, we know how to fill the fields. Else,
# leave them empty (super admin mode).
if self._domain is not None:
self.fields["domain"].queryset = Domain.objects.filter(pk=self._domain.id)
elif len(args) < 2 or args[1]["domain"] == '':
self.fields['mboxes'].queryset = Mailbox.objects.none()
# if 'instance' exists, it means we are modifying an existing
# record, we need to select the right value for
# 'domain'. Finally, if super user is doing the job, we need
# to fill 'mboxes' because it's currently empty (see upper).
if kwargs.has_key("instance") or self._domain is not None:
domain = self._domain is None and kwargs["instance"].domain or self._domain
self.fields["domain"].initial = domain
self.fields['mboxes'].queryset = Mailbox.objects.filter(domain=domain)
self.fields.keyOrder = ['domain', 'address', 'mboxes', 'enabled']
class Meta:
model = Alias
@@ -81,8 +125,7 @@ class AliasForm(forms.ModelForm):
def save(self, force_insert=False, force_update=False, commit=True):
a = super(AliasForm, self).save(commit=False)
if commit:
domain = self.cleaned_data["mboxes"][0].domain
a.full_address = "%s@%s" % (a.address, domain.name)
domain = self.cleaned_data["domain"].name
a.save()
return a
@@ -0,0 +1,112 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting field 'Alias.full_address'
db.delete_column('admin_alias', 'full_address')
# Changing field 'Alias.address'
db.alter_column('admin_alias', 'address', self.gf('django.db.models.fields.CharField')(max_length=254))
# Deleting field 'Mailbox.full_address'
db.delete_column('admin_mailbox', 'full_address')
def backwards(self, orm):
# User chose to not deal with backwards NULL issues for 'Alias.full_address'
raise RuntimeError("Cannot reverse this migration. 'Alias.full_address' and its values cannot be restored.")
# Changing field 'Alias.address'
db.alter_column('admin_alias', 'address', self.gf('django.db.models.fields.CharField')(max_length=100))
# User chose to not deal with backwards NULL issues for 'Mailbox.full_address'
raise RuntimeError("Cannot reverse this migration. 'Mailbox.full_address' and its values cannot be restored.")
models = {
'admin.alias': {
'Meta': {'object_name': 'Alias'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'})
},
'admin.domain': {
'Meta': {'object_name': 'Domain'},
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'quota': ('django.db.models.fields.IntegerField', [], {})
},
'admin.domainalias': {
'Meta': {'object_name': 'DomainAlias'},
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"})
},
'admin.extension': {
'Meta': {'object_name': 'Extension'},
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '150'})
},
'admin.mailbox': {
'Meta': {'object_name': 'Mailbox'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}),
'gid': ('django.db.models.fields.IntegerField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'quota': ('django.db.models.fields.IntegerField', [], {}),
'uid': ('django.db.models.fields.IntegerField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
}
}
complete_apps = ['admin']
@@ -1,25 +1,25 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from south.v2 import DataMigration
from django.db import models
class Migration(SchemaMigration):
class Migration(DataMigration):
def forwards(self, orm):
db.alter_column("admin_alias", "full_address",
models.CharField(unique=True, max_length=254))
for mb in orm.Mailbox.objects.all():
mb.path = mb.path.replace(mb.domain.name + "/", "", 1)
mb.save()
def backwards(self, orm):
db.alter_column("admin_alias", "full_address",
models.CharField(max_length=150))
raise RuntimeError("Cannot revert this migration")
models = {
'admin.alias': {
'Meta': {'object_name': 'Alias'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'full_address': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'})
},
@@ -47,7 +47,6 @@ class Migration(SchemaMigration):
'Meta': {'object_name': 'Mailbox'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}),
'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'gid': ('django.db.models.fields.IntegerField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+14 -6
View File
@@ -86,7 +86,6 @@ class Mailbox(models.Model):
help_text=_("First name and last name of mailbox owner"))
address = models.CharField(_('address'), max_length=100,
help_text=_("Mailbox address (without the @domain.tld part)"))
full_address = models.CharField(max_length=150)
password = models.CharField(_('password'), max_length=100)
quota = models.IntegerField()
uid = models.IntegerField()
@@ -106,7 +105,12 @@ class Mailbox(models.Model):
self.mdirroot = parameters.get_admin("MAILDIR_ROOT")
def __str__(self):
return "%s" % (self.full_address)
return self.__full_address()
def __full_address(self):
return "%s@%s" % (self.address, self.domain.name)
full_address = property(__full_address)
def create_dir(self):
relpath = "%s/%s" % (self.domain.name, self.address)
@@ -172,11 +176,11 @@ class Mailbox(models.Model):
self.password = crypt_password(kwargs["password"])
self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid
self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid
if kwargs.has_key("quota") and int(kwargs["quota"]) < self.domain.quota:
if kwargs.has_key("quota") and kwargs["quota"] is not None \
and int(kwargs["quota"]) < self.domain.quota:
self.quota = kwargs["quota"]
else:
self.quota = self.domain.quota
self.full_address = self.user.email
try:
for kw in ["enabled", "password", "quota"]:
del kwargs[kw]
@@ -207,9 +211,8 @@ class Mailbox(models.Model):
}
class Alias(models.Model):
address = models.CharField(_('address'), max_length=100,
address = models.CharField(_('address'), max_length=254,
help_text=_("The alias address (without the domain part)"))
full_address = models.CharField(max_length=254, unique=True)
mboxes = models.ManyToManyField(Mailbox, verbose_name=_('mailboxes'),
help_text=_("The mailboxes this alias points to"))
enabled = models.BooleanField(_('enabled'),
@@ -220,6 +223,11 @@ class Alias(models.Model):
("view_aliases", "View aliases"),
)
def __domain(self):
return self.mboxes.all()[0].domain
domain = property(__domain)
class Extension(models.Model):
name = models.CharField(max_length=150)
enabled = models.BooleanField(_('enabled'),
+3 -3
View File
@@ -7,7 +7,7 @@ from forms import *
class Permissions(object):
@staticmethod
def is_auhorized(user):
def is_authorized(user):
return True
def get_add_form(self, request):
@@ -27,7 +27,7 @@ class SuperAdminsPerms(Permissions):
role = "super_admins"
@staticmethod
def is_auhorized(user):
def is_authorized(user):
return user.is_superuser
def get_add_form(self, request):
@@ -141,7 +141,7 @@ def get_perms_class(user, role):
cname += p.capitalize()
cname += "Perms"
if globals().has_key(cname):
if globals()[cname].is_auhorized(user):
if globals()[cname].is_authorized(user):
return globals()[cname]
return None
res = events.raiseQueryEvent("PermsGetClass", role=role)
+1 -1
View File
@@ -199,7 +199,7 @@ def mbalias_actions(user, alias):
"img" : static_url("pics/edit.png"),
"title" : _("Edit mailbox alias"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:250}}"}
"rel" : "{handler:'iframe',size:{x:300,y:300}}"}
]
return render_actions(actions)
+2 -1
View File
@@ -22,7 +22,8 @@ urlpatterns = patterns('modoboa.admin.views',
(r'^mbaliases/edit/(?P<alias_id>\d+)/$', 'editmbalias'),
(r'^mbaliases/delete/$', 'delmbalias'),
(r'^domains/(?P<dom_id>\d+)/raw/$', 'mailboxes_raw'),
(r'^domains/(?P<dom_id>\d+)/rawmboxes/$', 'mailboxes_raw'),
#url(r'^domains/(?P<dom_id>\d+)/aliases/$', "aliases", name="full-aliases"),
#url(r'^domains/(?P<dom_id>\d+)/aliases/(?P<mbox_id>\d+)/$', "aliases", name="mbox-aliases"),
+132 -150
View File
@@ -14,8 +14,7 @@ from modoboa import admin, userprefs
from models import *
from admin.permissions import *
from modoboa.lib import crypt_password
from modoboa.lib import _render, _render_to_string, _ctx_ok, \
getctx, events, parameters
from modoboa.lib import _render, ajax_response, getctx, events, parameters
from modoboa.lib.models import Parameter
import copy
@@ -69,7 +68,11 @@ def domains(request):
@login_required
@permission_required("admin.add_domain")
def newdomain(request):
def newdomain(request, tplname="admin/adminform.html"):
commonctx = {"title" : _("New domain"),
"submit_label" : _("Create"),
"action" : reverse(newdomain),
"formid" : "domform"}
if request.method == "POST":
form = DomainForm(request.POST)
error = None
@@ -81,26 +84,26 @@ def newdomain(request):
if domain.create_dir():
form.save()
events.raiseEvent("CreateDomain", dom=domain)
ctx = _ctx_ok(reverse(admin.views.domains))
messages.info(request, _("Domain created"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.domains))
error = _("Failed to initialise domain, check permissions")
content = _render_to_string(request, "admin/newdomain.html", {
"form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = DomainForm()
return _render(request, 'admin/newdomain.html', {
"form" : form
})
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@permission_required("admin.change_domain")
def editdomain(request, dom_id):
def editdomain(request, dom_id, tplname="admin/adminform.html"):
domain = Domain.objects.get(pk=dom_id)
commonctx = {"title" : _("Domain editing"),
"submit_label" : _("Update"),
"action" : reverse(editdomain, args=[dom_id]),
"formid" : "domform"}
olddomain = copy.deepcopy(domain)
if request.method == "POST":
form = DomainForm(request.POST, instance=domain)
@@ -114,19 +117,16 @@ def editdomain(request, dom_id):
error = _("Failed to rename domain, check permissions")
if not error:
form.save()
ctx = _ctx_ok(reverse(admin.views.domains))
messages.info(request, _("Domain modified"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
content = _render_to_string(request, "admin/editdomain.html", {
"domain" : domain, "form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.domains))
form = DomainForm(instance=domain)
return _render(request, 'admin/editdomain.html', {
"domain" : domain, "form" : form
})
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = DomainForm(instance=domain)
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@permission_required("admin.delete_domain")
@@ -147,10 +147,8 @@ def deldomain(request):
dom.delete(keepdir=keepdir)
msg = ungettext("Domain deleted", "Domains deleted", len(selection))
messages.info(request, msg, fail_silently=True)
ctx = _ctx_ok("")
else:
ctx = getctx("ko", error=error)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
return ajax_response(request)
return ajax_response(request, status="ko", error=error)
@login_required
@permission_required("admin.view_domaliases")
@@ -167,9 +165,13 @@ def domaliases(request):
@login_required
@good_domain
@permission_required("admin.add_domainalias")
def newdomalias(request):
def newdomalias(request, tplname="admin/adminform.html"):
commonctx = {"title" : _("New domain alias"),
"submit_label" : _("Create"),
"action" : reverse(newdomalias),
"formid" : "domaliasform"}
if request.method == "POST":
form = DomainAliasForm(request.POST)
form = DomainAliasForm(request.user, request.POST)
error = None
if form.is_valid():
domalias = form.save(commit=False)
@@ -181,32 +183,30 @@ def newdomalias(request):
except IntegrityError:
error = _("Alias with this name already exists")
else:
ctx = _ctx_ok(reverse(admin.views.domaliases))
messages.info(request, _("Domain alias created"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/newdomalias.html", {
"form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = DomainAliasForm()
if not request.user.is_superuser:
form.fields["target"].queryset = \
Domain.objects.filter(mailbox__user__pk=request.user.id)
return ajax_response(request, url=reverse(admin.views.domaliases))
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = DomainAliasForm(request.user)
if request.GET.has_key("domid"):
form.fields["target"].initial = request.GET["domid"]
return _render(request, 'admin/newdomalias.html', {
"form" : form
})
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@good_domain
@permission_required("admin.change_domainalias")
def editdomalias(request, alias_id):
def editdomalias(request, alias_id, tplname="admin/adminform.html"):
domalias = DomainAlias.objects.get(pk=alias_id)
commonctx = {"title" : _("Domain alias editing"),
"submit_label" : _("Update"),
"action" : reverse(editdomalias, args=[alias_id]),
"formid" : "domaliasform"}
if request.method == "POST":
form = DomainAliasForm(request.POST, instance=domalias)
form = DomainAliasForm(request.user, request.POST, instance=domalias)
error = None
if form.is_valid():
ndomalias = form.save(commit=False)
@@ -218,20 +218,15 @@ def editdomalias(request, alias_id):
except IntegrityError:
error = _("Alias with this name already exists")
else:
ctx = _ctx_ok(reverse(admin.views.domaliases))
messages.info(request, _("Domain alias updated"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/editdomalias.html", {
"form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.domaliases))
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = DomainAliasForm(instance=domalias)
return _render(request, 'admin/editdomalias.html', {
"form" : form, "domalias" : domalias
})
form = DomainAliasForm(request.user, instance=domalias)
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@good_domain
@@ -241,8 +236,7 @@ def deldomalias(request):
DomainAlias.objects.filter(id__in=selection).delete()
msg = ungettext("Domain alias deleted", "Domain aliases deleted", len(selection))
messages.info(request, msg, fail_silently=True)
return HttpResponse(simplejson.dumps(_ctx_ok("")),
mimetype="application/json")
return ajax_response(request)
@login_required
@good_domain
@@ -262,17 +256,26 @@ def mailboxes(request):
@good_domain
@permission_required("admin.view_mailboxes")
def mailboxes_raw(request, dom_id=None):
mailboxes = Mailbox.objects.filter(domain=dom_id).exclude(user__id=request.user.id)
target = request.GET.has_key("target") and request.GET["target"] or "permissions"
if target == "permissions":
mailboxes = Mailbox.objects.filter(domain=dom_id).exclude(user__id=request.user.id)
else:
mailboxes = Mailbox.objects.filter(domain=dom_id)
return _render(request, 'admin/mailboxes_raw.html', {
"mailboxes" : mailboxes
"mailboxes" : mailboxes,
"target" : target
})
@login_required
@good_domain
@permission_required("admin.add_mailbox")
def newmailbox(request):
def newmailbox(request, tplname="admin/adminform.html"):
commonctx = {"title" : _("New mailbox"),
"submit_label" : _("Create"),
"action" : reverse(newmailbox),
"formid" : "mboxform"}
if request.method == "POST":
form = MailboxForm(request.POST)
form = MailboxForm(request.user, request.POST)
error = None
if form.is_valid():
try:
@@ -283,34 +286,29 @@ def newmailbox(request):
events.raiseEvent("CreateMailbox", mbox=mb)
messages.info(request, _("Mailbox created"),
fail_silently=True)
ctx = _ctx_ok(reverse(admin.views.mailboxes) + "?domid=%d" % mb.domain.id)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/newmailbox.html", {
"form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.mailboxes) + "?domid=%d" % mb.domain.id)
form = MailboxForm()
if not request.user.is_superuser:
form.fields["domain"].queryset = \
Domain.objects.filter(mailbox__user__pk=request.user.id)
if request.GET.has_key("domid"):
form.fields["domain"].initial = request.GET["domid"]
return _render(request, "admin/newmailbox.html", {
"form" : form
})
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = MailboxForm(request.user)
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@good_domain
@permission_required("admin.change_mailbox")
@transaction.commit_manually
def editmailbox(request, mbox_id=None):
def editmailbox(request, mbox_id=None, tplname="admin/adminform.html"):
mb = Mailbox.objects.get(pk=mbox_id)
commonctx = {"title" : _("Mailbox editing"),
"submit_label" : _("Create"),
"action" : reverse(editmailbox, args=[mbox_id]),
"formid" : "mboxform"}
if request.method == "POST":
oldmb = copy.deepcopy(mb)
form = MailboxForm(request.POST, instance=mb)
form = MailboxForm(request.user, request.POST, instance=mb)
error = None
if form.is_valid():
try:
@@ -323,25 +321,17 @@ def editmailbox(request, mbox_id=None):
events.raiseEvent("ModifyMailbox", mbox=mb, oldmbox=oldmb)
messages.info(request, _("Mailbox modified"),
fail_silently=True)
ctx = _ctx_ok(reverse(admin.views.mailboxes) + "?domid=%d" % mb.domain.id)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.mailboxes) + "?domid=%d" % mb.domain.id)
error = _("Failed to rename mailbox, check permissions")
if error is not None:
transaction.rollback()
ctx = getctx("ko", content=_render_to_string(request, "admin/editmailbox.html", {
"mbox" : mb, "form" : form, "error" : error
}))
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = MailboxForm(instance=mb)
form.fields['quota'].initial = mb.quota
form.fields['enabled'].initial = mb.user.is_active
form.fields['password1'].initial = "é"
form.fields['password2'].initial = "é"
return _render(request, 'admin/editmailbox.html', {
"form" : form, "mbox" : mb
})
form = MailboxForm(request.user, instance=mb)
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@good_domain
@@ -364,11 +354,9 @@ def delmailbox(request):
mb.delete(keepdir=keepdir)
msg = ungettext("Mailbox deleted", "Mailboxes deleted", len(selection))
messages.info(request, msg, fail_silently=True)
ctx = _ctx_ok("")
else:
ctx = getctx("ko", error=error)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
return ajax_response(request)
return ajax_response(request, status="ko", error=error)
@login_required
@good_domain
@@ -385,9 +373,13 @@ def mbaliases(request):
@login_required
@good_domain
@permission_required("admin.add_alias")
def newmbalias(request):
def newmbalias(request, tplname="admin/mbaliasform.html"):
commonctx = {"title" : _("New mailbox alias"),
"submit_label" : _("Create"),
"action" : reverse(newmbalias),
"formid" : "mbaliasform"}
if request.method == "POST":
form = AliasForm(request.POST)
form = AliasForm(request.user, request.POST)
error = None
if form.is_valid():
try:
@@ -396,33 +388,31 @@ def newmbalias(request):
error = _("Alias with this name already exists")
else:
form.save_m2m()
ctx = _ctx_ok(reverse(admin.views.mbaliases) )
messages.info(request, _("Mailbox alias created"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/newmbalias.html", {
"form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.mbaliases))
if request.GET.has_key("domid"):
form = AliasForm(domain=Domain.objects.get(pk=request.GET["domid"]))
else:
form = AliasForm()
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = AliasForm(request.user)
if request.GET.has_key("mbid"):
form.fields["mboxes"].initial = request.GET["mbid"]
return _render(request, 'admin/newmbalias.html', {
"form" : form, "noerrors" : True
})
commonctx["form"] = form
commonctx["noerrors"] = True
return _render(request, tplname, commonctx)
@login_required
@good_domain
@permission_required("admin.change_alias")
def editmbalias(request, alias_id):
def editmbalias(request, alias_id, tplname="admin/mbaliasform.html"):
alias = Alias.objects.get(pk=alias_id)
commonctx = {"title" : _("Mailbox alias editing"),
"submit_label" : _("Update"),
"action" : reverse(editmbalias, args=[alias.id]),
"formid" : "mbaliasform"}
if request.method == "POST":
form = AliasForm(request.POST, instance=alias)
form = AliasForm(request.user, request.POST, instance=alias)
error = None
if form.is_valid():
try:
@@ -431,20 +421,16 @@ def editmbalias(request, alias_id):
error = _("Alias with this name already exists")
else:
form.save_m2m()
ctx = _ctx_ok(reverse(admin.views.mbaliases))
messages.info(request, _("Mailbox alias modified"),
fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/editmbalias.html", {
"alias" : alias, "form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = AliasForm(instance=alias)
return _render(request, 'admin/editmbalias.html', {
"form" : form, "alias" : alias
})
return ajax_response(request, url=reverse(admin.views.mbaliases))
commonctx["form"] = form
commonctx["error"] = error
return ajax_response(request, status="ko", template=tplname, **commonctx)
form = AliasForm(request.user, instance=alias)
commonctx["form"] = form
return _render(request, tplname, commonctx)
@login_required
@good_domain
@@ -454,12 +440,11 @@ def delmbalias(request):
Alias.objects.filter(id__in=selection).delete()
msg = ungettext("Alias deleted", "Aliases deleted", len(selection))
messages.info(request, msg, fail_silently=True)
return HttpResponse(simplejson.dumps(_ctx_ok("")),
mimetype="application/json")
return ajax_response(request)
@login_required
@permission_required("auth.view_permissions")
def permissions(request):
def permissions(request, tplname='admin/permissions.html'):
permtables = []
if request.user.is_superuser:
permtables += [
@@ -476,7 +461,7 @@ def permissions(request):
"content" : DomainAdminsPerms().get(request)}
]
return _render(request, 'admin/permissions.html', {
return _render(request, tplname, {
"permtables" : permtables
})
@@ -497,9 +482,7 @@ def add_permission(request):
return HttpResponse(simplejson.dumps(data), mimetype="application/json")
messages.info(request, _("Permission added."),
fail_silently=True)
ctx = _ctx_ok(reverse(admin.views.permissions))
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
return ajax_response(request, url=reverse(admin.views.permissions))
@login_required
def delete_permissions(request):
@@ -516,7 +499,7 @@ def delete_permissions(request):
@login_required
@user_passes_test(lambda u: u.is_superuser)
def viewparameters(request):
def viewparameters(request, tplname='admin/parameters.html'):
apps = sorted(parameters._params.keys())
gparams = []
for app in apps:
@@ -533,7 +516,7 @@ def viewparameters(request):
tmp["params"] += [newdef]
gparams += [tmp]
return _render(request, 'admin/parameters.html', {
return _render(request, tplname, {
"gparams" : gparams
})
@@ -545,12 +528,11 @@ def saveparameters(request):
continue
app, name = pname.split('.')
parameters.save_admin(name, v, app=app)
ctx = getctx("ok")
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
return ajax_response(request)
@login_required
@user_passes_test(lambda u: u.is_superuser)
def viewextensions(request):
def viewextensions(request, tplname='admin/extensions.html'):
from modoboa.extensions import list_extensions
from modoboa.lib import tables
@@ -574,7 +556,7 @@ def viewextensions(request):
ext["selection"] = False
tbl = ExtensionsTable(exts)
return _render(request, 'admin/extensions.html', {
return _render(request, tplname, {
"extensions" : tbl.render(request)
})