* Possibility to export domains and identities (see #116)

* Display Modoboa version nicely (fix #304)
This commit is contained in:
Antoine Nguyen
2013-01-12 18:27:10 +01:00
parent 4f38d05111
commit 90d385769a
5 changed files with 82 additions and 7 deletions
+26 -4
View File
@@ -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 '<span class="label">%s</span>' % 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(
@@ -1,6 +1,6 @@
{% load i18n libextras %}
<h2>{% trans "Information" %} <small>{% trans "Various information about Modoboa" %}</small></h2><hr>
<p>Modoboa <strong>{% get_version %}</strong> {% trans "is currently in use." %}</p>
<div class="alert alert-info">Modoboa <strong>{% get_version %}</strong> {% trans "is currently in use." %}</div>
<h3>{% trans "Active users" %}</h3>
<table class="table">
+10 -2
View File
@@ -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', {
+2
View File
@@ -10,6 +10,7 @@ urlpatterns = patterns(
(r'^domains/(?P<dom_id>\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'),
+43
View File
@@ -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")