mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
@@ -9,7 +9,7 @@ DEFAULT_LIMITS = collections.OrderedDict((
|
||||
("domains", {
|
||||
"content_type": "admin.domain", "label": _("Domains"),
|
||||
"help": _("Maximum number of domains this user can create"),
|
||||
"required_role": "Reselles"}),
|
||||
"required_role": "Resellers"}),
|
||||
("domain_aliases", {
|
||||
"content_type": "admin.domainalias", "label": _("Domain aliases"),
|
||||
"help": _("Maximum number of domain aliases this user can create"),
|
||||
|
||||
+5
-14
@@ -35,29 +35,22 @@ class ResourcePoolForm(forms.Form):
|
||||
if hasattr(self, "account"):
|
||||
self.load_from_user(self.account)
|
||||
|
||||
def check_limit_value(self, lname):
|
||||
fieldname = "{}_limit".format(lname)
|
||||
if self.cleaned_data[fieldname] < -1:
|
||||
raise forms.ValidationError(_("Invalid limit"))
|
||||
return self.cleaned_data[fieldname]
|
||||
|
||||
def clean(self):
|
||||
"""Ensure limit values are correct."""
|
||||
cleaned_data = super(ResourcePoolForm, self).clean()
|
||||
if self.errors:
|
||||
return cleaned_data
|
||||
for lname in self.fields.keys():
|
||||
if lname not in self._errors and cleaned_data[lname] < -1:
|
||||
if cleaned_data[lname] < -1:
|
||||
self.add_error(lname, _("Invalid limit"))
|
||||
return cleaned_data
|
||||
|
||||
def load_from_user(self, user):
|
||||
"""Load limit values from given user."""
|
||||
for fieldname in self.fields.keys():
|
||||
lname = fieldname.replace("_limit", "")
|
||||
self.fields[fieldname].initial = (
|
||||
user.objectlimit_set.get(name=lname).max_value)
|
||||
# The following lines will become useless in a near
|
||||
# future.
|
||||
if self.fields[fieldname].initial == -2:
|
||||
self.fields[fieldname].initial = parameters.get_admin(
|
||||
"DEFLT_{}_LIMIT".format(lname.upper()))
|
||||
|
||||
def allocate_from_user(self, limit, user):
|
||||
"""Allocate resource using an existing user.
|
||||
@@ -68,8 +61,6 @@ class ResourcePoolForm(forms.Form):
|
||||
pool.
|
||||
"""
|
||||
ol = user.objectlimit_set.get(name=limit.name)
|
||||
if ol.max_value == -2:
|
||||
raise BadLimitValue(_("Your resources are not initialized yet"))
|
||||
fieldname = "{}_limit".format(limit.name)
|
||||
newvalue = self.cleaned_data[fieldname]
|
||||
if newvalue == -1 and ol.max_value != -1:
|
||||
|
||||
@@ -4,12 +4,15 @@
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from modoboa.core import models as core_models
|
||||
|
||||
from . import utils
|
||||
|
||||
|
||||
@python_2_unicode_compatible
|
||||
class ObjectLimit(models.Model):
|
||||
"""Per-user limits on object creation."""
|
||||
|
||||
@@ -49,7 +52,7 @@ class ObjectLimit(models.Model):
|
||||
if self.max_value < 0:
|
||||
return -1
|
||||
if self.max_value == 0:
|
||||
return 0
|
||||
return 100
|
||||
return int(float(self.current_value) / self.max_value * 100)
|
||||
|
||||
@property
|
||||
@@ -60,3 +63,11 @@ class ObjectLimit(models.Model):
|
||||
def is_exceeded(self, count=1):
|
||||
"""Check if limit will be reached if we add count object(s)."""
|
||||
return self.current_value + 1 > self.max_value
|
||||
|
||||
def __str__(self):
|
||||
"""Display current usage."""
|
||||
if self.max_value == -2:
|
||||
return _("undefined")
|
||||
if self.max_value == -1:
|
||||
return _("unlimited")
|
||||
return "{}%".format(self.usage)
|
||||
|
||||
@@ -188,6 +188,9 @@ class ResellerTestCase(ResourceTestCase):
|
||||
self.client.login(username='reseller', password='toto')
|
||||
|
||||
def test_domains_limit(self):
|
||||
response = self.client.get(reverse("admin:domain_list"))
|
||||
self.assertContains(response, "Domains (0%)")
|
||||
self.assertContains(response, "Domain aliases (0%)")
|
||||
self._create_domain('domain1.tld')
|
||||
self._check_limit('domains', 1, 2)
|
||||
self._create_domain('domain2.tld')
|
||||
@@ -216,6 +219,11 @@ class ResellerTestCase(ResourceTestCase):
|
||||
self._check_limit('domain_aliases', 1, 2)
|
||||
|
||||
def test_domain_admins_limit(self):
|
||||
response = self.client.get(reverse("admin:identity_list"))
|
||||
self.assertContains(response, "Domain admins (0%)")
|
||||
self.assertContains(response, "Mailboxes (0%)")
|
||||
self.assertContains(response, "Mailbox aliases (0%)")
|
||||
|
||||
self._create_domain('domain.tld')
|
||||
self._create_account('admin1@domain.tld', role='DomainAdmins')
|
||||
self._check_limit('domain_admins', 1, 2)
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
from django.conf.urls import patterns
|
||||
|
||||
urlpatterns = patterns(
|
||||
'modoboa.limits.views',
|
||||
|
||||
)
|
||||
Reference in New Issue
Block a user