diff --git a/.travis.yml b/.travis.yml index 318473a6f..6e55a8fc1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ python: - "2.7" env: - - DJANGO=1.6 + - DJANGO=1.7 install: - pip install -q Django==$DJANGO --use-mirrors diff --git a/doc/extending/events.rst b/doc/extending/events.rst index 6f4a533e8..8b780d4a6 100644 --- a/doc/extending/events.rst +++ b/doc/extending/events.rst @@ -266,28 +266,6 @@ creator. * ``owner`` is the original creator * ``domain`` is the ``Domain`` instance being modified -ExtDisabled -=========== - -Raised just after an extension has been disabled. - -*Callback prototype*:: - - def callback(extension): pass - -* ``extension`` is an ``Extension`` instance - -ExtEnabled -========== - -Raised just after an extension has been activated. - -*Callback prototype*:: - - def callback(extension): pass - -* ``extension`` is an ``Extension`` instance - ExtraAccountActions =================== @@ -613,6 +591,29 @@ Raised to request extra parameters for a given parameters form. Must return a dictionary. Each entry must be a valid Django form field. +.. _getextrarolepermissions: + +GetExtraRolePermissions +======================= + +Let extensions define new permissions for a given role. + +*Callback prototype*:: + + def callback(rolename): pass + +* ``rolename`` is the role's name (str) + +Callbacks listening to this event must return a list of list. The +second list level must contain exactly 3 strings: the application +name, the model name and the permission name. Example:: + + [ + ["core", "user", "add_user"], + ["core", "user", "change_user"], + ["core", "user", "delete_user"], + ] + .. _getextraroles: GetExtraRoles @@ -672,6 +673,17 @@ the following prototype:: * ``row`` is a string containing the object's definition (CSV format) * ``formopts`` is a dictionary that may contain options +InitialDataLoaded +================= + +Raised a initial data has been loaded for a given extension. + +*Callback prototype*:: + + def callback(extname); pass + + ``extname`` is the extension name (str) + MailboxAliasCreated =================== diff --git a/doc/extending/getting_started.rst b/doc/extending/getting_started.rst index 7e773d1fe..3ef89ab9b 100644 --- a/doc/extending/getting_started.rst +++ b/doc/extending/getting_started.rst @@ -42,7 +42,7 @@ Deploy an instance for development Now that you have a :ref:`running environment `, you're ready to deploy a test instance:: - $ modoboa-admin.py deploy --dbaction install --devel --dburl + $ modoboa-admin.py deploy --devel --dburl $ cd $ python manage.py runserver diff --git a/doc/extending/plugin_api.rst b/doc/extending/plugin_api.rst index 59d9f1d2e..984072927 100644 --- a/doc/extending/plugin_api.rst +++ b/doc/extending/plugin_api.rst @@ -14,7 +14,7 @@ implementation provides the following possibilities: * Register callback actions for specific events Plugins are nothing more than Django applications with an extra piece -of code that integrates them into Modoboa. Usually, the *__init__.py* file +of code that integrates them into Modoboa. The *modo_extension.py* file will contain a complete description of the plugin: * Admin and user parameters @@ -38,23 +38,22 @@ this (into Modoboa's directory):: $ python manage.py startapp Then, you need to register this application using the provided -API. Just copy/paste the following example into the :file:`__init__.py` file +API. Just copy/paste the following example into the :file:`modo_extension.py` file of the future extension:: from modoboa.core.extensions import ModoExtension, exts_pool + class MyExtension(ModoExtension): + + """My custom Modoboa extension.""" + name = "myext" label = "My Extension" version = "0.1" description = "A description" url = "myext_root_location" # optional, name is used if not defined - def init(self): - """This method is called when the extension is activated. - """ - pass - def load(self): """This method is called when Modoboa loads available and activated plugins. @@ -62,19 +61,19 @@ of the future extension:: """ pass - def destroy(self): - """This function is called when a plugin is disabled from the interface. - - Unregister parameters and events here. - """ + def load_initial_data(self): + """Optional: provide initial data for your extension here.""" pass exts_pool.register_extension(MyExtension) -Once done, simply add your plugin's module name to the -``INSTALLED_APPS`` variable located inside :file:`settings.py`. Optionaly, -run ``python manage.py syncdb`` if your plugin provides custom tables -and ``python manage.py collectstatic`` to update static files. +Once done, simply add your extension's module name to the +``MODOBOA_APPS`` variable located inside :file:`settings.py`. Finally, +run the following commands:: + + $ python manage.py migrate + $ python manage.py load_initial_data + $ python manage.py collectstatic ********** Parameters @@ -107,14 +106,6 @@ Both functions accept extra arguments listed here: * ``help`` : help text, * ``values`` : list of possible values if ``type`` is ``list``. -To undeclare parameters (for example when a plugin is disabled is -disabled from the interface), use the following function:: - - parameters.unregister_app(appname) - -``appname`` corresponds to your plugin's name, ie. the name of the -directory containing the source code. - *************************** Custom administrative roles *************************** @@ -122,15 +113,17 @@ Custom administrative roles Modoboa uses Django's internal permission system. Administrative roles are nothing more than groups (``Group`` instances). -If an extension needs to add new roles, it needs to follow those steps: +If an extension needs to add new roles, the following steps are required: -#. Create a new ``Group`` instance. It can be done by providing - `fixtures `_ - or by creating it into the extension ``init`` function - -#. A a new listener for the :ref:`getextraroles` event that will return +#. Listen to the :ref:`getextraroles` event that will return the group's name +#. Listen to the :ref:`getextrarolepermissions` event that will return + the new group's permissions + +The group will automatically be created the next time you run the +``load_initial_data`` command. + ********************* Extending admin forms ********************* diff --git a/doc/getting_started/install.rst b/doc/getting_started/install.rst index b8b12f323..611cf84ca 100644 --- a/doc/getting_started/install.rst +++ b/doc/getting_started/install.rst @@ -9,8 +9,7 @@ Requirements ************ * `Python version 2.6+ `_ -* `Django version 1.6+ `_ -* `south version 0.7+ `_ +* `Django version 1.7+ `_ * `lxml python module `_ * `pycrypto python module `_ * `rrdtool python binding `_ @@ -94,7 +93,7 @@ Deployment `modoboa-admin.py`, a command line tool, lets you deploy a *ready-to-use* Modoboa site using only one instruction:: - $ modoboa-admin.py deploy modoboa_example --dbaction install --collectstatic [--with-amavis] [--dburl database-url] [--amavis_dburl database-url] + $ modoboa-admin.py deploy modoboa_example --collectstatic [--with-amavis] [--dburl database-url] [--amavis_dburl database-url] Just answer the few questions and you're done. You can now go to the :ref:`first_use` section. diff --git a/doc/getting_started/upgrade.rst b/doc/getting_started/upgrade.rst index 3cbb49fa0..230ad644a 100644 --- a/doc/getting_started/upgrade.rst +++ b/doc/getting_started/upgrade.rst @@ -35,7 +35,7 @@ your instance was first deployed:: Then, run ``modoboa-admin.py deploy``:: - $ modoboa-admin.py deploy --dbaction upgrade --collectstatic [--with-amavis] [--dburl database-url] [--amavis_dburl database-url] [--domain hostname] [--lang lang] [--timezone timezone] + $ modoboa-admin.py deploy --collectstatic [--with-amavis] [--dburl database-url] [--amavis_dburl database-url] [--domain hostname] [--lang lang] [--timezone timezone] If you prefer the manual way, check if :ref:`specific_upgrade_instructions` are required according to the diff --git a/modoboa/core/__init__.py b/modoboa/core/__init__.py index ca94c9604..cc91ec6c1 100644 --- a/modoboa/core/__init__.py +++ b/modoboa/core/__init__.py @@ -18,16 +18,16 @@ BASE_EVENTS = [ "ExtraAccountActions", "RoleChanged", "GetExtraRoles", + "GetExtraRolePermissions", "PasswordChange", "UserCanSetRole", + "InitialDataLoaded", + "UserMenuDisplay", "AdminMenuDisplay", "GetStaticContent", - "ExtEnabled", - "ExtDisabled", - "UserLogin", "UserLogout", @@ -44,6 +44,15 @@ BASE_EVENTS = [ "SaveExtraFormFields", ] +PERMISSIONS = { + "DomainAdmins": [ + ["core", "user", "add_user"], + ["core", "user", "change_user"], + ["core", "user", "delete_user"], + ], + "SimpleUsers": [] +} + def load_core_settings(): """Load core settings. @@ -58,17 +67,6 @@ def load_core_settings(): events.declare(BASE_EVENTS) -@events.observe("ExtDisabled") -def unset_default_topredirection(extension): - """ - Simple callback to change the default redirection if the - corresponding extension is being disabled. - """ - topredirection = parameters.get_admin("DEFAULT_TOP_REDIRECTION") - if topredirection == extension.name: - parameters.save_admin("DEFAULT_TOP_REDIRECTION", "core") - - @events.observe("TopNotifications") def check_for_new_version(request, include_all): """ diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index 63c009777..5d4ea3ce8 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -9,7 +9,7 @@ from modoboa.lib.form_utils import YesNoField, SeparatorField, InlineRadioSelect def enabled_applications(): - """Return the list of currently enabled extensions + """Return the list of installed extensions. We check if the table exists before trying to fetch activated extensions because the admin module is always imported by Django, @@ -17,19 +17,11 @@ def enabled_applications(): :return: a list """ - from modoboa.core.models import Extension from modoboa.core.extensions import exts_pool - from modoboa.lib.db_utils import db_table_exists result = [("user", "user")] - if db_table_exists("core_extension"): - exts = Extension.objects.filter(enabled=True) - for ext in exts: - extclass = exts_pool.get_extension(ext.name) - if extclass is None: - continue - if extclass.available_for_topredirection: - result.append((ext.name, ext.name)) + for extension in exts_pool.list_all(): + result.append((extension["name"], extension["name"])) return sorted(result, key=lambda e: e[0]) @@ -293,8 +285,6 @@ class GeneralParametersForm(parameters.AdminParametersForm): required parameters. """ super(GeneralParametersForm, self).clean() - if len(self._errors): - raise forms.ValidationError(self._errors) cleaned_data = self.cleaned_data if cleaned_data["authentication_type"] != "ldap": return cleaned_data @@ -306,8 +296,7 @@ class GeneralParametersForm(parameters.AdminParametersForm): for f in required_fields: if f not in cleaned_data or cleaned_data[f] == u'': - self._errors[f] = self.error_class( - [_("This field is required")]) + self.add_error(f, _("This field is required")) return cleaned_data diff --git a/modoboa/core/commands/deploy.py b/modoboa/core/commands/deploy.py index 20e799d94..e3802e229 100644 --- a/modoboa/core/commands/deploy.py +++ b/modoboa/core/commands/deploy.py @@ -1,4 +1,7 @@ # coding: utf-8 + +"""A shortcut to deploy a fresh modoboa instance.""" + import getpass import os import shutil @@ -6,12 +9,12 @@ import sys import subprocess +import django from django.core import management from django.template import Context, Template import dj_database_url -from modoboa.lib.sysutils import exec_cmd from modoboa.core.commands import Command DBCONN_TPL = """ @@ -46,10 +49,6 @@ class DeployCommand(Command): '--with-amavis', action='store_true', default=False, help='Include amavis configuration' ) - self._parser.add_argument( - '--dbaction', type=str, default="install", - help='Action to take on the database (install|upgrade)' - ) self._parser.add_argument( '--collectstatic', action='store_true', default=False, help='Run django collectstatic command' @@ -63,10 +62,6 @@ class DeployCommand(Command): self._parser.add_argument( '--domain', type=str, default=None, help='The domain under which you want to deploy modoboa') - self._parser.add_argument( - '--extensions', type=str, nargs='*', - help='Deploy with those extensions already enabled' - ) self._parser.add_argument( '--lang', type=str, default="en-us", help="Set the default language" @@ -142,6 +137,7 @@ class DeployCommand(Command): return info def handle(self, parsed_args): + django.setup() management.call_command( 'startproject', parsed_args.name, verbosity=False ) @@ -217,36 +213,16 @@ class DeployCommand(Command): os.mkdir("%s/media" % parsed_args.name) os.unlink("%s/settings.pyc" % path) - if parsed_args.dbaction == "install": - self._exec_django_command( - "syncdb", parsed_args.name, '--noinput' - ) - exec_cmd('sed -ri "s|^#(\s+\'south)|\\1|" %s/settings.py' % path) - self._exec_django_command( - "syncdb", parsed_args.name, - ) - self._exec_django_command( - 'migrate', parsed_args.name, '--fake' - ) - self._exec_django_command( - "loaddata", parsed_args.name, 'initial_users.json' - ) - elif parsed_args.dbaction == "upgrade": - exec_cmd('sed -ri "s|^#(\s+\'south)|\\1|" %s/settings.py' % path) - self._exec_django_command( - "syncdb", parsed_args.name, "--migrate" - ) - + self._exec_django_command( + "migrate", parsed_args.name, '--noinput' + ) + self._exec_django_command( + "load_initial_data", parsed_args.name + ) if parsed_args.collectstatic: self._exec_django_command( "collectstatic", parsed_args.name, '--noinput' ) - - if parsed_args.extensions: - self._exec_django_command( - "manage_extensions", parsed_args.name, *parsed_args.extensions - ) - self._exec_django_command( "set_default_site", parsed_args.name, allowed_host ) diff --git a/modoboa/core/commands/postfix_maps.py b/modoboa/core/commands/postfix_maps.py index c663841fe..81a5f3fa5 100644 --- a/modoboa/core/commands/postfix_maps.py +++ b/modoboa/core/commands/postfix_maps.py @@ -203,7 +203,11 @@ class RelayRecipientVerification(MapFile): filename = "sql-relay-recipient-verification.cf" mysql = "SELECT 'reject_unverified_recipient' FROM postfix_relay_domains_relaydomain WHERE verify_recipients=1 AND name='%d'" postgres = "SELECT 'reject_unverified_recipient' FROM postfix_relay_domains_relaydomain WHERE verify_recipients AND name='%d'" - sqlite = "SELECT 'reject_unverified_recipient' FROM postfix_relay_domains_relaydomain WHERE verify_recipients=1 AND name='%d'" + sqlite = ( + "SELECT 'reject_unverified_recipient' " + "FROM postfix_relay_domains_relaydomain " + "WHERE verify_recipients=1 AND name='%d'" + ) class PostfixMapsCommand(Command): diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index cf0518017..2ba6dc86b 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -46,7 +46,6 @@ INSTALLED_APPS = ( 'django.contrib.messages', 'django.contrib.sites', 'django.contrib.staticfiles', -# 'south', 'reversion', ) @@ -86,7 +85,6 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'modoboa.lib.middleware.AjaxLoginRedirect', 'modoboa.lib.middleware.CommonExceptionCatcher', - 'modoboa.lib.middleware.ExtControlMiddleware', 'modoboa.lib.middleware.RequestCatcherMiddleware', ) @@ -151,9 +149,6 @@ STATICFILES_DIRS = ( MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -# South settings -SOUTH_TESTS_MIGRATE = False - # Modoboa settings #MODOBOA_CUSTOM_LOGO = os.path.join(MEDIA_URL, "custom_logo.png") diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index 96d3096cf..82e5fd30e 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -6,11 +6,13 @@ from django.conf.urls import include class ModoExtension(object): - """Base extension class. + """ + Base extension class. Each Modoboa extension must inherit from this class to be considered as valid. """ + name = None label = None version = "NA" @@ -27,10 +29,8 @@ class ModoExtension(object): always_active=self.always_active ) - def init(self): - pass - - def destroy(self): + def load_initial_data(self): + """Declare extension data in this method.""" pass def load(self): @@ -45,26 +45,24 @@ class ExtensionsPool(object): self.extensions = {} def register_extension(self, ext, show=True): + """Register an extension. + + :param ext: a class inheriting from ``Extension`` + :param show: list the extension or not + """ self.extensions[ext.name] = dict(cls=ext, show=show) def get_extension(self, name): + """Retrieve the current instance of an extension.""" if name not in self.extensions: return None if "instance" not in self.extensions[name]: self.extensions[name]["instance"] = self.extensions[name]["cls"]() return self.extensions[name]["instance"] - def is_extension_enabled(self, name): - """Check if an extension is enabled or not.""" - from modoboa.core.models import Extension - - if name not in self.extensions: - return False - try: - state = Extension.objects.get(name=name).enabled - except Extension.DoesNotExist: - state = False - return state + def is_extension_installed(self, name): + """Check if an extension is installed ir not.""" + return name in settings.MODOBOA_APPS def get_extension_infos(self, name): instance = self.get_extension(name) @@ -73,7 +71,7 @@ class ExtensionsPool(object): return instance.infos() def load_all(self): - """Load all enabled extensions. + """Load all defined extensions. Each extension must be loaded in order to integrate with Modoboa. Only enabled and special extensions are loaded but @@ -83,11 +81,9 @@ class ExtensionsPool(object): :return: a list of url maps """ - from modoboa.core.models import Extension - result = [] for ext in settings.MODOBOA_APPS: - __import__(ext) + __import__(ext, locals(), globals(), ["modo_extension"]) extname = ext.split('.')[-1] extinstance = self.get_extension(extname) if extinstance is None: @@ -97,25 +93,16 @@ class ExtensionsPool(object): if extinstance.url is not None else extname result += [ (r'^%s/' % (baseurl), - include("%s.urls" % extinstance.__module__, - namespace=extname)) + include("{0}.urls".format(ext), namespace=extname)) ] except ImportError: # No urls for this extension pass - if not extinstance.always_active: - try: - ext = Extension.objects.get(name=extname) - if not ext.enabled: - continue - except Extension.DoesNotExist: - continue extinstance.load() return result def list_all(self): - """List all defined extensions. - """ + """List all defined extensions.""" result = [] for extname, extdef in self.extensions.iteritems(): if not extdef["show"]: diff --git a/modoboa/core/factories.py b/modoboa/core/factories.py index d4dd9d6ad..768ca8546 100644 --- a/modoboa/core/factories.py +++ b/modoboa/core/factories.py @@ -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' diff --git a/modoboa/core/fixtures/initial_users.json b/modoboa/core/fixtures/initial_users.json deleted file mode 100644 index 0986e6fb0..000000000 --- a/modoboa/core/fixtures/initial_users.json +++ /dev/null @@ -1 +0,0 @@ -[{"pk": 1, "model": "core.user", "fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": false, "last_login": "2012-01-26T15:19:26+01:00", "groups": [], "user_permissions": [], "password": "{CRYPT}dTTsGDkA5ZHKg", "email": "", "date_joined": "2012-01-26T15:19:26+01:00"}},{"pk": 1, "model": "core.objectaccess", "fields": {"is_owner": true, "user": 1, "content_type": ["core", "user"], "object_id": 1}}] \ No newline at end of file diff --git a/modoboa/core/management/commands/clean_unknown_extensions.py b/modoboa/core/management/commands/clean_unknown_extensions.py deleted file mode 100644 index d0a297fea..000000000 --- a/modoboa/core/management/commands/clean_unknown_extensions.py +++ /dev/null @@ -1,26 +0,0 @@ -# coding: utf-8 -""" -A management command to clean unknown extensions from the -database. - -""" -from django.conf import settings -from django.core.management.base import BaseCommand -from django.db import connection - -from modoboa.core.models import Extension - - -class Command(BaseCommand): - - """Command definition.""" - - help = "Clean unknowns extensions from the database" - - def handle(self, *args, **options): - """Entry point.""" - for extension in Extension.objects.all(): - fullname = "modoboa.extensions.{0}".format(extension.name) - if fullname not in settings.MODOBOA_APPS: - extension.delete() - connection.close() diff --git a/modoboa/core/management/commands/load_initial_data.py b/modoboa/core/management/commands/load_initial_data.py new file mode 100644 index 000000000..341d3f376 --- /dev/null +++ b/modoboa/core/management/commands/load_initial_data.py @@ -0,0 +1,56 @@ +"""A management command to load Modoboa initial data: + +* Create a default super admin if none exists +* Create groups and permissions + +""" + +from django.contrib.auth.models import Group +from django.core.management.base import BaseCommand + +from modoboa.core import load_core_settings, PERMISSIONS +from modoboa.core.extensions import exts_pool +from modoboa.core.models import User, ObjectAccess +from modoboa.lib import events +from modoboa.lib.permissions import add_permissions_to_group +from . import CloseConnectionMixin + + +class Command(BaseCommand, CloseConnectionMixin): + + """Command defintion.""" + + help = "Load Modoboa initial data" + + def handle(self, *args, **options): + """Command entry point.""" + load_core_settings() + + 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) + + exts_pool.load_all() + + superadmin = User.objects.filter(is_superuser=True).first() + groups = PERMISSIONS.keys() + [ + role[0] for role + in events.raiseQueryEvent("GetExtraRoles", superadmin) + ] + for groupname in groups: + group, created = Group.objects.get_or_create(name=groupname) + permissions = ( + PERMISSIONS.get(groupname, []) + + events.raiseQueryEvent("GetExtraRolePermissions", groupname) + ) + if not permissions: + continue + add_permissions_to_group(group, permissions) + + for extname in exts_pool.extensions.keys(): + extension = exts_pool.get_extension(extname) + extension.load_initial_data() + events.raiseEvent("InitialDataLoaded", extname) diff --git a/modoboa/core/management/commands/manage_extensions.py b/modoboa/core/management/commands/manage_extensions.py deleted file mode 100644 index af90b1302..000000000 --- a/modoboa/core/management/commands/manage_extensions.py +++ /dev/null @@ -1,58 +0,0 @@ -# coding: utf-8 -""" -A management command to enable an extension. -""" -from optparse import make_option - -from django.conf import settings -from django.core.management.base import BaseCommand - -from modoboa.core.models import Extension -from . import CloseConnectionMixin - - -class Command(BaseCommand, CloseConnectionMixin): - - """Command definition.""" - - help = "Enable or disable extensions" - - option_list = BaseCommand.option_list + ( - make_option( - "--action", type=str, default="enable", - help="The action to take on extensions ('enable' or 'disable')" - ), - ) - - def _change_extension_state(self, name, options): - """Change the state of an extension.""" - newstate = options["action"] == "enable" - update_db = True - try: - extension = Extension.objects.get(name=name) - except Extension.DoesNotExist: - extension = Extension.objects.create(name=name, enabled=newstate) - update_db = False - else: - if extension.enabled == newstate: - return - if newstate: - extension.on(update_db) - else: - extension.off(update_db) - - def handle(self, *args, **options): - """Entry point.""" - if "all" in args: - for fullname in settings.MODOBOA_APPS: - if not fullname.startswith("modoboa.extensions"): - continue - extname = fullname.replace("modoboa.extensions.", "") - self._change_extension_state(extname, options) - return - - for extname in args: - fullname = "modoboa.extensions.{0}".format(extname) - if fullname not in settings.MODOBOA_APPS: - continue - self._change_extension_state(extname, options) diff --git a/modoboa/core/migrations/0001_initial.py b/modoboa/core/migrations/0001_initial.py index 4b0bbe9ed..3824558f1 100644 --- a/modoboa/core/migrations/0001_initial.py +++ b/modoboa/core/migrations/0001_initial.py @@ -1,161 +1,81 @@ # -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +from __future__ import unicode_literals + +from django.db import models, migrations +import django.utils.timezone +from django.conf import settings -class Migration(SchemaMigration): +class Migration(migrations.Migration): - def forwards(self, orm): - # Adding model 'User' - db.create_table(u'core_user', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('password', self.gf('django.db.models.fields.CharField')(max_length=128)), - ('last_login', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), - ('is_superuser', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('username', self.gf('django.db.models.fields.CharField')(unique=True, max_length=254)), - ('first_name', self.gf('django.db.models.fields.CharField')(max_length=30, blank=True)), - ('last_name', self.gf('django.db.models.fields.CharField')(max_length=30, blank=True)), - ('email', self.gf('django.db.models.fields.EmailField')(max_length=254, blank=True)), - ('is_staff', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('is_active', self.gf('django.db.models.fields.BooleanField')(default=True)), - ('date_joined', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)), - ('is_local', self.gf('django.db.models.fields.BooleanField')(default=True)), - )) - db.send_create_signal(u'core', ['User']) + dependencies = [ + ('auth', '0001_initial'), + ('contenttypes', '0001_initial'), + ] - # Adding M2M table for field groups on 'User' - db.create_table(u'core_user_groups', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('user', models.ForeignKey(orm[u'core.user'], null=False)), - ('group', models.ForeignKey(orm[u'auth.group'], null=False)) - )) - db.create_unique(u'core_user_groups', ['user_id', 'group_id']) - - # Adding M2M table for field user_permissions on 'User' - db.create_table(u'core_user_user_permissions', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('user', models.ForeignKey(orm[u'core.user'], null=False)), - ('permission', models.ForeignKey(orm[u'auth.permission'], null=False)) - )) - db.create_unique(u'core_user_user_permissions', ['user_id', 'permission_id']) - - # Adding model 'ObjectAccess' - db.create_table(u'core_objectaccess', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.User'])), - ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), - ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), - ('is_owner', self.gf('django.db.models.fields.BooleanField')(default=False)), - )) - db.send_create_signal(u'core', ['ObjectAccess']) - - # Adding unique constraint on 'ObjectAccess', fields ['user', 'content_type', 'object_id'] - db.create_unique(u'core_objectaccess', ['user_id', 'content_type_id', 'object_id']) - - # Adding model 'Extension' - db.create_table(u'core_extension', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False)), - )) - db.send_create_signal(u'core', ['Extension']) - - # Adding model 'Log' - db.create_table(u'core_log', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('message', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('level', self.gf('django.db.models.fields.CharField')(max_length=15)), - ('logger', self.gf('django.db.models.fields.CharField')(max_length=30)), - )) - db.send_create_signal(u'core', ['Log']) - - - def backwards(self, orm): - # Removing unique constraint on 'ObjectAccess', fields ['user', 'content_type', 'object_id'] - db.delete_unique(u'core_objectaccess', ['user_id', 'content_type_id', 'object_id']) - - # Deleting model 'User' - db.delete_table(u'core_user') - - # Removing M2M table for field groups on 'User' - db.delete_table('core_user_groups') - - # Removing M2M table for field user_permissions on 'User' - db.delete_table('core_user_user_permissions') - - # Deleting model 'ObjectAccess' - db.delete_table(u'core_objectaccess') - - # Deleting model 'Extension' - db.delete_table(u'core_extension') - - # Deleting model 'Log' - db.delete_table(u'core_log') - - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'core.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['core'] \ No newline at end of file + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(unique=True, max_length=254)), + ('first_name', models.CharField(max_length=30, blank=True)), + ('last_name', models.CharField(max_length=30, blank=True)), + ('email', models.EmailField(max_length=254, blank=True)), + ('is_staff', models.BooleanField(default=False)), + ('is_active', models.BooleanField(default=True)), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now)), + ('is_local', models.BooleanField(default=True)), + ('password', models.CharField(max_length=256, verbose_name='password')), + ('last_login', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last login')), + ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')), + ], + options={ + 'ordering': ['username'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Extension', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=150)), + ('enabled', models.BooleanField(default=False, help_text='Check to enable this extension', verbose_name='enabled')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Log', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('message', models.CharField(max_length=255)), + ('level', models.CharField(max_length=15)), + ('logger', models.CharField(max_length=30)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ObjectAccess', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('object_id', models.PositiveIntegerField()), + ('is_owner', models.BooleanField(default=False)), + ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='objectaccess', + unique_together=set([('user', 'content_type', 'object_id')]), + ), + ] diff --git a/modoboa/core/migrations/0002_delete_extension.py b/modoboa/core/migrations/0002_delete_extension.py new file mode 100644 index 000000000..073ef44bb --- /dev/null +++ b/modoboa/core/migrations/0002_delete_extension.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='Extension', + ), + ] diff --git a/modoboa/core/migrations/0002_update_permissions.py b/modoboa/core/migrations/0002_update_permissions.py deleted file mode 100644 index 31bc46068..000000000 --- a/modoboa/core/migrations/0002_update_permissions.py +++ /dev/null @@ -1,107 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - depends_on = ( - ('admin', '0037_rename_tables'), - ) - - def forwards(self, orm): - "Write your forwards methods here." - orm['contenttypes.ContentType'].objects.filter( - app_label='admin', model__in=['user', 'extension', 'objectaccess'] - ).update(app_label='core') - - def backwards(self, orm): - "Write your backwards methods here." - orm['contenttypes.ContentType'].objects.filter( - app_label='core', model__in=['user', 'extension', 'objectaccess'] - ).update(app_label='admin') - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'core.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'reversion.revision': { - 'Meta': {'object_name': 'Revision'}, - 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'manager_slug': ('django.db.models.fields.CharField', [], {'default': "u'default'", 'max_length': '200', 'db_index': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']", 'null': 'True', 'blank': 'True'}) - }, - u'reversion.version': { - 'Meta': {'object_name': 'Version'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - 'format': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'object_id': ('django.db.models.fields.TextField', [], {}), - 'object_id_int': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), - 'object_repr': ('django.db.models.fields.TextField', [], {}), - 'revision': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['reversion.Revision']"}), - 'serialized_data': ('django.db.models.fields.TextField', [], {}), - 'type': ('django.db.models.fields.PositiveSmallIntegerField', [], {'db_index': 'True'}) - } - } - - complete_apps = ['reversion', 'core'] - symmetrical = True diff --git a/modoboa/core/migrations/0003_update_md5crypt_passwords.py b/modoboa/core/migrations/0003_update_md5crypt_passwords.py deleted file mode 100644 index 95c9cf0c3..000000000 --- a/modoboa/core/migrations/0003_update_md5crypt_passwords.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for user in orm['core.User'].objects.all(): - if user.password.startswith('$1$'): - user.password = '{MD5-CRYPT}%s' % user.password - user.save() - - def backwards(self, orm): - "Write your backwards methods here." - for user in orm['core.User'].objects.all(): - if user.password.startswith('{MD5-CRYPT}'): - user.password = user.password.replace('{MD5-CRYPT}', '') - user.save() - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'core.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['core'] - symmetrical = True diff --git a/modoboa/core/migrations/0004_auto__chg_field_user_password.py b/modoboa/core/migrations/0004_auto__chg_field_user_password.py deleted file mode 100644 index 6695deeb3..000000000 --- a/modoboa/core/migrations/0004_auto__chg_field_user_password.py +++ /dev/null @@ -1,82 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'User.password' - db.alter_column(u'core_user', 'password', self.gf('django.db.models.fields.CharField')(max_length=256)) - - def backwards(self, orm): - - # Changing field 'User.password' - db.alter_column(u'core_user', 'password', self.gf('django.db.models.fields.CharField')(max_length=128)) - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'core.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['core'] \ No newline at end of file diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 8d4aed543..93df9a416 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -1,11 +1,8 @@ """Core models.""" import logging -import os import re -import sys -from django.conf import settings from django.contrib.auth.hashers import make_password, is_password_usable from django.contrib.auth.models import ( UserManager, Group, PermissionsMixin @@ -20,13 +17,11 @@ from django.utils.translation import ugettext as _, ugettext_lazy import reversion -from modoboa.core.extensions import exts_pool from modoboa.core.password_hashers import get_password_hasher from modoboa.lib import events, parameters from modoboa.lib.exceptions import ( PermDeniedException, InternalError, BadRequest, Conflict ) -from modoboa.lib.sysutils import exec_cmd try: @@ -438,72 +433,6 @@ class ObjectAccess(models.Model): ) -class Extension(models.Model): - - """A modoboa extension.""" - - name = models.CharField(max_length=150) - enabled = models.BooleanField( - ugettext_lazy('enabled'), - help_text=ugettext_lazy("Check to enable this extension") - ) - - def __init__(self, *args, **kwargs): - super(Extension, self).__init__(*args, **kwargs) - - def __unicode__(self): - return self.name - - def __get_ext_instance(self): - if not self.name: - return None - if hasattr(self, "instance") and self.instance: - return - self.instance = exts_pool.get_extension(self.name) - if self.instance: - self.__get_ext_dir() - - def __get_ext_dir(self): - modname = self.instance.__module__ - path = os.path.realpath(sys.modules[modname].__file__) - self.extdir = os.path.dirname(path) - - def on(self, update_db=True): - """Activate this extension.""" - if update_db: - self.enabled = True - self.save() - - self.__get_ext_instance() - self.instance.load() - self.instance.init() - - if self.instance.needs_media: - path = os.path.join(settings.MEDIA_ROOT, self.name) - exec_cmd("mkdir %s" % path) - - events.raiseEvent("ExtEnabled", self) - - def off(self, update_db=True): - """Disable this extension.""" - self.__get_ext_instance() - if self.instance is None: - return - self.instance.destroy() - - if update_db: - self.enabled = False - self.save() - - if self.instance.needs_media: - path = os.path.join(settings.MEDIA_ROOT, self.name) - exec_cmd("rm -r %s" % path) - - events.raiseEvent("ExtDisabled", self) - -reversion.register(Extension) - - class Log(models.Model): date_created = models.DateTimeField(auto_now_add=True) message = models.CharField(max_length=255) diff --git a/modoboa/core/templates/core/extensions.html b/modoboa/core/templates/core/extensions.html index cc51b3ecb..6415135e3 100644 --- a/modoboa/core/templates/core/extensions.html +++ b/modoboa/core/templates/core/extensions.html @@ -1,26 +1,22 @@ -{% load i18n %}{% load url from future %} -

