mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-24 06:48:35 +02:00
see #97
* 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:
@@ -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
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user