Merge with mainline

This commit is contained in:
Antoine Nguyen
2012-02-02 13:52:31 +01:00
31 changed files with 222 additions and 253 deletions
+23 -24
View File
@@ -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
View File
@@ -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")
+9
View File
@@ -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
+1
View File
@@ -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
View File
@@ -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
+8 -15
View File
@@ -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)
+4
View File
@@ -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"),
+1
View File
@@ -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}
});
+2
View File
@@ -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 }}'/>
+2 -2
View File
@@ -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,
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -15,20 +15,18 @@ import re
events = [
"SuperAdminPromotion",
"CanCreateDomain",
"CanCreate",
"CreateDomain",
"DeleteDomain",
"CanCreateDomainAlias",
"DomainAliasCreated",
"DomainAliasDeleted",
"CanCreateMailbox",
"CreateMailbox",
"DeleteMailbox",
"ModifyMailbox",
"CanCreateMailboxAlias",
"MailboxAliasCreated",
"MailboxAliasDeleted",
+62 -15
View File
@@ -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]
+8
View File
@@ -196,4 +196,12 @@ html[xmlns] .clearfix {
#assignform #id_domains {
width: 310px;
height: 200px;
}
/*
* Domain admins list
*/
#domainadmins {
width: 100%;
height: 140px;
}
+3 -130
View File
@@ -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();
});*/
+5 -5
View File
@@ -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

+3 -1
View File
@@ -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();
});
+8
View File
@@ -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 -1
View File
@@ -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 -2
View File
@@ -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 -2
View File
@@ -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" />
+5
View File
@@ -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 %}
+13 -17
View File
@@ -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()
+4
View File
@@ -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]