{% trans "Extensions" %} {% trans "Choose the extension(s) to use" %}


-
- {% csrf_token %} - - - - - - - - - - - {% for extension in extensions %} - - - - - - - {% endfor %} - -
{% trans "Name" %}{% trans "Version" %}{% trans "Description" %}
{{ extension.label }}{{ extension.version }}{{ extension.description }}
-
-{% trans 'Save' %} +{% load i18n %} +{% load url from future %} + +

{% trans "Extensions" %} {% trans "The extension(s) you are using" %}


+ + + + + + + + + + {% for extension in extensions %} + + + + + + {% endfor %} + +
{% trans "Name" %}{% trans "Version" %}{% trans "Description" %}
{{ extension.label }}{{ extension.version }}{{ extension.description }}
diff --git a/modoboa/core/urls.py b/modoboa/core/urls.py index 4402f37d2..cf03287fa 100644 --- a/modoboa/core/urls.py +++ b/modoboa/core/urls.py @@ -17,8 +17,6 @@ urlpatterns = patterns( name="parameter_save"), url(r'^core/extensions/$', 'modoboa.core.views.admin.viewextensions', name="extension_list"), - url(r'^core/extensions/save/$', 'modoboa.core.views.admin.saveextensions', - name="extension_save"), url(r'^core/info/$', 'modoboa.core.views.admin.information', name="information"), url(r'^core/logs/$', 'modoboa.core.views.admin.logs', name="log_list"), diff --git a/modoboa/core/views/admin.py b/modoboa/core/views/admin.py index b4b36e056..f1844ff76 100644 --- a/modoboa/core/views/admin.py +++ b/modoboa/core/views/admin.py @@ -8,7 +8,7 @@ from django.shortcuts import render from django.template.loader import render_to_string from django.utils.translation import ugettext as _ -from modoboa.core.models import Extension, Log +from modoboa.core.models import Log from modoboa.core.utils import new_version_available from modoboa.lib import events, parameters from modoboa.lib.listing import get_sort_order, get_listing_page @@ -58,44 +58,12 @@ def viewextensions(request, tplname='core/extensions.html'): from modoboa.core.extensions import exts_pool exts = exts_pool.list_all() - for ext in exts: - try: - dbext = Extension.objects.get(name=ext["id"]) - ext["selection"] = dbext.enabled - except Extension.DoesNotExist: - dbext = Extension() - dbext.name = ext["id"] - dbext.enabled = False - dbext.save() - ext["selection"] = False - return render_to_json_response({ "callback": "extensions", "content": _render_to_string(request, tplname, {"extensions": exts}) }) -@login_required -@user_passes_test(lambda u: u.is_superuser) -def saveextensions(request): - """Enable of disable extension(s).""" - actived_exts = Extension.objects.filter(enabled=True) - found = [] - for k in request.POST.keys(): - if k.startswith("select_"): - parts = k.split("_", 1) - dbext = Extension.objects.get(name=parts[1]) - if dbext not in actived_exts: - dbext.on() - else: - found += [dbext] - for ext in actived_exts: - if ext not in found: - ext.off() - - return render_to_json_response(_("Modifications applied.")) - - @login_required @user_passes_test(lambda u: u.is_superuser) def information(request, tplname="core/information.html"): diff --git a/modoboa/extensions/admin/__init__.py b/modoboa/extensions/admin/__init__.py index 1c23ae3d7..e69de29bb 100644 --- a/modoboa/extensions/admin/__init__.py +++ b/modoboa/extensions/admin/__init__.py @@ -1,263 +0,0 @@ -# coding: utf-8 -from django.core.urlresolvers import reverse -from django.utils.translation import ugettext as _, ugettext_lazy - -from modoboa.core.extensions import ModoExtension, exts_pool -from modoboa.extensions.admin.models import ( - Domain, DomainAlias, Mailbox, Alias -) -from modoboa.lib import parameters, events -from modoboa.lib.email_utils import split_mailbox -from modoboa.lib.exceptions import PermDeniedException, BadRequest, Conflict - - -admin_events = [ - "DomainCreated", - "DomainModified", - "DomainDeleted", - "DomainOwnershipRemoved", - "ExtraDomainEntries", - "ExtraDomainMenuEntries", - "ExtraDomainFilters", - "GetDomainActions", - "GetDomainModifyLink", - "CheckDomainName", - - "DomainAliasCreated", - "DomainAliasDeleted", - - "MailboxCreated", - "MailboxDeleted", - "MailboxModified", - - "MailboxAliasCreated", - "MailboxAliasDeleted", - - "ExtraDomainForm", - "FillDomainInstances", - - "ExtraAccountForm", - "CheckExtraAccountForm", - "FillAccountInstances", - - "ExtraDomainImportHelp", - "ImportObject" -] - - -class AdminConsole(ModoExtension): - name = "admin" - label = ugettext_lazy("Administration console") - version = "1.0" - description = ugettext_lazy( - "Web based console to manage domains, accounts and aliases" - ) - always_active = True - - def load(self): - from modoboa.extensions.admin.app_settings import AdminParametersForm - parameters.register( - AdminParametersForm, ugettext_lazy("Administration")) - events.declare(admin_events) - - def destroy(self): - parameters.unregister() - -exts_pool.register_extension(AdminConsole, show=False) - - -@events.observe("ExtraUprefsRoutes") -def extra_routes(): - from django.conf.urls import url - return [ - url(r'^user/forward/', - 'modoboa.extensions.admin.views.user.forward', - name="user_forward"), - ] - - -@events.observe("AdminMenuDisplay") -def admin_menu(target, user): - if target != "top_menu": - return [] - entries = [] - if user.has_perm("admin.view_domains"): - entries += [ - {"name": "domains", - "url": reverse("admin:domain_list"), - "label": _("Domains")} - ] - if user.has_perm("core.add_user") or user.has_perm("admin.add_alias"): - entries += [ - {"name": "identities", - "url": reverse("admin:identity_list"), - "label": _("Identities")}, - ] - return entries - - -@events.observe("UserMenuDisplay") -def user_menu(target, user): - if target != "uprefs_menu": - return [] - if not user.mailbox_set.count(): - return [] - return [ - {"name": "forward", - "class": "ajaxnav", - "url": "forward/", - "label": ugettext_lazy("Forward")} - ] - - -@events.observe("RoleChanged") -def grant_access_to_all_objects(user, role): - from django.contrib.contenttypes.models import ContentType - from modoboa.lib.permissions import grant_access_to_objects - from modoboa.core.models import User - - if role != "SuperAdmins": - return - grant_access_to_objects( - user, User.objects.all(), - ContentType.objects.get_for_model(User) - ) - grant_access_to_objects( - user, Domain.objects.all(), - ContentType.objects.get_for_model(Domain) - ) - grant_access_to_objects( - user, DomainAlias.objects.all(), - ContentType.objects.get_for_model(DomainAlias) - ) - grant_access_to_objects( - user, Mailbox.objects.all(), - ContentType.objects.get_for_model(Mailbox) - ) - grant_access_to_objects( - user, Alias.objects.all(), - ContentType.objects.get_for_model(Alias) - ) - - -@events.observe("AccountExported") -def export_admin_domains(admin): - result = [admin.mailbox_set.all()[0].quota] \ - if admin.mailbox_set.count() else [''] - if admin.group != "DomainAdmins": - return result - return result + [dom.name for dom in Domain.objects.get_for_admin(admin)] - - -@events.observe("AccountImported") -def import_account_mailbox(user, account, row): - """Handle extra fields when an account is imported. - - Expected fields: - - email address; quota; [domain; ...] - - :param User user: user importing the account - :param User account: account being imported - :param list rom: list of fields (strings) - """ - account.email = row[0].strip() - if account.email: - account.save() - mailbox, domname = split_mailbox(account.email) - try: - domain = Domain.objects.get(name=domname) - except Domain.DoesNotExist: - raise BadRequest( - _("Account import failed (%s): domain does not exist" - % account.username) - ) - if not user.can_access(domain): - raise PermDeniedException - try: - mb = Mailbox.objects.get(address=mailbox, domain=domain) - except Mailbox.DoesNotExist: - pass - else: - raise Conflict(_("Mailbox %s already exists" % account.email)) - if len(row) == 1: - quota = None - else: - try: - quota = int(row[1].strip()) - except ValueError: - raise BadRequest( - _("Account import failed (%s): wrong quota value" - % account.username) - ) - use_domain_quota = True if not quota else False - mb = Mailbox(address=mailbox, domain=domain, - user=account, use_domain_quota=use_domain_quota) - mb.set_quota(quota, override_rules=user.has_perm("admin.change_domain")) - mb.save(creator=user) - if account.group == "DomainAdmins": - for domname in row[2:]: - try: - dom = Domain.objects.get(name=domname.strip()) - except Domain.DoesNotExist: - continue - dom.add_admin(account) - - -@events.observe("AccountAutoCreated") -def account_auto_created(user): - from modoboa.core.models import User - from modoboa.extensions.admin.lib import check_if_domain_exists - from modoboa.lib.permissions import grant_access_to_object - - if parameters.get_admin("AUTO_CREATE_DOMAIN_AND_MAILBOX") == "no": - return - localpart, domname = split_mailbox(user.username) - if user.group != 'SimpleUsers' and domname is None: - return - sadmins = User.objects.filter(is_superuser=True) - try: - domain = Domain.objects.get(name=domname) - except Domain.DoesNotExist: - label = check_if_domain_exists( - domname, [(DomainAlias, _('domain alias'))]) - if label is not None: - return - domain = Domain(name=domname, enabled=True, quota=0) - domain.save(creator=sadmins[0]) - for su in sadmins[1:]: - grant_access_to_object(su, domain) - try: - mb = Mailbox.objects.get(domain=domain, address=localpart) - except Mailbox.DoesNotExist: - mb = Mailbox( - address=localpart, domain=domain, user=user, use_domain_quota=True - ) - mb.set_quota(override_rules=True) - mb.save(creator=sadmins[0]) - for su in sadmins[1:]: - grant_access_to_object(su, mb) - - -@events.observe("UserLogin") -def user_logged_in(request, username, password): - from modoboa.lib.cryptutils import encrypt - - if request.user.mailbox_set.count(): - request.session["password"] = encrypt(password) - - -@events.observe("AccountDeleted") -def account_deleted(account, byuser, **kwargs): - """'AccountDeleted' listener. - - When an account is deleted, we also need to remove its mailbox (if - any). - """ - if not account.mailbox_set.count(): - return - mb = account.mailbox_set.all()[0] - if not byuser.can_access(mb): - raise PermDeniedException - keep_mb_dir = kwargs.get("keep_mb_dir", True) - mb.delete(keepdir=keep_mb_dir) diff --git a/modoboa/extensions/admin/factories.py b/modoboa/extensions/admin/factories.py index b4399e0cd..e49956e83 100644 --- a/modoboa/extensions/admin/factories.py +++ b/modoboa/extensions/admin/factories.py @@ -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' diff --git a/modoboa/extensions/admin/fixtures/initial_data.json b/modoboa/extensions/admin/fixtures/initial_data.json deleted file mode 100644 index 9ad462996..000000000 --- a/modoboa/extensions/admin/fixtures/initial_data.json +++ /dev/null @@ -1 +0,0 @@ -[{"pk": 1, "model": "auth.group", "fields": {"name": "DomainAdmins", "permissions": [["add_user", "core", "user"], ["change_user", "core", "user"], ["delete_user", "core", "user"], ["view_domains", "admin", "domain"], ["add_mailbox", "admin", "mailbox"], ["change_mailbox", "admin", "mailbox"], ["delete_mailbox", "admin", "mailbox"], ["add_alias", "admin", "alias"], ["change_alias", "admin", "alias"], ["delete_alias", "admin", "alias"], ["view_mailboxes", "admin", "mailbox"], ["view_aliases", "admin", "alias"], ["view_domaliases", "admin", "domainalias"], ["add_domainalias", "admin", "domainalias"], ["change_domainalias", "admin", "domainalias"], ["delete_domainalias", "admin", "domainalias"]]}},{"pk": 2, "model": "auth.group", "fields": {"name": "SimpleUsers", "permissions": []}}] diff --git a/modoboa/extensions/admin/forms/account.py b/modoboa/extensions/admin/forms/account.py index dcda56951..1b3ef6b10 100644 --- a/modoboa/extensions/admin/forms/account.py +++ b/modoboa/extensions/admin/forms/account.py @@ -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": @@ -203,14 +208,10 @@ class AccountFormMail(forms.Form, DynamicForm): Check if quota is >= 0 only when the domain value is not used. """ super(AccountFormMail, self).clean() - if self._errors: - raise forms.ValidationError(self._errors) if not self.cleaned_data["quota_act"] \ and self.cleaned_data['quota'] is not None: if self.cleaned_data["quota"] < 0: - self._errors["quota"] = self.error_class( - [_("Must be a positive integer")]) - del self.cleaned_data["quota"] + self.add_error("quota", _("Must be a positive integer")) return self.cleaned_data def create_mailbox(self, user, account): diff --git a/modoboa/extensions/admin/forms/alias.py b/modoboa/extensions/admin/forms/alias.py index d54dad929..1a999fe49 100644 --- a/modoboa/extensions/admin/forms/alias.py +++ b/modoboa/extensions/admin/forms/alias.py @@ -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: diff --git a/modoboa/extensions/admin/forms/domain.py b/modoboa/extensions/admin/forms/domain.py index 373e1775d..8fc8afb15 100644 --- a/modoboa/extensions/admin/forms/domain.py +++ b/modoboa/extensions/admin/forms/domain.py @@ -78,18 +78,13 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): The validation way is not very smart... """ super(DomainFormGeneral, self).clean() - if self._errors: - raise forms.ValidationError(self._errors) - cleaned_data = self.cleaned_data name = cleaned_data["name"] label = check_if_domain_exists(name, [(DomainAlias, _('domain alias'))]) if label is not None: - self._errors["name"] = self.error_class( - [_("A %s with this name already exists" % unicode(label))] + self.add_error( + "name", _("A %s with this name already exists") % unicode(label) ) - del cleaned_data["name"] - for k in cleaned_data.keys(): if not k.startswith("aliases"): continue @@ -105,11 +100,8 @@ class DomainFormGeneral(forms.ModelForm, DynamicForm): label = check_if_domain_exists( cleaned_data[k], [(Domain, _("domain"))]) if label is not None: - self._errors[k] = self.error_class( - [_("A %s with this name already exists" % unicode(label))] - ) - del cleaned_data[k] - + self.add_error( + k, _("A %s with this name already exists") % unicode(label)) return cleaned_data def update_mailbox_quotas(self, domain): diff --git a/modoboa/extensions/admin/management/commands/handle_mailbox_operations.py b/modoboa/extensions/admin/management/commands/handle_mailbox_operations.py index 49607b4fe..b0cea9d46 100644 --- a/modoboa/extensions/admin/management/commands/handle_mailbox_operations.py +++ b/modoboa/extensions/admin/management/commands/handle_mailbox_operations.py @@ -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 diff --git a/modoboa/extensions/admin/migrations/0001_initial.py b/modoboa/extensions/admin/migrations/0001_initial.py index e36bb068f..ed6048142 100644 --- a/modoboa/extensions/admin/migrations/0001_initial.py +++ b/modoboa/extensions/admin/migrations/0001_initial.py @@ -1,127 +1,161 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'Domain' - db.create_table('admin_domain', ( - ('quota', self.gf('django.db.models.fields.IntegerField')()), - ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=100)), - )) - db.send_create_signal('admin', ['Domain']) +class Migration(migrations.Migration): - # Adding model 'Mailbox' - db.create_table('admin_mailbox', ( - ('domain', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Domain'])), - ('name', self.gf('django.db.models.fields.CharField')(max_length=100)), - ('quota', self.gf('django.db.models.fields.IntegerField')()), - ('full_address', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('gid', self.gf('django.db.models.fields.IntegerField')()), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - ('address', self.gf('django.db.models.fields.CharField')(max_length=100)), - ('path', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('password', self.gf('django.db.models.fields.CharField')(max_length=100)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('uid', self.gf('django.db.models.fields.IntegerField')()), - )) - db.send_create_signal('admin', ['Mailbox']) + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] - # Adding model 'Alias' - db.create_table('admin_alias', ( - ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), - ('mbox', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Mailbox'])), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('full_address', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('address', self.gf('django.db.models.fields.CharField')(max_length=100)), - )) - db.send_create_signal('admin', ['Alias']) - - def backwards(self, orm): - - # Deleting model 'Domain' - db.delete_table('admin_domain') - - # Deleting model 'Mailbox' - db.delete_table('admin_mailbox') - - # Deleting model 'Alias' - db.delete_table('admin_alias') - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']"}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User', 'db_table': "'auth_user'"}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] + operations = [ + migrations.CreateModel( + name='Alias', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('address', models.CharField(help_text="The alias address (without the domain part). For a 'catch-all' address, just enter an * character.", max_length=254, verbose_name='address')), + ('extmboxes', models.TextField(blank=True)), + ('enabled', models.BooleanField(default=True, help_text='Check to activate this alias', verbose_name='enabled')), + ('aliases', models.ManyToManyField(help_text='The aliases this alias points to', to='admin.Alias')), + ], + options={ + 'ordering': ['domain__name', 'address'], + 'permissions': (('view_aliases', 'View aliases'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Domain', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='The domain name', unique=True, max_length=100, verbose_name='name')), + ('quota', models.IntegerField()), + ('enabled', models.BooleanField(default=True, help_text='Check to activate this domain', verbose_name='enabled')), + ], + options={ + 'ordering': ['name'], + 'permissions': (('view_domain', 'View domain'), ('view_domains', 'View domains')), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='DomainAlias', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='The alias name', unique=True, max_length=100, verbose_name='name')), + ('enabled', models.BooleanField(default=True, help_text='Check to activate this alias', verbose_name='enabled')), + ], + options={ + 'permissions': (('view_domaliases', 'View domain aliases'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Mailbox', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('address', models.CharField(help_text='Mailbox address (without the @domain.tld part)', max_length=252, verbose_name='address')), + ('quota', models.PositiveIntegerField()), + ('use_domain_quota', models.BooleanField(default=False)), + ], + options={ + 'permissions': (('view_mailboxes', 'View mailboxes'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='MailboxOperation', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('type', models.CharField(max_length=20, choices=[(b'rename', b'rename'), (b'delete', b'delete')])), + ('argument', models.TextField()), + ('mailbox', models.ForeignKey(blank=True, to='admin.Mailbox', null=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ObjectDates', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('creation', models.DateTimeField(auto_now_add=True)), + ('last_modification', models.DateTimeField(auto_now=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Quota', + fields=[ + ('username', models.EmailField(max_length=254, serialize=False, primary_key=True)), + ('bytes', models.BigIntegerField(default=0)), + ('messages', models.IntegerField(default=0)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='mailbox', + name='dates', + field=models.ForeignKey(to='admin.ObjectDates'), + preserve_default=True, + ), + migrations.AddField( + model_name='mailbox', + name='domain', + field=models.ForeignKey(to='admin.Domain'), + preserve_default=True, + ), + migrations.AddField( + model_name='mailbox', + name='user', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + preserve_default=True, + ), + migrations.AddField( + model_name='domainalias', + name='dates', + field=models.ForeignKey(to='admin.ObjectDates'), + preserve_default=True, + ), + migrations.AddField( + model_name='domainalias', + name='target', + field=models.ForeignKey(verbose_name='target', to='admin.Domain', help_text='The domain this alias points to'), + preserve_default=True, + ), + migrations.AddField( + model_name='domain', + name='dates', + field=models.ForeignKey(to='admin.ObjectDates'), + preserve_default=True, + ), + migrations.AddField( + model_name='alias', + name='dates', + field=models.ForeignKey(to='admin.ObjectDates'), + preserve_default=True, + ), + migrations.AddField( + model_name='alias', + name='domain', + field=models.ForeignKey(to='admin.Domain'), + preserve_default=True, + ), + migrations.AddField( + model_name='alias', + name='mboxes', + field=models.ManyToManyField(help_text='The mailboxes this alias points to', to='admin.Mailbox', verbose_name='mailboxes'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='alias', + unique_together=set([('address', 'domain')]), + ), + ] diff --git a/modoboa/extensions/admin/migrations/0002_auto__del_field_alias_mbox.py b/modoboa/extensions/admin/migrations/0002_auto__del_field_alias_mbox.py deleted file mode 100644 index c9e11d33e..000000000 --- a/modoboa/extensions/admin/migrations/0002_auto__del_field_alias_mbox.py +++ /dev/null @@ -1,105 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - no_dry_run = True - - def forwards(self, orm): - - # Adding M2M table for field mboxes on 'Alias' - db.create_table('admin_alias_mboxes', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('alias', models.ForeignKey(orm['admin.alias'], null=False)), - ('mailbox', models.ForeignKey(orm['admin.mailbox'], null=False)) - )) - db.create_unique('admin_alias_mboxes', ['alias_id', 'mailbox_id']) - - for alias in orm.Alias.objects.all(): - alias.mboxes.add(alias.mbox_id) - alias.save() - - # Deleting field 'Alias.mbox' - db.delete_column('admin_alias', 'mbox_id') - - def backwards(self, orm): - - # Adding field 'Alias.mbox' - db.add_column('admin_alias', 'mbox', self.gf('django.db.models.fields.related.ForeignKey')(default=-1, to=orm['admin.Mailbox']), keep_default=False) - - # Removing M2M table for field mboxes on 'Alias' - db.delete_table('admin_alias_mboxes') - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']"}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0003_auto__add_extension.py b/modoboa/extensions/admin/migrations/0003_auto__add_extension.py deleted file mode 100644 index 2d3b82afc..000000000 --- a/modoboa/extensions/admin/migrations/0003_auto__add_extension.py +++ /dev/null @@ -1,101 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'Extension' - db.create_table('admin_extension', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=150)), - ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)), - )) - db.send_create_signal('admin', ['Extension']) - - - def backwards(self, orm): - - # Deleting model 'Extension' - db.delete_table('admin_extension') - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0004_add_permissions.py b/modoboa/extensions/admin/migrations/0004_add_permissions.py deleted file mode 100644 index 57fbea7d6..000000000 --- a/modoboa/extensions/admin/migrations/0004_add_permissions.py +++ /dev/null @@ -1,100 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -#from django.contrib.auth.models import Permission -#from django.contrib.contenttypes.models import ContentType - - -class Migration(DataMigration): - - def forwards(self, orm): - #perm_ct = ContentType.objects.get(app_label="auth", model="permission") - perm_ct = orm["contenttypes.ContentType"].objects.get(app_label="auth", model="permission") - view_perms = orm['auth.Permission']( - name="View permissions", codename="view_permissions", - content_type=perm_ct - ) - view_perms.save() - - def backwards(self, orm): - p = orm['auth.Permission'].objects.get(codename="view_permissions") - p.delete() - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin', 'contenttypes'] diff --git a/modoboa/extensions/admin/migrations/0005_increase_columns_length.py b/modoboa/extensions/admin/migrations/0005_increase_columns_length.py deleted file mode 100644 index be4adc771..000000000 --- a/modoboa/extensions/admin/migrations/0005_increase_columns_length.py +++ /dev/null @@ -1,91 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - db.alter_column('auth_user', "username", models.CharField(unique=True, max_length=254)) - db.alter_column('auth_user', "email", models.CharField(max_length=254)) - - def backwards(self, orm): - raise RuntimeError("Cannot revert this migration") - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0006_auto__add_domainalias.py b/modoboa/extensions/admin/migrations/0006_auto__add_domainalias.py deleted file mode 100644 index d8652c116..000000000 --- a/modoboa/extensions/admin/migrations/0006_auto__add_domainalias.py +++ /dev/null @@ -1,113 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'DomainAlias' - db.create_table('admin_domainalias', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)), - ('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Domain'])), - ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False)), - )) - db.send_create_signal('admin', ['DomainAlias']) - - def backwards(self, orm): - - # Deleting model 'DomainAlias' - db.delete_table('admin_domainalias') - - grp = orm["auth.Group"].objects.get(name="DomainAdmins") - for pcode in ["view_domaliases", "add_domainalias", "change_domainalias", - "delete_domainalias"]: - grp.permissions.remove(orm["auth.Permissions"].objects.get(codename=pcode)) - grp.save() - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0007_auto__del_field_alias_full_address__chg_field_alias_address__del_field.py b/modoboa/extensions/admin/migrations/0007_auto__del_field_alias_full_address__chg_field_alias_address__del_field.py deleted file mode 100644 index 5f1ff1c57..000000000 --- a/modoboa/extensions/admin/migrations/0007_auto__del_field_alias_full_address__chg_field_alias_address__del_field.py +++ /dev/null @@ -1,113 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Deleting field 'Alias.full_address' - db.delete_column('admin_alias', 'full_address') - - # Changing field 'Alias.address' - db.alter_column('admin_alias', 'address', self.gf('django.db.models.fields.CharField')(max_length=254)) - - # Deleting field 'Mailbox.full_address' - db.delete_column('admin_mailbox', 'full_address') - - - def backwards(self, orm): - - # User chose to not deal with backwards NULL issues for 'Alias.full_address' - raise RuntimeError("Cannot reverse this migration. 'Alias.full_address' and its values cannot be restored.") - - # Changing field 'Alias.address' - db.alter_column('admin_alias', 'address', self.gf('django.db.models.fields.CharField')(max_length=100)) - - # User chose to not deal with backwards NULL issues for 'Mailbox.full_address' - raise RuntimeError("Cannot reverse this migration. 'Mailbox.full_address' and its values cannot be restored.") - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0008_update_mailbox_path.py b/modoboa/extensions/admin/migrations/0008_update_mailbox_path.py deleted file mode 100644 index d38f0f85c..000000000 --- a/modoboa/extensions/admin/migrations/0008_update_mailbox_path.py +++ /dev/null @@ -1,98 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - for mb in orm.Mailbox.objects.all(): - mb.path = mb.path.replace(mb.domain.name + "/", "", 1) - mb.save() - - - def backwards(self, orm): - raise RuntimeError("Cannot revert this migration") - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0009_auto__add_field_alias_extmboxes.py b/modoboa/extensions/admin/migrations/0009_auto__add_field_alias_extmboxes.py deleted file mode 100644 index 0d3a8a02e..000000000 --- a/modoboa/extensions/admin/migrations/0009_auto__add_field_alias_extmboxes.py +++ /dev/null @@ -1,104 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding field 'Alias.extmboxes' - db.add_column('admin_alias', 'extmboxes', self.gf('django.db.models.fields.TextField')(default='', blank=True), keep_default=False) - db.add_column('admin_alias', 'domain', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Domain'], default=-1)) - - - def backwards(self, orm): - - # Deleting field 'Alias.extmboxes' - db.delete_column('admin_alias', 'extmboxes') - db.delete_column('admin_alias', 'domain') - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0010_fill_alias_domain.py b/modoboa/extensions/admin/migrations/0010_fill_alias_domain.py deleted file mode 100644 index fc5ceeb34..000000000 --- a/modoboa/extensions/admin/migrations/0010_fill_alias_domain.py +++ /dev/null @@ -1,101 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for alias in orm.Alias.objects.all(): - alias.domain = alias.mboxes.all()[0].domain - alias.save() - - def backwards(self, orm): - "Write your backwards methods here." - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0011_auto__add_objectdates__add_field_domain_dates__add_field_domainalias_d.py b/modoboa/extensions/admin/migrations/0011_auto__add_objectdates__add_field_domain_dates__add_field_domainalias_d.py deleted file mode 100644 index 52f8812c3..000000000 --- a/modoboa/extensions/admin/migrations/0011_auto__add_objectdates__add_field_domain_dates__add_field_domainalias_d.py +++ /dev/null @@ -1,142 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'ObjectDates' - db.create_table('admin_objectdates', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('creation', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('last_modification', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), - )) - db.send_create_signal('admin', ['ObjectDates']) - - # Adding field 'Domain.dates' - db.add_column('admin_domain', 'dates', self.gf('django.db.models.fields.related.ForeignKey')(default=-1, to=orm['admin.ObjectDates']), keep_default=False) - - # Adding field 'DomainAlias.dates' - db.add_column('admin_domainalias', 'dates', self.gf('django.db.models.fields.related.ForeignKey')(default=-1, to=orm['admin.ObjectDates']), keep_default=False) - - # Adding field 'Alias.dates' - db.add_column('admin_alias', 'dates', self.gf('django.db.models.fields.related.ForeignKey')(default=-1, to=orm['admin.ObjectDates']), keep_default=False) - - # Adding field 'Mailbox.dates' - db.add_column('admin_mailbox', 'dates', self.gf('django.db.models.fields.related.ForeignKey')(default=-1, to=orm['admin.ObjectDates']), keep_default=False) - - - def backwards(self, orm): - - # Deleting model 'ObjectDates' - db.delete_table('admin_objectdates') - - # Deleting field 'Domain.dates' - db.delete_column('admin_domain', 'dates_id') - - # Deleting field 'DomainAlias.dates' - db.delete_column('admin_domainalias', 'dates_id') - - # Deleting field 'Alias.dates' - db.delete_column('admin_alias', 'dates_id') - - # Deleting field 'Mailbox.dates' - db.delete_column('admin_mailbox', 'dates_id') - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0012_fill_object_dates.py b/modoboa/extensions/admin/migrations/0012_fill_object_dates.py deleted file mode 100644 index 23fc740b8..000000000 --- a/modoboa/extensions/admin/migrations/0012_fill_object_dates.py +++ /dev/null @@ -1,122 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -def create_od(orm, obj): - od = orm.ObjectDates() - od.save() - obj.dates = od - obj.save() - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for domain in orm.Domain.objects.all(): - create_od(orm, domain) - for domalias in orm.DomainAlias.objects.all(): - create_od(orm, domainalias) - for mbox in orm.Mailbox.objects.all(): - create_od(orm, mbox) - for mbalias in orm.Alias.objects.all(): - create_od(orm, mbalias) - - def backwards(self, orm): - "Write your backwards methods here." - orm.ObjectDates.objects.all().delete() - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['admin.ObjectDates']", 'unique': 'True'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['admin.ObjectDates']", 'unique': 'True'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['admin.ObjectDates']", 'unique': 'True'}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['admin.ObjectDates']", 'unique': 'True'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0013_update_mailbox_path.py b/modoboa/extensions/admin/migrations/0013_update_mailbox_path.py deleted file mode 100644 index 1f4dc201e..000000000 --- a/modoboa/extensions/admin/migrations/0013_update_mailbox_path.py +++ /dev/null @@ -1,111 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for mb in orm.Mailbox.objects.all(): - mb.path = "%s/" % mb.address - mb.save() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot reverse this migration.") - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0014_auto__add_unique_domain_name.py b/modoboa/extensions/admin/migrations/0014_auto__add_unique_domain_name.py deleted file mode 100644 index 829fc4a7b..000000000 --- a/modoboa/extensions/admin/migrations/0014_auto__add_unique_domain_name.py +++ /dev/null @@ -1,113 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding unique constraint on 'Domain', fields ['name'] - db.create_unique('admin_domain', ['name']) - - - def backwards(self, orm): - - # Removing unique constraint on 'Domain', fields ['name'] - db.delete_unique('admin_domain', ['name']) - - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0015_move_passwords.py b/modoboa/extensions/admin/migrations/0015_move_passwords.py deleted file mode 100644 index 8b32209ed..000000000 --- a/modoboa/extensions/admin/migrations/0015_move_passwords.py +++ /dev/null @@ -1,120 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from modoboa.lib.models import Parameter -from modoboa.lib.db_utils import db_table_exists - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - if not db_table_exists("lib_parameter"): - return - try: - s = Parameter.objects.get(name='admin.PASSWORD_SCHEME').value - except Parameter.DoesNotExist: - s = "crypt" - - for mb in orm.Mailbox.objects.all(): - mb.user.password = '{%s}%s' % (s.upper(), mb.password) - mb.user.save() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot reverse this migration.") - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin', 'auth'] diff --git a/modoboa/extensions/admin/migrations/0016_auto__add_objectaccess__add_unique_objectaccess_user_content_type_obje.py b/modoboa/extensions/admin/migrations/0016_auto__add_objectaccess__add_unique_objectaccess_user_content_type_obje.py deleted file mode 100644 index 81b6701c3..000000000 --- a/modoboa/extensions/admin/migrations/0016_auto__add_objectaccess__add_unique_objectaccess_user_content_type_obje.py +++ /dev/null @@ -1,131 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'ObjectAccess' - db.create_table('admin_objectaccess', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - ('content_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['contenttypes.ContentType'])), - ('object_id', self.gf('django.db.models.fields.PositiveIntegerField')()), - ('is_owner', self.gf('django.db.models.fields.BooleanField')(default=False)), - )) - db.send_create_signal('admin', ['ObjectAccess']) - - # Adding unique constraint on 'ObjectAccess', fields ['user', 'content_type', 'object_id'] - db.create_unique('admin_objectaccess', ['user_id', 'content_type_id', 'object_id']) - - # Deleting field 'Mailbox.password' - db.delete_column('admin_mailbox', 'password') - - # Deleting field 'Mailbox.name' - db.delete_column('admin_mailbox', 'name') - - def backwards(self, orm): - raise RuntimeError("Cannot reverse this migration.") - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']" }) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0017_set_permissions.py b/modoboa/extensions/admin/migrations/0017_set_permissions.py deleted file mode 100644 index 9242f6838..000000000 --- a/modoboa/extensions/admin/migrations/0017_set_permissions.py +++ /dev/null @@ -1,175 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.core.exceptions import ObjectDoesNotExist - - -class Migration(DataMigration): - - def grant_access(self, orm, user, ct, obj, is_owner=False): - objaccess = orm["admin.ObjectAccess"]( - user=user, content_type=ct, object_id=obj.id - ) - objaccess.is_owner = is_owner - objaccess.save() - - def forwards(self, orm): - superusers = orm['auth.User'].objects.filter(is_superuser=True) - if not len(superusers): - # Empty db, nothing to do - return - - # 1: all superadmins must be able to access every defined - # object. (user, domain, domain alias, mailbox, alias) - try: - uct = orm['contenttypes.ContentType'].objects.get( - app_label='auth', model='user' - ) - except ObjectDoesNotExist: - uct = orm['contenttypes.ContentType']( - name='user', app_label='auth', model='user' - ) - uct.save() - for account in orm['auth.User'].objects.all(): - for i, su in enumerate(superusers): - self.grant_access(orm, su, uct, account, i == 0) - domct = orm['contenttypes.ContentType'].objects.get( - app_label='admin', model='domain' - ) - for dom in orm["admin.Domain"].objects.all(): - for i, su in enumerate(superusers): - self.grant_access(orm, su, domct, dom, i == 0) - dalct = orm['contenttypes.ContentType'].objects.get( - app_label='admin', model='domainalias' - ) - for domalias in orm["admin.DomainAlias"].objects.all(): - for i, su in enumerate(superusers): - self.grant_access(orm, su, dalct, domalias, i == 0) - mbct = orm['contenttypes.ContentType'].objects.get( - app_label='admin', model='mailbox' - ) - for mb in orm["admin.Mailbox"].objects.all(): - for i, su in enumerate(superusers): - self.grant_access(orm, su, mbct, mb, i == 0) - alct = orm['contenttypes.ContentType'].objects.get( - app_label='admin', model='alias' - ) - for alias in orm["admin.Alias"].objects.all(): - for i, su in enumerate(superusers): - self.grant_access(orm, su, alct, alias, i == 0) - - # 2: domain admins must have access to their domain's content - for da in orm['auth.User'].objects.filter(groups__name='DomainAdmins'): - dom = da.mailbox_set.all()[0].domain - self.grant_access(orm, da, domct, dom) - - for mb in dom.mailbox_set.all(): - self.grant_access(orm, da, mbct, mb) - self.grant_access(orm, da, uct, mb.user) - for al in dom.alias_set.all(): - self.grant_access(orm, da, alct, al) - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - 'admin.alias': { - 'Meta': {'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['contenttypes', 'admin'] diff --git a/modoboa/extensions/admin/migrations/0018_auto__add_unique_alias_domain_address.py b/modoboa/extensions/admin/migrations/0018_auto__add_unique_alias_domain_address.py deleted file mode 100644 index b4f7c03cb..000000000 --- a/modoboa/extensions/admin/migrations/0018_auto__add_unique_alias_domain_address.py +++ /dev/null @@ -1,119 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding unique constraint on 'Alias', fields ['domain', 'address'] - db.create_unique('admin_alias', ['domain_id', 'address']) - - - def backwards(self, orm): - - # Removing unique constraint on 'Alias', fields ['domain', 'address'] - db.delete_unique('admin_alias', ['domain_id', 'address']) - - - models = { - 'admin.alias': { - 'Meta': {'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0019_set_default_group.py b/modoboa/extensions/admin/migrations/0019_set_default_group.py deleted file mode 100644 index 7af4cd3fa..000000000 --- a/modoboa/extensions/admin/migrations/0019_set_default_group.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - try: - sugroup = orm["auth.Group"].objects.get(name="SimpleUsers") - except orm["auth.Group"].DoesNotExist: - sugroup = orm["auth.Group"](name="SimpleUsers") - sugroup.save() - for account in orm['auth.User'].objects.all(): - if not len(account.groups.all()): - account.groups.add(sugroup) - account.save() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot reverse this migration") - - - models = { - 'admin.alias': { - 'Meta': {'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0020_rename_amavis_ext.py b/modoboa/extensions/admin/migrations/0020_rename_amavis_ext.py deleted file mode 100644 index c0d69f544..000000000 --- a/modoboa/extensions/admin/migrations/0020_rename_amavis_ext.py +++ /dev/null @@ -1,127 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.core.exceptions import ObjectDoesNotExist - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - try: - ext = orm["admin.Extension"].objects.get(name="amavis_quarantine") - except ObjectDoesNotExist: - return - ext.name = "amavis" - ext.save() - - def backwards(self, orm): - "Write your backwards methods here." - try: - ext = orm["admin.Extension"].objects.get(name="amavis") - except ObjectDoesNotExist: - return - ext.name = "amavis_quarantine" - ext.save() - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0021_default_superadmin_ownership.py b/modoboa/extensions/admin/migrations/0021_default_superadmin_ownership.py deleted file mode 100644 index 58f7aeedf..000000000 --- a/modoboa/extensions/admin/migrations/0021_default_superadmin_ownership.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.core.exceptions import ObjectDoesNotExist - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - try: - su = orm['auth.User'].objects.get(pk=1) - except ObjectDoesNotExist: - return - uct = orm['contenttypes.ContentType'].objects.get( - app_label='auth', model='user' - ) - su.objectaccess_set.filter(content_type=uct, object_id=1).update(is_owner=True) - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['contenttypes', 'admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0022_auto__del_field_mailbox_uid__del_field_mailbox_gid__del_field_mailbox_.py b/modoboa/extensions/admin/migrations/0022_auto__del_field_mailbox_uid__del_field_mailbox_gid__del_field_mailbox_.py deleted file mode 100644 index e83be9f87..000000000 --- a/modoboa/extensions/admin/migrations/0022_auto__del_field_mailbox_uid__del_field_mailbox_gid__del_field_mailbox_.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Deleting field 'Mailbox.uid' - db.delete_column('admin_mailbox', 'uid') - - # Deleting field 'Mailbox.gid' - db.delete_column('admin_mailbox', 'gid') - - # Deleting field 'Mailbox.path' - db.delete_column('admin_mailbox', 'path') - - - def backwards(self, orm): - - # User chose to not deal with backwards NULL issues for 'Mailbox.uid' - raise RuntimeError("Cannot reverse this migration. 'Mailbox.uid' and its values cannot be restored.") - - # User chose to not deal with backwards NULL issues for 'Mailbox.gid' - raise RuntimeError("Cannot reverse this migration. 'Mailbox.gid' and its values cannot be restored.") - - # User chose to not deal with backwards NULL issues for 'Mailbox.path' - raise RuntimeError("Cannot reverse this migration. 'Mailbox.path' and its values cannot be restored.") - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0023_auto__add_quota.py b/modoboa/extensions/admin/migrations/0023_auto__add_quota.py deleted file mode 100644 index f386d38a9..000000000 --- a/modoboa/extensions/admin/migrations/0023_auto__add_quota.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Quota' - db.create_table('admin_quota', ( - ('username', self.gf('django.db.models.fields.EmailField')(max_length=75, primary_key=True)), - ('bytes', self.gf('django.db.models.fields.IntegerField')(default=0)), - ('messages', self.gf('django.db.models.fields.IntegerField')(default=0)), - )) - db.send_create_signal('admin', ['Quota']) - - - def backwards(self, orm): - # Deleting model 'Quota' - db.delete_table('admin_quota') - - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0024_create_quotas.py b/modoboa/extensions/admin/migrations/0024_create_quotas.py deleted file mode 100644 index 308350b1d..000000000 --- a/modoboa/extensions/admin/migrations/0024_create_quotas.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for mb in orm["admin.Mailbox"].objects.all(): - orm["admin.Quota"].objects.create(username="%s@%s" % (mb.address, mb.domain.name)) - - def backwards(self, orm): - "Write your backwards methods here." - orm["admin.Quota"].objects.all().delete() - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0025_auto__add_field_quota_mbox.py b/modoboa/extensions/admin/migrations/0025_auto__add_field_quota_mbox.py deleted file mode 100644 index 2cc877617..000000000 --- a/modoboa/extensions/admin/migrations/0025_auto__add_field_quota_mbox.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'Quota.mbox' - db.add_column(u'admin_quota', 'mbox', - self.gf('django.db.models.fields.related.OneToOneField')(related_name='quota_value', unique=True, null=True, to=orm['admin.Mailbox']), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'Quota.mbox' - db.delete_column(u'admin_quota', 'mbox_id') - - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0026_set_quota_mbox.py b/modoboa/extensions/admin/migrations/0026_set_quota_mbox.py deleted file mode 100644 index f25fcd261..000000000 --- a/modoboa/extensions/admin/migrations/0026_set_quota_mbox.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for mb in orm["admin.Mailbox"].objects.all(): - q = orm["admin.Quota"].objects.get(username="%s@%s" % (mb.address, mb.domain.name)) - q.mbox = mb - q.save() - - def backwards(self, orm): - "Write your backwards methods here." - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0027_auto__add_field_mailbox_use_domain_quota.py b/modoboa/extensions/admin/migrations/0027_auto__add_field_mailbox_use_domain_quota.py deleted file mode 100644 index 9fc0d74af..000000000 --- a/modoboa/extensions/admin/migrations/0027_auto__add_field_mailbox_use_domain_quota.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'Mailbox.use_domain_quota' - db.add_column(u'admin_mailbox', 'use_domain_quota', - self.gf('django.db.models.fields.BooleanField')(default=False), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'Mailbox.use_domain_quota' - db.delete_column(u'admin_mailbox', 'use_domain_quota') - - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0028_auto__chg_field_mailbox_quota.py b/modoboa/extensions/admin/migrations/0028_auto__chg_field_mailbox_quota.py deleted file mode 100644 index 0461260cf..000000000 --- a/modoboa/extensions/admin/migrations/0028_auto__chg_field_mailbox_quota.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Mailbox.quota' - db.alter_column(u'admin_mailbox', 'quota', self.gf('django.db.models.fields.PositiveIntegerField')()) - - def backwards(self, orm): - - # Changing field 'Mailbox.quota' - db.alter_column(u'admin_mailbox', 'quota', self.gf('django.db.models.fields.IntegerField')()) - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0029_auto__add_user__chg_field_mailbox_user__chg_field_objectaccess_user.py b/modoboa/extensions/admin/migrations/0029_auto__add_user__chg_field_mailbox_user__chg_field_objectaccess_user.py deleted file mode 100644 index d1934ef32..000000000 --- a/modoboa/extensions/admin/migrations/0029_auto__add_user__chg_field_mailbox_user__chg_field_objectaccess_user.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - db.rename_table('auth_user', 'admin_user') - db.rename_table('auth_user_groups', 'admin_user_groups') - db.rename_table('auth_user_user_permissions', 'admin_user_user_permissions') - db.send_create_signal('admin', ['User']) - - # Changing field 'Mailbox.user' - db.alter_column(u'admin_mailbox', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - # Changing field 'ObjectAccess.user' - db.alter_column(u'admin_objectaccess', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - - def backwards(self, orm): - raise RuntimeError("Cannot revert this migration") - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0030_update_permissions.py b/modoboa/extensions/admin/migrations/0030_update_permissions.py deleted file mode 100644 index 2d1a52b09..000000000 --- a/modoboa/extensions/admin/migrations/0030_update_permissions.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - try: - orig_ct = orm["contenttypes.ContentType"].objects.get(app_label="auth", name="user") - except orm["contenttypes.ContentType"].DoesNotExist: - return - new_ct = orm["contenttypes.ContentType"].objects.get(app_label="admin", name="user") - orm["auth.Permission"].objects.filter(content_type=orig_ct).update(content_type=new_ct) - orig_ct.delete() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin', 'auth', 'contenttypes'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0031_auto__add_aliases_to_alias.py b/modoboa/extensions/admin/migrations/0031_auto__add_aliases_to_alias.py deleted file mode 100644 index 491f06122..000000000 --- a/modoboa/extensions/admin/migrations/0031_auto__add_aliases_to_alias.py +++ /dev/null @@ -1,128 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding M2M table for field aliases on 'Alias' - db.create_table(u'admin_alias_aliases', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('from_alias', models.ForeignKey(orm[u'admin.alias'], null=False)), - ('to_alias', models.ForeignKey(orm[u'admin.alias'], null=False)) - )) - db.create_unique(u'admin_alias_aliases', ['from_alias_id', 'to_alias_id']) - - - def backwards(self, orm): - # Removing M2M table for field aliases on 'Alias' - db.delete_table('admin_alias_aliases') - - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0032_auto__chg_field_quota_bytes.py b/modoboa/extensions/admin/migrations/0032_auto__chg_field_quota_bytes.py deleted file mode 100644 index 913fd74e8..000000000 --- a/modoboa/extensions/admin/migrations/0032_auto__chg_field_quota_bytes.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Quota.bytes' - db.alter_column(u'admin_quota', 'bytes', self.gf('django.db.models.fields.BigIntegerField')()) - - def backwards(self, orm): - - # Changing field 'Quota.bytes' - db.alter_column(u'admin_quota', 'bytes', self.gf('django.db.models.fields.IntegerField')()) - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0033_auto__chg_field_mailbox_address__chg_field_quota_username.py b/modoboa/extensions/admin/migrations/0033_auto__chg_field_mailbox_address__chg_field_quota_username.py deleted file mode 100644 index 9d86a9a5c..000000000 --- a/modoboa/extensions/admin/migrations/0033_auto__chg_field_mailbox_address__chg_field_quota_username.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Mailbox.address' - db.alter_column(u'admin_mailbox', 'address', self.gf('django.db.models.fields.CharField')(max_length=252)) - - # Changing field 'Quota.username' - db.alter_column(u'admin_quota', 'username', self.gf('django.db.models.fields.EmailField')(max_length=254, primary_key=True)) - - def backwards(self, orm): - - # Changing field 'Mailbox.address' - db.alter_column(u'admin_mailbox', 'address', self.gf('django.db.models.fields.CharField')(max_length=100)) - - # Changing field 'Quota.username' - db.alter_column(u'admin_quota', 'username', self.gf('django.db.models.fields.EmailField')(max_length=75, primary_key=True)) - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0034_auto__add_field_user_is_local.py b/modoboa/extensions/admin/migrations/0034_auto__add_field_user_is_local.py deleted file mode 100644 index 5b4a89e50..000000000 --- a/modoboa/extensions/admin/migrations/0034_auto__add_field_user_is_local.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'User.is_local' - db.add_column('admin_user', 'is_local', - self.gf('django.db.models.fields.BooleanField')(default=True), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'User.is_local' - db.delete_column('admin_user', 'is_local') - - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0035_set_local_flag.py b/modoboa/extensions/admin/migrations/0035_set_local_flag.py deleted file mode 100644 index 145b6e9b7..000000000 --- a/modoboa/extensions/admin/migrations/0035_set_local_flag.py +++ /dev/null @@ -1,127 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..." - for user in orm['admin.User'].objects.all(): - if user.password != '!': - continue - user.is_local = False - user.save() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0036_auto__add_mailboxoperation.py b/modoboa/extensions/admin/migrations/0036_auto__add_mailboxoperation.py deleted file mode 100644 index f59c90677..000000000 --- a/modoboa/extensions/admin/migrations/0036_auto__add_mailboxoperation.py +++ /dev/null @@ -1,137 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'MailboxOperation' - db.create_table(u'admin_mailboxoperation', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('mailbox', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Mailbox'], null=True, blank=True)), - ('type', self.gf('django.db.models.fields.CharField')(max_length=20)), - ('argument', self.gf('django.db.models.fields.TextField')()), - )) - db.send_create_signal(u'admin', ['MailboxOperation']) - - - def backwards(self, orm): - # Deleting model 'MailboxOperation' - db.delete_table(u'admin_mailboxoperation') - - - models = { - u'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}) - }, - u'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': u"orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0037_rename_tables.py b/modoboa/extensions/admin/migrations/0037_rename_tables.py deleted file mode 100644 index 6b08aabd7..000000000 --- a/modoboa/extensions/admin/migrations/0037_rename_tables.py +++ /dev/null @@ -1,145 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - depends_on = ( - ('core', '0001_initial'), - ) - - def forwards(self, orm): - db.rename_table('admin_user', 'core_user') - # Changing field 'Mailbox.user' - db.alter_column(u'admin_mailbox', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.User'])) - - db.rename_table('admin_objectaccess', 'core_objectaccess') - db.alter_column(u'core_objectaccess', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.User'])) - - db.rename_table('admin_user_groups', 'core_user_groups') - db.rename_table('admin_user_user_permissions', 'core_user_user_permissions') - - db.rename_table('admin_extension', 'core_extension') - - def backwards(self, orm): - db.rename_table('core_user', 'admin_user') - # Changing field 'Mailbox.user' - db.alter_column(u'admin_mailbox', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - - db.rename_table('core_objectaccess', 'admin_objectaccess') - db.alter_column(u'admin_objectaccess', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - - db.rename_table('core_user_groups', 'admin_user_groups') - db.rename_table('core_user_user_permissions', 'admin_user_user_permissions') - - db.rename_table('core_extension', 'admin_extension') - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': "orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['admin'] diff --git a/modoboa/extensions/admin/migrations/0038_auto__add_field_mailbox_quota_value__del_field_quota_mbox.py b/modoboa/extensions/admin/migrations/0038_auto__add_field_mailbox_quota_value__del_field_quota_mbox.py deleted file mode 100644 index aacb7383a..000000000 --- a/modoboa/extensions/admin/migrations/0038_auto__add_field_mailbox_quota_value__del_field_quota_mbox.py +++ /dev/null @@ -1,135 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'Mailbox.quota_value' - db.add_column(u'admin_mailbox', 'quota_value', - self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Quota'], null=True), - keep_default=False) - - # Deleting field 'Quota.mbox' - db.delete_column(u'admin_quota', 'mbox_id') - - - def backwards(self, orm): - # Deleting field 'Mailbox.quota_value' - db.delete_column(u'admin_mailbox', 'quota_value_id') - - # Adding field 'Quota.mbox' - db.add_column(u'admin_quota', 'mbox', - self.gf('django.db.models.fields.related.OneToOneField')(related_name='quota_value', unique=True, null=True, to=orm['admin.Mailbox']), - keep_default=False) - - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'quota_value': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Quota']", 'null': 'True'}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0039_set_mailbox_quota_value.py b/modoboa/extensions/admin/migrations/0039_set_mailbox_quota_value.py deleted file mode 100644 index bd42e28ee..000000000 --- a/modoboa/extensions/admin/migrations/0039_set_mailbox_quota_value.py +++ /dev/null @@ -1,130 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - for mailbox in orm.Mailbox.objects.all(): - quota, created = orm.Quota.objects.get_or_create( - pk="%s@%s" % (mailbox.address, mailbox.domain.name) - ) - mailbox.quota_value = quota - mailbox.save() - - def backwards(self, orm): - "Write your backwards methods here." - for mailbox in orm.Mailbox.objects.all(): - mailbox.quota_value = None - mailbox.save() - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'quota_value': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Quota']", 'null': 'True'}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['admin'] - symmetrical = True diff --git a/modoboa/extensions/admin/migrations/0040_auto__chg_field_mailbox_quota_value.py b/modoboa/extensions/admin/migrations/0040_auto__chg_field_mailbox_quota_value.py deleted file mode 100644 index 7aebef23d..000000000 --- a/modoboa/extensions/admin/migrations/0040_auto__chg_field_mailbox_quota_value.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Mailbox.quota_value' - db.alter_column(u'admin_mailbox', 'quota_value_id', self.gf('django.db.models.fields.related.ForeignKey')(default=0, to=orm['admin.Quota'])) - - def backwards(self, orm): - - # Changing field 'Mailbox.quota_value' - db.alter_column(u'admin_mailbox', 'quota_value_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Quota'], null=True)) - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'quota_value': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Quota']"}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0041_auto__chg_field_mailbox_quota_value__add_unique_mailbox_quota_value.py b/modoboa/extensions/admin/migrations/0041_auto__chg_field_mailbox_quota_value__add_unique_mailbox_quota_value.py deleted file mode 100644 index 9bc6a8f19..000000000 --- a/modoboa/extensions/admin/migrations/0041_auto__chg_field_mailbox_quota_value__add_unique_mailbox_quota_value.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Mailbox.quota_value' - db.alter_column(u'admin_mailbox', 'quota_value_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['admin.Quota'], unique=True)) - # Adding unique constraint on 'Mailbox', fields ['quota_value'] - db.create_unique(u'admin_mailbox', ['quota_value_id']) - - - def backwards(self, orm): - # Removing unique constraint on 'Mailbox', fields ['quota_value'] - db.delete_unique(u'admin_mailbox', ['quota_value_id']) - - - # Changing field 'Mailbox.quota_value' - db.alter_column(u'admin_mailbox', 'quota_value_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Quota'])) - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'quota_value': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['admin.Quota']", 'unique': 'True'}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/migrations/0042_auto__del_field_mailbox_quota_value.py b/modoboa/extensions/admin/migrations/0042_auto__del_field_mailbox_quota_value.py deleted file mode 100644 index 48e6dac9e..000000000 --- a/modoboa/extensions/admin/migrations/0042_auto__del_field_mailbox_quota_value.py +++ /dev/null @@ -1,130 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Deleting field 'Mailbox.quota_value' - db.delete_column(u'admin_mailbox', 'quota_value_id') - - - def backwards(self, orm): - - # User chose to not deal with backwards NULL issues for 'Mailbox.quota_value' - raise RuntimeError("Cannot reverse this migration. 'Mailbox.quota_value' and its values cannot be restored.") - - # The following code is provided here to aid in writing a correct migration # Adding field 'Mailbox.quota_value' - db.add_column(u'admin_mailbox', 'quota_value', - self.gf('django.db.models.fields.related.OneToOneField')(to=orm['admin.Quota'], unique=True), - keep_default=False) - - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['admin'] \ No newline at end of file diff --git a/modoboa/extensions/admin/models/alias.py b/modoboa/extensions/admin/models/alias.py index 04c154603..646dab326 100644 --- a/modoboa/extensions/admin/models/alias.py +++ b/modoboa/extensions/admin/models/alias.py @@ -38,7 +38,8 @@ class Alias(AdminObject): extmboxes = models.TextField(blank=True) enabled = models.BooleanField( ugettext_lazy('enabled'), - help_text=ugettext_lazy("Check to activate this alias") + help_text=ugettext_lazy("Check to activate this alias"), + default=True ) _objectname = 'MailboxAlias' diff --git a/modoboa/extensions/admin/models/domain.py b/modoboa/extensions/admin/models/domain.py index 20b5d0c1e..8d996def4 100644 --- a/modoboa/extensions/admin/models/domain.py +++ b/modoboa/extensions/admin/models/domain.py @@ -28,14 +28,15 @@ class DomainManager(Manager): class Domain(AdminObject): - """Mail domain. - """ + """Mail domain.""" + name = models.CharField(ugettext_lazy('name'), max_length=100, unique=True, help_text=ugettext_lazy("The domain name")) quota = models.IntegerField() enabled = models.BooleanField( ugettext_lazy('enabled'), - help_text=ugettext_lazy("Check to activate this domain") + help_text=ugettext_lazy("Check to activate this domain"), + default=True ) owners = generic.GenericRelation(ObjectAccess) diff --git a/modoboa/extensions/admin/models/domain_alias.py b/modoboa/extensions/admin/models/domain_alias.py index a0ab23bfc..ba784a3cb 100644 --- a/modoboa/extensions/admin/models/domain_alias.py +++ b/modoboa/extensions/admin/models/domain_alias.py @@ -11,6 +11,9 @@ from modoboa.lib.exceptions import BadRequest, Conflict class DomainAlias(AdminObject): + + """Domain aliases.""" + name = models.CharField(ugettext_lazy("name"), max_length=100, unique=True, help_text=ugettext_lazy("The alias name")) target = models.ForeignKey( @@ -19,7 +22,8 @@ class DomainAlias(AdminObject): ) enabled = models.BooleanField( ugettext_lazy('enabled'), - help_text=ugettext_lazy("Check to activate this alias") + help_text=ugettext_lazy("Check to activate this alias"), + default=True ) class Meta: diff --git a/modoboa/extensions/admin/modo_extension.py b/modoboa/extensions/admin/modo_extension.py new file mode 100644 index 000000000..15d64de5b --- /dev/null +++ b/modoboa/extensions/admin/modo_extension.py @@ -0,0 +1,285 @@ +"""Registration with Modoboa takes place here.""" + +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext as _, ugettext_lazy + +from modoboa.core.extensions import ModoExtension, exts_pool +from modoboa.extensions.admin.models import ( + Domain, DomainAlias, Mailbox, Alias +) +from modoboa.lib import parameters, events +from modoboa.lib.email_utils import split_mailbox +from modoboa.lib.exceptions import PermDeniedException, BadRequest, Conflict + + +ADMIN_EVENTS = [ + "DomainCreated", + "DomainModified", + "DomainDeleted", + "DomainOwnershipRemoved", + "ExtraDomainEntries", + "ExtraDomainMenuEntries", + "ExtraDomainFilters", + "GetDomainActions", + "GetDomainModifyLink", + "CheckDomainName", + + "DomainAliasCreated", + "DomainAliasDeleted", + + "MailboxCreated", + "MailboxDeleted", + "MailboxModified", + + "MailboxAliasCreated", + "MailboxAliasDeleted", + + "ExtraDomainForm", + "FillDomainInstances", + + "ExtraAccountForm", + "CheckExtraAccountForm", + "FillAccountInstances", + + "ExtraDomainImportHelp", + "ImportObject" +] + +PERMISSIONS = { + "DomainAdmins": [ + ["admin", "domain", "view_domain"], + ["admin", "mailbox", "add_mailbox"], + ["admin", "mailbox", "change_mailbox"], + ["admin", "mailbox", "delete_mailbox"], + ["admin", "alias", "add_alias"], + ["admin", "alias", "change_alias"], + ["admin", "alias", "delete_alias"], + ["admin", "mailbox", "view_mailboxes"], + ["admin", "alias", "view_aliases"], + ["admin", "domainalias", "view_domaliases"], + ["admin", "domainalias", "add_domainalias"], + ["admin", "domainalias", "change_domainalias"], + ["admin", "domainalias", "delete_domainalias"] + ] +} + + +class AdminConsole(ModoExtension): + name = "admin" + label = ugettext_lazy("Administration console") + version = "1.0" + description = ugettext_lazy( + "Web based console to manage domains, accounts and aliases" + ) + always_active = True + + def load(self): + from modoboa.extensions.admin.app_settings import AdminParametersForm + parameters.register( + AdminParametersForm, ugettext_lazy("Administration")) + events.declare(ADMIN_EVENTS) + +exts_pool.register_extension(AdminConsole) + + +@events.observe("GetExtraRolePermissions") +def extra_permissions(rolename): + """Return extra permissions for :kw:`rolename`.""" + return PERMISSIONS.get(rolename, []) + + +@events.observe("ExtraUprefsRoutes") +def extra_routes(): + from django.conf.urls import url + return [ + url(r'^user/forward/', + 'modoboa.extensions.admin.views.user.forward', + name="user_forward"), + ] + + +@events.observe("AdminMenuDisplay") +def admin_menu(target, user): + if target != "top_menu": + return [] + entries = [] + if user.has_perm("admin.view_domains"): + entries += [ + {"name": "domains", + "url": reverse("admin:domain_list"), + "label": _("Domains")} + ] + if user.has_perm("core.add_user") or user.has_perm("admin.add_alias"): + entries += [ + {"name": "identities", + "url": reverse("admin:identity_list"), + "label": _("Identities")}, + ] + return entries + + +@events.observe("UserMenuDisplay") +def user_menu(target, user): + if target != "uprefs_menu": + return [] + if not user.mailbox_set.count(): + return [] + return [ + {"name": "forward", + "class": "ajaxnav", + "url": "forward/", + "label": ugettext_lazy("Forward")} + ] + + +@events.observe("RoleChanged") +def grant_access_to_all_objects(user, role): + from django.contrib.contenttypes.models import ContentType + from modoboa.lib.permissions import grant_access_to_objects + from modoboa.core.models import User + + if role != "SuperAdmins": + return + grant_access_to_objects( + user, User.objects.all(), + ContentType.objects.get_for_model(User) + ) + grant_access_to_objects( + user, Domain.objects.all(), + ContentType.objects.get_for_model(Domain) + ) + grant_access_to_objects( + user, DomainAlias.objects.all(), + ContentType.objects.get_for_model(DomainAlias) + ) + grant_access_to_objects( + user, Mailbox.objects.all(), + ContentType.objects.get_for_model(Mailbox) + ) + grant_access_to_objects( + user, Alias.objects.all(), + ContentType.objects.get_for_model(Alias) + ) + + +@events.observe("AccountExported") +def export_admin_domains(admin): + result = [admin.mailbox_set.all()[0].quota] \ + if admin.mailbox_set.count() else [''] + if admin.group != "DomainAdmins": + return result + return result + [dom.name for dom in Domain.objects.get_for_admin(admin)] + + +@events.observe("AccountImported") +def import_account_mailbox(user, account, row): + """Handle extra fields when an account is imported. + + Expected fields: + + email address; quota; [domain; ...] + + :param User user: user importing the account + :param User account: account being imported + :param list rom: list of fields (strings) + """ + account.email = row[0].strip() + if account.email: + account.save() + mailbox, domname = split_mailbox(account.email) + try: + domain = Domain.objects.get(name=domname) + except Domain.DoesNotExist: + raise BadRequest( + _("Account import failed (%s): domain does not exist" + % account.username) + ) + if not user.can_access(domain): + raise PermDeniedException + try: + mb = Mailbox.objects.get(address=mailbox, domain=domain) + except Mailbox.DoesNotExist: + pass + else: + raise Conflict(_("Mailbox %s already exists" % account.email)) + if len(row) == 1: + quota = None + else: + try: + quota = int(row[1].strip()) + except ValueError: + raise BadRequest( + _("Account import failed (%s): wrong quota value" + % account.username) + ) + use_domain_quota = True if not quota else False + mb = Mailbox(address=mailbox, domain=domain, + user=account, use_domain_quota=use_domain_quota) + mb.set_quota(quota, override_rules=user.has_perm("admin.change_domain")) + mb.save(creator=user) + if account.group == "DomainAdmins": + for domname in row[2:]: + try: + dom = Domain.objects.get(name=domname.strip()) + except Domain.DoesNotExist: + continue + dom.add_admin(account) + + +@events.observe("AccountAutoCreated") +def account_auto_created(user): + from modoboa.core.models import User + from modoboa.extensions.admin.lib import check_if_domain_exists + from modoboa.lib.permissions import grant_access_to_object + + if parameters.get_admin("AUTO_CREATE_DOMAIN_AND_MAILBOX") == "no": + return + localpart, domname = split_mailbox(user.username) + if user.group != 'SimpleUsers' and domname is None: + return + sadmins = User.objects.filter(is_superuser=True) + try: + domain = Domain.objects.get(name=domname) + except Domain.DoesNotExist: + label = check_if_domain_exists( + domname, [(DomainAlias, _('domain alias'))]) + if label is not None: + return + domain = Domain(name=domname, enabled=True, quota=0) + domain.save(creator=sadmins[0]) + for su in sadmins[1:]: + grant_access_to_object(su, domain) + try: + mb = Mailbox.objects.get(domain=domain, address=localpart) + except Mailbox.DoesNotExist: + mb = Mailbox( + address=localpart, domain=domain, user=user, use_domain_quota=True + ) + mb.set_quota(override_rules=True) + mb.save(creator=sadmins[0]) + for su in sadmins[1:]: + grant_access_to_object(su, mb) + + +@events.observe("UserLogin") +def user_logged_in(request, username, password): + from modoboa.lib.cryptutils import encrypt + + if request.user.mailbox_set.count(): + request.session["password"] = encrypt(password) + + +@events.observe("AccountDeleted") +def account_deleted(account, byuser, **kwargs): + """'AccountDeleted' listener. + + When an account is deleted, we also need to remove its mailbox (if + any). + """ + if not account.mailbox_set.count(): + return + mb = account.mailbox_set.all()[0] + if not byuser.can_access(mb): + raise PermDeniedException + keep_mb_dir = kwargs.get("keep_mb_dir", True) + mb.delete(keepdir=keep_mb_dir) diff --git a/modoboa/extensions/amavis/__init__.py b/modoboa/extensions/amavis/__init__.py index 552e006dd..e69de29bb 100644 --- a/modoboa/extensions/amavis/__init__.py +++ b/modoboa/extensions/amavis/__init__.py @@ -1,61 +0,0 @@ -# coding: utf-8 -""" -Amavis management frontend. - -Provides: - -* SQL quarantine management -* Per-domain settings - -""" -import sys -from django.utils.translation import ugettext_lazy -from modoboa.lib import events, parameters -from modoboa.core.extensions import ModoExtension, exts_pool - - -class Amavis(ModoExtension): - name = "amavis" - label = "Amavis frontend" - version = "1.0" - description = ugettext_lazy("Simple amavis management frontend") - url = "quarantine" - available_for_topredirection = True - - def init(self): - """Init function - - Only run once, when the extension is enabled. We create records - for existing domains to let Amavis consider them local. - """ - from modoboa.extensions.admin.models import Domain - from modoboa.extensions.amavis.models import Users - from modoboa.extensions.amavis.lib import ( - create_user_and_policy, create_user_and_use_policy - ) - - for dom in Domain.objects.all(): - try: - Users.objects.get(email="@%s" % dom.name) - except Users.DoesNotExist: - create_user_and_policy(dom.name) - for domalias in dom.domainalias_set.all(): - try: - Users.objects.get(email='@%s' % domalias.name) - except Users.DoesNotExist: - create_user_and_use_policy(domalias.name, dom.name) - - def load(self): - from .app_settings import ParametersForm, UserSettings - - parameters.register(ParametersForm, "Amavis") - parameters.register(UserSettings, ugettext_lazy("Quarantine")) - from modoboa.extensions.amavis import general_callbacks - if 'modoboa.extensions.amavis.general_callbacks' in sys.modules: - reload(general_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(Amavis) diff --git a/modoboa/extensions/amavis/general_callbacks.py b/modoboa/extensions/amavis/general_callbacks.py index 32e42cb01..1e1c9b9d5 100644 --- a/modoboa/extensions/amavis/general_callbacks.py +++ b/modoboa/extensions/amavis/general_callbacks.py @@ -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": diff --git a/modoboa/extensions/amavis/management/commands/amnotify.py b/modoboa/extensions/amavis/management/commands/amnotify.py index 82c5f62f0..209350da3 100644 --- a/modoboa/extensions/amavis/management/commands/amnotify.py +++ b/modoboa/extensions/amavis/management/commands/amnotify.py @@ -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): diff --git a/modoboa/extensions/amavis/management/commands/qcleanup.py b/modoboa/extensions/amavis/management/commands/qcleanup.py index d81b9645a..47e2d6dce 100644 --- a/modoboa/extensions/amavis/management/commands/qcleanup.py +++ b/modoboa/extensions/amavis/management/commands/qcleanup.py @@ -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")) diff --git a/modoboa/extensions/amavis/migrations/0001_initial.py b/modoboa/extensions/amavis/migrations/0001_initial.py index b666a852e..dea55f387 100644 --- a/modoboa/extensions/amavis/migrations/0001_initial.py +++ b/modoboa/extensions/amavis/migrations/0001_initial.py @@ -1,139 +1,187 @@ # -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +from __future__ import unicode_literals + +from django.db import models, migrations -class Migration(SchemaMigration): +class Migration(migrations.Migration): - def forwards(self, orm): - pass + dependencies = [ + ] - def backwards(self, orm): - pass - - models = { - 'amavis.maddr': { - 'Meta': {'object_name': 'Maddr', 'db_table': "u'maddr'", 'managed': 'False'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '765'}), - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'id': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}) - }, - 'amavis.mailaddr': { - 'Meta': {'object_name': 'Mailaddr', 'db_table': "u'mailaddr'", 'managed': 'False'}, - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'priority': ('django.db.models.fields.IntegerField', [], {}) - }, - 'amavis.msgrcpt': { - 'Meta': {'unique_together': "(('partition_tag', 'mail', 'rseqnum'),)", 'object_name': 'Msgrcpt', 'db_table': "u'msgrcpt'", 'managed': 'False'}, - 'bl': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'bspam_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'content': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'ds': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'is_local': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'mail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Msgs']", 'primary_key': 'True'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rid': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Maddr']", 'primary_key': 'True', 'db_column': "'rid'"}), - 'rs': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'rseqnum': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'smtp_resp': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'wl': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}) - }, - 'amavis.msgs': { - 'Meta': {'unique_together': "(('partition_tag', 'mail_id'),)", 'object_name': 'Msgs', 'db_table': "u'msgs'", 'managed': 'False'}, - 'am_id': ('django.db.models.fields.CharField', [], {'max_length': '60'}), - 'client_addr': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'content': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'dsn_sent': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'from_addr': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'host': ('django.db.models.fields.CharField', [], {'max_length': '765'}), - 'mail_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'primary_key': 'True'}), - 'message_id': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'originating': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'policy': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'quar_loc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'quar_type': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'secret_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'blank': 'True'}), - 'sid': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Maddr']", 'db_column': "'sid'"}), - 'size': ('django.db.models.fields.IntegerField', [], {}), - 'spam_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'time_iso': ('django.db.models.fields.CharField', [], {'max_length': '48'}), - 'time_num': ('django.db.models.fields.IntegerField', [], {}) - }, - 'amavis.policy': { - 'Meta': {'object_name': 'Policy', 'db_table': "u'policy'", 'managed': 'False'}, - 'addr_extension_bad_header': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_banned': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_spam': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_virus': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'archive_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bad_header_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bad_header_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'bad_header_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_files_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'banned_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_rulenames': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bypass_banned_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'bypass_header_checks': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'bypass_spam_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'bypass_virus_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'clean_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'disclaimer_options': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'forward_method': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'message_size_limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'newvirus_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'policy_name': ('django.db.models.fields.CharField', [], {'max_length': '96', 'blank': 'True'}), - 'sa_userconf': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'sa_username': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_dsn_cutoff_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_kill_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'spam_quarantine_cutoff_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag2': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag3': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_tag2_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_tag3_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_tag_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'unchecked_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'unchecked_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'virus_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'virus_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'virus_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'warnbadhrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'warnbannedrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'warnvirusrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}) - }, - 'amavis.quarantine': { - 'Meta': {'ordering': "['-mail__time_num']", 'unique_together': "(('partition_tag', 'mail', 'chunk_ind'),)", 'object_name': 'Quarantine', 'db_table': "u'quarantine'", 'managed': 'False'}, - 'chunk_ind': ('django.db.models.fields.IntegerField', [], {}), - 'mail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Msgs']", 'primary_key': 'True'}), - 'mail_text': ('django.db.models.fields.TextField', [], {}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) - }, - 'amavis.users': { - 'Meta': {'object_name': 'Users', 'db_table': "u'users'", 'managed': 'False'}, - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'fullname': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'policy': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Policy']"}), - 'priority': ('django.db.models.fields.IntegerField', [], {}) - }, - 'amavis.wblist': { - 'Meta': {'object_name': 'Wblist', 'db_table': "u'wblist'", 'managed': 'False'}, - 'rid': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'sid': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'wb': ('django.db.models.fields.CharField', [], {'max_length': '30'}) - } - } - - complete_apps = ['amavis'] + operations = [ + migrations.CreateModel( + name='Maddr', + fields=[ + ('partition_tag', models.IntegerField(unique=True, null=True, blank=True)), + ('id', models.BigIntegerField(serialize=False, primary_key=True)), + ('email', models.CharField(unique=True, max_length=255)), + ('domain', models.CharField(max_length=765)), + ], + options={ + 'db_table': 'maddr', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Mailaddr', + fields=[ + ('id', models.IntegerField(serialize=False, primary_key=True)), + ('priority', models.IntegerField()), + ('email', models.CharField(unique=True, max_length=255)), + ], + options={ + 'db_table': 'mailaddr', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Msgs', + fields=[ + ('partition_tag', models.IntegerField(null=True, blank=True)), + ('mail_id', models.CharField(max_length=12, serialize=False, primary_key=True)), + ('secret_id', models.CharField(max_length=12, blank=True)), + ('am_id', models.CharField(max_length=60)), + ('time_num', models.IntegerField()), + ('time_iso', models.CharField(max_length=48)), + ('policy', models.CharField(max_length=765, blank=True)), + ('client_addr', models.CharField(max_length=765, blank=True)), + ('size', models.IntegerField()), + ('originating', models.CharField(max_length=3)), + ('content', models.CharField(max_length=1, blank=True)), + ('quar_type', models.CharField(max_length=1, blank=True)), + ('quar_loc', models.CharField(max_length=255, blank=True)), + ('dsn_sent', models.CharField(max_length=3, blank=True)), + ('spam_level', models.FloatField(null=True, blank=True)), + ('message_id', models.CharField(max_length=765, blank=True)), + ('from_addr', models.CharField(max_length=765, blank=True)), + ('subject', models.CharField(max_length=765, blank=True)), + ('host', models.CharField(max_length=765)), + ], + options={ + 'db_table': 'msgs', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Msgrcpt', + fields=[ + ('partition_tag', models.IntegerField(null=True, blank=True)), + ('mail', models.ForeignKey(primary_key=True, serialize=False, to='amavis.Msgs')), + ('rseqnum', models.IntegerField(default=0)), + ('is_local', models.CharField(max_length=3)), + ('content', models.CharField(max_length=3)), + ('ds', models.CharField(max_length=3)), + ('rs', models.CharField(max_length=3)), + ('bl', models.CharField(max_length=3, blank=True)), + ('wl', models.CharField(max_length=3, blank=True)), + ('bspam_level', models.FloatField(null=True, blank=True)), + ('smtp_resp', models.CharField(max_length=765, blank=True)), + ], + options={ + 'db_table': 'msgrcpt', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Policy', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('policy_name', models.CharField(max_length=32, blank=True)), + ('virus_lover', models.CharField(max_length=3, null=True, blank=True)), + ('spam_lover', models.CharField(max_length=3, null=True, blank=True)), + ('unchecked_lover', models.CharField(max_length=3, null=True, blank=True)), + ('banned_files_lover', models.CharField(max_length=3, null=True, blank=True)), + ('bad_header_lover', models.CharField(max_length=3, null=True, blank=True)), + ('bypass_virus_checks', models.CharField(default=b'', choices=[(b'N', 'yes'), (b'Y', 'no'), (b'', 'default')], max_length=3, help_text="Bypass virus checks or not. Choose 'default' to use global settings.", null=True, verbose_name='Virus filter')), + ('bypass_spam_checks', models.CharField(default=b'', choices=[(b'N', 'yes'), (b'Y', 'no'), (b'', 'default')], max_length=3, help_text="Bypass spam checks or not. Choose 'default' to use global settings.", null=True, verbose_name='Spam filter')), + ('bypass_banned_checks', models.CharField(default=b'', choices=[(b'N', 'yes'), (b'Y', 'no'), (b'', 'default')], max_length=3, help_text="Bypass banned checks or not. Choose 'default' to use global settings.", null=True, verbose_name='Banned filter')), + ('bypass_header_checks', models.CharField(max_length=3, null=True, blank=True)), + ('virus_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('spam_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('banned_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('unchecked_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('bad_header_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('clean_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('archive_quarantine_to', models.CharField(max_length=192, null=True, blank=True)), + ('spam_tag_level', models.FloatField(null=True, blank=True)), + ('spam_tag2_level', models.FloatField(null=True, blank=True)), + ('spam_tag3_level', models.FloatField(null=True, blank=True)), + ('spam_kill_level', models.FloatField(null=True, blank=True)), + ('spam_dsn_cutoff_level', models.FloatField(null=True, blank=True)), + ('spam_quarantine_cutoff_level', models.FloatField(null=True, blank=True)), + ('addr_extension_virus', models.CharField(max_length=192, null=True, blank=True)), + ('addr_extension_spam', models.CharField(max_length=192, null=True, blank=True)), + ('addr_extension_banned', models.CharField(max_length=192, null=True, blank=True)), + ('addr_extension_bad_header', models.CharField(max_length=192, null=True, blank=True)), + ('warnvirusrecip', models.CharField(max_length=3, null=True, blank=True)), + ('warnbannedrecip', models.CharField(max_length=3, null=True, blank=True)), + ('warnbadhrecip', models.CharField(max_length=3, null=True, blank=True)), + ('newvirus_admin', models.CharField(max_length=192, null=True, blank=True)), + ('virus_admin', models.CharField(max_length=192, null=True, blank=True)), + ('banned_admin', models.CharField(max_length=192, null=True, blank=True)), + ('bad_header_admin', models.CharField(max_length=192, null=True, blank=True)), + ('spam_admin', models.CharField(max_length=192, null=True, blank=True)), + ('spam_subject_tag', models.CharField(max_length=192, null=True, blank=True)), + ('spam_subject_tag2', models.CharField(default=None, max_length=192, blank=True, help_text="Modify spam subject using the specified text. Choose 'default' to use global settings.", null=True, verbose_name='Spam marker')), + ('spam_subject_tag3', models.CharField(max_length=192, null=True, blank=True)), + ('message_size_limit', models.IntegerField(null=True, blank=True)), + ('banned_rulenames', models.CharField(max_length=192, null=True, blank=True)), + ('disclaimer_options', models.CharField(max_length=192, null=True, blank=True)), + ('forward_method', models.CharField(max_length=192, null=True, blank=True)), + ('sa_userconf', models.CharField(max_length=192, null=True, blank=True)), + ('sa_username', models.CharField(max_length=192, null=True, blank=True)), + ], + options={ + 'db_table': 'policy', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Quarantine', + fields=[ + ('partition_tag', models.IntegerField(null=True, blank=True)), + ('mail', models.ForeignKey(primary_key=True, serialize=False, to='amavis.Msgs')), + ('chunk_ind', models.IntegerField()), + ('mail_text', models.TextField()), + ], + options={ + 'ordering': ['-mail__time_num'], + 'db_table': 'quarantine', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Users', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True)), + ('priority', models.IntegerField()), + ('email', models.CharField(unique=True, max_length=255)), + ('fullname', models.CharField(max_length=765, blank=True)), + ], + options={ + 'db_table': 'users', + 'managed': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Wblist', + fields=[ + ('rid', models.IntegerField(serialize=False, primary_key=True)), + ('sid', models.IntegerField(primary_key=True)), + ('wb', models.CharField(max_length=30)), + ], + options={ + 'db_table': 'wblist', + 'managed': False, + }, + bases=(models.Model,), + ), + ] diff --git a/modoboa/extensions/amavis/migrations/0002_create_records.py b/modoboa/extensions/amavis/migrations/0002_create_records.py deleted file mode 100644 index ba2c3ccf2..000000000 --- a/modoboa/extensions/amavis/migrations/0002_create_records.py +++ /dev/null @@ -1,254 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.core.exceptions import ObjectDoesNotExist - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - orm["amavis.Users"].objects.all().delete() - if not orm['amavis.Policy'].objects.all(): - orm["amavis.Policy"].objects.create( - id=1, policy_name='default', bypass_virus_checks=None, - bypass_spam_checks=None, bypass_banned_checks=None, - spam_subject_tag2=None - ) - for dom in orm["admin.Domain"].objects.all(): - orm["amavis.Users"].objects.create(email="@%s" % dom.name, fullname=dom.name, - priority=7, policy_id=1) - try: - ext = orm["admin.Extension"].objects.get(name="amavis") - except ObjectDoesNotExist: - return - if ext.enabled: - for dom in orm["admin.Domain"].objects.all(): - u = orm["amavis.Users"].objects.get(email="@%s" % dom.name) - u.policy = orm["amavis.Policy"].objects.create(policy_name=dom.name) - u.save() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'amavis.maddr': { - 'Meta': {'object_name': 'Maddr', 'db_table': "u'maddr'", 'managed': 'False'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '765'}), - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'id': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}) - }, - 'amavis.mailaddr': { - 'Meta': {'object_name': 'Mailaddr', 'db_table': "u'mailaddr'", 'managed': 'False'}, - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'priority': ('django.db.models.fields.IntegerField', [], {}) - }, - 'amavis.msgrcpt': { - 'Meta': {'unique_together': "(('partition_tag', 'mail', 'rseqnum'),)", 'object_name': 'Msgrcpt', 'db_table': "u'msgrcpt'", 'managed': 'False'}, - 'bl': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'bspam_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'content': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'ds': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'is_local': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'mail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Msgs']", 'primary_key': 'True'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rid': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Maddr']", 'primary_key': 'True', 'db_column': "'rid'"}), - 'rs': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'rseqnum': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'smtp_resp': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'wl': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}) - }, - 'amavis.msgs': { - 'Meta': {'unique_together': "(('partition_tag', 'mail_id'),)", 'object_name': 'Msgs', 'db_table': "u'msgs'", 'managed': 'False'}, - 'am_id': ('django.db.models.fields.CharField', [], {'max_length': '60'}), - 'client_addr': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'content': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'dsn_sent': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'from_addr': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'host': ('django.db.models.fields.CharField', [], {'max_length': '765'}), - 'mail_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'primary_key': 'True'}), - 'message_id': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'originating': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'policy': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'quar_loc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'quar_type': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'secret_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'blank': 'True'}), - 'sid': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Maddr']", 'db_column': "'sid'"}), - 'size': ('django.db.models.fields.IntegerField', [], {}), - 'spam_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'time_iso': ('django.db.models.fields.CharField', [], {'max_length': '48'}), - 'time_num': ('django.db.models.fields.IntegerField', [], {}) - }, - 'amavis.policy': { - 'Meta': {'object_name': 'Policy', 'db_table': "u'policy'", 'managed': 'False'}, - 'addr_extension_bad_header': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_banned': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_spam': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_virus': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'archive_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bad_header_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bad_header_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'bad_header_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_files_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'banned_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_rulenames': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bypass_banned_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'bypass_header_checks': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'bypass_spam_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'bypass_virus_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'clean_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'disclaimer_options': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'forward_method': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'message_size_limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'newvirus_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'policy_name': ('django.db.models.fields.CharField', [], {'max_length': '96', 'blank': 'True'}), - 'sa_userconf': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'sa_username': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_dsn_cutoff_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_kill_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'spam_quarantine_cutoff_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag2': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag3': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_tag2_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_tag3_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_tag_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'unchecked_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'unchecked_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'virus_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'virus_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'virus_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'warnbadhrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'warnbannedrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'warnvirusrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}) - }, - 'amavis.quarantine': { - 'Meta': {'ordering': "['-mail__time_num']", 'unique_together': "(('partition_tag', 'mail', 'chunk_ind'),)", 'object_name': 'Quarantine', 'db_table': "u'quarantine'", 'managed': 'False'}, - 'chunk_ind': ('django.db.models.fields.IntegerField', [], {}), - 'mail': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Msgs']", 'primary_key': 'True'}), - 'mail_text': ('django.db.models.fields.TextField', [], {}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) - }, - 'amavis.users': { - 'Meta': {'object_name': 'Users', 'db_table': "u'users'", 'managed': 'False'}, - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'fullname': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'policy': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['amavis.Policy']"}), - 'priority': ('django.db.models.fields.IntegerField', [], {}) - }, - 'amavis.wblist': { - 'Meta': {'object_name': 'Wblist', 'db_table': "u'wblist'", 'managed': 'False'}, - 'rid': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'sid': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'wb': ('django.db.models.fields.CharField', [], {'max_length': '30'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['admin', 'amavis'] - symmetrical = True diff --git a/modoboa/extensions/amavis/migrations/0003_create_domalias_records.py b/modoboa/extensions/amavis/migrations/0003_create_domalias_records.py deleted file mode 100644 index f5fd72418..000000000 --- a/modoboa/extensions/amavis/migrations/0003_create_domalias_records.py +++ /dev/null @@ -1,269 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.core.exceptions import ObjectDoesNotExist - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - try: - ext = orm["core.Extension"].objects.get(name="amavis") - except ObjectDoesNotExist: - return - if not ext.enabled: - return - for domalias in orm["admin.DomainAlias"].objects.all(): - u = orm["amavis.Users"]( - email="@%s" % domalias.name, fullname=domalias.name, priority=7 - ) - u.policy = orm["amavis.Policy"].objects.get(policy_name=domalias.target.name) - u.save() - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - 'admin.alias': { - 'Meta': {'ordering': "['domain__name', 'address']", 'unique_together': "(('address', 'domain'),)", 'object_name': 'Alias'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}), - 'aliases': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Alias']", 'symmetrical': 'False'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'extmboxes': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mboxes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['admin.Mailbox']", 'symmetrical': 'False'}) - }, - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.domainalias': { - 'Meta': {'object_name': 'DomainAlias'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.mailboxoperation': { - 'Meta': {'object_name': 'MailboxOperation'}, - 'argument': ('django.db.models.fields.TextField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mailbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '20'}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'admin.quota': { - 'Meta': {'object_name': 'Quota'}, - 'bytes': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}), - 'mbox': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'quota_value'", 'unique': 'True', 'null': 'True', 'to': "orm['admin.Mailbox']"}), - 'messages': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'username': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'primary_key': 'True'}) - }, - u'amavis.maddr': { - 'Meta': {'object_name': 'Maddr', 'db_table': "u'maddr'", 'managed': 'False'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '765'}), - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'id': ('django.db.models.fields.BigIntegerField', [], {'primary_key': 'True'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'}) - }, - u'amavis.mailaddr': { - 'Meta': {'object_name': 'Mailaddr', 'db_table': "u'mailaddr'", 'managed': 'False'}, - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'priority': ('django.db.models.fields.IntegerField', [], {}) - }, - u'amavis.msgrcpt': { - 'Meta': {'unique_together': "(('partition_tag', 'mail', 'rseqnum'),)", 'object_name': 'Msgrcpt', 'db_table': "u'msgrcpt'", 'managed': 'False'}, - 'bl': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'bspam_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'content': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'ds': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'is_local': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'mail': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['amavis.Msgs']", 'primary_key': 'True'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rid': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['amavis.Maddr']", 'primary_key': 'True', 'db_column': "'rid'"}), - 'rs': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'rseqnum': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'smtp_resp': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'wl': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}) - }, - u'amavis.msgs': { - 'Meta': {'unique_together': "(('partition_tag', 'mail_id'),)", 'object_name': 'Msgs', 'db_table': "u'msgs'", 'managed': 'False'}, - 'am_id': ('django.db.models.fields.CharField', [], {'max_length': '60'}), - 'client_addr': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'content': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'dsn_sent': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'from_addr': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'host': ('django.db.models.fields.CharField', [], {'max_length': '765'}), - 'mail_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'primary_key': 'True'}), - 'message_id': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'originating': ('django.db.models.fields.CharField', [], {'max_length': '3'}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'policy': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'quar_loc': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'quar_type': ('django.db.models.fields.CharField', [], {'max_length': '1', 'blank': 'True'}), - 'secret_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'blank': 'True'}), - 'sid': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['amavis.Maddr']", 'db_column': "'sid'"}), - 'size': ('django.db.models.fields.IntegerField', [], {}), - 'spam_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'time_iso': ('django.db.models.fields.CharField', [], {'max_length': '48'}), - 'time_num': ('django.db.models.fields.IntegerField', [], {}) - }, - u'amavis.policy': { - 'Meta': {'object_name': 'Policy', 'db_table': "u'policy'", 'managed': 'False'}, - 'addr_extension_bad_header': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_banned': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_spam': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'addr_extension_virus': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'archive_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bad_header_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bad_header_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'bad_header_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_files_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'banned_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'banned_rulenames': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'bypass_banned_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'bypass_header_checks': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'bypass_spam_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'bypass_virus_checks': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '3', 'null': 'True'}), - 'clean_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'disclaimer_options': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'forward_method': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'message_size_limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'newvirus_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'policy_name': ('django.db.models.fields.CharField', [], {'max_length': '96', 'blank': 'True'}), - 'sa_userconf': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'sa_username': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_dsn_cutoff_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_kill_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'spam_quarantine_cutoff_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag2': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_subject_tag3': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'spam_tag2_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_tag3_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'spam_tag_level': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'unchecked_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'unchecked_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'virus_admin': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'virus_lover': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'virus_quarantine_to': ('django.db.models.fields.CharField', [], {'max_length': '192', 'null': 'True', 'blank': 'True'}), - 'warnbadhrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'warnbannedrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}), - 'warnvirusrecip': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'}) - }, - u'amavis.quarantine': { - 'Meta': {'ordering': "['-mail__time_num']", 'unique_together': "(('partition_tag', 'mail', 'chunk_ind'),)", 'object_name': 'Quarantine', 'db_table': "u'quarantine'", 'managed': 'False'}, - 'chunk_ind': ('django.db.models.fields.IntegerField', [], {}), - 'mail': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['amavis.Msgs']", 'primary_key': 'True'}), - 'mail_text': ('django.db.models.fields.TextField', [], {}), - 'partition_tag': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) - }, - u'amavis.users': { - 'Meta': {'object_name': 'Users', 'db_table': "u'users'", 'managed': 'False'}, - 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'fullname': ('django.db.models.fields.CharField', [], {'max_length': '765', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'policy': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['amavis.Policy']"}), - 'priority': ('django.db.models.fields.IntegerField', [], {}) - }, - u'amavis.wblist': { - 'Meta': {'object_name': 'Wblist', 'db_table': "u'wblist'", 'managed': 'False'}, - 'rid': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'sid': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'wb': ('django.db.models.fields.CharField', [], {'max_length': '30'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'core.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - } - } - - complete_apps = ['core', 'admin', 'amavis'] - symmetrical = True diff --git a/modoboa/extensions/amavis/modo_extension.py b/modoboa/extensions/amavis/modo_extension.py new file mode 100644 index 000000000..55f73ba3e --- /dev/null +++ b/modoboa/extensions/amavis/modo_extension.py @@ -0,0 +1,54 @@ +# coding: utf-8 +""" +Amavis management frontend. + +Provides: + +* SQL quarantine management +* Per-domain settings + +""" + +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" + label = "Amavis frontend" + version = "1.0" + description = ugettext_lazy("Simple amavis management frontend") + url = "quarantine" + available_for_topredirection = True + + def load(self): + from .app_settings import ParametersForm, UserSettings + + parameters.register(ParametersForm, "Amavis") + parameters.register(UserSettings, ugettext_lazy("Quarantine")) + + 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) diff --git a/modoboa/extensions/limits/__init__.py b/modoboa/extensions/limits/__init__.py index 7119b7077..e69de29bb 100644 --- a/modoboa/extensions/limits/__init__.py +++ b/modoboa/extensions/limits/__init__.py @@ -1,70 +0,0 @@ -# coding: utf-8 - -""" -The *limits* extension ----------------------- -""" -import sys -from django.contrib.auth.models import Permission, Group -from django.db import IntegrityError -from django.contrib.contenttypes.models import ContentType -from django.utils.translation import ugettext_lazy -from modoboa.lib import events, parameters -from modoboa.lib.permissions import add_permissions_to_group -from modoboa.core.extensions import ModoExtension, exts_pool - -levents = [ - 'GetExtraLimitTemplates' -] - - -class Limits(ModoExtension): - name = "limits" - label = "Limits" - version = "1.0" - description = ugettext_lazy( - "Per administrator resources to limit the number of objects " - "they can create" - ) - - def init(self): - from modoboa.core.models import User - from modoboa.extensions.admin.models import Domain - - ct = ContentType.objects.get(app_label="admin", model="domain") - dagrp = Group.objects.get(name="DomainAdmins") - - grp = Group(name="Resellers") - grp.save() - grp.permissions.add(*dagrp.permissions.all()) - - ct = ContentType.objects.get_for_model(Domain) - add_permissions_to_group( - "Resellers", [("admin", "domain", "view_domains"), - ("admin", "domain", "add_domain"), - ("admin", "domain", "change_domain"), - ("admin", "domain", "delete_domain")] - ) - - for user in User.objects.filter(groups__name='DomainAdmins'): - try: - controls.create_pool(user) - except IntegrityError: - pass - - def load(self): - from modoboa.extensions.limits.app_settings import ParametersForm - from modoboa.extensions.limits import controls - - parameters.register(ParametersForm, ugettext_lazy("Limits")) - events.declare(levents) - from modoboa.extensions.limits import general_callbacks - if 'modoboa.extensions.limits.general_callbacks' in sys.modules: - reload(general_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - Group.objects.get(name="Resellers").delete() - -exts_pool.register_extension(Limits) diff --git a/modoboa/extensions/limits/forms.py b/modoboa/extensions/limits/forms.py index 0f0b27f9a..b96d10ef3 100644 --- a/modoboa/extensions/limits/forms.py +++ b/modoboa/extensions/limits/forms.py @@ -37,8 +37,7 @@ class ResourcePoolForm(forms.Form): cleaned_data = super(ResourcePoolForm, self).clean() for lname in self.fields.keys(): if lname not in self._errors and cleaned_data[lname] < -1: - self._errors[lname] = self.error_class([_('Invalid limit')]) - del cleaned_data[lname] + self.add_error(lname, _("Invalid limit")) return cleaned_data def load_from_user(self, user): diff --git a/modoboa/extensions/limits/general_callbacks.py b/modoboa/extensions/limits/general_callbacks.py index 66561368d..3f207eebc 100644 --- a/modoboa/extensions/limits/general_callbacks.py +++ b/modoboa/extensions/limits/general_callbacks.py @@ -2,11 +2,25 @@ from django.utils.translation import ugettext as _ +from modoboa.core import PERMISSIONS as CORE_PERMS +from modoboa.extensions.admin.modo_extension import PERMISSIONS as ADMIN_PERMS from modoboa.extensions.limits.forms import ResourcePoolForm from modoboa.extensions.limits.models import LimitTemplates from modoboa.lib import events +PERMISSIONS = { + "Resellers": ( + CORE_PERMS.get("DomainAdmins") + + ADMIN_PERMS.get("DomainAdmins") + + [["admin", "domain", "view_domains"], + ["admin", "domain", "add_domain"], + ["admin", "domain", "change_domain"], + ["admin", "domain", "delete_domain"]] + ) +} + + @events.observe("GetExtraRoles") def get_extra_roles(user): if user.is_superuser: @@ -14,6 +28,12 @@ def get_extra_roles(user): return [] +@events.observe("GetExtraRolePermissions") +def extra_permissions(rolename): + """Return extra permissions for Resellers.""" + return PERMISSIONS.get(rolename, []) + + @events.observe("ExtraAdminContent") def display_pool_usage(user, target, currentpage): from django.template.loader import render_to_string diff --git a/modoboa/extensions/limits/migrations/0001_initial.py b/modoboa/extensions/limits/migrations/0001_initial.py index 4a5762307..82ed516e3 100644 --- a/modoboa/extensions/limits/migrations/0001_initial.py +++ b/modoboa/extensions/limits/migrations/0001_initial.py @@ -1,97 +1,47 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings -class Migration(SchemaMigration): +class Migration(migrations.Migration): - def forwards(self, orm): - - # Adding model 'LimitsPool' - db.create_table('limits_limitspool', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), - )) - db.send_create_signal('limits', ['LimitsPool']) + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] - # Adding model 'Limit' - db.create_table('limits_limit', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('curvalue', self.gf('django.db.models.fields.IntegerField')(default=0)), - ('maxvalue', self.gf('django.db.models.fields.IntegerField')(default=-2)), - ('pool', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['limits.LimitsPool'])), - )) - db.send_create_signal('limits', ['Limit']) - - # Adding unique constraint on 'Limit', fields ['name', 'pool'] - db.create_unique('limits_limit', ['name', 'pool_id']) - - - def backwards(self, orm): - - # Removing unique constraint on 'Limit', fields ['name', 'pool'] - db.delete_unique('limits_limit', ['name', 'pool_id']) - - # Deleting model 'LimitsPool' - db.delete_table('limits_limitspool') - - # Deleting model 'Limit' - db.delete_table('limits_limit') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'limits.limit': { - 'Meta': {'unique_together': "(('name', 'pool'),)", 'object_name': 'Limit'}, - 'curvalue': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'maxvalue': ('django.db.models.fields.IntegerField', [], {'default': '-2'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'pool': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['limits.LimitsPool']"}) - }, - 'limits.limitspool': { - 'Meta': {'object_name': 'LimitsPool'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) - } - } - - complete_apps = ['limits'] + operations = [ + migrations.CreateModel( + name='Limit', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255)), + ('curvalue', models.IntegerField(default=0)), + ('maxvalue', models.IntegerField(default=-2)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='LimitsPool', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='limit', + name='pool', + field=models.ForeignKey(to='limits.LimitsPool'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='limit', + unique_together=set([('name', 'pool')]), + ), + ] diff --git a/modoboa/extensions/limits/migrations/0002_update_user_foreign_key.py b/modoboa/extensions/limits/migrations/0002_update_user_foreign_key.py deleted file mode 100644 index 1c4b007ac..000000000 --- a/modoboa/extensions/limits/migrations/0002_update_user_foreign_key.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - db.alter_column(u'limits_limitspool', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - - def backwards(self, orm): - pass - - models = { - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'limits.limit': { - 'Meta': {'unique_together': "(('name', 'pool'),)", 'object_name': 'Limit'}, - 'curvalue': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'maxvalue': ('django.db.models.fields.IntegerField', [], {'default': '-2'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'pool': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['limits.LimitsPool']"}) - }, - u'limits.limitspool': { - 'Meta': {'object_name': 'LimitsPool'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['admin.User']", 'unique': 'True'}) - } - } - - complete_apps = ['limits'] diff --git a/modoboa/extensions/limits/migrations/0003_auto__chg_field_limitspool_user.py b/modoboa/extensions/limits/migrations/0003_auto__chg_field_limitspool_user.py deleted file mode 100644 index 9762fda21..000000000 --- a/modoboa/extensions/limits/migrations/0003_auto__chg_field_limitspool_user.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - depends_on = ( - ('admin', '0037_rename_tables'), - ) - - def forwards(self, orm): - - # Changing field 'LimitsPool.user' - db.alter_column(u'limits_limitspool', 'user_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['core.User'], unique=True)) - - def backwards(self, orm): - - # Changing field 'LimitsPool.user' - db.alter_column(u'limits_limitspool', 'user_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['admin.User'], unique=True)) - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'limits.limit': { - 'Meta': {'unique_together': "(('name', 'pool'),)", 'object_name': 'Limit'}, - 'curvalue': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'maxvalue': ('django.db.models.fields.IntegerField', [], {'default': '-2'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'pool': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['limits.LimitsPool']"}) - }, - u'limits.limitspool': { - 'Meta': {'object_name': 'LimitsPool'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['core.User']", 'unique': 'True'}) - } - } - - complete_apps = ['limits'] diff --git a/modoboa/extensions/limits/modo_extension.py b/modoboa/extensions/limits/modo_extension.py new file mode 100644 index 000000000..45a8659a6 --- /dev/null +++ b/modoboa/extensions/limits/modo_extension.py @@ -0,0 +1,44 @@ +# coding: utf-8 + +""" +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 LimitTemplates, LimitsPool, Limit + + +EVENTS = [ + 'GetExtraLimitTemplates' +] + + +class Limits(ModoExtension): + name = "limits" + label = "Limits" + version = "1.0" + description = ugettext_lazy( + "Per administrator resources to limit the number of objects " + "they can create" + ) + + def load(self): + from modoboa.extensions.limits.app_settings import ParametersForm + from modoboa.extensions.limits import controls + + parameters.register(ParametersForm, ugettext_lazy("Limits")) + events.declare(EVENTS) + from modoboa.extensions.limits import general_callbacks + + def load_initial_data(self): + """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) diff --git a/modoboa/extensions/limits/tests.py b/modoboa/extensions/limits/tests.py index 893417ea0..69b737714 100644 --- a/modoboa/extensions/limits/tests.py +++ b/modoboa/extensions/limits/tests.py @@ -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() diff --git a/modoboa/extensions/postfix_autoreply/__init__.py b/modoboa/extensions/postfix_autoreply/__init__.py index 10578ca40..e69de29bb 100644 --- a/modoboa/extensions/postfix_autoreply/__init__.py +++ b/modoboa/extensions/postfix_autoreply/__init__.py @@ -1,77 +0,0 @@ -# coding: utf-8 -""" -Postfix auto-replies plugin. - -This module provides a way to integrate Modoboa auto-reply -functionality into Postfix. - -""" -import sys - -from django.utils.translation import ugettext_lazy - -from modoboa.core.extensions import ModoExtension, exts_pool -from modoboa.extensions.postfix_autoreply.models import ( - Transport, Alias -) -from modoboa.lib import events, parameters - - -class PostfixAutoreply(ModoExtension): - - """ - Auto-reply (vacation) functionality using Postfix. - - """ - name = "postfix_autoreply" - label = "Postfix autoreply" - version = "1.0" - description = ugettext_lazy( - "Auto-reply (vacation) functionality using Postfix") - - def init(self): - from modoboa.extensions.admin.models import Domain - from modoboa.extensions.postfix_autoreply.general_callbacks \ - import onDomainCreated, onMailboxCreated - - 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) - - def load(self): - from modoboa.extensions.postfix_autoreply.app_settings import ( - ParametersForm - ) - parameters.register( - ParametersForm, ugettext_lazy("Automatic replies")) - from modoboa.extensions.postfix_autoreply import general_callbacks - modname = "modoboa.extensions.postfix_autoreply.general_callbacks" - if modname in sys.modules: - reload(general_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(PostfixAutoreply) - - -@events.observe("ExtraUprefsRoutes") -def extra_routes(): - from django.conf.urls import url - - return [ - url(r'^user/autoreply/$', - 'modoboa.extensions.postfix_autoreply.views.autoreply', - name="autoreply") - ] diff --git a/modoboa/extensions/postfix_autoreply/forms.py b/modoboa/extensions/postfix_autoreply/forms.py index 9e159343e..2252672bf 100644 --- a/modoboa/extensions/postfix_autoreply/forms.py +++ b/modoboa/extensions/postfix_autoreply/forms.py @@ -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) @@ -60,26 +63,19 @@ class ARmessageForm(forms.ModelForm): """ super(ARmessageForm, self).clean() - if self._errors: - raise forms.ValidationError(self._errors) if not self.cleaned_data["enabled"]: return self.cleaned_data if self.cleaned_data["fromdate"] is not None: if self.cleaned_data["fromdate"] < timezone.now(): - self._errors["fromdate"] = self.error_class( - [_("This date is over")]) - del self.cleaned_data['fromdate'] + self.add_error("fromdate", _("This date is over")) else: self.cleaned_data['fromdate'] = timezone.now() if self.cleaned_data["untildate"] is not None: untildate = self.cleaned_data["untildate"] if untildate < timezone.now(): - self._errors["untildate"] = self.error_class( - [_("This date is over")]) - del self.cleaned_data["untildate"] + self.add_error("untildate", _("This date is over")) elif "fromdate" in self.cleaned_data and \ untildate < self.cleaned_data["fromdate"]: - self._errors["untildate"] = \ - self.error_class([_("Must be greater than start date")]) - del self.cleaned_data["untildate"] + self.add_error( + "untildate", _("Must be greater than start date")) return self.cleaned_data diff --git a/modoboa/extensions/postfix_autoreply/general_callbacks.py b/modoboa/extensions/postfix_autoreply/general_callbacks.py index caff6b845..450cf0b42 100644 --- a/modoboa/extensions/postfix_autoreply/general_callbacks.py +++ b/modoboa/extensions/postfix_autoreply/general_callbacks.py @@ -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") )) ] diff --git a/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py b/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py index 82f0c3064..09482185c 100644 --- a/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py +++ b/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py @@ -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)) diff --git a/modoboa/extensions/postfix_autoreply/migrations/0001_initial.py b/modoboa/extensions/postfix_autoreply/migrations/0001_initial.py index 50736e342..4bb61e930 100644 --- a/modoboa/extensions/postfix_autoreply/migrations/0001_initial.py +++ b/modoboa/extensions/postfix_autoreply/migrations/0001_initial.py @@ -1,52 +1,73 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +# -*- coding: utf-8 -*- +from __future__ import unicode_literals -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'Transport' - db.create_table('postfix_autoreply_transport', ( - ('domain', self.gf('django.db.models.fields.CharField')(max_length=300)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('method', self.gf('django.db.models.fields.CharField')(max_length=255)), - )) - db.send_create_signal('postfix_autoreply', ['Transport']) +from django.db import models, migrations +import django.utils.timezone - # Adding model 'Alias' - db.create_table('postfix_autoreply_alias', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('full_address', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('autoreply_address', self.gf('django.db.models.fields.CharField')(max_length=255)), - )) - db.send_create_signal('postfix_autoreply', ['Alias']) - - - def backwards(self, orm): - - # Deleting model 'Transport' - db.delete_table('postfix_autoreply_transport') - # Deleting model 'Alias' - db.delete_table('postfix_autoreply_alias') - - - models = { - 'postfix_autoreply.alias': { - 'Meta': {'object_name': 'Alias'}, - 'autoreply_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'postfix_autoreply.transport': { - 'Meta': {'object_name': 'Transport'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '300'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'method': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['postfix_autoreply'] +class Migration(migrations.Migration): + + dependencies = [ + ('admin', '__first__'), + ] + + operations = [ + migrations.CreateModel( + name='Alias', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('full_address', models.CharField(max_length=255)), + ('autoreply_address', models.CharField(max_length=255)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ARhistoric', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('last_sent', models.DateTimeField(auto_now=True)), + ('sender', models.CharField(max_length=254)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ARmessage', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('subject', models.CharField(help_text='The subject that will appear in sent emails', max_length=255, verbose_name='subject')), + ('content', models.TextField(help_text='The content that will appear in sent emails', verbose_name='content')), + ('enabled', models.BooleanField(default=False, help_text='Activate/Deactivate your auto reply', verbose_name='enabled')), + ('fromdate', models.DateTimeField(default=django.utils.timezone.now)), + ('untildate', models.DateTimeField(null=True, blank=True)), + ('mbox', models.ForeignKey(to='admin.Mailbox')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Transport', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('domain', models.CharField(max_length=300)), + ('method', models.CharField(max_length=255)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='arhistoric', + name='armessage', + field=models.ForeignKey(to='postfix_autoreply.ARmessage'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='arhistoric', + unique_together=set([('armessage', 'sender')]), + ), + ] diff --git a/modoboa/extensions/postfix_autoreply/migrations/0002_auto__add_armessage__add_arhistoric.py b/modoboa/extensions/postfix_autoreply/migrations/0002_auto__add_armessage__add_arhistoric.py deleted file mode 100644 index 408cb8087..000000000 --- a/modoboa/extensions/postfix_autoreply/migrations/0002_auto__add_armessage__add_arhistoric.py +++ /dev/null @@ -1,132 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models -from modoboa.lib.db_utils import db_table_exists - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Renaming/Creating model 'ARmessage' - if db_table_exists('main_armessage'): - db.rename_table('main_armessage', 'postfix_autoreply_armessage') - else: - db.create_table('postfix_autoreply_armessage', ( - ('mbox', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Mailbox'])), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('subject', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('content', self.gf('django.db.models.fields.TextField')()), - ('enabled', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True)) - )) - db.send_create_signal('postfix_autoreply', ['ARmessage']) - - db.add_column('postfix_autoreply_armessage', 'untildate', - models.DateTimeField(null=True)) - - # Renaming model 'ARhistoric' - if db_table_exists('main_arhistoric'): - db.rename_table('main_arhistoric', 'postfix_autoreply_arhistoric') - else: - db.create_table('postfix_autoreply_arhistoric', ( - ('armessage', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['postfix_autoreply.ARmessage'])), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('last_sent', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)), - ('sender', self.gf('django.db.models.fields.TextField')()), - )) - db.send_create_signal('postfix_autoreply', ['ARhistoric']) - - - def backwards(self, orm): - raise RuntimeError("Cannot reverse this migration.") - - - models = { - 'admin.domain': { - 'Meta': {'object_name': 'Domain'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), - 'gid': ('django.db.models.fields.IntegerField', [], {}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}), - 'uid': ('django.db.models.fields.IntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'postfix_autoreply.alias': { - 'Meta': {'object_name': 'Alias'}, - 'autoreply_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'postfix_autoreply.arhistoric': { - 'Meta': {'object_name': 'ARhistoric'}, - 'armessage': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['postfix_autoreply.ARmessage']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'sender': ('django.db.models.fields.TextField', [], {}) - }, - 'postfix_autoreply.armessage': { - 'Meta': {'object_name': 'ARmessage'}, - 'content': ('django.db.models.fields.TextField', [], {}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']"}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'untildate': ('django.db.models.fields.DateTimeField', [], {}) - }, - 'postfix_autoreply.transport': { - 'Meta': {'object_name': 'Transport'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '300'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'method': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['postfix_autoreply'] diff --git a/modoboa/extensions/postfix_autoreply/migrations/0003_auto__chg_field_arhistoric_sender.py b/modoboa/extensions/postfix_autoreply/migrations/0003_auto__chg_field_arhistoric_sender.py deleted file mode 100644 index a760497e9..000000000 --- a/modoboa/extensions/postfix_autoreply/migrations/0003_auto__chg_field_arhistoric_sender.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'ARhistoric.sender' - db.alter_column(u'postfix_autoreply_arhistoric', 'sender', self.gf('django.db.models.fields.CharField')(max_length=254)) - - def backwards(self, orm): - - # Changing field 'ARhistoric.sender' - db.alter_column(u'postfix_autoreply_arhistoric', 'sender', self.gf('django.db.models.fields.TextField')()) - - models = { - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'postfix_autoreply.alias': { - 'Meta': {'object_name': 'Alias'}, - 'autoreply_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'postfix_autoreply.arhistoric': { - 'Meta': {'object_name': 'ARhistoric'}, - 'armessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['postfix_autoreply.ARmessage']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'sender': ('django.db.models.fields.CharField', [], {'max_length': '254'}) - }, - u'postfix_autoreply.armessage': { - 'Meta': {'object_name': 'ARmessage'}, - 'content': ('django.db.models.fields.TextField', [], {}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mbox': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Mailbox']"}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'untildate': ('django.db.models.fields.DateTimeField', [], {}) - }, - u'postfix_autoreply.transport': { - 'Meta': {'object_name': 'Transport'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '300'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'method': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['postfix_autoreply'] \ No newline at end of file diff --git a/modoboa/extensions/postfix_autoreply/migrations/0004_auto__add_unique_arhistoric_sender_armessage.py b/modoboa/extensions/postfix_autoreply/migrations/0004_auto__add_unique_arhistoric_sender_armessage.py deleted file mode 100644 index 25819da9a..000000000 --- a/modoboa/extensions/postfix_autoreply/migrations/0004_auto__add_unique_arhistoric_sender_armessage.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding unique constraint on 'ARhistoric', fields ['sender', 'armessage'] - db.create_unique(u'postfix_autoreply_arhistoric', ['sender', 'armessage_id']) - - - def backwards(self, orm): - # Removing unique constraint on 'ARhistoric', fields ['sender', 'armessage'] - db.delete_unique(u'postfix_autoreply_arhistoric', ['sender', 'armessage_id']) - - - models = { - u'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - u'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}) - }, - u'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'postfix_autoreply.alias': { - 'Meta': {'object_name': 'Alias'}, - 'autoreply_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'postfix_autoreply.arhistoric': { - 'Meta': {'unique_together': "(('armessage', 'sender'),)", 'object_name': 'ARhistoric'}, - 'armessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['postfix_autoreply.ARmessage']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'sender': ('django.db.models.fields.CharField', [], {'max_length': '254'}) - }, - u'postfix_autoreply.armessage': { - 'Meta': {'object_name': 'ARmessage'}, - 'content': ('django.db.models.fields.TextField', [], {}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mbox': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.Mailbox']"}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'untildate': ('django.db.models.fields.DateTimeField', [], {}) - }, - u'postfix_autoreply.transport': { - 'Meta': {'object_name': 'Transport'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '300'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'method': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['postfix_autoreply'] \ No newline at end of file diff --git a/modoboa/extensions/postfix_autoreply/migrations/0005_auto__add_field_armessage_fromdate.py b/modoboa/extensions/postfix_autoreply/migrations/0005_auto__add_field_armessage_fromdate.py deleted file mode 100644 index 0d1b2c0f9..000000000 --- a/modoboa/extensions/postfix_autoreply/migrations/0005_auto__add_field_armessage_fromdate.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models -from django.utils import timezone - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding field 'ARmessage.fromdate' - db.add_column(u'postfix_autoreply_armessage', 'fromdate', - self.gf('django.db.models.fields.DateTimeField')(default=timezone.now), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'ARmessage.fromdate' - db.delete_column(u'postfix_autoreply_armessage', 'fromdate') - - - models = { - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'postfix_autoreply.alias': { - 'Meta': {'object_name': 'Alias'}, - 'autoreply_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'postfix_autoreply.arhistoric': { - 'Meta': {'unique_together': "(('armessage', 'sender'),)", 'object_name': 'ARhistoric'}, - 'armessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['postfix_autoreply.ARmessage']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'sender': ('django.db.models.fields.CharField', [], {'max_length': '254'}) - }, - u'postfix_autoreply.armessage': { - 'Meta': {'object_name': 'ARmessage'}, - 'content': ('django.db.models.fields.TextField', [], {}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'fromdate': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']"}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'untildate': ('django.db.models.fields.DateTimeField', [], {}) - }, - u'postfix_autoreply.transport': { - 'Meta': {'object_name': 'Transport'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '300'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'method': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['postfix_autoreply'] diff --git a/modoboa/extensions/postfix_autoreply/migrations/0006_auto__chg_field_armessage_untildate.py b/modoboa/extensions/postfix_autoreply/migrations/0006_auto__chg_field_armessage_untildate.py deleted file mode 100644 index 9458b7891..000000000 --- a/modoboa/extensions/postfix_autoreply/migrations/0006_auto__chg_field_armessage_untildate.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'ARmessage.untildate' - db.alter_column(u'postfix_autoreply_armessage', 'untildate', self.gf('django.db.models.fields.DateTimeField')(null=True)) - - def backwards(self, orm): - - # User chose to not deal with backwards NULL issues for 'ARmessage.untildate' - raise RuntimeError("Cannot reverse this migration. 'ARmessage.untildate' and its values cannot be restored.") - - models = { - 'admin.domain': { - 'Meta': {'ordering': "['name']", 'object_name': 'Domain'}, - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), - 'quota': ('django.db.models.fields.IntegerField', [], {}) - }, - 'admin.mailbox': { - 'Meta': {'object_name': 'Mailbox'}, - 'address': ('django.db.models.fields.CharField', [], {'max_length': '252'}), - 'dates': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.ObjectDates']"}), - 'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Domain']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'quota': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'use_domain_quota': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - 'admin.objectdates': { - 'Meta': {'object_name': 'ObjectDates'}, - 'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_modification': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'postfix_autoreply.alias': { - 'Meta': {'object_name': 'Alias'}, - 'autoreply_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'full_address': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - u'postfix_autoreply.arhistoric': { - 'Meta': {'unique_together': "(('armessage', 'sender'),)", 'object_name': 'ARhistoric'}, - 'armessage': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['postfix_autoreply.ARmessage']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'sender': ('django.db.models.fields.CharField', [], {'max_length': '254'}) - }, - u'postfix_autoreply.armessage': { - 'Meta': {'object_name': 'ARmessage'}, - 'content': ('django.db.models.fields.TextField', [], {}), - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'fromdate': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'mbox': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['admin.Mailbox']"}), - 'subject': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'untildate': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) - }, - u'postfix_autoreply.transport': { - 'Meta': {'object_name': 'Transport'}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '300'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'method': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['postfix_autoreply'] \ No newline at end of file diff --git a/modoboa/extensions/postfix_autoreply/models.py b/modoboa/extensions/postfix_autoreply/models.py index ad8c1e03a..0c53a163b 100644 --- a/modoboa/extensions/postfix_autoreply/models.py +++ b/modoboa/extensions/postfix_autoreply/models.py @@ -1,6 +1,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils import timezone + from modoboa.extensions.admin.models import Mailbox @@ -26,7 +27,8 @@ class ARmessage(models.Model): ) enabled = models.BooleanField( _('enabled'), - help_text=_("Activate/Deactivate your auto reply") + help_text=_("Activate/Deactivate your auto reply"), + default=False ) fromdate = models.DateTimeField(default=timezone.now) untildate = models.DateTimeField(null=True, blank=True) diff --git a/modoboa/extensions/postfix_autoreply/modo_extension.py b/modoboa/extensions/postfix_autoreply/modo_extension.py new file mode 100644 index 000000000..90e861cde --- /dev/null +++ b/modoboa/extensions/postfix_autoreply/modo_extension.py @@ -0,0 +1,65 @@ +# coding: utf-8 +""" +Postfix auto-replies plugin. + +This module provides a way to integrate Modoboa auto-reply +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): + + """ + Auto-reply (vacation) functionality using Postfix. + + """ + name = "postfix_autoreply" + label = "Postfix autoreply" + version = "1.0" + description = ugettext_lazy( + "Auto-reply (vacation) functionality using Postfix") + + def load(self): + from modoboa.extensions.postfix_autoreply.app_settings import ( + ParametersForm + ) + parameters.register( + ParametersForm, ugettext_lazy("Automatic replies")) + + 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) + + +@events.observe("ExtraUprefsRoutes") +def extra_routes(): + from django.conf.urls import url + + return [ + url(r'^user/autoreply/$', + 'modoboa.extensions.postfix_autoreply.views.autoreply', + name="autoreply") + ] diff --git a/modoboa/extensions/postfix_autoreply/tests.py b/modoboa/extensions/postfix_autoreply/tests.py index e021e2929..3e1dd172e 100644 --- a/modoboa/extensions/postfix_autoreply/tests.py +++ b/modoboa/extensions/postfix_autoreply/tests.py @@ -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): diff --git a/modoboa/extensions/postfix_relay_domains/__init__.py b/modoboa/extensions/postfix_relay_domains/__init__.py index 4c4ceac6b..e69de29bb 100644 --- a/modoboa/extensions/postfix_relay_domains/__init__.py +++ b/modoboa/extensions/postfix_relay_domains/__init__.py @@ -1,115 +0,0 @@ -# coding: utf-8 -import sys - -from django.contrib.auth.models import Group, Permission -from django.contrib.contenttypes.models import ContentType -from django.utils.translation import ugettext_lazy - -from .models import RelayDomain, RelayDomainAlias, Service -from modoboa.core.extensions import ModoExtension, exts_pool -from modoboa.lib import events, parameters - - -EXTENSION_EVENTS = [ - "RelayDomainCreated", - "RelayDomainDeleted", - "RelayDomainModified", - "RelayDomainAliasCreated", - "RelayDomainAliasDeleted", - "ExtraRelayDomainForm", - "FillRelayDomainInstances" -] - - -def init_limits_dependant_features(): - """Populate limits tables. - - Update the pool of every defined user (to add new limits) and - update the *Resellers* group with new permissions. - """ - from modoboa.core.models import User - from modoboa.extensions.limits import controls - - for u in User.objects.all(): - controls.create_pool(u) - grp = Group.objects.get(name='Resellers') - for model in [RelayDomain, RelayDomainAlias, Service]: - ct = ContentType.objects.get_for_model(model) - name = model.__name__.lower() - for action in ['add', 'change', 'delete']: - grp.permissions.add( - Permission.objects.get( - content_type=ct, codename='%s_%s' % (action, name) - ) - ) - grp.save() - - -def init_amavis_dependant_features(): - """Populate amavis database. - - We create records for *users* and *policy* tables for each defined - relay domain or relay domain alias. - """ - from modoboa.extensions.amavis.models import Users - from modoboa.extensions.amavis.lib import ( - create_user_and_policy, create_user_and_use_policy - ) - - for rdom in RelayDomain.objects.all(): - try: - Users.objects.get(email="@%s" % rdom.name) - except Users.DoesNotExist: - create_user_and_policy(rdom.name) - for rdomalias in rdom.relaydomainalias_set.all(): - try: - Users.objects.get(email='@%s' % rdomalias.name) - except Users.DoesNotExist: - create_user_and_use_policy(rdomalias.name, rdom.name) - - -class PostfixRelayDomains(ModoExtension): - - """Extension declaration.""" - - name = "postfix_relay_domains" - label = "Postfix relay domains" - version = "1.0" - description = ugettext_lazy("Relay domains support for Postfix") - - def init(self): - """Initialisation method. - - Only run once, when the extension is enabled. Populates the - service table with default entries. - """ - for service_name in ['relay', 'smtp']: - Service.objects.get_or_create(name=service_name) - if exts_pool.is_extension_enabled('limits'): - init_limits_dependant_features() - - def load(self): - from .app_settings import AdminParametersForm - - parameters.register( - AdminParametersForm, ugettext_lazy("Relay domains") - ) - events.declare(EXTENSION_EVENTS) - from modoboa.extensions.postfix_relay_domains import general_callbacks - prefix = "modoboa.extensions.postfix_relay_domains." - if prefix + "general_callbacks" in sys.modules: - reload(general_callbacks) - if exts_pool.is_extension_enabled('limits'): - import limits_callbacks - if prefix + "limits_callbacks" in sys.modules: - reload(limits_callbacks) - if exts_pool.is_extension_enabled('amavis'): - import amavis_callbacks - if prefix + "amavis_callbacks" in sys.modules: - reload(amavis_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(PostfixRelayDomains) diff --git a/modoboa/extensions/postfix_relay_domains/forms.py b/modoboa/extensions/postfix_relay_domains/forms.py index 0fcd2535f..ddafe295d 100644 --- a/modoboa/extensions/postfix_relay_domains/forms.py +++ b/modoboa/extensions/postfix_relay_domains/forms.py @@ -55,8 +55,6 @@ class RelayDomainFormGeneral(forms.ModelForm, DynamicForm): The validation way is not very smart... """ super(RelayDomainFormGeneral, self).clean() - if self._errors: - raise forms.ValidationError(self._errors) cleaned_data = self.cleaned_data for dtype, label in [(Domain, _('domain')), (DomainAlias, _('domain alias')), @@ -66,10 +64,9 @@ class RelayDomainFormGeneral(forms.ModelForm, DynamicForm): except dtype.DoesNotExist: pass else: - self._errors["name"] = self.error_class( - [_("A %s with this name already exists" % label)] + self.add_error( + "name", _("A %s with this name already exists") % label ) - del cleaned_data["name"] break for k in cleaned_data.keys(): @@ -86,10 +83,8 @@ class RelayDomainFormGeneral(forms.ModelForm, DynamicForm): except dtype.DoesNotExist: pass else: - self._errors[k] = self.error_class( - [_("A %s with this name already exists" % name)] - ) - del cleaned_data[k] + self.add_error( + k, _("A %s with this name already exists") % name) break return cleaned_data diff --git a/modoboa/extensions/postfix_relay_domains/general_callbacks.py b/modoboa/extensions/postfix_relay_domains/general_callbacks.py index 765b32fcf..2dd319956 100644 --- a/modoboa/extensions/postfix_relay_domains/general_callbacks.py +++ b/modoboa/extensions/postfix_relay_domains/general_callbacks.py @@ -6,8 +6,33 @@ from django.db.models import Q from django.template import Template, Context from django.utils.translation import ugettext_lazy -from .models import RelayDomain, RelayDomainAlias +from modoboa.core.extensions import exts_pool from modoboa.lib import events +from .models import RelayDomain, RelayDomainAlias + +PERMISSIONS = { + "Resellers": [ + ("postfix_relay_domains", "relaydomain", "add_relaydomain"), + ("postfix_relay_domains", "relaydomain", "change_relaydomain"), + ("postfix_relay_domains", "relaydomain", "delete_relaydomain"), + ("postfix_relay_domains", "relaydomainalias", "add_relaydomainalias"), + ("postfix_relay_domains", "relaydomainalias", + "change_relaydomainalias"), + ("postfix_relay_domains", "relaydomainalias", + "delete_relaydomainalias"), + ("postfix_relay_domains", "service", "add_service"), + ("postfix_relay_domains", "service", "change_service"), + ("postfix_relay_domains", "service", "delete_service") + ] +} + + +@events.observe("GetExtraRolePermissions") +def extra_permissions(rolename): + """Return extra permissions for Resellers.""" + if not exts_pool.is_extension_installed("modoboa.extensions.limits"): + return [] + return PERMISSIONS.get(rolename, []) @events.observe('GetStaticContent') @@ -127,21 +152,3 @@ def get_import_func(objtype): if objtype == 'relaydomainalias': return [import_relaydomainalias] return [] - - -@events.observe('ExtEnabled') -def extension_enabled(extension): - """ExtEnabled event listener. - - Usefull when *limits* or *amavis* extensions are activated after - *postfix_relay_domains*. - - :param extension: enabled extension - """ - from modoboa.extensions.postfix_relay_domains import ( - init_limits_dependant_features, init_amavis_dependant_features - ) - if extension.name == 'limits': - init_limits_dependant_features() - if extension.name == 'amavis': - init_amavis_dependant_features() diff --git a/modoboa/extensions/postfix_relay_domains/limits_callbacks.py b/modoboa/extensions/postfix_relay_domains/limits_callbacks.py index 8b1ce5d81..7a7b362cf 100644 --- a/modoboa/extensions/postfix_relay_domains/limits_callbacks.py +++ b/modoboa/extensions/postfix_relay_domains/limits_callbacks.py @@ -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') diff --git a/modoboa/extensions/postfix_relay_domains/migrations/0001_initial.py b/modoboa/extensions/postfix_relay_domains/migrations/0001_initial.py new file mode 100644 index 000000000..311a5dc0d --- /dev/null +++ b/modoboa/extensions/postfix_relay_domains/migrations/0001_initial.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('admin', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='RelayDomain', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='The domain name', unique=True, max_length=100, verbose_name='name')), + ('target_host', models.CharField(help_text='Remote destination of this domain', max_length=255, verbose_name='target host')), + ('enabled', models.BooleanField(default=True, help_text='Check to activate this domain', verbose_name='enabled')), + ('verify_recipients', models.BooleanField(default=False, help_text='Check for valid recipients', verbose_name='verify recipients')), + ('dates', models.ForeignKey(to='admin.ObjectDates')), + ], + options={ + 'ordering': ['name'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='RelayDomainAlias', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='The alias name', unique=True, max_length=100, verbose_name='name')), + ('enabled', models.BooleanField(default=True, help_text='Check to activate this alias', verbose_name='enabled')), + ('dates', models.ForeignKey(to='admin.ObjectDates')), + ('target', models.ForeignKey(verbose_name='target', to='postfix_relay_domains.RelayDomain', help_text='The relay domain this alias points to')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Service', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(help_text='The service name', unique=True, max_length=100, verbose_name='name')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='relaydomain', + name='service', + field=models.ForeignKey(to='postfix_relay_domains.Service'), + preserve_default=True, + ), + ] diff --git a/modoboa/extensions/postfix_relay_domains/migrations/__init__.py b/modoboa/extensions/postfix_relay_domains/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modoboa/extensions/postfix_relay_domains/models.py b/modoboa/extensions/postfix_relay_domains/models.py index 5e96959ac..17807373e 100644 --- a/modoboa/extensions/postfix_relay_domains/models.py +++ b/modoboa/extensions/postfix_relay_domains/models.py @@ -86,14 +86,16 @@ class RelayDomain(AdminObject): ugettext_lazy('target host'), max_length=255, help_text=ugettext_lazy('Remote destination of this domain') ) - service = models.ForeignKey(Service, default='relay') + service = models.ForeignKey(Service) enabled = models.BooleanField( ugettext_lazy('enabled'), - help_text=ugettext_lazy('Check to activate this domain') + help_text=ugettext_lazy('Check to activate this domain'), + default=True ) verify_recipients = models.BooleanField( ugettext_lazy('verify recipients'), - help_text=ugettext_lazy('Check for valid recipients') + help_text=ugettext_lazy('Check for valid recipients'), + default=False ) owners = generic.GenericRelation(ObjectAccess) @@ -173,7 +175,8 @@ class RelayDomainAlias(AdminObject): ) enabled = models.BooleanField( ugettext_lazy('enabled'), - help_text=ugettext_lazy("Check to activate this alias") + help_text=ugettext_lazy("Check to activate this alias"), + default=True ) def __str__(self): diff --git a/modoboa/extensions/postfix_relay_domains/modo_extension.py b/modoboa/extensions/postfix_relay_domains/modo_extension.py new file mode 100644 index 000000000..4694f801a --- /dev/null +++ b/modoboa/extensions/postfix_relay_domains/modo_extension.py @@ -0,0 +1,55 @@ +# coding: utf-8 + +"""Declare postfix_relay_domains extension and register it.""" + +from django.utils.translation import ugettext_lazy + +from modoboa.core.extensions import ModoExtension, exts_pool +from modoboa.lib import events, parameters + + +EXTENSION_EVENTS = [ + "RelayDomainCreated", + "RelayDomainDeleted", + "RelayDomainModified", + "RelayDomainAliasCreated", + "RelayDomainAliasDeleted", + "ExtraRelayDomainForm", + "FillRelayDomainInstances" +] + + +class PostfixRelayDomains(ModoExtension): + + """Extension declaration.""" + + name = "postfix_relay_domains" + label = "Postfix relay domains" + version = "1.0" + description = ugettext_lazy("Relay domains support for Postfix") + + def load(self): + from .app_settings import AdminParametersForm + + parameters.register( + AdminParametersForm, ugettext_lazy("Relay domains") + ) + events.declare(EXTENSION_EVENTS) + from modoboa.extensions.postfix_relay_domains import general_callbacks + if exts_pool.is_extension_installed("modoboa.extensions.limits"): + import limits_callbacks + 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) diff --git a/modoboa/extensions/postfix_relay_domains/tests.py b/modoboa/extensions/postfix_relay_domains/tests.py index f1d28a001..0a725161d 100644 --- a/modoboa/extensions/postfix_relay_domains/tests.py +++ b/modoboa/extensions/postfix_relay_domains/tests.py @@ -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( diff --git a/modoboa/extensions/radicale/__init__.py b/modoboa/extensions/radicale/__init__.py index d7d884cf3..e69de29bb 100644 --- a/modoboa/extensions/radicale/__init__.py +++ b/modoboa/extensions/radicale/__init__.py @@ -1,76 +0,0 @@ -""" -Radicale management frontend. - -""" -import sys - -from django.contrib.auth.models import Permission, Group -from django.contrib.contenttypes.models import ContentType -from django.utils.translation import ugettext_lazy - -from modoboa.lib import events, parameters -from modoboa.lib.permissions import add_permissions_to_group -from modoboa.core.extensions import ModoExtension, exts_pool - - -def init_limits_dependant_features(): - """Custom initialization if the limits extension activated. - - We mainly define extra permissions. - """ - add_permissions_to_group( - "Resellers", - [("radicale", "usercalendar", "add_usercalendar"), - ("radicale", "usercalendar", "change_usercalendar"), - ("radicale", "usercalendar", "delete_usercalendar"), - ("radicale", "sharedcalendar", "add_sharedcalendar"), - ("radicale", "sharedcalendar", "change_sharedcalendar"), - ("radicale", "sharedcalendar", "delete_sharedcalendar")] - ) - - -class Radicale(ModoExtension): - - """Radicale extension declaration.""" - - name = "radicale" - label = ugettext_lazy("Radicale management") - version = "1.0" - url = "calendars" - description = ugettext_lazy( - "Management frontend for Radicale, a simple calendar and contact " - "server." - ) - - def init(self): - """Plugin initialization. - """ - add_permissions_to_group( - "DomainAdmins", - [("radicale", "usercalendar", "add_usercalendar"), - ("radicale", "usercalendar", "change_usercalendar"), - ("radicale", "usercalendar", "delete_usercalendar"), - ("radicale", "sharedcalendar", "add_sharedcalendar"), - ("radicale", "sharedcalendar", "change_sharedcalendar"), - ("radicale", "sharedcalendar", "delete_sharedcalendar")] - ) - if exts_pool.is_extension_enabled('limits'): - init_limits_dependant_features() - - def load(self): - """Plugin loading. - """ - from .app_settings import ParametersForm - - parameters.register(ParametersForm, "Radicale") - from modoboa.extensions.radicale import general_callbacks - if 'modoboa.extensions.radicale.general_callbacks' in sys.modules: - reload(general_callbacks) - - def destroy(self): - """Plugin unloading. - """ - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(Radicale) diff --git a/modoboa/extensions/radicale/factories.py b/modoboa/extensions/radicale/factories.py index a164df7db..278cc3232 100644 --- a/modoboa/extensions/radicale/factories.py +++ b/modoboa/extensions/radicale/factories.py @@ -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) diff --git a/modoboa/extensions/radicale/general_callbacks.py b/modoboa/extensions/radicale/general_callbacks.py index 5de72ed50..9cfb78938 100644 --- a/modoboa/extensions/radicale/general_callbacks.py +++ b/modoboa/extensions/radicale/general_callbacks.py @@ -6,6 +6,26 @@ from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _ from modoboa.lib import events +PERMISSIONS = [ + ("radicale", "usercalendar", "add_usercalendar"), + ("radicale", "usercalendar", "change_usercalendar"), + ("radicale", "usercalendar", "delete_usercalendar"), + ("radicale", "sharedcalendar", "add_sharedcalendar"), + ("radicale", "sharedcalendar", "change_sharedcalendar"), + ("radicale", "sharedcalendar", "delete_sharedcalendar") +] + +ROLES_PERMISSIONS = { + "DomainAdmins": PERMISSIONS, + "Resellers": PERMISSIONS +} + + +@events.observe("GetExtraRolePermissions") +def extra_permissions(rolename): + """Extra permissions.""" + return ROLES_PERMISSIONS.get(rolename, []) + @events.observe("UserMenuDisplay") def top_menu(target, user): @@ -16,20 +36,3 @@ def top_menu(target, user): "url": reverse('radicale:index')} ] return [] - - -@events.observe('ExtEnabled') -def extension_enabled(extension): - """ExtEnabled event listener. - - Usefull when *limits* extension is activated after *radicale*. - - :param extension: enabled extension - - """ - if extension.name == 'limits': - from modoboa.extensions.radicale import ( - init_limits_dependant_features - ) - - init_limits_dependant_features() diff --git a/modoboa/extensions/radicale/management/commands/generate_rights.py b/modoboa/extensions/radicale/management/commands/generate_rights.py index 9d6c3d722..3dd857c97 100644 --- a/modoboa/extensions/radicale/management/commands/generate_rights.py +++ b/modoboa/extensions/radicale/management/commands/generate_rights.py @@ -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: diff --git a/modoboa/extensions/radicale/migrations/0001_initial.py b/modoboa/extensions/radicale/migrations/0001_initial.py new file mode 100644 index 000000000..8654a5fc0 --- /dev/null +++ b/modoboa/extensions/radicale/migrations/0001_initial.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('admin', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='AccessRule', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('read', models.BooleanField(default=False)), + ('write', models.BooleanField(default=False)), + ('last_update', models.DateTimeField(auto_now=True)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='SharedCalendar', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=200)), + ('domain', models.ForeignKey(to='admin.Domain')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='UserCalendar', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=200)), + ('mailbox', models.ForeignKey(to='admin.Mailbox')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='accessrule', + name='calendar', + field=models.ForeignKey(related_name='rules', to='radicale.UserCalendar'), + preserve_default=True, + ), + migrations.AddField( + model_name='accessrule', + name='mailbox', + field=models.ForeignKey(to='admin.Mailbox'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='accessrule', + unique_together=set([('mailbox', 'calendar')]), + ), + ] diff --git a/modoboa/extensions/radicale/migrations/__init__.py b/modoboa/extensions/radicale/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/modoboa/extensions/radicale/modo_extension.py b/modoboa/extensions/radicale/modo_extension.py new file mode 100644 index 000000000..02c9fb9dc --- /dev/null +++ b/modoboa/extensions/radicale/modo_extension.py @@ -0,0 +1,33 @@ +""" +Radicale management frontend. + +""" + +from django.utils.translation import ugettext_lazy + +from modoboa.core.extensions import ModoExtension, exts_pool +from modoboa.lib import parameters + + +class Radicale(ModoExtension): + + """Radicale extension declaration.""" + + name = "radicale" + label = ugettext_lazy("Radicale management") + version = "1.0" + url = "calendars" + description = ugettext_lazy( + "Management frontend for Radicale, a simple calendar and contact " + "server." + ) + + def load(self): + """Plugin loading. + """ + from .app_settings import ParametersForm + + parameters.register(ParametersForm, "Radicale") + from modoboa.extensions.radicale import general_callbacks + +exts_pool.register_extension(Radicale) diff --git a/modoboa/extensions/radicale/tests.py b/modoboa/extensions/radicale/tests.py index 955eac766..749364d3c 100644 --- a/modoboa/extensions/radicale/tests.py +++ b/modoboa/extensions/radicale/tests.py @@ -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( diff --git a/modoboa/extensions/sievefilters/__init__.py b/modoboa/extensions/sievefilters/__init__.py index 50ef1ebe9..e69de29bb 100644 --- a/modoboa/extensions/sievefilters/__init__.py +++ b/modoboa/extensions/sievefilters/__init__.py @@ -1,28 +0,0 @@ -# coding: utf-8 -import sys -from django.utils.translation import ugettext_lazy -from modoboa.lib import events, parameters -from modoboa.core.extensions import ModoExtension, exts_pool - - -class SieveFilters(ModoExtension): - name = "sievefilters" - label = "Sieve filters" - version = "1.0" - description = ugettext_lazy("Plugin to easily create server-side filters") - url = "sfilters" - available_for_topredirection = True - - def load(self): - from .app_settings import ParametersForm, UserSettings - parameters.register(ParametersForm, ugettext_lazy("Sieve filters")) - parameters.register(UserSettings, ugettext_lazy("Message filters")) - from modoboa.extensions.sievefilters import general_callbacks - if 'modoboa.extensions.sievefilters.general_callbacks' in sys.modules: - reload(general_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(SieveFilters) diff --git a/modoboa/extensions/sievefilters/modo_extension.py b/modoboa/extensions/sievefilters/modo_extension.py new file mode 100644 index 000000000..0b4fe46ba --- /dev/null +++ b/modoboa/extensions/sievefilters/modo_extension.py @@ -0,0 +1,24 @@ +# coding: utf-8 +"""Declare and register the sievefilters extension.""" + +from django.utils.translation import ugettext_lazy + +from modoboa.core.extensions import ModoExtension, exts_pool +from modoboa.lib import parameters + + +class SieveFilters(ModoExtension): + name = "sievefilters" + label = "Sieve filters" + version = "1.0" + description = ugettext_lazy("Plugin to easily create server-side filters") + url = "sfilters" + available_for_topredirection = True + + def load(self): + from .app_settings import ParametersForm, UserSettings + parameters.register(ParametersForm, ugettext_lazy("Sieve filters")) + parameters.register(UserSettings, ugettext_lazy("Message filters")) + from modoboa.extensions.sievefilters import general_callbacks + +exts_pool.register_extension(SieveFilters) diff --git a/modoboa/extensions/stats/__init__.py b/modoboa/extensions/stats/__init__.py index e08b12b55..e69de29bb 100644 --- a/modoboa/extensions/stats/__init__.py +++ b/modoboa/extensions/stats/__init__.py @@ -1,39 +0,0 @@ -# coding: utf-8 - -""" -Graphical statistics about emails traffic using RRDtool - -This module provides support to retrieve statistics from postfix log : -sent, received, bounced, rejected - -""" -import sys -from django.utils.translation import ugettext_lazy -from modoboa.lib import events, parameters -from modoboa.core.extensions import ModoExtension, exts_pool - - -class Stats(ModoExtension): - name = "stats" - label = "Statistics" - version = "1.0" - description = ugettext_lazy( - "Graphical statistics about emails traffic using RRDtool" - ) - needs_media = True - - def load(self): - from modoboa.extensions.stats.app_settings import ParametersForm - events.declare(["GetGraphSets"]) - parameters.register( - ParametersForm, ugettext_lazy("Graphical statistics") - ) - from modoboa.extensions.stats import general_callbacks - if 'modoboa.extensions.stats.general_callbacks' in sys.modules: - reload(general_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(Stats) diff --git a/modoboa/extensions/stats/management/commands/logparser.py b/modoboa/extensions/stats/management/commands/logparser.py index 3613f056b..1f38ff6fa 100644 --- a/modoboa/extensions/stats/management/commands/logparser.py +++ b/modoboa/extensions/stats/management/commands/logparser.py @@ -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 @@ -97,7 +96,8 @@ class LogParser(object): for dom in Domain.objects.all(): self.domains += [str(dom.name)] self.data[str(dom.name)] = {} - if not exts_pool.is_extension_enabled("postfix_relay_domains"): + if not exts_pool.is_extension_installed( + "modoboa.extensions.postfix_relay_domains"): return from modoboa.extensions.postfix_relay_domains.models import RelayDomain for rdom in RelayDomain.objects.all(): @@ -372,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")) diff --git a/modoboa/extensions/stats/modo_extension.py b/modoboa/extensions/stats/modo_extension.py new file mode 100644 index 000000000..926063168 --- /dev/null +++ b/modoboa/extensions/stats/modo_extension.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +""" +Graphical statistics about emails traffic using RRDtool + +This module provides support to retrieve statistics from postfix log : +sent, received, bounced, rejected + +""" +import sys + +from django.utils.translation import ugettext_lazy + +from modoboa.core.extensions import ModoExtension, exts_pool +from modoboa.lib import events, parameters + + +class Stats(ModoExtension): + name = "stats" + label = "Statistics" + version = "1.0" + description = ugettext_lazy( + "Graphical statistics about emails traffic using RRDtool" + ) + needs_media = True + + def load(self): + from modoboa.extensions.stats.app_settings import ParametersForm + events.declare(["GetGraphSets"]) + parameters.register( + ParametersForm, ugettext_lazy("Graphical statistics") + ) + from modoboa.extensions.stats import general_callbacks + +exts_pool.register_extension(Stats) diff --git a/modoboa/extensions/stats/views.py b/modoboa/extensions/stats/views.py index b16756408..de88d898c 100644 --- a/modoboa/extensions/stats/views.py +++ b/modoboa/extensions/stats/views.py @@ -58,7 +58,8 @@ def check_domain_access(user, pattern): :return: a domain name (str) or None. """ targets = [Domain] - if exts_pool.is_extension_enabled("postfix_relay_domains"): + if exts_pool.is_extension_installed( + "modoboa.extensions.postfix_relay_domains"): from modoboa.extensions.postfix_relay_domains.models import RelayDomain targets.append(RelayDomain) @@ -123,7 +124,8 @@ def graphs(request): def get_domain_list(request): """Get the list of domains (and relay domains) the user can see.""" doms = [dom.name for dom in Domain.objects.get_for_admin(request.user)] - if exts_pool.is_extension_enabled("postfix_relay_domains"): + if exts_pool.is_extension_installed( + "modoboa.extensions.postfix_relay_domains"): from modoboa.extensions.postfix_relay_domains.models import RelayDomain doms += [ rdom.name for rdom in diff --git a/modoboa/extensions/webmail/__init__.py b/modoboa/extensions/webmail/__init__.py index b57e93b88..e69de29bb 100644 --- a/modoboa/extensions/webmail/__init__.py +++ b/modoboa/extensions/webmail/__init__.py @@ -1,30 +0,0 @@ -# coding: utf-8 -import sys -from django.utils.translation import ugettext as _, ugettext_lazy -from django.core.urlresolvers import reverse -from modoboa.lib import events, parameters -from modoboa.core.extensions import ModoExtension, exts_pool - - -class Webmail(ModoExtension): - name = "webmail" - label = "Webmail" - version = "1.0" - description = ugettext_lazy("Simple IMAP webmail") - needs_media = True - available_for_topredirection = True - - def load(self): - from .app_settings import ParametersForm, UserSettings - - parameters.register(ParametersForm, "Webmail") - parameters.register(UserSettings, "Webmail") - from modoboa.extensions.webmail import general_callbacks - if 'modoboa.extensions.webmail.general_callbacks' in sys.modules: - reload(general_callbacks) - - def destroy(self): - events.unregister_extension() - parameters.unregister() - -exts_pool.register_extension(Webmail) diff --git a/modoboa/extensions/webmail/modo_extension.py b/modoboa/extensions/webmail/modo_extension.py new file mode 100644 index 000000000..7ee635a15 --- /dev/null +++ b/modoboa/extensions/webmail/modo_extension.py @@ -0,0 +1,25 @@ +# coding: utf-8 +"""Declare and register the webmail extension.""" + +from django.utils.translation import ugettext_lazy + +from modoboa.core.extensions import ModoExtension, exts_pool +from modoboa.lib import parameters + + +class Webmail(ModoExtension): + name = "webmail" + label = "Webmail" + version = "1.0" + description = ugettext_lazy("Simple IMAP webmail") + needs_media = True + available_for_topredirection = True + + def load(self): + from .app_settings import ParametersForm, UserSettings + + parameters.register(ParametersForm, "Webmail") + parameters.register(UserSettings, "Webmail") + from modoboa.extensions.webmail import general_callbacks + +exts_pool.register_extension(Webmail) diff --git a/modoboa/lib/events.py b/modoboa/lib/events.py index 19bbe0b20..57996db07 100644 --- a/modoboa/lib/events.py +++ b/modoboa/lib/events.py @@ -1,34 +1,26 @@ # -*- coding: utf-8 -*- """ -:mod:`events` --- simple events handling +:mod:`EVENTS` --- simple EVENTS handling ---------------------------------------- -This module provides a simple way of managing events between Modoboa +This module provides a simple way of managing EVENTS between Modoboa core application and additional components. """ -import inspect -import re -from functools import wraps -from django.conf import settings - -from modoboa.lib.sysutils import guess_extension_name - - -events = [] -callbacks = {} +EVENTS = [] +CALLBACKS = {} def declare(nevents): - """Declare new events + """Declare new events. :param list nevents: a list of event names """ for evt in nevents: - if evt not in events: - events.append(evt) + if evt not in EVENTS: + EVENTS.append(evt) def register(event, callback): @@ -39,69 +31,32 @@ def register(event, callback): :param event: the event to listen to :param callback: a function to execute when the event is raised """ - # if not event in events: + # if not event in EVENTS: # print "Event %s not registered" % event # return 0 - if event not in callbacks.keys(): - callbacks[event] = {} + if event not in CALLBACKS.keys(): + CALLBACKS[event] = {} fullname = "%s.%s" % (callback.__module__, callback.__name__) - if fullname not in callbacks[event]: - callbacks[event][fullname] = callback + if fullname not in CALLBACKS[event]: + CALLBACKS[event][fullname] = callback return 1 class observe(object): - """Event observing decorator + """Event observing decorator. Automatically register the decorated function to observe the given - event. If the decorated function is located into an extension, we - check before each call if the extension is enabled or not. If - that's not the case, the callback is not called. + event. - .. note:: - - That's not a really optimized behaviour but I haven't found - another solution to achieve that feature. - - :param evtname: the event's name + :param evtnames: a list of event names """ def __init__(self, *evtnames, **kwargs): self.evtnames = evtnames - if "extname" in kwargs: - self.extname = kwargs["extname"] - - def __guess_extension_name(self, modname): - if modname.startswith('modoboa.extensions'): - m = re.match(r'modoboa\.extensions\.([^\.]+)', modname) - if m: - return m.group(1) - return None def __call__(self, f): - modname = inspect.getmodule(inspect.stack()[1][0]).__name__ - extname = self.extname if hasattr(self, "extname") \ - else self.__guess_extension_name(modname) - - @wraps(f) - def wrapped_f(*args, **kwargs): - if extname: - from modoboa.core.models import Extension - from modoboa.core.extensions import exts_pool - try: - ext = Extension.objects.get(name=extname) - except Extension.DoesNotExist: - extdef = exts_pool.get_extension(extname) - if not extdef.always_active: - return [] - else: - if not ext.enabled: - return None - elif modname not in settings.MODOBOA_APPS: - return [] - return f(*args, **kwargs) for evt in self.evtnames: - register(evt, wrapped_f) - return wrapped_f + register(evt, f) + return f def unregister(event, callback): @@ -110,57 +65,44 @@ def unregister(event, callback): :param event: the targeted event :param callback: the callback to remove """ - if event not in events: + if event not in EVENTS: return False - if event not in callbacks: + if event not in CALLBACKS: return False fullname = "%s.%s" % (callback.__module__, callback.__name__) try: - del callbacks[event][fullname] + del CALLBACKS[event][fullname] except KeyError: pass -def unregister_extension(extension=None): - """Unregister all callbacks declared by an extension. - - :param str extension: extension full name (ie. module name) - """ - if extension is None: - extension = guess_extension_name() - for evt, values in callbacks.items(): - for name in values.keys(): - if extension in name: - del callbacks[evt][name] - - def raiseEvent(event, *args, **kwargs): """Raise a specific event Any additional keyword argument will be passed to registered - callbacks. + CALLBACKS. :param event: the event to raise """ - if event not in events or event not in callbacks: + if event not in EVENTS or event not in CALLBACKS: return 0 - for callback in callbacks[event].values(): + for callback in CALLBACKS[event].values(): callback(*args, **kwargs) return 1 def raiseQueryEvent(event, *args, **kwargs): - """Raise a specific event and wait for answers from callbacks + """Raise a specific event and wait for answers from CALLBACKS Any additional keyword argument will be passed to registered - callbacks. Callback answers are returned as a list. + CALLBACKS. Callback answers are returned as a list. :param event: the event to raise """ result = [] - if event not in events or event not in callbacks: + if event not in EVENTS or event not in CALLBACKS: return result - for callback in callbacks[event].values(): + for callback in CALLBACKS[event].values(): tmp = callback(*args, **kwargs) if tmp is None: # Callback is registered but associated extension is @@ -174,15 +116,15 @@ def raiseDictEvent(event, *args): """Raise a specific event and return result as a dictionnary Any additional keyword argument will be passed to registered - callbacks. Callback answers must be dictionnaries. + CALLBACKS. Callback answers must be dictionnaries. :param event: the event to raise :return: a dictionnary """ result = {} - if event not in events or event not in callbacks: + if event not in EVENTS or event not in CALLBACKS: return result - for callback in callbacks[event].values(): + for callback in CALLBACKS[event].values(): tmp = callback(*args) if tmp is None: # Callback is registered but associated extension is diff --git a/modoboa/lib/form_utils.py b/modoboa/lib/form_utils.py index ef90c7ff4..da18fa26b 100644 --- a/modoboa/lib/form_utils.py +++ b/modoboa/lib/form_utils.py @@ -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(pos, 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. diff --git a/modoboa/lib/middleware.py b/modoboa/lib/middleware.py index 31b7df90a..b6da7c8c9 100644 --- a/modoboa/lib/middleware.py +++ b/modoboa/lib/middleware.py @@ -2,12 +2,8 @@ """Custom middlewares.""" -import re +from django.http import HttpResponseRedirect -from django.http import Http404, HttpResponseRedirect - -from modoboa.core.extensions import exts_pool -from modoboa.core.models import Extension from modoboa.lib.exceptions import ModoboaException from modoboa.lib.signals import request_accessor from modoboa.lib.web_utils import ( @@ -15,24 +11,6 @@ from modoboa.lib.web_utils import ( ) -class ExtControlMiddleware(object): - - def process_view(self, request, view, args, kwargs): - m = re.match(r"modoboa\.extensions\.(\w+)", view.__module__) - if m is None: - return None - try: - ext = Extension.objects.get(name=m.group(1)) - except Extension.DoesNotExist: - extdef = exts_pool.get_extension(m.group(1)) - if extdef.always_active: - return None - raise Http404 - if ext.enabled: - return None - raise Http404 - - class AjaxLoginRedirect(object): def process_response(self, request, response): diff --git a/modoboa/lib/migrations/0001_initial.py b/modoboa/lib/migrations/0001_initial.py index 3f7087488..02453b798 100644 --- a/modoboa/lib/migrations/0001_initial.py +++ b/modoboa/lib/migrations/0001_initial.py @@ -1,91 +1,38 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'Parameter' - db.create_table('lib_parameter', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('value', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), - )) - db.send_create_signal('lib', ['Parameter']) +class Migration(migrations.Migration): - # Adding model 'UserParameter' - db.create_table('lib_userparameter', ( - ('value', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - )) - db.send_create_signal('lib', ['UserParameter']) - - - def backwards(self, orm): - - # Deleting model 'Parameter' - db.delete_table('lib_parameter') + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] - # Deleting model 'UserParameter' - db.delete_table('lib_userparameter') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'lib.parameter': { - 'Meta': {'object_name': 'Parameter'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - 'lib.userparameter': { - 'Meta': {'object_name': 'UserParameter'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['lib'] + operations = [ + migrations.CreateModel( + name='Parameter', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255)), + ('value', models.CharField(max_length=255)), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='UserParameter', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField(max_length=255)), + ('value', models.CharField(max_length=255)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), + ], + options={ + }, + bases=(models.Model,), + ), + ] diff --git a/modoboa/lib/migrations/0002_move_secret_key.py b/modoboa/lib/migrations/0002_move_secret_key.py deleted file mode 100644 index 3f4feb3f0..000000000 --- a/modoboa/lib/migrations/0002_move_secret_key.py +++ /dev/null @@ -1,78 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - try: - p = orm.Parameter.objects.get(name="webmail.SECRET_KEY") - except orm.Parameter.DoesNotExist: - pass - else: - p.name = "auth.SECRET_KEY" - p.save() - - def backwards(self, orm): - "Write your backwards methods here." - p = orm.Parameter.objects.get(name="auth.SECRET_KEY") - p.name = "webmail.SECRET_KEY" - p.save() - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'lib.parameter': { - 'Meta': {'object_name': 'Parameter'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - 'lib.userparameter': { - 'Meta': {'object_name': 'UserParameter'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['lib'] diff --git a/modoboa/lib/migrations/0003_clean_parameters.py b/modoboa/lib/migrations/0003_clean_parameters.py deleted file mode 100644 index 2aa0edea5..000000000 --- a/modoboa/lib/migrations/0003_clean_parameters.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.core.exceptions import ObjectDoesNotExist - - -class Migration(DataMigration): - - def forwards(self, orm): - "Write your forwards methods here." - orm["lib.Parameter"].objects.filter(name__in=[ - "admin.STORAGE_PATH", "admin.VIRTUAL_GID", "admin.MAILBOX_TYPE", - "admin.MAILDIR_ROOT" - ]).delete() - try: - orm["lib.parameter"].objects.filter(name="general.DEFAULT_TOP_REDICTION").update(name="admin.DEFAULT_TOP_REDICTION") - except ObjectDoesNotExist: - pass - try: - orm["lib.parameter"].objects.filter(name="admin.CREATE_DIRECTORIES").update(name="admin.HANDLE_MAILBOXES") - except ObjectDoesNotExist: - pass - try: - orm["lib.parameter"].objects.filter(name="admin.VIRTUAL_UID").update(name="admin.MAILBOXES_OWNER") - except ObjectDoesNotExist: - pass - try: - orm["lib.parameter"].objects.filter(name="auth.SECRET_KEY").update(name="admin.SECRET_KEY") - except ObjectDoesNotExist: - pass - - def backwards(self, orm): - "Write your backwards methods here." - raise RuntimeError("Cannot revert this migration") - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'lib.parameter': { - 'Meta': {'object_name': 'Parameter'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - 'lib.userparameter': { - 'Meta': {'object_name': 'UserParameter'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['lib'] - symmetrical = True diff --git a/modoboa/lib/migrations/0004_auto__add_log__chg_field_userparameter_user.py b/modoboa/lib/migrations/0004_auto__add_log__chg_field_userparameter_user.py deleted file mode 100644 index 052538afd..000000000 --- a/modoboa/lib/migrations/0004_auto__add_log__chg_field_userparameter_user.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'Log' - db.create_table(u'lib_log', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('message', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('level', self.gf('django.db.models.fields.CharField')(max_length=15)), - ('logger', self.gf('django.db.models.fields.CharField')(max_length=30)), - )) - db.send_create_signal(u'lib', ['Log']) - - # Changing field 'UserParameter.user' - db.alter_column(u'lib_userparameter', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - - def backwards(self, orm): - raise RuntimeError("Cannot revert this migration") - - models = { - u'admin.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'lib.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'lib.parameter': { - 'Meta': {'object_name': 'Parameter'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'lib.userparameter': { - 'Meta': {'object_name': 'UserParameter'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['admin.User']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['lib'] diff --git a/modoboa/lib/migrations/0005_rename_table.py b/modoboa/lib/migrations/0005_rename_table.py deleted file mode 100644 index cd5ab6347..000000000 --- a/modoboa/lib/migrations/0005_rename_table.py +++ /dev/null @@ -1,102 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - - -class Migration(SchemaMigration): - depends_on = ( - ('admin', '0037_rename_tables'), - ) - - def forwards(self, orm): - db.rename_table('lib_log', 'core_log') - db.send_create_signal('core', ['Log']) - - # Changing field 'UserParameter.user' - db.alter_column(u'lib_userparameter', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.User'])) - - def backwards(self, orm): - db.rename_table('core_log', 'lib_log') - db.send_create_signal(u'lib', ['Log']) - - # Changing field 'UserParameter.user' - db.alter_column(u'lib_userparameter', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.User'])) - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.extension': { - 'Meta': {'object_name': 'Extension'}, - 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) - }, - u'core.log': { - 'Meta': {'object_name': 'Log'}, - 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'level': ('django.db.models.fields.CharField', [], {'max_length': '15'}), - 'logger': ('django.db.models.fields.CharField', [], {'max_length': '30'}), - 'message': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'core.objectaccess': { - 'Meta': {'unique_together': "(('user', 'content_type', 'object_id'),)", 'object_name': 'ObjectAccess'}, - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'lib.parameter': { - 'Meta': {'object_name': 'Parameter'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'lib.userparameter': { - 'Meta': {'object_name': 'UserParameter'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['core', 'lib'] diff --git a/modoboa/lib/migrations/0006_move_parameters.py b/modoboa/lib/migrations/0006_move_parameters.py deleted file mode 100644 index 0913b626a..000000000 --- a/modoboa/lib/migrations/0006_move_parameters.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models - -class Migration(DataMigration): - depends_on = ( - ('admin', '0037_rename_tables'), - ) - - params = ['AUTHENTICATION_TYPE', 'PASSWORD_SCHEME', 'SECRET_KEY', - 'LOG_MAXIMUM_AGE', 'ITEMS_PER_PAGE', 'DEFAULT_TOP_REDIRECTION'] - - def forwards(self, orm): - "Write your forwards methods here." - for p in orm['lib.Parameter'].objects.filter( - name__in=['admin.%s' % n for n in self.params]): - p.name = p.name.replace('admin.', 'core.') - p.save() - for ldap_p in orm['lib.Parameter'].objects.filter(name__contains='admin.LDAP'): - ldap_p.name = ldap_p.name.replace('admin.', 'core.') - ldap_p.save() - - def backwards(self, orm): - "Write your backwards methods here." - for p in orm['lib.Parameter'].objects.filter( - name__in=['core.%s' % n for n in self.params]): - p.name = p.name.replace('core.', 'admin.') - p.save() - for ldap_p in orm['lib.Parameter'].objects.filter(name__contains='core.LDAP'): - ldap_p.name = ldap_p.name.replace('core.', 'admin.') - ldap_p.save() - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - u'core.user': { - 'Meta': {'ordering': "['username']", 'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '254', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_local': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '254'}) - }, - u'lib.parameter': { - 'Meta': {'object_name': 'Parameter'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - }, - u'lib.userparameter': { - 'Meta': {'object_name': 'UserParameter'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['core.User']"}), - 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'}) - } - } - - complete_apps = ['lib'] - symmetrical = True diff --git a/modoboa/lib/permissions.py b/modoboa/lib/permissions.py index b1a136b99..661db46fb 100644 --- a/modoboa/lib/permissions.py +++ b/modoboa/lib/permissions.py @@ -1,7 +1,10 @@ # coding: utf-8 + +from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType -from django.utils.translation import ugettext as _ from django.db import IntegrityError +from django.utils.translation import ugettext as _ + from modoboa.core.models import ObjectAccess, User from modoboa.lib import events @@ -147,15 +150,16 @@ def get_object_owner(obj): return entry.user -def add_permissions_to_group(groupname, permissions): - """Add the specified permissions to a django group. - """ - from django.contrib.auth.models import Group, Permission +def add_permissions_to_group(group, permissions): + """Add the specified permissions to a django group.""" + if isinstance(group, basestring): + group = Group.objects.get(name=group) - grp = Group.objects.get(name=groupname) for appname, modelname, permname in permissions: - ct = ContentType.objects.get_by_natural_key( - appname, modelname) - grp.permissions.add( + ct = ContentType.objects.get_by_natural_key(appname, modelname) + if group.permissions.filter( + content_type=ct, codename=permname).exists(): + continue + group.permissions.add( Permission.objects.get(content_type=ct, codename=permname) ) diff --git a/modoboa/lib/tests.py b/modoboa/lib/tests.py index 5eee3edbd..ade238400 100644 --- a/modoboa/lib/tests.py +++ b/modoboa/lib/tests.py @@ -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" diff --git a/modoboa/urls.py b/modoboa/urls.py index 2a4e3eef5..29c617ec2 100644 --- a/modoboa/urls.py +++ b/modoboa/urls.py @@ -18,12 +18,12 @@ urlpatterns = patterns( urlpatterns += patterns( '', - *events.raiseQueryEvent("ExtraUprefsRoutes") + *exts_pool.load_all() ) urlpatterns += patterns( '', - *exts_pool.load_all() + *events.raiseQueryEvent("ExtraUprefsRoutes") ) parameters.apply_to_django_settings() diff --git a/requirements.txt b/requirements.txt index f469abeba..e2f877685 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,13 @@ -django>=1.6,<1.7 +django>=1.7 django-reversion==1.8.5 dj-database-url -south>=1.0 lxml pycrypto sievelib chardet argparse rfc6266 -factory-boy<2.4 +factory-boy>=2.4 passlib django-versionfield2>=0.3.3 requests diff --git a/tests/install_from_scratch.py b/tests/install_from_scratch.py index 9fafbb56c..fa2663afe 100644 --- a/tests/install_from_scratch.py +++ b/tests/install_from_scratch.py @@ -36,7 +36,7 @@ class DeployTest(unittest.TestCase): def test_standard(self): timeout = 2 cmd = ( - "modoboa-admin.py deploy --dbaction install --collectstatic {0}" + "modoboa-admin.py deploy --collectstatic {0}" .format(self.projname) ) child = pexpect.spawn(cmd, cwd=self.workdir) @@ -65,8 +65,8 @@ class DeployTest(unittest.TestCase): % (self.dbtype, self.dbuser, self.dbpassword, self.dbhost, self.projname) cmd = ( - "modoboa-admin.py deploy --dbaction install --collectstatic " - "--dburl %s --extensions all --domain %s %s" + "modoboa-admin.py deploy --collectstatic " + "--dburl %s --domain %s %s" % (dburl, 'localhost', self.projname) ) code, output = exec_cmd(cmd, cwd=self.workdir)