* Added domain aliases delete,
 * Permissions are not implemented yet.

see #103

 * New generic create and remove buttons,
 * New javascript confirmation module,
 * Fixed a lot of problems about objects relations removal,
 * Simpler interface (no more dropdown menus),
 * Multiple removal support.
This commit is contained in:
tonio
2010-12-13 23:45:37 +01:00
parent 308702ec10
commit 9d95107bbd
22 changed files with 353 additions and 339 deletions
@@ -19,7 +19,7 @@ class Migration(SchemaMigration):
'Meta': {'object_name': 'Alias'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'full_address': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '150'}),
'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'})
},
+29 -1
View File
@@ -51,6 +51,20 @@ class Domain(models.Model):
% (parameters.get_admin("STORAGE_PATH"),
self.name))
def delete(self, *args, **kwargs):
keepdir = False
if kwargs.has_key("keepdir"):
keepdir = kwargs["keepdir"]
del kwargs["keepdir"]
# Not very optimized but currently, this is the simple way
# I've found to delete all related objects (mailboxes, users
# and aliases)!
for mb in self.mailbox_set.all():
mb.delete(keepdir=keepdir)
super(Domain, self).delete(*args, **kwargs)
if not keepdir:
self.delete_dir()
def __str__(self):
return self.name
@@ -74,7 +88,7 @@ class Mailbox(models.Model):
gid = models.IntegerField()
path = models.CharField(max_length=200)
domain = models.ForeignKey(Domain)
user = models.ForeignKey(User)
user = models.OneToOneField(User)
path = models.CharField(max_length=255)
class Meta:
@@ -164,6 +178,20 @@ class Mailbox(models.Model):
pass
super(Mailbox, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
keepdir = False
if kwargs.has_key("keepdir"):
keepdir = kwargs["keepdir"]
del kwargs["keepdir"]
for alias in self.alias_set.all():
alias.mboxes.remove(self)
if len(alias.mboxes.all()) == 0:
alias.delete()
self.user.delete()
super(Mailbox, self).delete(*args, **kwargs)
if not keepdir:
self.delete_dir()
def tohash(self):
return {
"id" : self.id,
+10 -56
View File
@@ -58,40 +58,6 @@ def admin_menu(user):
return render_to_string("common/menulist.html",
{"entries" : entries, "user" : user})
@register.simple_tag
def domain_menu(domain_id, selection, user):
entries = [
{"name" : "",
"url" : reverse(admin.views.newmailbox),
"label" : _("New mailbox"),
"img" : static_url("pics/add.png"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:280}}"},
{"name" : "mailboxes",
"url" : reverse(admin.views.mailboxes),
"img" : static_url("pics/mailbox.png"),
"label" : _("Mailboxes")},
{"name" : "aliases",
"url" : reverse("full-aliases"),
"img" : static_url("/pics/alias.png"),
"label" : _("Aliases")},
]
if user.has_perm("admin.change_domain"):
entries += [
{"name" : "",
"url" : reverse(admin.views.editdomain, args=[domain_id]),
"label" : _("Properties"),
"img" : static_url("pics/edit.png"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:180}}"}
]
entries += events.raiseQueryEvent("AdminMenuDisplay", target="admin_menu_bar",
user=user, domain=domain_id)
return render_to_string('common/menu.html',
{"selection" : selection, "entries" : entries,
"user" : user})
@register.simple_tag
def settings_menu(selection, user):
entries = [
@@ -114,13 +80,6 @@ def dommenu_entry(name, label, img, listurl, newurl):
"img" : img,
"url" : listurl,
"class" : "menubardropdown",
"menu" : [{"name" : "%s_new" % name,
"url" : newurl,
"label" : _("New"),
"img" : static_url("pics/add.png"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:200}}"}
]
}
return result
@@ -128,6 +87,15 @@ def dommenu_entry(name, label, img, listurl, newurl):
def domains_menu(selection, user, domid):
args = domid != "" and ("?domid=%s" % domid) or ""
entries = []
entries += [{"name" : "new",
"label" : _("New"),
"img" : static_url("pics/add.png")},
{"name" : "remove",
"label" : _("Remove"),
"img" : static_url("pics/remove.png")
}]
entries += [{"separator" : True}]
if user.has_perm("admin.view_domains"):
entries += dommenu_entry("domains", _("Domains"),
static_url("pics/domains.png"),
@@ -188,11 +156,6 @@ def domain_actions(user, domid):
"title" : _("Edit domain"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:180}}"},
{"name" : "deldomain",
"url" : reverse(admin.views.deldomain, args=[domid]),
"img" : static_url("pics/remove.png"),
"title" : _("Delete domain"),
"confirm" : _("Delete this domain?")},
{"name" : "domaliases",
"url" : reverse(admin.views.domaliases) + "?domid=%s" % domid,
"img" : static_url("pics/alias.png"),
@@ -221,10 +184,6 @@ def mailbox_actions(user, mbox):
"title" : _("Edit mailbox"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:280}}"},
{"name" : "deleteMb",
"url" : reverse(admin.views.delmailbox, args=[mbox.id]),
"img" : static_url("pics/remove.png"),
"title" : _("Delete mailbox")},
{"name" : "aliases",
"url" : reverse(admin.views.mbaliases) + "?mbid=%d" % mbox.id,
"img" : static_url("pics/alias.png"),
@@ -240,12 +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}}"},
{"name" : "dembalias",
"url" : reverse(admin.views.delmbalias, args=[alias.id]),
"img" : static_url("pics/remove.png"),
"title" : _("Delete mailbox alias"),
"confirm" : _("Delete this alias?")},
"rel" : "{handler:'iframe',size:{x:300,y:250}}"}
]
return render_actions(actions)
+4 -3
View File
@@ -5,21 +5,22 @@ urlpatterns = patterns('modoboa.admin.views',
url(r'^domains/$', 'domains', name="domains"),
(r'^domains/new/', 'newdomain'),
(r'^domains/(?P<dom_id>\d+)/edit/$', 'editdomain'),
(r'^domains/(?P<dom_id>\d+)/delete/$', 'deldomain'),
(r'^domains/delete/$', 'deldomain'),
(r'^domaliases/$', "domaliases"),
(r'^domaliases/new/', 'newdomalias'),
(r'^domaliases/edit/(?P<alias_id>\d+)/', 'editdomalias'),
(r'^domaliases/delete/$', 'deldomalias'),
(r'^mailboxes/$', 'mailboxes'),
(r'^mailboxes/new/$', 'newmailbox'),
(r'^mailboxes/edit/(?P<mbox_id>\d+)/$', 'editmailbox'),
(r'^mailboxes/delete/(?P<mbox_id>\d+)/$', 'delmailbox'),
(r'^mailboxes/delete/$', 'delmailbox'),
(r'^mbaliases/$', 'mbaliases'),
(r'^mbaliases/new/$', 'newmbalias'),
(r'^mbaliases/edit/(?P<alias_id>\d+)/$', 'editmbalias'),
(r'^mbaliases/delete/(?P<alias_id>\d+)/$', 'delmbalias'),
(r'^mbaliases/delete/$', 'delmbalias'),
(r'^domains/(?P<dom_id>\d+)/raw/$', 'mailboxes_raw'),
#url(r'^domains/(?P<dom_id>\d+)/aliases/$', "aliases", name="full-aliases"),
+58 -24
View File
@@ -63,8 +63,10 @@ def domains(request):
counters = {}
for dom in domains:
dom.mboxcounter = len(dom.mailbox_set.all())
deloptions = {"keepdir" : _("Do not delete domain directory")}
return render_domains_page(request, "domains",
domains=domains, counter=counters)
domains=domains, counter=counters,
deloptions=deloptions)
@login_required
def domaliases(request):
@@ -137,6 +139,15 @@ def editdomalias(request, alias_id):
"form" : form, "domalias" : domalias
})
@login_required
@permission_required("admin.delete_domalias")
def deldomalias(request):
selection = request.GET["selection"].split(",")
DomainAlias.objects.filter(id__in=selection).delete()
messages.info(request, _("Domain alias(es) deleted"), fail_silently=True)
return HttpResponse(simplejson.dumps(_ctx_ok("")),
mimetype="application/json")
@login_required
@permission_required("admin.add_domain")
def newdomain(request):
@@ -200,13 +211,26 @@ def editdomain(request, dom_id):
@login_required
@permission_required("admin.delete_domain")
def deldomain(request, dom_id):
domain = Domain.objects.get(pk=dom_id)
events.raiseEvent("DeleteDomain", dom=domain)
domain.delete_dir()
domain.delete()
messages.info(request, _("Domain deleted"), fail_silently=True)
return HttpResponseRedirect(reverse(admin.views.domains))
def deldomain(request):
selection = request.GET["selection"].split(",")
error = None
if request.user.id != 1:
mb = Mailbox.objects.get(user__id=request.user.id)
if dom.id in selection:
error = _("You can't delete your own domain")
if error is None:
if request.GET.has_key("keepdir") and request.GET["keepdir"] == "true":
keepdir = True
else:
keepdir = False
for dom in Domain.objects.filter(id__in=selection):
events.raiseEvent("DeleteDomain", dom=dom)
dom.delete(keepdir=keepdir)
messages.info(request, _("Domain deleted"), fail_silently=True)
ctx = _ctx_ok("")
else:
ctx = getctx("ko", error=error)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
@login_required
@good_domain
@@ -214,12 +238,13 @@ def deldomain(request, dom_id):
def mailboxes(request):
if request.GET.has_key("domid"):
domain = Domain.objects.get(pk=request.GET["domid"])
mailboxes = Mailbox.objects.filter(domain=domain.id)
mboxes = Mailbox.objects.filter(domain=domain.id)
else:
mailboxes = Mailbox.objects.all()
mboxes = Mailbox.objects.all()
domain = None
deloptions = {"keepdir" : _("Do not delete mailbox directory")}
return render_domains_page(request, "mailboxes",
mailboxes=mailboxes, domain=domain)
mailboxes=mboxes, domain=domain, deloptions=deloptions)
@login_required
@good_domain
@@ -306,18 +331,26 @@ def editmailbox(request, mbox_id=None):
@login_required
@good_domain
@permission_required("admin.delete_mailbox")
def delmailbox(request, mbox_id=None):
mb = Mailbox.objects.get(pk=mbox_id)
if mb.user.id != request.user.id:
events.raiseEvent("DeleteMailbox", mbox=mb)
if not request.GET.has_key("keepdir") or request.GET["keepdir"] != "true":
mb.delete_dir()
mb.user.delete()
mb.delete()
def delmailbox(request):
selection = request.GET["selection"].split(",")
error = None
if not request.user.is_superuser:
mb = Mailbox.objects.get(user__id=request.user.id)
if mb.id in selection:
error = _("You can't delete your own mailbox")
if error is None:
if request.GET.has_key("keepdir") and request.GET["keepdir"] == "true":
keepdir = True
else:
keepdir = False
for mb in Mailbox.objects.filter(id__in=selection):
events.raiseEvent("DeleteMailbox", mbox=mb)
mb.delete()#keepdir=keepdir)
messages.info(request, _("Mailbox deleted"), fail_silently=True)
ctx = _ctx_ok("")
else:
ctx = getctx("ko", error=_("You can't delete your own mailbox"))
ctx = getctx("ko", error=error)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
@@ -398,11 +431,12 @@ def editmbalias(request, alias_id):
@login_required
@good_domain
@permission_required("admin.delete_alias")
def delmbalias(request, alias_id):
alias = Alias.objects.get(pk=alias_id)
alias.delete()
def delmbalias(request):
selection = request.GET["selection"].split(",")
Alias.objects.filter(id__in=selection).delete()
messages.info(request, _("Alias deleted"), fail_silently=True)
return HttpResponseRedirect(reverse(admin.views.mbaliases))
return HttpResponse(simplejson.dumps(_ctx_ok("")),
mimetype="application/json")
@login_required
@permission_required("auth.view_permissions")