Work still in progress. Added support for aliases creation and edition.

see #102

Starting with code refactoring before modifying UI.
This commit is contained in:
tonio
2010-12-02 16:25:15 +01:00
parent c052235644
commit 66f08caea9
8 changed files with 257 additions and 56 deletions
@@ -0,0 +1,108 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'DomainAlias'
db.create_table('admin_domainalias', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)),
('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Domain'])),
('enabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('admin', ['DomainAlias'])
def backwards(self, orm):
# Deleting model 'DomainAlias'
db.delete_table('admin_domainalias')
models = {
'admin.alias': {
'Meta': {'object_name': 'Alias'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'})
},
'admin.domain': {
'Meta': {'object_name': 'Domain'},
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'quota': ('django.db.models.fields.IntegerField', [], {})
},
'admin.domainalias': {
'Meta': {'object_name': 'DomainAlias'},
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"})
},
'admin.extension': {
'Meta': {'object_name': 'Extension'},
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '150'})
},
'admin.mailbox': {
'Meta': {'object_name': 'Mailbox'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}),
'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'gid': ('django.db.models.fields.IntegerField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'quota': ('django.db.models.fields.IntegerField', [], {}),
'uid': ('django.db.models.fields.IntegerField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
}
}
complete_apps = ['admin']
+70
View File
@@ -121,6 +121,12 @@ def domains_menu(selection, user):
"url" : reverse(admin.views.domains),
"label" : _("Domains"),
"img" : static_url("pics/domains.png")},
{"name" : "newdomalias",
"url" : reverse(admin.views.newdomalias),
"label" : _("New domain alias"),
"img" : static_url("pics/add.png"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:200}}"},
{"name" : "domaliases",
"url" : reverse(admin.views.domaliases),
"label" : _("Domain aliases"),
@@ -147,6 +153,70 @@ def permissions_menu(user):
return render_to_string('common/menu.html',
{"entries" : entries, "user" : user})
def render_actions(actions):
t = template.Template("""
{% for a in actions %}
<a href="{{ a.url }}" name="{{ a.name }}" class="{{ a.class }}" rel="{{ a.rel }}">
<img src="{{ a.img }}" border="0" title="{{ a.title }}" />
</a>
{% endfor %}
""")
return t.render(template.Context({
"actions" : actions
}))
@register.simple_tag
def domain_actions(user, domid):
actions = [
{"name" : "editdomain",
"url" : reverse(admin.views.editdomain, args=[domid]),
"img" : static_url("pics/edit.png"),
"title" : _("Edit domain"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:180}}"},
{"name" : "deldomain",
"url" : reverse(admin.views.deldomain, args=[domid]),
"img" : static_url("pics/remove.png"),
"title" : _("Delete domain")},
{"name" : "domaliases",
"url" : reverse(admin.views.domaliases) + "?domid=%s" % domid,
"img" : static_url("pics/alias.png"),
"title" : _("View aliases of this domain")}
]
return render_actions(actions)
@register.simple_tag
def domalias_actions(user, aid):
actions = [
{"name" : "editalias",
"url" : reverse(admin.views.editdomalias, args=[aid]),
"img" : static_url("pics/edit.png"),
"title" : _("Edit alias"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:220}}"}
]
return render_actions(actions)
@register.simple_tag
def mailbox_actions(user, domid, mid):
actions = [
{"name" : "editmailbox",
"url" : reverse(admin.views.editmailbox, args=[domid, mid]),
"img" : static_url("pics/edit.png"),
"title" : _("Edit mailbox"),
"class" : "boxed",
"rel" : "{handler:'iframe',size:{x:300,y:280}}"},
{"name" : "deleteMb",
"url" : reverse(admin.views.delmailbox, args=[domid, mid]),
"img" : static_url("pics/remove.png"),
"title" : _("Delete mailbox")},
{"name" : "aliases",
"url" : reverse("mbox-aliases", args=[domid, mid]),
"img" : static_url("pics/alias.png"),
"title" : _("View this mailbox aliases")},
]
return render_actions(actions)
@register.simple_tag
def loadadminextmenu(user):
menu = events.raiseQueryEvent("AdminMenuDisplay", target="admin_menu_box",
+3 -2
View File
@@ -7,8 +7,9 @@ urlpatterns = patterns('modoboa.admin.views',
(r'^domains/(?P<dom_id>\d+)/edit/$', 'editdomain'),
(r'^domains/(?P<dom_id>\d+)/delete/$', 'deldomain'),
(r'^aliases/$', "domaliases"),
(r'^aliases/new/(?P<dom_id>\d+)/', 'newdomalias'),
(r'^domaliases/$', "domaliases"),
(r'^domaliases/new/', 'newdomalias'),
(r'^domaliases/edit/(?P<alias_id>\d+)/', 'editdomalias'),
(r'^domains/(?P<dom_id>\d+)/newmailbox/$', 'newmailbox'),
(r'^domains/(?P<dom_id>\d+)/editmailbox/(?P<mbox_id>\d+)/$', 'editmailbox'),
+52 -13
View File
@@ -54,28 +54,36 @@ def domains(request):
})
@login_required
def domaliases(request, dom_id=None):
domaliases = DomainAlias.objects.all()
def domaliases(request):
if request.GET.has_key("domid"):
domain = Domain.objects.get(pk=request.GET["domid"])
domaliases = DomainAlias.objects.filter(target=request.GET["domid"])
else:
domain = None
domaliases = DomainAlias.objects.all()
return _render(request, 'admin/domaliases.html', {
"domaliases" : domaliases
"domaliases" : domaliases, "domain" : domain
})
@login_required
def newdomalias(request, dom_id):
domain = Domain.objects.get(pk=dom_id)
def newdomalias(request):
if request.method == "POST":
form = DomainAliasForm(request.POST)
error = None
if form.is_valid():
if DomainAlias.objects.filter(name=request.POST["name"]):
error = _("Alias with this name already exists")
domalias = form.save(commit=False)
if Domain.objects.filter(name=domalias.name):
error = _("A domain with this name already exists")
else:
domalias = form.save(commit=False)
domalias.save()
ctx = _ctx_ok(reverse(admin.views.domaliases))
messages.info(request, _("Domain alias created"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
try:
domalias.save()
except IntegrityError:
error = _("Alias with this name already exists")
else:
ctx = _ctx_ok(reverse(admin.views.domaliases))
messages.info(request, _("Domain alias created"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/newdomalias.html", {
"form" : form, "error" : error
})
@@ -86,6 +94,37 @@ def newdomalias(request, dom_id):
"form" : form
})
@login_required
def editdomalias(request, alias_id):
domalias = DomainAlias.objects.get(pk=alias_id)
if request.method == "POST":
form = DomainAliasForm(request.POST, instance=domalias)
error = None
if form.is_valid():
ndomalias = form.save(commit=False)
if Domain.objects.filter(name=ndomalias.name):
error = _("A domain with this name already exists")
else:
try:
ndomalias.save()
except IntegrityError:
error = _("Alias with this name already exists")
else:
ctx = _ctx_ok(reverse(admin.views.domaliases))
messages.info(request, _("Domain alias updated"), fail_silently=True)
return HttpResponse(simplejson.dumps(ctx),
mimetype="application/json")
content = _render_to_string(request, "admin/editdomalias.html", {
"form" : form, "error" : error
})
ctx = getctx("ko", content=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = DomainAliasForm(instance=domalias)
return _render(request, 'admin/editdomalias.html', {
"form" : form, "domalias" : domalias
})
@login_required
@permission_required("admin.add_domain")
def newdomain(request):
+1 -17
View File
@@ -28,23 +28,7 @@
</tr>
{% for dom in domains %}
<tr class="{% cycle 'odd' 'even' %}" id="{{ dom.id }}">
<td>
{% url admin.views.editdomain dom.id as edit_url %}
<a href="{{ edit_url }}" class="boxed"
rel="{handler:'iframe',size:{x:300,y:180}}">
<img src="{{ MEDIA_URL }}pics/edit.png" border="0" title="{% trans 'Edit domain' %}"/>
</a>
{% url admin.views.deldomain dom.id as del_url %}
<a href="{{ del_url }}" name="deleteDom">
<img src="{{ MEDIA_URL }}pics/remove.png" border="0" title="{% trans 'Delete domain' %}"/>
</a>
{% url admin.views.newdomalias dom.id as new_url %}
<a href="{{ new_url }}" class="boxed"
rel="{handler:'iframe',size:{x:300,y:180}}">
<img src="{{ MEDIA_URL }}pics/add.png" border="0" title="{% trans 'Add domain alias' %}"/>
</a>
</td>
{% url admin.views.mailboxes dom.id as domurl %}
<td>{% domain_actions user dom.id %}</td>
<td>{{ dom.name }}</td>
<td>{{ dom.mboxcounter }}</td>
<td>{{ dom.quota }} {% trans "MB" %}</td>
+5 -3
View File
@@ -5,7 +5,9 @@
<script type="text/javascript">
</script>
{% endblock %}
{% block middletitle %}{% trans "Available aliases" %}{% endblock %}
{% block middletitle %}
{% trans "Domain aliases" %}{% if domain %} ({% trans "for" %} {{ domain.name }}){% endif %}
{% endblock %}
{% block menu %}{% domains_menu "domaliases" user %}{% endblock %}
{% block content %}
{% if messages %}{% display_messages messages %}{% endif %}
@@ -21,8 +23,8 @@
<th width="75px">{% trans "Enabled" %}</th>
</tr>
{% for domalias in domaliases %}
<tr>
<td></td>
<tr class="{% cycle 'odd' 'even' %}">
<td>{% domalias_actions user domalias.id %}</td>
<td>{{ domalias.name }}</td>
<td>{{ domalias.target.name }}</td>
<td>{{ domalias.enabled|yesno }}</td>
+17
View File
@@ -0,0 +1,17 @@
{% extends "layout_simple.html" %}
{% load i18n %}
{% block html_head %}
<script src="{{ MEDIA_URL }}js/form.js" type="text/javascript"></script>
{% endblock %}
{% block content %}
<div class="title"><h1>{% trans "Edit domain alias" %}</h1></div>
{% if error %}<div class="error">{{ error }}</div>{% endif %}
{% url admin.views.editdomalias domalias.id as box_url %}
<form action="{{ box_url }}" method="POST" id="domaliasform" name="domaliasform">
{% include "common/genericform.html" %}
<div class="spacer"></div>
<div class="lastrow" align="center">
<input type="submit" name="submit" value="{% trans 'Update' %}" />
</div>
</form>
{% endblock %}
+1 -21
View File
@@ -19,27 +19,7 @@
</tr>
{% for mb in mailboxes %}
<tr class="{% cycle 'odd' 'even' %}">
<td>
{% url admin.views.editmailbox domain.id mb.id as edit_url %}
<a href="{{ edit_url }}" class="boxed"
rel="{handler:'iframe',size:{x:300,y:280}}">
<img src="{{ MEDIA_URL }}pics/edit.png" border="0" title="{% trans 'Edit mailbox' %}"/>
</a>
{% url admin.views.delmailbox domain.id mb.id as del_url %}
<a href="{{ del_url }}" name="deleteMb">
<img src="{{ MEDIA_URL }}pics/remove.png" border="0"
title="{% trans 'Delete mailbox' %}" />
</a>
{% url admin.views.newalias domain.id as alias_url %}
<a href="{{ alias_url }}" class="boxed"
rel="{handler:'iframe',size:{x:300,y:250}}">
<img src="{{ MEDIA_URL }}pics/add.png" border="0" title="{% trans 'Add new alias' %}"/>
</a>
{% url mbox-aliases domain.id mb.id as aliases_url %}
<a href="{{ aliases_url }}">
<img src="{{ MEDIA_URL }}pics/alias.png" border="0" title="{% trans 'Mailbox aliases' %}"/>
</a>
</td>
<td>{% mailbox_actions user domain.id mb.id %}</td>
<td>{{ mb.name }}</td>
<td>{{ mb.address }}@{{ mb.domain.name }}</td>
<td>{{ mb.quota }} {% trans "MB" %}</td>