diff --git a/modoboa/admin/models.py b/modoboa/admin/models.py index 6c8b106fa..ed72f733b 100644 --- a/modoboa/admin/models.py +++ b/modoboa/admin/models.py @@ -335,6 +335,11 @@ class User(DUser): if ooentry.content_object.is_owner(obj): return True return False + + def to_csv(self, csvwriter): + csvwriter.writerow(["account", self.username.encode("utf-8"), self.password, + self.first_name.encode("utf-8"), self.last_name.encode("utf-8"), + self.email]) class ObjectAccess(models.Model): user = models.ForeignKey(User) @@ -481,6 +486,9 @@ class Domain(DatesAware): self.enabled = True self.save() + def to_csv(self, csvwriter): + csvwriter.writerow(["domain", self.name, self.quota]) + class DomainAlias(DatesAware): name = models.CharField(ugettext_lazy("name"), max_length=100, unique=True, help_text=ugettext_lazy("The alias name")) @@ -768,11 +776,13 @@ class Alias(DatesAware): @property def tags(self): - cpt = len(self.mboxes.all()) - if cpt: - label = _("alias") if cpt == 1 else _("distribution list") - else: + cpt = len(self.get_recipients()) + if cpt > 1: + label = _("distribution list") + elif self.extmboxes != "": label = _("forward") + else: + label = _("alias") return '%s' % label def save(self, int_rcpts, ext_rcpts, *args, **kwargs): @@ -844,6 +854,18 @@ class Alias(DatesAware): raise AdminError(_("Mailbox %s does not exist" % rcpt)) self.save(int_rcpts, ext_rcpts) + def to_csv(self, csvwriter): + cpt = len(self.get_recipients()) + if cpt > 1: + altype = "dlist" + elif self.extmboxes != "": + altype = "forward" + else: + altype = "alias" + row = [altype, self.address] + row += self.get_recipients() + csvwriter.writerow(row) + class Extension(models.Model): name = models.CharField(max_length=150) enabled = models.BooleanField( diff --git a/modoboa/admin/templates/admin/information.html b/modoboa/admin/templates/admin/information.html index ed6275672..80f7500a3 100644 --- a/modoboa/admin/templates/admin/information.html +++ b/modoboa/admin/templates/admin/information.html @@ -1,6 +1,6 @@ {% load i18n libextras %}

{% trans "Information" %} {% trans "Various information about Modoboa" %}


-

Modoboa {% get_version %} {% trans "is currently in use." %}

+
Modoboa {% get_version %} {% trans "is currently in use." %}

{% trans "Active users" %}

diff --git a/modoboa/admin/templatetags/admin_extras.py b/modoboa/admin/templatetags/admin_extras.py index 8f9d7608b..0797e5d84 100644 --- a/modoboa/admin/templatetags/admin_extras.py +++ b/modoboa/admin/templatetags/admin_extras.py @@ -83,7 +83,11 @@ def domains_menu(selection, user): "img" : "icon-folder-open", "url" : reverse(admin.views.import_domains), "modal" : True, - "modalcb" : "admin.importform_cb"} + "modalcb" : "admin.importform_cb"}, + {"name" : "export", + "label" : _("Export"), + "img" : "icon-share-alt", + "url" : reverse(admin.views.export_domains),} ] return render_to_string('common/menulist.html', { @@ -124,7 +128,11 @@ def identities_menu(user): "img" : "icon-folder-open", "url" : reverse(admin.views.import_identities), "modal" : True, - "modalcb" : "admin.importform_cb"} + "modalcb" : "admin.importform_cb"}, + {"name" : "export", + "label" : _("Export"), + "img" : "icon-share-alt", + "url" : reverse(admin.views.export_identities),} ] return render_to_string('common/menulist.html', { diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index 7837441ed..c8b5c09c7 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -10,6 +10,7 @@ urlpatterns = patterns( (r'^domains/(?P\d+)/edit/$', 'editdomain'), (r'^domains/delete/$', 'deldomain'), (r'^domains/import/$', 'import_domains'), + (r'^domains/export/$', 'export_domains'), (r'^settings/$', 'viewsettings'), (r'^settings/parameters/$', 'viewparameters'), @@ -23,6 +24,7 @@ urlpatterns = patterns( (r'^identities/$', 'identities'), (r'^identities/list/$', '_identities'), (r'^identities/import/$', 'import_identities'), + (r'^identities/export/$', 'export_identities'), (r'^accounts/list/$', 'accounts_list'), (r'^accounts/new/$', 'newaccount'), diff --git a/modoboa/admin/views.py b/modoboa/admin/views.py index f61368c53..25b2f4ea5 100644 --- a/modoboa/admin/views.py +++ b/modoboa/admin/views.py @@ -7,6 +7,8 @@ from django.contrib.auth.decorators \ from django.db.models import Q from django.shortcuts import render from django.db import transaction, IntegrityError +import cStringIO +import csv from lib import render_listing from forms import * @@ -656,6 +658,32 @@ def import_identities(request): ) return render(request, "admin/importform.html", ctx) +def _export(content, filename): + """Export a csv file's content + + :param content: the content to export (string) + :param filename: the name that will appear into the response + :return: an ``HttpResponse`` object + """ + resp = HttpResponse(content) + resp["Content-Type"] = "text/csv" + resp["Content-Length"] = len(content) + resp["Content-Disposition"] = 'attachment; filename="%s"' % filename + return resp + +@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_identities(): + if oa.content_object: + oa.content_object.to_csv(csvwriter) + + content = fp.getvalue() + fp.close() + return _export(content, "modoboa-identities.csv") + @login_required @permission_required("admin.add_domain") @transaction.commit_on_success @@ -683,3 +711,18 @@ def import_domains(request): form=ImportDataForm() ) return render(request, "admin/importform.html", ctx) + +@login_required +@permission_required("admin.add_domain") +def export_domains(request): + import cStringIO + import csv + + fp = cStringIO.StringIO() + csvwriter = csv.writer(fp, delimiter=';') + for dom in request.user.get_domains(): + dom.to_csv(csvwriter) + + content = fp.getvalue() + fp.close() + return _export(content, "modoboa-domains.csv")