mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
* New "import data" feature (only supports mailboxes for now)
* Some javascript cleanup into the admin. application see #191
This commit is contained in:
@@ -199,3 +199,13 @@ class DomainAdminForm(forms.Form):
|
||||
forms.ChoiceField(label=_("User"), required=True,
|
||||
choices=[("", _("Empty"))],
|
||||
help_text=_("Select a user in the list"))
|
||||
|
||||
class ImportDataForm(forms.Form):
|
||||
sourcefile = forms.FileField(label=_("Select a file"))
|
||||
sepcar = forms.CharField(label=_("Separator"), max_length=1, required=False)
|
||||
|
||||
def clean_sepcar(self):
|
||||
if self.cleaned_data["sepcar"] == "":
|
||||
return ";"
|
||||
return self.cleaned_data["sepcar"]
|
||||
|
||||
|
||||
@@ -319,6 +319,26 @@ class Mailbox(DatesAware):
|
||||
self.quota = self.domain.quota
|
||||
super(Mailbox, self).save()
|
||||
|
||||
def create_from_csv(self, line):
|
||||
"""Create a new mailbox from a CSV file entry
|
||||
|
||||
The expected order is the following::
|
||||
|
||||
[loginname, password, first name, last name, address]
|
||||
|
||||
:param line: a list containing the expected information
|
||||
"""
|
||||
if len(line) < 5:
|
||||
raise AdminError(_("Invalid line"))
|
||||
mailbox, domname = split_mailbox(line[4])
|
||||
self.address = mailbox
|
||||
try:
|
||||
self.domain = Domain.objects.get(name=domname)
|
||||
except Domain.DoesNotExist:
|
||||
raise AdminError(_("Cannot import this mailbox because the associated domain does not exist"))
|
||||
self.name = "%s %s" % (line[2], line[3])
|
||||
self.save(password=line[1], enabled=True)
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
keepdir = False
|
||||
if kwargs.has_key("keepdir"):
|
||||
|
||||
@@ -93,7 +93,13 @@ def domains_menu(selection, user, domid):
|
||||
else:
|
||||
disabled = False
|
||||
|
||||
entries += [{"name" : "new",
|
||||
entries += [
|
||||
{"name" : "actions",
|
||||
"label" : _("Actions"),
|
||||
"img" : static_url("pics/tools.png"),
|
||||
"class" : "menubardropdown",
|
||||
"menu" : [
|
||||
{"name" : "new",
|
||||
"label" : _("New"),
|
||||
"img" : static_url("pics/add.png"),
|
||||
"disabled" : disabled},
|
||||
@@ -101,7 +107,16 @@ def domains_menu(selection, user, domid):
|
||||
"label" : _("Remove"),
|
||||
"img" : static_url("pics/remove.png"),
|
||||
"disabled" : disabled
|
||||
}]
|
||||
},
|
||||
{"name" : "import",
|
||||
"label" : _("Import data"),
|
||||
"img" : static_url("pics/import.png"),
|
||||
"class" : "boxed",
|
||||
"rel" : "{handler:'iframe',size:{x:370,y:250}}",
|
||||
"url" : reverse(admin.views.importdata)}
|
||||
]
|
||||
},
|
||||
]
|
||||
|
||||
entries += [{"separator" : True}]
|
||||
if user.has_perm("admin.view_domains"):
|
||||
|
||||
+1
-3
@@ -6,6 +6,7 @@ urlpatterns = patterns('modoboa.admin.views',
|
||||
(r'^domains/new/', 'newdomain'),
|
||||
(r'^domains/(?P<dom_id>\d+)/edit/$', 'editdomain'),
|
||||
(r'^domains/delete/$', 'deldomain'),
|
||||
(r'^domains/import/$', 'importdata'),
|
||||
|
||||
(r'^domaliases/$', "domaliases"),
|
||||
(r'^domaliases/new/', 'newdomalias'),
|
||||
@@ -25,9 +26,6 @@ urlpatterns = patterns('modoboa.admin.views',
|
||||
|
||||
(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"),
|
||||
|
||||
(r'^settings/$', 'viewparameters'),
|
||||
(r'^settings/parameters/$', 'viewparameters'),
|
||||
(r'^settings/parameters/save/$', 'saveparameters'),
|
||||
|
||||
@@ -608,3 +608,37 @@ def saveextensions(request):
|
||||
ext.save()
|
||||
messages.info(request, _("Modifications applied."), fail_silently=True)
|
||||
return HttpResponseRedirect(reverse(admin.views.viewextensions))
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser)
|
||||
def importdata(request, tplname="admin/import.html"):
|
||||
if request.method == "POST":
|
||||
error = None
|
||||
form = ImportDataForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
import csv
|
||||
reader = csv.reader(request.FILES['sourcefile'],
|
||||
delimiter=form.cleaned_data['sepcar'])
|
||||
cpt = 0
|
||||
try:
|
||||
for row in reader:
|
||||
mb = Mailbox()
|
||||
mb.create_from_csv(row)
|
||||
cpt += 1
|
||||
except AdminError, e:
|
||||
error = str(e)
|
||||
else:
|
||||
messages.info(request, _("%d mailboxes imported successfully" % cpt))
|
||||
return _render(request, "admin/import_done.html", {
|
||||
"status" : "ok", "msg" : ""
|
||||
})
|
||||
|
||||
return _render(request, "admin/import_done.html", {
|
||||
"status" : "ko", "msg" : error
|
||||
})
|
||||
|
||||
form = ImportDataForm()
|
||||
ctx = dict(title=_("Import data"), action="", formid="importform",
|
||||
enctype="multipart/form-data", form=form, submit_label=_("Import"))
|
||||
return _render(request, tplname, ctx)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user