diff --git a/modoboa/admin/forms.py b/modoboa/admin/forms.py index 8bdbe13a6..8fd5ec40d 100644 --- a/modoboa/admin/forms.py +++ b/modoboa/admin/forms.py @@ -344,6 +344,36 @@ class ImportIdentitiesForm(ImportDataForm): help_text=ugettext_lazy("Check this option if passwords contained in your file are not crypted") ) +class ExportDataForm(forms.Form): + filename = forms.CharField( + label=ugettext_lazy("File name"), max_length=100, required=False + ) + sepchar = forms.CharField(label=ugettext_lazy("Separator"), max_length=1, required=False) + + def __init__(self, *args, **kwargs): + super(ExportDataForm, self).__init__(*args, **kwargs) + self.fields["sepchar"].widget.attrs = {"class" : "span1"} + + def clean_sepchar(self): + if self.cleaned_data["sepchar"] == "": + return ";" + return str(self.cleaned_data["sepchar"]) + + def clean_filename(self): + if self.cleaned_data["filename"] == "": + return self.fields["filename"].initial + return str(self.cleaned_data["filename"]) + +class ExportDomainsForm(ExportDataForm): + def __init__(self, *args, **kwargs): + super(ExportDomainsForm, self).__init__(*args, **kwargs) + self.fields["filename"].initial = "modoboa-domains.csv" + +class ExportIdentitiesForm(ExportDataForm): + def __init__(self, *args, **kwargs): + super(ExportIdentitiesForm, self).__init__(*args, **kwargs) + self.fields["filename"].initial = "modoboa-identities.csv" + class AccountFormGeneral(forms.ModelForm): username = forms.CharField(label=ugettext_lazy("Username"), max_length=254) role = forms.ChoiceField( diff --git a/modoboa/admin/models.py b/modoboa/admin/models.py index d3ef96535..66ab20dde 100644 --- a/modoboa/admin/models.py +++ b/modoboa/admin/models.py @@ -230,24 +230,6 @@ class User(DUser): return False return True - def get_accounts(self): - """Return all accounts owned by this user - - :return: a queryset - """ - from modoboa.lib.permissions import get_content_type - - return self.objectaccess_set.filter(content_type=get_content_type(self)) - - def get_aliases(self): - """Return all aliases owned by this user - - :return: a queryset - """ - from modoboa.lib.permissions import get_content_type - - return self.objectaccess_set.filter(content_type=get_content_type(Alias)) - def get_identities(self): """Return all identities owned by this user diff --git a/modoboa/admin/static/admin/js/admin.js b/modoboa/admin/static/admin/js/admin.js index 0267ba8d4..b0cdff044 100644 --- a/modoboa/admin/static/admin/js/admin.js +++ b/modoboa/admin/static/admin/js/admin.js @@ -84,6 +84,14 @@ Admin.prototype = { } }, + exportform_cb: function() { + $(".submit").one('click', function(e) { + e.preventDefault(); + $("#exportform").submit(); + $("#modalbox").modal('hide'); + }); + }, + reload_listing: function(data) { this.navobj.update(true); if (data.respmsg) { diff --git a/modoboa/admin/templatetags/admin_extras.py b/modoboa/admin/templatetags/admin_extras.py index da9dfeb6d..e9be74591 100644 --- a/modoboa/admin/templatetags/admin_extras.py +++ b/modoboa/admin/templatetags/admin_extras.py @@ -88,7 +88,9 @@ def domains_menu(selection, user): {"name" : "export", "label" : _("Export"), "img" : "icon-share-alt", - "url" : reverse(admin.views.export_domains),} + "url" : reverse(admin.views.export_domains), + "modal" : True, + "modalcb" : "admin.exportform_cb"} ] return render_to_string('common/menulist.html', { @@ -133,7 +135,9 @@ def identities_menu(user): {"name" : "export", "label" : _("Export"), "img" : "icon-share-alt", - "url" : reverse(admin.views.export_identities),} + "url" : reverse(admin.views.export_identities), + "modal" : True, + "modalcb" : "admin.exportform_cb"} ] return render_to_string('common/menulist.html', { diff --git a/modoboa/admin/views.py b/modoboa/admin/views.py index 8243f66a9..1c42d17de 100644 --- a/modoboa/admin/views.py +++ b/modoboa/admin/views.py @@ -697,18 +697,27 @@ def _export(content, filename): @login_required @permission_required(lambda u: u.has_perm("auth.add_user") or u.has_perm("auth.add_alias")) def export_identities(request): - fp = cStringIO.StringIO() - csvwriter = csv.writer(fp, delimiter=';') - for oa in request.user.get_accounts(): - if oa.content_object: - oa.content_object.to_csv(csvwriter) - for oa in request.user.get_aliases(): - if oa.content_object: - oa.content_object.to_csv(csvwriter) - - content = fp.getvalue() - fp.close() - return _export(content, "modoboa-identities.csv") + ctx = { + "title" : _("Export identities"), + "action_label" : _("Export"), + "action_classes" : "submit", + "formid" : "exportform", + "action" : reverse(export_identities), + } + + if request.method == "POST": + form = ExportIdentitiesForm(request.POST) + form.is_valid() + fp = cStringIO.StringIO() + csvwriter = csv.writer(fp, delimiter=form.cleaned_data["sepchar"]) + for ident in request.user.get_identities(): + ident.to_csv(csvwriter) + content = fp.getvalue() + fp.close() + return _export(content, form.cleaned_data["filename"]) + + ctx["form"] = ExportIdentitiesForm() + return render(request, "common/generic_modal_form.html", ctx) @login_required @permission_required("admin.add_domain") @@ -742,16 +751,26 @@ def import_domains(request): @login_required @permission_required("admin.add_domain") def export_domains(request): - import cStringIO - import csv + ctx = { + "title" : _("Export domains"), + "action_label" : _("Export"), + "action_classes" : "submit", + "formid" : "exportform", + "action" : reverse(export_domains), + } - fp = cStringIO.StringIO() - csvwriter = csv.writer(fp, delimiter=';') - for dom in request.user.get_domains(): - dom.to_csv(csvwriter) - for da in dom.domainalias_set.all(): - da.to_csv(csvwriter) - - content = fp.getvalue() - fp.close() - return _export(content, "modoboa-domains.csv") + if request.method == "POST": + form = ExportDomainsForm(request.POST) + form.is_valid() + fp = cStringIO.StringIO() + csvwriter = csv.writer(fp, delimiter=form.cleaned_data["sepchar"]) + for dom in request.user.get_domains(): + dom.to_csv(csvwriter) + for da in dom.domainalias_set.all(): + da.to_csv(csvwriter) + content = fp.getvalue() + fp.close() + return _export(content, form.cleaned_data["filename"]) + + ctx["form"] = ExportDomainsForm() + return render(request, "common/generic_modal_form.html", ctx)