* New "import data" feature (only supports mailboxes for now)

* Some javascript cleanup into the admin. application

see #191
This commit is contained in:
Antoine Nguyen
2011-12-09 14:38:56 +01:00
parent 767343640a
commit 4fcc5b7911
14 changed files with 226 additions and 86 deletions
+10
View File
@@ -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"]
+20
View File
@@ -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"):
+17 -2
View File
@@ -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
View File
@@ -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'),
+34
View File
@@ -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)