mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-28 06:28:43 +01:00
fixed #107
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:
+54
-11
@@ -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
|
||||
|
||||
|
||||
+112
@@ -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']
|
||||
+8
-9
@@ -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
@@ -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'),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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)
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user