mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
* Possibility to export domains and identities (see #116)
* Display Modoboa version nicely (fix #304)
This commit is contained in:
+26
-4
@@ -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">
|
||||
|
||||
@@ -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', {
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user