mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Merge with mainline
This commit is contained in:
+23
-24
@@ -295,15 +295,14 @@ class DatesAware(models.Model):
|
||||
ObjectDates.set_for_object(self)
|
||||
super(DatesAware, self).save(*args, **kwargs)
|
||||
|
||||
def __creation(self):
|
||||
@property
|
||||
def creation(self):
|
||||
return self.dates.creation
|
||||
|
||||
def __last_modification(self):
|
||||
@property
|
||||
def last_modification(self):
|
||||
return self.dates.last_modification
|
||||
|
||||
creation = property(__creation)
|
||||
last_modification = property(__last_modification)
|
||||
|
||||
class Domain(DatesAware):
|
||||
name = models.CharField(ugettext_noop('name'), max_length=100, unique=True,
|
||||
help_text=ugettext_noop("The domain name"))
|
||||
@@ -317,14 +316,14 @@ class Domain(DatesAware):
|
||||
("view_domain", "View domain"),
|
||||
("view_domains", "View domains"),
|
||||
)
|
||||
|
||||
def __domainalias_count(self):
|
||||
|
||||
@property
|
||||
def domainalias_count(self):
|
||||
return len(self.domainalias_set.all())
|
||||
domainalias_count = property(__domainalias_count)
|
||||
|
||||
def __mailbox_count(self):
|
||||
@property
|
||||
def mailbox_count(self):
|
||||
return len(self.mailbox_set.all())
|
||||
mailbox_count = property(__mailbox_count)
|
||||
|
||||
def create_dir(self):
|
||||
if parameters.get_admin("CREATE_DIRECTORIES") == "yes":
|
||||
@@ -407,25 +406,25 @@ class Mailbox(DatesAware):
|
||||
self.mdirroot += '/'
|
||||
|
||||
def __str__(self):
|
||||
return self.__full_address()
|
||||
|
||||
def __full_address(self):
|
||||
return self.full_address
|
||||
|
||||
@property
|
||||
def full_address(self):
|
||||
return "%s@%s" % (self.address, self.domain.name)
|
||||
full_address = property(__full_address)
|
||||
|
||||
def __enabled(self):
|
||||
@property
|
||||
def enabled(self):
|
||||
return self.user.is_active
|
||||
enabled = property(__enabled)
|
||||
|
||||
def __full_path(self):
|
||||
@property
|
||||
def full_path(self):
|
||||
path = os.path.join(parameters.get_admin("STORAGE_PATH"),
|
||||
self.domain.name, self.address)
|
||||
return os.path.abspath(path)
|
||||
full_path = property(__full_path)
|
||||
|
||||
def __alias_count(self):
|
||||
@property
|
||||
def alias_count(self):
|
||||
return len(self.alias_set.all())
|
||||
alias_count = property(__alias_count)
|
||||
|
||||
def create_dir(self):
|
||||
if parameters.get_admin("CREATE_DIRECTORIES") == "yes":
|
||||
@@ -607,15 +606,15 @@ class Alias(DatesAware):
|
||||
("view_aliases", "View aliases"),
|
||||
)
|
||||
|
||||
def __full_address(self):
|
||||
@property
|
||||
def full_address(self):
|
||||
return "%s@%s" % (self.address, self.domain.name)
|
||||
full_address = property(__full_address)
|
||||
|
||||
def __targets(self):
|
||||
@property
|
||||
def targets(self):
|
||||
ret = "<br/>".join(map(lambda m: str(m), self.mboxes.all()))
|
||||
ret += "<br/>" + self.repr_extmboxes()
|
||||
return ret
|
||||
targets = property(__targets)
|
||||
|
||||
def save(self, int_targets, ext_targets, *args, **kwargs):
|
||||
if len(ext_targets):
|
||||
|
||||
+2
-2
@@ -21,7 +21,7 @@ class DomainsTable(tables.Table):
|
||||
width="50px", align="center")
|
||||
enabled = tables.Column("enabled", label=gender("Enabled", "m"), width="50px",
|
||||
align="center")
|
||||
actions = tables.ActionColumn("actions", label=ugettext_noop("Actions"), width="50px",
|
||||
actions = tables.ActionColumn("actions", label=ugettext_noop("Actions"), width="70px",
|
||||
align="center", defvalue=domain_actions)
|
||||
|
||||
cols_order = ["name", "creation", "modified",
|
||||
@@ -67,7 +67,7 @@ class MailboxesTable(tables.Table):
|
||||
tableid = "objects_table"
|
||||
idkey = "id"
|
||||
|
||||
address = tables.Column("address", label=ugettext_noop("Address"))
|
||||
address = tables.Column("full_address", label=ugettext_noop("Address"))
|
||||
name = tables.Column("user", label=ugettext_noop("Name"))
|
||||
creation = tables.Column("creation", label=ugettext_noop("Created"),
|
||||
width="160px")
|
||||
|
||||
@@ -169,6 +169,15 @@ def domain_actions(user, domid):
|
||||
"img" : static_url("pics/alias.png"),
|
||||
"title" : _("View aliases of this domain")}
|
||||
]
|
||||
if user.has_perm('admin.view_domains'):
|
||||
actions += [
|
||||
{"name" : "viewadmins",
|
||||
"url" : reverse(admin.views.view_domain_admins, args=[domid]),
|
||||
"img" : static_url("pics/administrators.png"),
|
||||
"title" : _("View administrators of this domain"),
|
||||
"class" : "boxed",
|
||||
"rel" : "{handler:'iframe',size:{x:310,y:190}}"},
|
||||
]
|
||||
return render_actions(actions)
|
||||
|
||||
@register.simple_tag
|
||||
|
||||
@@ -37,6 +37,7 @@ urlpatterns = patterns(
|
||||
(r'^permissions/domainadmin/edit/(?P<da_id>\d+)/$', 'edit_domain_admin'),
|
||||
(r'^permissions/domainadmin/promote/$', 'domain_admin_promotion'),
|
||||
(r'^permissions/domainadmin/assign/(?P<da_id>\d+)/$', 'assign_domains_to_admin'),
|
||||
(r'^permissions/domainadmins/(?P<dom_id>\d+)/$', 'view_domain_admins'),
|
||||
(r'^permissions/searchaccount/$', 'search_account'),
|
||||
(r'^permissions/delete/$', 'delete_permissions'),
|
||||
)
|
||||
|
||||
+19
-9
@@ -70,7 +70,7 @@ def _validate_domain(request, form, successmsg, commonctx,
|
||||
@permission_required("admin.add_domain")
|
||||
@transaction.commit_on_success
|
||||
def newdomain(request, tplname="admin/adminform.html"):
|
||||
events.raiseEvent("CanCreateDomain", request.user)
|
||||
events.raiseEvent("CanCreate", request.user, "domains")
|
||||
def newdomain_cb(user, domain):
|
||||
grant_access_to_object(user, domain, is_owner=True)
|
||||
events.raiseEvent("CreateDomain", user, domain)
|
||||
@@ -152,7 +152,7 @@ def domaliases(request):
|
||||
@permission_required("admin.add_domainalias")
|
||||
@transaction.commit_on_success
|
||||
def newdomalias(request, tplname="admin/adminform.html"):
|
||||
events.raiseEvent("CanCreateDomainAlias", request.user)
|
||||
events.raiseEvent("CanCreate", request.user, "domain_aliases")
|
||||
commonctx = {"title" : _("New domain alias"),
|
||||
"submit_label" : _("Create"),
|
||||
"action" : reverse(newdomalias),
|
||||
@@ -275,7 +275,7 @@ def mailboxes_search(request):
|
||||
@permission_required("admin.add_mailbox")
|
||||
@transaction.commit_on_success
|
||||
def newmailbox(request, tplname="admin/adminform.html"):
|
||||
events.raiseEvent("CanCreateMailbox", request.user)
|
||||
events.raiseEvent("CanCreate", request.user, "mailboxes")
|
||||
commonctx = {"title" : _("New mailbox"),
|
||||
"submit_label" : _("Create"),
|
||||
"action" : reverse(newmailbox),
|
||||
@@ -312,7 +312,7 @@ def newmailbox(request, tplname="admin/adminform.html"):
|
||||
@permission_required("admin.change_mailbox")
|
||||
def editmailbox(request, mbox_id=None, tplname="admin/adminform.html"):
|
||||
mb = Mailbox.objects.get(pk=mbox_id)
|
||||
if not request.user.is_owner(mb.domain):
|
||||
if not request.user.can_access(mb.domain):
|
||||
raise PermDeniedException(_("You do not have access to this domain"))
|
||||
|
||||
commonctx = {"title" : _("Mailbox editing"),
|
||||
@@ -423,7 +423,7 @@ def _validate_mbalias(request, form, successmsg, tplname, commonctx, callback=No
|
||||
@permission_required("admin.add_alias")
|
||||
@transaction.commit_on_success
|
||||
def newmbalias(request, tplname="admin/mbaliasform.html"):
|
||||
events.raiseEvent("CanCreateMailboxAlias", request.user)
|
||||
events.raiseEvent("CanCreate", request.user, "mailbox_aliases")
|
||||
commonctx = {"title" : _("New mailbox alias"),
|
||||
"submit_label" : _("Create"),
|
||||
"action" : reverse(newmbalias),
|
||||
@@ -496,7 +496,7 @@ def permissions(request, tplname='admin/permissions.html'):
|
||||
permtables += [
|
||||
{"id" : "domain_admins",
|
||||
"title" : _("Domain administrators"),
|
||||
"rel" : "350 250",
|
||||
"rel" : "350 100",
|
||||
"content" : DomainAdminsPerms().get(request)}
|
||||
]
|
||||
|
||||
@@ -515,6 +515,7 @@ def add_permission(request):
|
||||
else:
|
||||
pobj = pclass()
|
||||
if request.method == "GET":
|
||||
events.raiseEvent("CanCreate", request.user, role)
|
||||
return pobj.get_add_form(request)
|
||||
status, data = pobj.add(request)
|
||||
if not status:
|
||||
@@ -573,7 +574,7 @@ def edit_domain_admin(request, da_id, tplname="admin/adminform.html"):
|
||||
|
||||
@login_required
|
||||
@permission_required("auth.view_permissions")
|
||||
def domain_admin_promotion(request):
|
||||
def domain_admin_promotion(request, tplname="admin/domain_admin_promotion.html"):
|
||||
if request.method == "POST":
|
||||
form = DomainAdminPromotionForm(request.POST)
|
||||
if form.is_valid():
|
||||
@@ -589,9 +590,10 @@ def domain_admin_promotion(request):
|
||||
messages.info(request, _("Domain admin added"), fail_silently=True)
|
||||
return ajax_response(request, url=reverse(admin.views.permissions))
|
||||
|
||||
return ajax_response(request, status="ko", template=tplname, form=form)
|
||||
|
||||
form = DomainAdminPromotionForm()
|
||||
return ajax_response(request, template="admin/domain_admin_promotion.html",
|
||||
form=form)
|
||||
return ajax_response(request, template=tplname, form=form)
|
||||
|
||||
@login_required
|
||||
@permission_required("auth.view_permissions")
|
||||
@@ -624,6 +626,14 @@ def assign_domains_to_admin(request, da_id, tplname="admin/adminform.html"):
|
||||
ctx.update(form=form)
|
||||
return _render(request, tplname, ctx)
|
||||
|
||||
@login_required
|
||||
@permission_required("auth.view_permissions")
|
||||
def view_domain_admins(request, dom_id, tplname="admin/view_domain_admins.html"):
|
||||
domain = Domain.objects.get(pk=dom_id)
|
||||
return _render(request, tplname, {
|
||||
"domain" : domain
|
||||
})
|
||||
|
||||
@login_required
|
||||
@permission_required("auth.view_permissions")
|
||||
@check_domain_access
|
||||
|
||||
@@ -40,9 +40,6 @@ def dec_limit(user, lname):
|
||||
except LimitsPool.DoesNotExist:
|
||||
pass
|
||||
|
||||
@events.observe('CanCreateDomain')
|
||||
def check_domains_limit(user):
|
||||
check_limit(user, 'domains_limit')
|
||||
|
||||
@events.observe('CreateDomain')
|
||||
def inc_nb_domains(user, domain):
|
||||
@@ -59,10 +56,6 @@ def dec_nb_domains(domain):
|
||||
for mbalias in domain.alias_set.all():
|
||||
dec_nb_mbaliases(mbalias)
|
||||
|
||||
@events.observe('CanCreateDomainAlias')
|
||||
def check_domaliases_limit(user):
|
||||
check_limit(user, 'domain_aliases_limit')
|
||||
|
||||
@events.observe('DomainAliasCreated')
|
||||
def inc_nb_domaliases(user, domalias):
|
||||
inc_limit(user, 'domain_aliases_limit')
|
||||
@@ -72,10 +65,6 @@ def dec_nb_domaliases(domainalias):
|
||||
owner = get_object_owner(domainalias)
|
||||
dec_limit(owner, 'domain_aliases_limit')
|
||||
|
||||
@events.observe('CanCreateMailbox')
|
||||
def check_mboxes_limit(user):
|
||||
check_limit(user, 'mailboxes_limit')
|
||||
|
||||
@events.observe('CreateMailbox')
|
||||
def inc_nb_mailboxes(user, mailbox):
|
||||
inc_limit(user, 'mailboxes_limit')
|
||||
@@ -85,10 +74,6 @@ def dec_nb_mailboxes(mailbox):
|
||||
owner = get_object_owner(mailbox)
|
||||
dec_limit(owner, 'mailboxes_limit')
|
||||
|
||||
@events.observe('CanCreateMailboxAlias')
|
||||
def check_mbaliases_limit(user):
|
||||
check_limit(user, 'mailbox_aliases_limit')
|
||||
|
||||
@events.observe('MailboxAliasCreated')
|
||||
def inc_nb_mbaliases(user, mailboxalias):
|
||||
inc_limit(user, 'mailbox_aliases_limit')
|
||||
@@ -98,8 +83,14 @@ def dec_nb_mbaliases(mailboxalias):
|
||||
owner = get_object_owner(mailboxalias)
|
||||
dec_limit(owner, 'mailbox_aliases_limit')
|
||||
|
||||
@events.observe('CanCreate')
|
||||
def can_create_new_object(user, objtype):
|
||||
check_limit(user, '%s_limit' % objtype)
|
||||
|
||||
@events.observe("DomainAdminCreated")
|
||||
def create_pool(user):
|
||||
owner = get_object_owner(user)
|
||||
inc_limit(owner, 'domain_admins_limit')
|
||||
p = LimitsPool(user=user)
|
||||
p.save()
|
||||
p.create_limits()
|
||||
@@ -108,6 +99,8 @@ def create_pool(user):
|
||||
def move_pool_resource(user):
|
||||
owner = get_object_owner(user)
|
||||
if not owner.is_superuser:
|
||||
dec_limit(owner, 'domain_admins_limit')
|
||||
|
||||
for ooentry in user.objectaccess_set.all():
|
||||
if ooentry.is_owner:
|
||||
grant_access_to_object(owner, ooentry.content_object, True)
|
||||
|
||||
@@ -30,6 +30,10 @@ class ResellerWithPasswordForm(ResellerForm, UserWithPasswordForm):
|
||||
pass
|
||||
|
||||
class ResellerPoolForm(forms.Form):
|
||||
domain_admins_limit = forms.IntegerField(
|
||||
ugettext_noop("Max domain admins"),
|
||||
help_text=ugettext_noop("Maximum number of domain administrators that can be created by this user")
|
||||
)
|
||||
domains_limit = forms.IntegerField(ugettext_noop("Max domains"),
|
||||
help_text=ugettext_noop("Maximum number of domains that can be created by this user"))
|
||||
domain_aliases_limit = forms.IntegerField(ugettext_noop("Max domain aliases"),
|
||||
|
||||
@@ -6,6 +6,7 @@ from django.utils.translation import ugettext as _, ugettext_noop
|
||||
from modoboa.admin.models import User
|
||||
|
||||
reseller_limits_tpl = [
|
||||
"domain_admins_limit",
|
||||
"domains_limit",
|
||||
"domain_aliases_limit",
|
||||
"mailboxes_limit",
|
||||
|
||||
@@ -39,6 +39,6 @@ def reseller_actions(user, resid):
|
||||
"img" : static_url("pics/settings.png"),
|
||||
"title" : _("Edit limits allocated to this reseller"),
|
||||
"class" : "boxed",
|
||||
"rel" : "{handler:'iframe',size:{x:330,y:280}}"},
|
||||
"rel" : "{handler:'iframe',size:{x:330,y:310}}"},
|
||||
]
|
||||
return render_actions(actions)
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
<script type="text/javascript">
|
||||
window.addEvent("domready", function() {
|
||||
var cal = new Calendar({id_untildate: "Y-m-d"}, {tweak: {x: -100, y:-100}});
|
||||
var form = new Form();
|
||||
|
||||
register_error_callback("armform", function() {
|
||||
form.register_error_callback("armform", function() {
|
||||
new Calendar({id_untildate: "Y-m-d"}, {
|
||||
tweak: {x: -100, y:-100}
|
||||
});
|
||||
|
||||
@@ -8,6 +8,8 @@ from sievelib.managesieve import SUPPORTED_AUTH_MECHS
|
||||
baseurl = "sfilters"
|
||||
|
||||
def load():
|
||||
parameters.register_app(uparams_opts=dict(needs_mailbox=True))
|
||||
|
||||
parameters.register_admin("SERVER", type="string",
|
||||
deflt="127.0.0.1",
|
||||
help=_("Address of your MANAGESIEVE server"))
|
||||
|
||||
@@ -42,6 +42,8 @@ function initform() {
|
||||
}
|
||||
|
||||
$(document).addEvent("domready", function() {
|
||||
var form = new Form();
|
||||
|
||||
new Request.JSON({
|
||||
url: "{% url modoboa.extensions.sievefilters.views.get_templates 'condition' %}",
|
||||
onSuccess: function(response) {
|
||||
@@ -55,8 +57,8 @@ $(document).addEvent("domready", function() {
|
||||
initform();
|
||||
}
|
||||
}).get();
|
||||
register_error_callback("filterform", initform);
|
||||
register_extra_data_callback("filterform", function() {
|
||||
form.register_error_callback("filterform", initform);
|
||||
form.register_extra_data_callback("filterform", function() {
|
||||
return "conds=" + dc.fields_cnt + "&actions=" + da.fields_cnt;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,23 +5,25 @@
|
||||
<script src="{{ MEDIA_URL }}js/form.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).addEvent("domready", function() {
|
||||
register_success_callback("newfiltersset", function(response) {
|
||||
var name = response.url;
|
||||
var option = new Element("option", {value: name, html: name});
|
||||
var curfset = $(parent.document).getElementById("curfset");
|
||||
var form = new Form();
|
||||
|
||||
option.inject(curfset);
|
||||
curfset.set("value", name);
|
||||
if ($("id_active").checked) {
|
||||
curfset.getElements("option").each(function(item) {
|
||||
if (item.get("value") == name) {
|
||||
item.set("html", name + " (" + gettext("active") + ")");
|
||||
} else {
|
||||
item.set("html", item.get("value"));
|
||||
form.register_success_callback("newfiltersset", function(response) {
|
||||
var name = response.url;
|
||||
var option = new Element("option", {value: name, html: name});
|
||||
var curfset = $(parent.document).getElementById("curfset");
|
||||
|
||||
option.inject(curfset);
|
||||
curfset.set("value", name);
|
||||
if ($("id_active").checked) {
|
||||
curfset.getElements("option").each(function(item) {
|
||||
if (item.get("value") == name) {
|
||||
item.set("html", name + " (" + gettext("active") + ")");
|
||||
} else {
|
||||
item.set("html", item.get("value"));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
@@ -29,7 +31,8 @@ $(document).addEvent("domready", function() {
|
||||
{% block content %}
|
||||
<div class="title"><h1>{{ title }}</h1></div>
|
||||
{% if error %}<div id="error" class="error">{{ error }}</div>{% endif %}
|
||||
<form action="" method="POST" id="{{ fname }}" name="{{ fname }}">
|
||||
<form action="{% url modoboa.extensions.sievefilters.views.new_filters_set %}"
|
||||
method="POST" id="{{ fname }}" name="{{ fname }}">
|
||||
{% include "common/genericform.html" %}
|
||||
<div id="submit_container">
|
||||
<input type="submit" name="submit" value='{{ submit_label }}'/>
|
||||
|
||||
@@ -28,9 +28,9 @@ def index(request, tplname="sievefilters/index.html"):
|
||||
return _render_error(request, user_context={"error" : e})
|
||||
if active_script is None:
|
||||
active_script = ""
|
||||
default_script = scripts[0] if len(scripts) else ""
|
||||
default_script = "%s/" % scripts[0] if len(scripts) else ""
|
||||
else:
|
||||
default_script = active_script
|
||||
default_script = "%s/" % active_script
|
||||
return _render(request, tplname, {
|
||||
"active_script" : active_script,
|
||||
"default_script" : default_script,
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
import os
|
||||
import time
|
||||
import datetime
|
||||
import rrdtool
|
||||
from django.utils.translation import ugettext as _
|
||||
from modoboa.lib import parameters
|
||||
|
||||
@@ -77,6 +76,8 @@ class Grapher(object):
|
||||
self.img_rootdir = parameters.get_admin("IMG_ROOTDIR")
|
||||
|
||||
def process(self, target, suffix, start, end, tpl=traffic_avg_template):
|
||||
import rrdtool
|
||||
|
||||
rrdfile = "%s/%s.rrd" % (self.rrd_rootdir, target)
|
||||
if not os.path.exists(rrdfile):
|
||||
return
|
||||
|
||||
@@ -5,6 +5,8 @@ from modoboa.lib import events, parameters
|
||||
from modoboa.lib.webutils import static_url
|
||||
|
||||
def load():
|
||||
parameters.register_app(uparams_opts=dict(needs_mailbox=True))
|
||||
|
||||
parameters.register_admin("IMAP_SERVER", type="string",
|
||||
deflt="127.0.0.1",
|
||||
help=_("Address of your IMAP server"))
|
||||
@@ -30,7 +32,6 @@ def load():
|
||||
parameters.register_admin("MAX_ATTACHMENT_SIZE", type="int", deflt=2048,
|
||||
help=_("Maximum attachment size in bytes (or KB, MB, GB if specified)"))
|
||||
|
||||
|
||||
parameters.register_user("MESSAGES_PER_PAGE", type="int", deflt=40,
|
||||
label=_("Number of displayed emails per page"),
|
||||
help=_("Sets the maximum number of messages displayed in a page"))
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
<script src="{{ MEDIA_URL }}webmail/js/webmail.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
window.addEvent("domready", function() {
|
||||
var form = new Form();
|
||||
|
||||
init_folders_browsing();
|
||||
|
||||
$$("a[name=loadfolder]").addEvent("click", function(evt) {
|
||||
@@ -16,7 +18,7 @@
|
||||
this.getParent().addClass("selected");
|
||||
});
|
||||
|
||||
register_extra_data_callback("{{ fname }}", function() {
|
||||
form.register_extra_data_callback("{{ fname }}", function() {
|
||||
var result = "";
|
||||
$$("li[class*=selected]").each(function(item) {
|
||||
var atag = item.getFirst("a");
|
||||
@@ -30,7 +32,8 @@
|
||||
{% block content %}
|
||||
<div class="title"><h1>{{ title }}</h1></div>
|
||||
<div id="error" class="error">{{ error }}</div>
|
||||
<form action="" method="POST" id="{{ fname }}" name="{{ fname }}">
|
||||
<form action="{% url modoboa.extensions.webmail.views.newfolder %}"
|
||||
method="POST" id="{{ fname }}" name="{{ fname }}">
|
||||
<input type="hidden" name="oldname" value="{{ oldname }}" />
|
||||
{% include "common/genericform.html" %}
|
||||
<div class="row">
|
||||
|
||||
+2
-4
@@ -15,20 +15,18 @@ import re
|
||||
events = [
|
||||
"SuperAdminPromotion",
|
||||
|
||||
"CanCreateDomain",
|
||||
"CanCreate",
|
||||
|
||||
"CreateDomain",
|
||||
"DeleteDomain",
|
||||
|
||||
"CanCreateDomainAlias",
|
||||
"DomainAliasCreated",
|
||||
"DomainAliasDeleted",
|
||||
|
||||
"CanCreateMailbox",
|
||||
"CreateMailbox",
|
||||
"DeleteMailbox",
|
||||
"ModifyMailbox",
|
||||
|
||||
"CanCreateMailboxAlias",
|
||||
"MailboxAliasCreated",
|
||||
"MailboxAliasDeleted",
|
||||
|
||||
|
||||
+62
-15
@@ -27,6 +27,49 @@ class NotDefined(Exception):
|
||||
return "Application '%s' and/or parameter '%s' not defined" \
|
||||
% (self.app, self.name)
|
||||
|
||||
def register_app(app=None, aparams_opts=None, uparams_opts=None):
|
||||
"""Manually register an application
|
||||
|
||||
You don't need to call this function unless you want to provide
|
||||
specific options for your application parameters.
|
||||
|
||||
For example, you can indicate that user-level parameters are only
|
||||
accessible for users that own a mailbox.
|
||||
|
||||
:param app: the application's name
|
||||
:param aparams_opts: a dict containing options applicable to admin-level params
|
||||
:param uparams_opts: a dict containing options applicable to user-level params
|
||||
"""
|
||||
if app is None:
|
||||
app = __guess_extension()
|
||||
|
||||
if _params.has_key(app):
|
||||
return
|
||||
_params[app] = {}
|
||||
_params[app]['options'] = {}
|
||||
_params_order[app] = {}
|
||||
for lvl in _levels.keys():
|
||||
_params[app][lvl] = {}
|
||||
_params_order[app][lvl] = []
|
||||
|
||||
if aparams_opts:
|
||||
_params[app]['options']['A'] = aparams_opts
|
||||
if uparams_opts:
|
||||
_params[app]['options']['U'] = uparams_opts
|
||||
|
||||
def unregister_app(app):
|
||||
"""Unregister an application
|
||||
|
||||
All parameters associated to this application will also be
|
||||
removed.
|
||||
|
||||
:param app: the application's name (string)
|
||||
"""
|
||||
if not _params.has_key(app):
|
||||
return False
|
||||
del _params[app]
|
||||
return True
|
||||
|
||||
def __is_defined(app, level, name):
|
||||
if not level in _levels.keys() \
|
||||
or not app in _params.keys() \
|
||||
@@ -44,11 +87,8 @@ def __register(app, level, name, **kwargs):
|
||||
:param name: the parameter's name
|
||||
"""
|
||||
if not app in _params.keys():
|
||||
_params[app] = {}
|
||||
_params_order[app] = {}
|
||||
for lvl in _levels.keys():
|
||||
_params[app][lvl] = {}
|
||||
_params_order[app][lvl] = []
|
||||
register_app(app)
|
||||
|
||||
if not level in _levels.keys():
|
||||
return
|
||||
if _params[app][level].has_key(name):
|
||||
@@ -113,6 +153,10 @@ def update_admin(name, **kwargs):
|
||||
return __update(app, 'A', name, **kwargs)
|
||||
|
||||
def register_user(name, **kwargs):
|
||||
"""Register a new user-level parameter
|
||||
|
||||
:param name: the parameter's name
|
||||
"""
|
||||
if kwargs.has_key("app"):
|
||||
app = kwargs["app"]
|
||||
del kwargs["app"]
|
||||
@@ -120,12 +164,6 @@ def register_user(name, **kwargs):
|
||||
app = __guess_extension()
|
||||
return __register(app, 'U', name, **kwargs)
|
||||
|
||||
def unregister_app(app):
|
||||
if not _params.has_key(app):
|
||||
return False
|
||||
del _params[app]
|
||||
return True
|
||||
|
||||
def save_admin(name, value, app=None):
|
||||
from models import Parameter
|
||||
|
||||
@@ -139,7 +177,7 @@ def save_admin(name, value, app=None):
|
||||
p = Parameter()
|
||||
p.name = fullname
|
||||
if p.value != value:
|
||||
p.value = str(value).encode("string_escape").strip()
|
||||
p.value = value.encode("unicode_escape").strip()
|
||||
p.save()
|
||||
return True
|
||||
|
||||
@@ -157,7 +195,7 @@ def save_user(user, name, value, app=None):
|
||||
p.user = user
|
||||
p.name = fullname
|
||||
if p.value != value:
|
||||
p.value = str(value).encode("string_escape").strip()
|
||||
p.value = value.encode("unicode_escape").strip()
|
||||
p.save()
|
||||
return True
|
||||
|
||||
@@ -171,7 +209,7 @@ def get_admin(name, app=None):
|
||||
p = Parameter.objects.get(name="%s.%s" % (app, name))
|
||||
except Parameter.DoesNotExist:
|
||||
return _params[app]["A"][name]["deflt"]
|
||||
return p.value.decode("string_escape")
|
||||
return p.value.decode("unicode_escape")
|
||||
|
||||
def get_user(user, name, app=None):
|
||||
from models import UserParameter
|
||||
@@ -183,4 +221,13 @@ def get_user(user, name, app=None):
|
||||
p = UserParameter.objects.get(user=user, name="%s.%s" % (app, name))
|
||||
except UserParameter.DoesNotExist:
|
||||
return _params[app]["U"][name]["deflt"]
|
||||
return p.value.decode("string_escape")
|
||||
return p.value.decode("unicode_escape")
|
||||
|
||||
def get_app_option(lvl, name, dflt, app=None):
|
||||
if app is None:
|
||||
app = __guess_extension()
|
||||
if not lvl in _params[app]['options']:
|
||||
return dflt
|
||||
if not _params[app]['options'][lvl].has_key(name):
|
||||
return dflt
|
||||
return _params[app]['options'][lvl][name]
|
||||
|
||||
@@ -196,4 +196,12 @@ html[xmlns] .clearfix {
|
||||
#assignform #id_domains {
|
||||
width: 310px;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Domain admins list
|
||||
*/
|
||||
#domainadmins {
|
||||
width: 100%;
|
||||
height: 140px;
|
||||
}
|
||||
+3
-130
@@ -41,7 +41,7 @@ var Form = new Class({
|
||||
},
|
||||
|
||||
register_callback: function(category, name, callback) {
|
||||
if (this.callbacks[category][name] == undefined) {
|
||||
if (this.callbacks[category] == undefined) {
|
||||
return false;
|
||||
}
|
||||
this.callbacks[category][name] = callback;
|
||||
@@ -82,8 +82,8 @@ var Form = new Class({
|
||||
if (response.norefresh != undefined && response.norefresh == true) {
|
||||
$$("div[class=error]").set("html", response.respmsg);
|
||||
} else {
|
||||
var target = (this.options.target)
|
||||
? $(this.options.target) : $(document.body);
|
||||
var target = (this.options.resptarget)
|
||||
? $(this.options.resptarget) : $(document.body);
|
||||
|
||||
target.set("html", response.content);
|
||||
this.init_help_messages();
|
||||
@@ -124,130 +124,3 @@ var Form = new Class({
|
||||
}).send();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
var error_callbacks = {
|
||||
permform: function() {
|
||||
if ($defined($("id_domain"))) {
|
||||
$("id_domain").options[0].setProperty("selected", "selected");
|
||||
domadminform_init();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var success_callbacks = {
|
||||
|
||||
};
|
||||
|
||||
var extra_data_callbacks = {
|
||||
|
||||
};
|
||||
|
||||
function register_callback(hash, name, callback) {
|
||||
if ($defined(hash[name])) {
|
||||
return false;
|
||||
}
|
||||
hash[name] = callback;
|
||||
return true;
|
||||
}
|
||||
|
||||
function register_error_callback(name, callback) {
|
||||
return register_callback(error_callbacks, name, callback);
|
||||
}
|
||||
|
||||
function register_success_callback(name, callback) {
|
||||
return register_callback(success_callbacks, name, callback);
|
||||
}
|
||||
|
||||
function register_extra_data_callback(name, callback) {
|
||||
return register_callback(extra_data_callbacks, name, callback);
|
||||
}
|
||||
|
||||
function ajax_submit(event) {
|
||||
var form = event.target;
|
||||
var myid = form.get("id");
|
||||
var data = form.toQueryString();
|
||||
|
||||
event.stop();
|
||||
if ($defined(extra_data_callbacks[myid])) {
|
||||
if (data != "") {
|
||||
data += "&";
|
||||
}
|
||||
data += extra_data_callbacks[myid]();
|
||||
}
|
||||
|
||||
new Request.JSON({
|
||||
url: form.get("action"),
|
||||
method: form.get("method"),
|
||||
data: data,
|
||||
onSuccess: function(response) {
|
||||
if (response.status == "ko") {
|
||||
if (response.norefresh != undefined && response.norefresh == true) {
|
||||
$$("div[class=error]").set("html", response.respmsg);
|
||||
} else {
|
||||
var target = (resptarget != undefined)
|
||||
? $(resptarget) : $(document.body);
|
||||
|
||||
target.set("html", response.content);
|
||||
/*$(document.body).addEvent("submit", ajax_submit);*/
|
||||
if ($defined(error_callbacks[myid])) {
|
||||
error_callbacks[myid]();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ($defined(response.respmsg)) {
|
||||
if ($defined(parent.current_anchor)) {
|
||||
parent.current_anchor.loading_message = response.respmsg;
|
||||
parent.current_anchor.loading_color = "green";
|
||||
} else {
|
||||
parent.infobox.info(response.respmsg);
|
||||
parent.infobox.hide(1);
|
||||
}
|
||||
}
|
||||
if ($defined(response.ajaxnav)) {
|
||||
if ($defined(response.url)) {
|
||||
parent.current_anchor.baseurl(response.url, 1);
|
||||
}
|
||||
parent.current_anchor.update(1);
|
||||
} else if ($defined(response.url)) {
|
||||
parent.location.href = response.url;
|
||||
}
|
||||
if ($defined(success_callbacks[myid])) {
|
||||
success_callbacks[myid](response);
|
||||
}
|
||||
parent.SqueezeBox.close();
|
||||
},
|
||||
onFailure: function(xhr) {
|
||||
parent.document.getElement('iframe').setStyles({width: 800, height: 600});
|
||||
$(document.body).set("html", xhr.responseText);
|
||||
}
|
||||
}).send();
|
||||
}
|
||||
|
||||
function initform() {
|
||||
$(document.body)
|
||||
.removeEvents("submit")
|
||||
.addEvent("submit", ajax_submit);
|
||||
|
||||
$$("input[type!=submit]", "select").addEvents({
|
||||
focus: function(evt) {
|
||||
var helpdiv = $(evt.target.name + "_helptext");
|
||||
if (helpdiv) {
|
||||
var coords = evt.target.getCoordinates();
|
||||
helpdiv.setPosition({x: 10, y: coords['top'] + coords['height'] + 5});
|
||||
helpdiv.setStyle("display", "block");
|
||||
}
|
||||
},
|
||||
blur: function(evt) {
|
||||
var helpdiv = $(evt.target.name + "_helptext");
|
||||
if (helpdiv) {
|
||||
helpdiv.setStyle("display", "none");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*window.addEvent("domready", function() {
|
||||
initform();
|
||||
});*/
|
||||
|
||||
@@ -23,12 +23,12 @@ window.addEvent('domready', function() {
|
||||
$$("a[name=addperm]").addEvent("click", function(evt) {
|
||||
evt.stop();
|
||||
var sizes = current_sizes.split(" ");
|
||||
SqueezeBox.initialize({
|
||||
size: {x: sizes[0], y: sizes[1]},
|
||||
handler: 'iframe'
|
||||
});
|
||||
var addperm_url = evt.target.get("href") + "?role=" + current_role;
|
||||
SqueezeBox.open(addperm_url);
|
||||
|
||||
SqueezeBox.open(addperm_url, {
|
||||
size: {x: parseInt(sizes[0]), y: parseInt(sizes[1])},
|
||||
handler: 'iframe'
|
||||
});
|
||||
});
|
||||
|
||||
$$("a[name=delperms]").addEvent("click", function(evt) {
|
||||
|
||||
|
Before Width: | Height: | Size: 734 B After Width: | Height: | Size: 734 B |
@@ -8,7 +8,7 @@
|
||||
<script type="text/javascript" src="{{ MEDIA_URL }}js/Autocompleter.Request.js"></script>
|
||||
<script type="text/javascript">
|
||||
window.addEvent("domready", function() {
|
||||
var form = new Form({target: "formcontainer"});
|
||||
var form = new Form({resptarget: "formcontainer"});
|
||||
|
||||
$("createfrom").addEvent("change", function(evt) {
|
||||
var url = "";
|
||||
@@ -23,6 +23,7 @@ $("createfrom").addEvent("change", function(evt) {
|
||||
url = "{% url admin.views.domain_admin_promotion %}";
|
||||
styles = {height: 200};
|
||||
}
|
||||
var size = {y: styles.height};
|
||||
new Request.JSON.mdb({
|
||||
url: url,
|
||||
onSuccess: function(response) {
|
||||
@@ -37,6 +38,7 @@ $("createfrom").addEvent("change", function(evt) {
|
||||
});
|
||||
}
|
||||
$(parent.document).getElement('iframe').setStyles(styles);
|
||||
parent.SqueezeBox.resize(size);
|
||||
}
|
||||
}).get();
|
||||
});
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{% extends "layout_simple.html" %}
|
||||
{% load i18n %}
|
||||
{% block content %}
|
||||
<div class="title"><h1>{% trans "Administrators of" %} {{ domain.name }}</h1></div>
|
||||
<select id="domainadmins" multiple="multiple">
|
||||
{% for owner in domain.owners.all %}<option value="{{ owner.user.id }}">{{ owner.user.username }}</option>{% endfor %}
|
||||
</select>
|
||||
{% endblock %}
|
||||
@@ -1,6 +1,6 @@
|
||||
{% load i18n %}
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
{% load i18n %}
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head profile="http://www.w3.org/2005/10/profile">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
{% load i18n %}
|
||||
{% load admin_extras uprefs_extras libextras %}
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
{% load i18n admin_extras uprefs_extras libextras %}
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head profile="http://www.w3.org/2005/10/profile">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
{% load i18n %}
|
||||
{% load libextras %}
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
{% load i18n libextras %}
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head profile="http://www.w3.org/2005/10/profile">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
{% extends "layout_simple.html" %}
|
||||
{% block html_head %}
|
||||
<script src="{{ MEDIA_URL }}js/form.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
window.addEvent("domready", function() {
|
||||
var form = new Form();
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% load i18n %}
|
||||
|
||||
@@ -115,9 +115,7 @@ def migrate_mailboxes(domain, options):
|
||||
old_mboxes = pf_models.Mailbox.objects.using(options._from).filter(domain=domain.name)
|
||||
for old_mb in old_mboxes:
|
||||
new_mb = md_models.Mailbox()
|
||||
new_mb.name = old_mb.name
|
||||
new_mb.address = old_mb.local_part
|
||||
new_mb.password = old_mb.password
|
||||
new_mb.domain = domain
|
||||
new_mb.dates = migrate_dates(old_mb)
|
||||
if old_mb.quota:
|
||||
@@ -132,7 +130,7 @@ def migrate_mailboxes(domain, options):
|
||||
print "Error: cannot rename mailbox directory\n%s" % output
|
||||
sys.exit(1)
|
||||
|
||||
new_mb.save(using=options.to)
|
||||
new_mb.save(name=old_mb.name, password=old_mb.password, using=options.to)
|
||||
|
||||
|
||||
def migrate_domain(old_dom, options):
|
||||
@@ -161,29 +159,27 @@ def migrate_admins(options):
|
||||
print "Warning: skipping useless admin %s" % (old_admin.username)
|
||||
continue
|
||||
try:
|
||||
mb = md_models.Mailbox.objects.using(options.to).get(user__username=old_admin.username)
|
||||
except md_models.Mailbox.DoesNotExist:
|
||||
user = md_models.User.objects.using(options.to).get(username=old_admin.username)
|
||||
except md_models.User.DoesNotExist:
|
||||
try:
|
||||
domain = md_models.Domain.objects.using(options.to).get(name=domname)
|
||||
except md_models.Domain.DoesNotExist:
|
||||
print "Warning: skipping domain admin %s, domain not found" \
|
||||
% old_admin.username
|
||||
continue
|
||||
mb = md_models.Mailbox()
|
||||
mb.address = local_part
|
||||
mb.domain = domain
|
||||
mb.name = local_part
|
||||
mb.enabled = old_admin.active
|
||||
mb.password = old_admin.password
|
||||
mb.dates = migrate_dates(old_admin)
|
||||
mb.save(using=options.to)
|
||||
user = md_models.User()
|
||||
user.username = old_admin.username
|
||||
user.email = old_admin.username
|
||||
user.password = old_admin.password
|
||||
user.is_active = old_admin.active
|
||||
user.save(using=options.to)
|
||||
|
||||
mb.user.date_joined = old_admin.modified
|
||||
user.date_joined = old_admin.modified
|
||||
if creds.domain == "ALL":
|
||||
mb.user.is_superuser = True
|
||||
user.is_superuser = True
|
||||
else:
|
||||
mb.user.groups.add(dagroup)
|
||||
mb.save(using=options.to)
|
||||
user.groups.add(dagroup)
|
||||
user.save(using=options.to)
|
||||
|
||||
def do_migration(options):
|
||||
pf_domains = pf_models.Domain.objects.using(options._from).all()
|
||||
|
||||
@@ -95,6 +95,10 @@ def preferences(request):
|
||||
for app in apps:
|
||||
if not len(parameters._params[app]['U']):
|
||||
continue
|
||||
if parameters.get_app_option('U', 'needs_mailbox', False, app=app) \
|
||||
and not request.user.has_mailbox:
|
||||
continue
|
||||
|
||||
tmp = {"name" : app, "params" : []}
|
||||
for p in parameters._params_order[app]['U']:
|
||||
param_def = parameters._params[app]['U'][p]
|
||||
|
||||
Reference in New Issue
Block a user