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")