mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
Unit tests fixed.
This commit is contained in:
@@ -22,6 +22,8 @@ BASE_EVENTS = [
|
||||
"PasswordChange",
|
||||
"UserCanSetRole",
|
||||
|
||||
"InitialDataLoaded",
|
||||
|
||||
"UserMenuDisplay",
|
||||
"AdminMenuDisplay",
|
||||
"GetStaticContent",
|
||||
|
||||
@@ -1,27 +1,37 @@
|
||||
"""Factories for core application."""
|
||||
|
||||
import factory
|
||||
|
||||
from django.contrib.auth.models import Group
|
||||
|
||||
from . import models
|
||||
|
||||
|
||||
class PermissionFactory(factory.DjangoModelFactory):
|
||||
ABSTRACT_FACTORY = True
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
@factory.post_generation
|
||||
def set_permission(self, create, extracted, **kwargs):
|
||||
if not create:
|
||||
return
|
||||
self.post_create(models.User.objects.get(pk=1))
|
||||
self.post_create(models.User.objects.filter(is_superuser=True).first())
|
||||
|
||||
|
||||
class GroupFactory(factory.DjangoModelFactory):
|
||||
FACTORY_FOR = Group
|
||||
|
||||
class Meta:
|
||||
model = Group
|
||||
|
||||
name = 'DefaultGroup'
|
||||
|
||||
|
||||
class UserFactory(PermissionFactory):
|
||||
FACTORY_FOR = models.User
|
||||
FACTORY_DJANGO_GET_OR_CREATE = ("username", )
|
||||
|
||||
class Meta:
|
||||
model = models.User
|
||||
django_get_or_create = ("username", )
|
||||
|
||||
email = factory.LazyAttribute(lambda a: a.username)
|
||||
password = '{PLAIN}toto'
|
||||
|
||||
@@ -25,15 +25,17 @@ class Command(BaseCommand, CloseConnectionMixin):
|
||||
def handle(self, *args, **options):
|
||||
"""Command entry point."""
|
||||
|
||||
if not User.objects.filter(pk=1, username="admin").exists():
|
||||
if not User.objects.filter(is_superuser=True).count():
|
||||
admin = User(username="admin", is_superuser=True)
|
||||
admin.set_password("password")
|
||||
admin.save()
|
||||
ObjectAccess.objects.create(
|
||||
user=admin, content_object=admin, is_owner=True)
|
||||
|
||||
superadmin = User.objects.filter(is_superuser=True).first()
|
||||
groups = PERMISSIONS.keys() + [
|
||||
role[0] for role in events.raiseQueryEvent("GetExtraRoles")
|
||||
role[0] for role
|
||||
in events.raiseQueryEvent("GetExtraRoles", superadmin)
|
||||
]
|
||||
for groupname in groups:
|
||||
group, created = Group.objects.get_or_create(name=groupname)
|
||||
@@ -49,3 +51,4 @@ class Command(BaseCommand, CloseConnectionMixin):
|
||||
for extname in exts_pool.extensions.keys():
|
||||
extension = exts_pool.get_extension(extname)
|
||||
extension.load_initial_data()
|
||||
events.raiseEvent("InitialDataLoaded", extname)
|
||||
|
||||
@@ -8,15 +8,21 @@ from . import models
|
||||
|
||||
|
||||
class DomainFactory(PermissionFactory):
|
||||
FACTORY_FOR = models.Domain
|
||||
FACTORY_DJANGO_GET_OR_CREATE = ("name", )
|
||||
|
||||
"""Factory to create Domains."""
|
||||
|
||||
class Meta:
|
||||
model = models.Domain
|
||||
django_get_or_create = ("name", )
|
||||
|
||||
quota = 10
|
||||
enabled = True
|
||||
|
||||
|
||||
class MailboxFactory(PermissionFactory):
|
||||
FACTORY_FOR = models.Mailbox
|
||||
|
||||
class Meta:
|
||||
model = models.Mailbox
|
||||
|
||||
domain = factory.SubFactory(DomainFactory)
|
||||
user = factory.SubFactory(UserFactory)
|
||||
@@ -25,7 +31,9 @@ class MailboxFactory(PermissionFactory):
|
||||
|
||||
|
||||
class AliasFactory(PermissionFactory):
|
||||
FACTORY_FOR = models.Alias
|
||||
|
||||
class Meta:
|
||||
model = models.Alias
|
||||
|
||||
enabled = True
|
||||
|
||||
@@ -35,7 +43,7 @@ def populate_database():
|
||||
|
||||
2 domains, 1 domain admin, 2 users
|
||||
"""
|
||||
dom = DomainFactory.create(name="test.com")
|
||||
dom = DomainFactory(name="test.com")
|
||||
admin = UserFactory(
|
||||
username="admin@test.com", groups=('DomainAdmins', ),
|
||||
password='{PLAIN}toto'
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
"""Forms related to accounts management."""
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from django import forms
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import QueryDict
|
||||
@@ -49,8 +51,11 @@ class AccountFormGeneral(forms.ModelForm):
|
||||
|
||||
def __init__(self, user, *args, **kwargs):
|
||||
super(AccountFormGeneral, self).__init__(*args, **kwargs)
|
||||
self.fields.keyOrder = ['role', 'username', 'first_name', 'last_name',
|
||||
'password1', 'password2', 'is_active']
|
||||
self.fields = OrderedDict(
|
||||
(key, self.fields[key]) for key in
|
||||
['role', 'username', 'first_name', 'last_name', 'password1',
|
||||
'password2', 'is_active']
|
||||
)
|
||||
self.fields["is_active"].label = _("Enabled")
|
||||
self.user = user
|
||||
if user.group == "DomainAdmins":
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
"""Forms related to aliases management."""
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from django import forms
|
||||
from django.http import QueryDict
|
||||
from django.utils.translation import ugettext as _, ugettext_lazy
|
||||
@@ -39,7 +41,10 @@ class AliasForm(forms.ModelForm, DynamicForm):
|
||||
def __init__(self, user, *args, **kwargs):
|
||||
self.user = user
|
||||
super(AliasForm, self).__init__(*args, **kwargs)
|
||||
self.fields.keyOrder = ['email', 'recipients', 'enabled']
|
||||
self.fields = OrderedDict(
|
||||
(key, self.fields[key]) for key in
|
||||
['email', 'recipients', 'enabled']
|
||||
)
|
||||
|
||||
if len(args) and isinstance(args[0], QueryDict):
|
||||
if "instance" in kwargs:
|
||||
|
||||
@@ -9,7 +9,6 @@ from modoboa.core.management.commands import CloseConnectionMixin
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.sysutils import exec_cmd
|
||||
from modoboa.lib.exceptions import InternalError
|
||||
from modoboa.extensions.admin import AdminConsole
|
||||
from modoboa.extensions.admin.models import MailboxOperation
|
||||
|
||||
|
||||
@@ -75,7 +74,6 @@ class Command(BaseCommand, CloseConnectionMixin):
|
||||
return True
|
||||
|
||||
def handle(self, *args, **options):
|
||||
AdminConsole().load()
|
||||
try:
|
||||
if parameters.get_admin("HANDLE_MAILBOXES") == 'no':
|
||||
return
|
||||
|
||||
@@ -56,7 +56,7 @@ PERMISSIONS = {
|
||||
["admin", "alias", "delete_alias"],
|
||||
["admin", "mailbox", "view_mailboxes"],
|
||||
["admin", "alias", "view_aliases"],
|
||||
["admin", "domainalias", "view_domainaliases"],
|
||||
["admin", "domainalias", "view_domaliases"],
|
||||
["admin", "domainalias", "add_domainalias"],
|
||||
["admin", "domainalias", "change_domainalias"],
|
||||
["admin", "domainalias", "delete_domainalias"]
|
||||
|
||||
@@ -12,6 +12,29 @@ from .lib import manual_learning_enabled
|
||||
from .models import Policy, Users
|
||||
|
||||
|
||||
def create_relay_domains_records():
|
||||
"""Create records for existing relay domains."""
|
||||
from modoboa.extensions.postfix_relay_domains.models import RelayDomain
|
||||
|
||||
for dom in RelayDomain.objects.all():
|
||||
name = "@{0}".format(dom.name)
|
||||
policy, created = Policy.objects.get_or_create(policy_name=name[:32])
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
for rdalias in dom.relaydomainalias_set.all():
|
||||
name = "@{0}".format(rdalias.name)
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
|
||||
|
||||
@events.observe("InitialDataLoaded")
|
||||
def load_relay_domains_dependant_data(name):
|
||||
"""Load relay domains dependant data."""
|
||||
if name != "postfix_relay_domains":
|
||||
return
|
||||
create_relay_domains_records()
|
||||
|
||||
|
||||
@events.observe("UserMenuDisplay")
|
||||
def menu(target, user):
|
||||
if target == "top_menu":
|
||||
|
||||
@@ -13,7 +13,6 @@ from modoboa.lib import parameters
|
||||
from modoboa.lib.email_utils import sendmail_simple
|
||||
from modoboa.extensions.admin.models import Domain
|
||||
|
||||
from modoboa.extensions.amavis import Amavis
|
||||
from modoboa.extensions.amavis.models import (
|
||||
Msgrcpt
|
||||
)
|
||||
@@ -42,7 +41,6 @@ class Command(BaseCommand, CloseConnectionMixin):
|
||||
if options["baseurl"] is None:
|
||||
raise CommandError("You must provide the --baseurl option")
|
||||
self.options = options
|
||||
Amavis().load()
|
||||
self.notify_admins_pending_requests()
|
||||
|
||||
def send_pr_notification(self, rcpt, reqs):
|
||||
|
||||
@@ -7,7 +7,6 @@ from optparse import make_option
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from modoboa.core.management.commands import CloseConnectionMixin
|
||||
from modoboa.extensions.amavis import Amavis
|
||||
from modoboa.extensions.amavis.models import (
|
||||
Msgrcpt, Msgs, Maddr
|
||||
)
|
||||
@@ -42,8 +41,6 @@ class Command(BaseCommand, CloseConnectionMixin):
|
||||
l.addHandler(logging.StreamHandler())
|
||||
self.verbose = options["verbose"]
|
||||
|
||||
Amavis().load()
|
||||
|
||||
max_messages_age = int(parameters.get_admin("MAX_MESSAGES_AGE",
|
||||
app="amavis"))
|
||||
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
from modoboa.core.extensions import exts_pool
|
||||
|
||||
|
||||
def load_initial_data(apps, schema_editor):
|
||||
"""Load initial data."""
|
||||
Domain = apps.get_model("admin", "Domain")
|
||||
Policy = apps.get_model("amavis", "Policy")
|
||||
Users = apps.get_model("amavis", "Users")
|
||||
|
||||
for dom in Domain.objects.all():
|
||||
name = "@{0}".format(dom.name)
|
||||
policy, created = Policy.objects.get_or_create(policy_name=name[:32])
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
for dalias in dom.domainalias_set.all():
|
||||
name = "@{0}".format(dalias.name)
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
|
||||
if not exts_pool.is_extension_installed(
|
||||
"modoboa.extensions.postfix_relay_domains"):
|
||||
return
|
||||
|
||||
RelayDomain = apps.get_model("postfix_relay_domains", "RelayDomain")
|
||||
|
||||
for dom in RelayDomain.objects.all():
|
||||
name = "@{0}".format(dom.name)
|
||||
policy, created = Policy.objects.get_or_create(policy_name=name[:32])
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
for rdalias in dom.relaydomainalias_set.all():
|
||||
name = "@{0}".format(rdalias.name)
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('amavis', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(load_initial_data)
|
||||
]
|
||||
@@ -8,13 +8,16 @@ Provides:
|
||||
* Per-domain settings
|
||||
|
||||
"""
|
||||
import sys
|
||||
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from modoboa.core.extensions import ModoExtension, exts_pool
|
||||
from modoboa.extensions.admin.models import Domain
|
||||
from modoboa.lib import parameters
|
||||
|
||||
from . import general_callbacks
|
||||
from .models import Policy, Users
|
||||
|
||||
|
||||
class Amavis(ModoExtension):
|
||||
name = "amavis"
|
||||
@@ -29,6 +32,23 @@ class Amavis(ModoExtension):
|
||||
|
||||
parameters.register(ParametersForm, "Amavis")
|
||||
parameters.register(UserSettings, ugettext_lazy("Quarantine"))
|
||||
from modoboa.extensions.amavis import general_callbacks
|
||||
|
||||
def load_initial_data(self):
|
||||
"""Create records for existing domains and co."""
|
||||
for dom in Domain.objects.all():
|
||||
name = "@{0}".format(dom.name)
|
||||
policy, created = Policy.objects.get_or_create(
|
||||
policy_name=name[:32])
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
for dalias in dom.domainalias_set.all():
|
||||
name = "@{0}".format(dalias.name)
|
||||
Users.objects.get_or_create(
|
||||
email=name, fullname=name, priority=7, policy=policy)
|
||||
|
||||
if not exts_pool.is_extension_installed(
|
||||
"modoboa.extensions.postfix_relay_domains"):
|
||||
return
|
||||
general_callbacks.create_relay_domains_records()
|
||||
|
||||
exts_pool.register_extension(Amavis)
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
from modoboa.extensions.limits.models import LimitTemplates
|
||||
|
||||
|
||||
def load_initial_data(apps, schema_editor):
|
||||
"""Load initial data."""
|
||||
User = apps.get_model("core", "User")
|
||||
LimitsPool = apps.get_model("limits", "LimitsPool")
|
||||
Limit = apps.get_model("limits", "Limit")
|
||||
|
||||
for user in User.objects.filter(groups__name="DomainAdmins"):
|
||||
pool, created = LimitsPool.objects.get_or_create(user=user)
|
||||
for tpl in LimitTemplates().templates:
|
||||
Limit.objects.create(name=tpl[0], pool=pool, maxvalue=0)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('limits', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(load_initial_data)
|
||||
]
|
||||
@@ -7,8 +7,9 @@ The *limits* extension
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from modoboa.core.extensions import ModoExtension, exts_pool
|
||||
from modoboa.core.models import User
|
||||
from modoboa.lib import events, parameters
|
||||
from .models import LimitsPool, Limit
|
||||
from .models import LimitTemplates, LimitsPool, Limit
|
||||
|
||||
|
||||
EVENTS = [
|
||||
@@ -34,10 +35,10 @@ class Limits(ModoExtension):
|
||||
from modoboa.extensions.limits import general_callbacks
|
||||
|
||||
def load_initial_data(self):
|
||||
"""Complete existing pools with new limits."""
|
||||
new_limits = ["relay_domains_limit", "relay_domain_aliases_limit"]
|
||||
for pool in LimitsPool.objects.all():
|
||||
for lname in new_limits:
|
||||
Limit.objects.get_or_create(name=lname, pool=pool, maxvalue=0)
|
||||
"""Create pools for existing accounts."""
|
||||
for user in User.objects.filter(groups__name="DomainAdmins"):
|
||||
pool, created = LimitsPool.objects.get_or_create(user=user)
|
||||
for tpl in LimitTemplates().templates:
|
||||
Limit.objects.get_or_create(name=tpl[0], pool=pool, maxvalue=0)
|
||||
|
||||
exts_pool.register_extension(Limits)
|
||||
|
||||
@@ -10,15 +10,14 @@ from modoboa.extensions.admin.factories import (
|
||||
from modoboa.extensions.admin.models import Alias, Domain
|
||||
from modoboa.extensions.limits.models import LimitTemplates
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.tests import ExtTestCase
|
||||
from modoboa.lib.tests import ModoTestCase
|
||||
|
||||
|
||||
class PermissionsTestCase(ExtTestCase):
|
||||
class PermissionsTestCase(ModoTestCase):
|
||||
fixtures = ["initial_users.json"]
|
||||
|
||||
def setUp(self):
|
||||
super(PermissionsTestCase, self).setUp()
|
||||
self.activate_extensions('limits')
|
||||
populate_database()
|
||||
|
||||
def test_domainadmin_deletes_reseller(self):
|
||||
@@ -42,7 +41,7 @@ class PermissionsTestCase(ExtTestCase):
|
||||
self.assertEqual(resp, "Permission denied")
|
||||
|
||||
|
||||
class ResourceTestCase(ExtTestCase):
|
||||
class ResourceTestCase(ModoTestCase):
|
||||
fixtures = ["initial_users.json"]
|
||||
|
||||
def setUp(self):
|
||||
@@ -52,7 +51,6 @@ class ResourceTestCase(ExtTestCase):
|
||||
provided by 'postfix_relay_domains' are properly received.
|
||||
"""
|
||||
super(ResourceTestCase, self).setUp()
|
||||
self.activate_extensions('limits')
|
||||
for tpl in LimitTemplates().templates:
|
||||
parameters.save_admin('DEFLT_%s' % tpl[0].upper(), 2, app='limits')
|
||||
populate_database()
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
"""Custom forms."""
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
from django import forms
|
||||
from django.utils import timezone
|
||||
from django.utils.translation import ugettext as _, ugettext_lazy
|
||||
@@ -44,9 +46,10 @@ class ARmessageForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(ARmessageForm, self).__init__(*args, **kwargs)
|
||||
self.fields.keyOrder = [
|
||||
'subject', 'content', 'fromdate', 'untildate', 'enabled'
|
||||
]
|
||||
self.fields = OrderedDict(
|
||||
(key, self.fields[key]) for key in
|
||||
['subject', 'content', 'fromdate', 'untildate', 'enabled']
|
||||
)
|
||||
if 'instance' in kwargs and kwargs['instance'] is not None:
|
||||
self.fields['fromdate'].initial = \
|
||||
kwargs['instance'].fromdate.replace(second=0, microsecond=0)
|
||||
|
||||
@@ -120,6 +120,7 @@ def extra_mailform_fields(form_name, mailbox=None):
|
||||
('autoreply', YesNoField(
|
||||
label=ugettext_lazy("Enable auto-reply"),
|
||||
initial="yes" if status else "no",
|
||||
required=False,
|
||||
help_text=ugettext_lazy("Enable or disable Postfix auto-reply")
|
||||
))
|
||||
]
|
||||
|
||||
@@ -10,7 +10,6 @@ from modoboa.core.management.commands import CloseConnectionMixin
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.email_utils import split_mailbox, sendmail_simple
|
||||
from modoboa.extensions.admin.models import Mailbox
|
||||
from modoboa.extensions.postfix_autoreply import PostfixAutoreply
|
||||
from modoboa.extensions.postfix_autoreply.models import ARmessage, ARhistoric
|
||||
|
||||
|
||||
@@ -25,7 +24,6 @@ def send_autoreply(sender, mailbox, armessage):
|
||||
|
||||
try:
|
||||
lastar = ARhistoric.objects.get(armessage=armessage.id, sender=sender)
|
||||
PostfixAutoreply().load()
|
||||
timeout = parameters.get_admin("AUTOREPLIES_TIMEOUT",
|
||||
app="postfix_autoreply")
|
||||
delta = datetime.timedelta(seconds=int(timeout))
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
from modoboa.extensions.postfix_autoreply.general_callbacks import (
|
||||
onDomainCreated, onMailboxCreated
|
||||
)
|
||||
|
||||
|
||||
def load_initial_data(apps, schema_editor):
|
||||
"""Load initial data."""
|
||||
Domain = apps.get_model("admin", "Domain")
|
||||
Transport = apps.get_model("postfix_autoreply", "Transport")
|
||||
Alias = apps.get_model("postfix_autoreply", "Alias")
|
||||
|
||||
for dom in Domain.objects.all():
|
||||
try:
|
||||
Transport.objects.get(domain="autoreply.%s" % dom.name)
|
||||
except Transport.DoesNotExist:
|
||||
onDomainCreated(None, dom)
|
||||
else:
|
||||
continue
|
||||
|
||||
for mb in dom.mailbox_set.all():
|
||||
try:
|
||||
Alias.objects.get(full_address=mb.full_address)
|
||||
except Alias.DoesNotExist:
|
||||
onMailboxCreated(None, mb)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('postfix_autoreply', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(load_initial_data)
|
||||
]
|
||||
@@ -10,7 +10,10 @@ functionality into Postfix.
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from modoboa.core.extensions import ModoExtension, exts_pool
|
||||
from modoboa.extensions.admin.models import Domain
|
||||
from modoboa.lib import events, parameters
|
||||
from . import general_callbacks
|
||||
from .models import Transport, Alias
|
||||
|
||||
|
||||
class PostfixAutoreply(ModoExtension):
|
||||
@@ -31,7 +34,22 @@ class PostfixAutoreply(ModoExtension):
|
||||
)
|
||||
parameters.register(
|
||||
ParametersForm, ugettext_lazy("Automatic replies"))
|
||||
from modoboa.extensions.postfix_autoreply import general_callbacks
|
||||
|
||||
def load_initial_data(self):
|
||||
"""Create records for existing domains."""
|
||||
for dom in Domain.objects.all():
|
||||
try:
|
||||
Transport.objects.get(domain="autoreply.%s" % dom.name)
|
||||
except Transport.DoesNotExist:
|
||||
general_callbacks.onDomainCreated(None, dom)
|
||||
else:
|
||||
continue
|
||||
|
||||
for mb in dom.mailbox_set.all():
|
||||
try:
|
||||
Alias.objects.get(full_address=mb.full_address)
|
||||
except Alias.DoesNotExist:
|
||||
general_callbacks.onMailboxCreated(None, mb)
|
||||
|
||||
exts_pool.register_extension(PostfixAutoreply)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from django.core.urlresolvers import reverse
|
||||
from modoboa.core.models import User
|
||||
from modoboa.lib.tests import ExtTestCase
|
||||
from modoboa.lib.tests import ModoTestCase
|
||||
from modoboa.extensions.admin import factories
|
||||
from modoboa.extensions.admin.models import (
|
||||
Domain
|
||||
@@ -10,12 +10,11 @@ from modoboa.extensions.postfix_autoreply.models import (
|
||||
)
|
||||
|
||||
|
||||
class EventsTestCase(ExtTestCase):
|
||||
class EventsTestCase(ModoTestCase):
|
||||
fixtures = ['initial_users.json']
|
||||
|
||||
def setUp(self):
|
||||
super(EventsTestCase, self).setUp()
|
||||
self.activate_extensions('postfix_autoreply')
|
||||
factories.populate_database()
|
||||
|
||||
def test_domain_created_event(self):
|
||||
@@ -100,12 +99,11 @@ class EventsTestCase(ExtTestCase):
|
||||
al = Alias.objects.get(full_address='leon@test.com')
|
||||
|
||||
|
||||
class FormTestCase(ExtTestCase):
|
||||
class FormTestCase(ModoTestCase):
|
||||
fixtures = ['initial_users.json']
|
||||
|
||||
def setUp(self):
|
||||
super(FormTestCase, self).setUp()
|
||||
self.activate_extensions('postfix_autoreply')
|
||||
factories.populate_database()
|
||||
|
||||
# def test_set_autoreply(self):
|
||||
|
||||
@@ -30,7 +30,7 @@ PERMISSIONS = {
|
||||
@events.observe("GetExtraRolePermissions")
|
||||
def extra_permissions(rolename):
|
||||
"""Return extra permissions for Resellers."""
|
||||
if not exts_pool.is_extension_installed("modoboa.extensions.limit"):
|
||||
if not exts_pool.is_extension_installed("modoboa.extensions.limits"):
|
||||
return []
|
||||
return PERMISSIONS.get(rolename, [])
|
||||
|
||||
|
||||
@@ -2,10 +2,28 @@
|
||||
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from .models import RelayDomainAlias
|
||||
from modoboa.extensions.limits.lib import inc_limit_usage, dec_limit_usage
|
||||
from modoboa.extensions.limits.models import LimitsPool, Limit
|
||||
from modoboa.lib import events
|
||||
from modoboa.lib.permissions import get_object_owner
|
||||
from .models import RelayDomainAlias
|
||||
|
||||
|
||||
def create_new_limits():
|
||||
"""Create relay domains limits."""
|
||||
|
||||
new_limits = ["relay_domains_limit", "relay_domain_aliases_limit"]
|
||||
for pool in LimitsPool.objects.all():
|
||||
for lname in new_limits:
|
||||
Limit.objects.get_or_create(name=lname, pool=pool, maxvalue=0)
|
||||
|
||||
|
||||
@events.observe("InitialDataLoaded")
|
||||
def load_limits_dependant_data(name):
|
||||
"""Complete existing pools with new limits."""
|
||||
if name != "limits":
|
||||
return
|
||||
create_new_limits()
|
||||
|
||||
|
||||
@events.observe('GetExtraParameters')
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
def load_initial_data(apps, schema_editor):
|
||||
"""Load initial data."""
|
||||
Service = apps.get_model("postfix_relay_domains", "Service")
|
||||
for service_name in ['relay', 'smtp']:
|
||||
Service.objects.get_or_create(name=service_name)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('postfix_relay_domains', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(load_initial_data)
|
||||
]
|
||||
@@ -41,4 +41,15 @@ class PostfixRelayDomains(ModoExtension):
|
||||
if exts_pool.is_extension_installed("modoboa.extensions.amavis"):
|
||||
import amavis_callbacks
|
||||
|
||||
def load_initial_data(self):
|
||||
"""Create extension data."""
|
||||
from .models import Service
|
||||
for service_name in ['relay', 'smtp']:
|
||||
Service.objects.get_or_create(name=service_name)
|
||||
|
||||
if not exts_pool.is_extension_installed("modoboa.extensions.limits"):
|
||||
return
|
||||
from .limits_callbacks import create_new_limits
|
||||
create_new_limits()
|
||||
|
||||
exts_pool.register_extension(PostfixRelayDomains)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
from modoboa.core.factories import UserFactory
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.tests import ExtTestCase
|
||||
from modoboa.extensions.admin import factories
|
||||
from modoboa.extensions.limits.tests import ResourceTestCase
|
||||
from .models import RelayDomain, RelayDomainAlias, Service
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.tests import ModoTestCase
|
||||
from .factories import RelayDomainFactory, RelayDomainAliasFactory
|
||||
from .models import RelayDomain, RelayDomainAlias, Service
|
||||
|
||||
|
||||
class Operations(object):
|
||||
@@ -47,12 +47,11 @@ class Operations(object):
|
||||
self.assertEqual(l.maxvalue, maxvalue)
|
||||
|
||||
|
||||
class RelayDomainsTestCase(ExtTestCase, Operations):
|
||||
class RelayDomainsTestCase(ModoTestCase, Operations):
|
||||
fixtures = ['initial_users.json']
|
||||
|
||||
def setUp(self):
|
||||
super(RelayDomainsTestCase, self).setUp()
|
||||
self.activate_extensions('postfix_relay_domains')
|
||||
factories.populate_database()
|
||||
self.rdom = RelayDomainFactory(name='relaydomain.tld')
|
||||
RelayDomainAliasFactory(name='relaydomainalias.tld', target=self.rdom)
|
||||
@@ -162,14 +161,12 @@ class RelayDomainsTestCase(ExtTestCase, Operations):
|
||||
RelayDomain.objects.get(name='relaydomainalias.tld')
|
||||
|
||||
|
||||
class LimitsTestCase(ExtTestCase, Operations):
|
||||
fixtures = ['initial_users.json']
|
||||
class LimitsTestCase(ModoTestCase, Operations):
|
||||
|
||||
def setUp(self):
|
||||
super(LimitsTestCase, self).setUp()
|
||||
from modoboa.extensions.limits.models import LimitTemplates
|
||||
|
||||
self.activate_extensions('limits', 'postfix_relay_domains')
|
||||
for tpl in LimitTemplates().templates:
|
||||
parameters.save_admin('DEFLT_%s' % tpl[0].upper(), 2, app='limits')
|
||||
self.user = UserFactory.create(
|
||||
|
||||
@@ -11,21 +11,27 @@ from . import models
|
||||
|
||||
|
||||
class UserCalendarFactory(factory.DjangoModelFactory):
|
||||
FACTORY_FOR = models.UserCalendar
|
||||
|
||||
class Meta:
|
||||
model = models.UserCalendar
|
||||
|
||||
name = factory.Sequence(lambda n: 'User calendar %s' % n)
|
||||
mailbox = factory.SubFactory(MailboxFactory)
|
||||
|
||||
|
||||
class SharedCalendarFactory(factory.DjangoModelFactory):
|
||||
FACTORY_FOR = models.SharedCalendar
|
||||
|
||||
class Meta:
|
||||
model = models.SharedCalendar
|
||||
|
||||
name = factory.Sequence(lambda n: 'Shared calendar %s' % n)
|
||||
domain = factory.SubFactory(DomainFactory)
|
||||
|
||||
|
||||
class AccessRuleFactory(factory.DjangoModelFactory):
|
||||
FACTORY_FOR = models.AccessRule
|
||||
|
||||
class Meta:
|
||||
model = models.AccessRule
|
||||
|
||||
mailbox = factory.SubFactory(MailboxFactory)
|
||||
calendar = factory.SubFactory(UserCalendarFactory)
|
||||
|
||||
@@ -7,8 +7,7 @@ from django.core.management.base import BaseCommand
|
||||
from modoboa.core.management.commands import CloseConnectionMixin
|
||||
from modoboa.core.models import User
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.extensions.admin import Domain
|
||||
from modoboa.extensions.radicale import Radicale
|
||||
from modoboa.extensions.admin.models import Domain
|
||||
from modoboa.extensions.radicale.models import (
|
||||
AccessRule
|
||||
)
|
||||
@@ -102,9 +101,7 @@ permission = %s
|
||||
self._cfgfile.close()
|
||||
|
||||
def handle(self, *args, **options):
|
||||
"""Command entry point.
|
||||
"""
|
||||
Radicale().load()
|
||||
"""Command entry point."""
|
||||
path = parameters.get_admin("RIGHTS_FILE_PATH", app="radicale")
|
||||
if not options["force"]:
|
||||
try:
|
||||
|
||||
@@ -10,7 +10,7 @@ from django.core.urlresolvers import reverse
|
||||
from django.core import management
|
||||
|
||||
from modoboa.lib import parameters
|
||||
from modoboa.lib.tests import ExtTestCase
|
||||
from modoboa.lib.tests import ModoTestCase
|
||||
from modoboa.extensions.admin.factories import (
|
||||
MailboxFactory, populate_database
|
||||
)
|
||||
@@ -24,12 +24,10 @@ from .factories import (
|
||||
from .models import UserCalendar, SharedCalendar, AccessRule
|
||||
|
||||
|
||||
class UserCalendarTestCase(ExtTestCase):
|
||||
fixtures = ["initial_users.json"]
|
||||
class UserCalendarTestCase(ModoTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(UserCalendarTestCase, self).setUp()
|
||||
self.activate_extensions('radicale')
|
||||
populate_database()
|
||||
|
||||
def assertRuleEqual(self, calname, username, read=False, write=False):
|
||||
@@ -137,12 +135,11 @@ class UserCalendarTestCase(ExtTestCase):
|
||||
reverse("radicale:user_calendar_add"), values, status=400)
|
||||
|
||||
|
||||
class SharedCalendarTestCase(ExtTestCase):
|
||||
class SharedCalendarTestCase(ModoTestCase):
|
||||
fixtures = ["initial_users.json"]
|
||||
|
||||
def setUp(self):
|
||||
super(SharedCalendarTestCase, self).setUp()
|
||||
self.activate_extensions('radicale')
|
||||
populate_database()
|
||||
|
||||
def test_add_calendar(self):
|
||||
@@ -205,12 +202,11 @@ class SharedCalendarTestCase(ExtTestCase):
|
||||
)
|
||||
|
||||
|
||||
class AccessRuleTestCase(ExtTestCase):
|
||||
class AccessRuleTestCase(ModoTestCase):
|
||||
fixtures = ["initial_users.json"]
|
||||
|
||||
def setUp(self):
|
||||
super(AccessRuleTestCase, self).setUp()
|
||||
self.activate_extensions('radicale')
|
||||
populate_database()
|
||||
self.rights_file_path = tempfile.mktemp()
|
||||
parameters.save_admin(
|
||||
|
||||
@@ -31,7 +31,6 @@ from django.core.management.base import BaseCommand
|
||||
from modoboa.core.extensions import exts_pool
|
||||
from modoboa.core.management.commands import CloseConnectionMixin
|
||||
from modoboa.extensions.admin.models import Domain
|
||||
from modoboa.extensions.stats import Stats
|
||||
from modoboa.extensions.stats.lib import date_to_timestamp
|
||||
from modoboa.lib import parameters
|
||||
|
||||
@@ -373,7 +372,6 @@ class Command(BaseCommand, CloseConnectionMixin):
|
||||
)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
Stats().load()
|
||||
if options["logfile"] is None:
|
||||
options["logfile"] = parameters.get_admin("LOGFILE", app="stats")
|
||||
p = LogParser(options, parameters.get_admin("RRD_ROOTDIR", app="stats"))
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"""Form management utilities."""
|
||||
|
||||
import abc
|
||||
from collections import OrderedDict
|
||||
import re
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
@@ -180,8 +181,10 @@ class DynamicForm(object):
|
||||
if value is not None:
|
||||
self.fields[name].initial = value
|
||||
if pos:
|
||||
self.fields.keyOrder.remove(name)
|
||||
self.fields.keyOrder.insert(pos, name)
|
||||
order = self.fields.keys()
|
||||
order.remove(name)
|
||||
order.insert(post, name)
|
||||
self.fields = OrderedDict((key, self.fields[key]) for key in order)
|
||||
|
||||
def _load_from_qdict(self, qdict, pattern, typ):
|
||||
"""Load all instances of a field from a ``QueryDict`` object.
|
||||
|
||||
+7
-19
@@ -1,15 +1,20 @@
|
||||
# coding: utf-8
|
||||
"""Testing utilities."""
|
||||
|
||||
import json
|
||||
|
||||
from django import forms
|
||||
from django.core import management
|
||||
from django.test import TestCase
|
||||
from django.test.client import Client
|
||||
from django import forms
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
from modoboa.lib import parameters
|
||||
|
||||
|
||||
class ModoTestCase(TestCase):
|
||||
|
||||
def setUp(self, username="admin", password="password"):
|
||||
management.call_command("load_initial_data")
|
||||
self.clt = Client()
|
||||
self.assertEqual(
|
||||
self.clt.login(username=username, password=password), True)
|
||||
@@ -35,23 +40,6 @@ class ModoTestCase(TestCase):
|
||||
return self.ajax_request('get', *args, **kwargs)
|
||||
|
||||
|
||||
class ExtTestCase(ModoTestCase):
|
||||
|
||||
def setUp(self, *args, **kwargs):
|
||||
super(ExtTestCase, self).setUp(*args, **kwargs)
|
||||
self.clt.get(reverse("core:extension_list"))
|
||||
|
||||
def activate_extensions(self, *names):
|
||||
from modoboa.core.extensions import exts_pool
|
||||
|
||||
self.ajax_post(
|
||||
reverse("core:extension_save"),
|
||||
dict(("select_%s" % name, "1") for name in names)
|
||||
)
|
||||
for name in names:
|
||||
exts_pool.get_extension(name).load()
|
||||
|
||||
|
||||
class TestParams(parameters.AdminParametersForm):
|
||||
app = "test"
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ class DeployTest(unittest.TestCase):
|
||||
self.dbhost, self.projname)
|
||||
cmd = (
|
||||
"modoboa-admin.py deploy --dbaction install --collectstatic "
|
||||
"--dburl %s --extensions all --domain %s %s"
|
||||
"--dburl %s --domain %s %s"
|
||||
% (dburl, 'localhost', self.projname)
|
||||
)
|
||||
code, output = exec_cmd(cmd, cwd=self.workdir)
|
||||
|
||||
Reference in New Issue
Block a user