VirtualMailManager/domain.py
author Pascal Volk <user@localhost.localdomain.org>
Sun, 30 Dec 2012 16:12:18 +0000
branchv0.7.x
changeset 666 50148adebee9
parent 653 cf07e4468934
child 671 a9d86ccac044
permissions -rw-r--r--
VMM/cli/main: Adjusted to new argparse functionality.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     1
# -*- coding: UTF-8 -*-
568
14abdd04ddf5 Updated copyright notices to include the year 2012.
Pascal Volk <user@localhost.localdomain.org>
parents: 539
diff changeset
     2
# Copyright (c) 2007 - 2012, Pascal Volk
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     3
# See COPYING for distribution information.
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
     4
"""
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
     5
    VirtualMailManager.domain
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
     6
    ~~~~~~~~~~~~~~~~~~~~~~~~~
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
     7
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
     8
    Virtual Mail Manager's Domain class to manage e-mail domains.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
     9
"""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    10
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    11
import os
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
    12
import re
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    13
from random import choice
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    14
316
31d8931dc535 VMM/constants: Replaced the constants subpackage by a module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 294
diff changeset
    15
from VirtualMailManager.constants import \
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
    16
     ACCOUNT_AND_ALIAS_PRESENT, DOMAIN_ALIAS_EXISTS, DOMAIN_EXISTS, \
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
    17
     DOMAIN_INVALID, DOMAIN_TOO_LONG, NO_SUCH_DOMAIN, VMM_ERROR
615
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
    18
from VirtualMailManager.common import validate_transport
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
    19
from VirtualMailManager.errors import VMMError, DomainError as DomErr
615
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
    20
from VirtualMailManager.maillocation import MailLocation
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
    21
from VirtualMailManager.quotalimit import QuotaLimit
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    22
from VirtualMailManager.serviceset import ServiceSet
320
011066435e6f VMM/*: Made all modules names lowercase, adjusted imports.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 316
diff changeset
    23
from VirtualMailManager.transport import Transport
185
6e1ef32fbd82 VMM/*: Moved some methods from classes to modules __init__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
    24
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    25
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    26
MAILDIR_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
    27
RE_DOMAIN = re.compile(r"^(?:[a-z0-9-]{1,63}\.){1,}[a-z]{2,6}$")
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
    28
_ = lambda msg: msg
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
    29
cfg_dget = lambda option: None
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    30
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    31
122
30abf0abf8f8 Converted to new-style class, added __slots__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 110
diff changeset
    32
class Domain(object):
3
a9b44e04bf01 * VirtualMailManager/Account.py:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 0
diff changeset
    33
    """Class to manage e-mail domains."""
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    34
    __slots__ = ('_directory', '_gid', '_name', '_qlimit', '_services',
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
    35
                 '_transport', '_note', '_dbh', '_new')
225
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 222
diff changeset
    36
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    37
    def __init__(self, dbh, domainname):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    38
        """Creates a new Domain instance.
122
30abf0abf8f8 Converted to new-style class, added __slots__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 110
diff changeset
    39
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    40
        Loads all relevant data from the database, if the domain could be
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    41
        found.  To create a new domain call the methods set_directory() and
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    42
        set_transport() before save().
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    43
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    44
        A DomainError will be thrown when the *domainname* is the name of
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    45
        an alias domain.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    46
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    47
        Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    48
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    49
        `dbh` : pyPgSQL.PgSQL.Connection
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    50
          a database connection for the database access
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    51
        `domainname` : basestring
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    52
          The name of the domain
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    53
        """
199
0684790fff7c VMM: renamed function chk_domainname() -> check_domainname().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 198
diff changeset
    54
        self._name = check_domainname(domainname)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    55
        self._dbh = dbh
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    56
        self._gid = 0
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
    57
        self._qlimit = None
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    58
        self._services = None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    59
        self._transport = None
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    60
        self._directory = None
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
    61
        self._note = None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    62
        self._new = True
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    63
        self._load()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    64
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    65
    def _load(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    66
        """Load information from the database and checks if the domain name
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    67
        is the primary one.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    68
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    69
        Raises a DomainError if Domain._name isn't the primary name of the
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    70
        domain.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    71
        """
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    72
        dbc = self._dbh.cursor()
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
    73
        dbc.execute('SELECT dd.gid, qid, ssid, tid, domaindir, is_primary, '
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
    74
                    'note '
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    75
                    'FROM domain_data dd, domain_name dn WHERE domainname = '
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    76
                    '%s AND dn.gid = dd.gid', (self._name,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    77
        result = dbc.fetchone()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    78
        dbc.close()
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    79
        if result:
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    80
            if not result[5]:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
    81
                raise DomErr(_("The domain '%s' is an alias domain.") %
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    82
                             self._name, DOMAIN_ALIAS_EXISTS)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    83
            self._gid, self._directory = result[0], result[4]
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
    84
            self._qlimit = QuotaLimit(self._dbh, qid=result[1])
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    85
            self._services = ServiceSet(self._dbh, ssid=result[2])
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    86
            self._transport = Transport(self._dbh, tid=result[3])
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
    87
            self._note = result[6]
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    88
            self._new = False
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    89
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    90
    def _set_gid(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    91
        """Sets the ID of the domain - if not set yet."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    92
        assert self._gid == 0
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    93
        dbc = self._dbh.cursor()
43
92a6132940f5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 35
diff changeset
    94
        dbc.execute("SELECT nextval('domain_gid')")
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    95
        self._gid = dbc.fetchone()[0]
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    96
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    97
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
    98
    def _check_for_addresses(self):
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
    99
        """Checks dependencies for deletion. Raises a DomainError if there
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   100
        are accounts, aliases and/or relocated users.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   101
        """
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   102
        dbc = self._dbh.cursor()
492
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   103
        dbc.execute('SELECT '
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   104
                    '(SELECT count(gid) FROM users WHERE gid = %(gid)u)'
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   105
                    '  as account_count, '
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   106
                    '(SELECT count(gid) FROM alias WHERE gid = %(gid)u)'
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   107
                    '  as alias_count, '
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   108
                    '(SELECT count(gid) FROM relocated WHERE gid = %(gid)u)'
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   109
                    '  as relocated_count'
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   110
                    % {'gid': self._gid})
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   111
        result = dbc.fetchall()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   112
        dbc.close()
492
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   113
        result = result[0]
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   114
        if any(result):
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   115
            keys = ('account_count', 'alias_count', 'relocated_count')
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   116
            raise DomErr(_('There are %(account_count)u accounts, '
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   117
                           '%(alias_count)u aliases and %(relocated_count)u '
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   118
                           'relocated users.') % dict(list(zip(keys, result))),
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 199
diff changeset
   119
                         ACCOUNT_AND_ALIAS_PRESENT)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   120
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   121
    def _chk_state(self, must_exist=True):
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   122
        """Checks the state of the Domain instance and will raise a
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   123
        VirtualMailManager.errors.DomainError:
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   124
          - if *must_exist* is `True` and the domain doesn't exist
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   125
          - or *must_exist* is `False` and the domain exists
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   126
        """
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   127
        if must_exist and self._new:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   128
            raise DomErr(_("The domain '%s' does not exist.") % self._name,
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   129
                         NO_SUCH_DOMAIN)
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   130
        elif not must_exist and not self._new:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   131
            raise DomErr(_("The domain '%s' already exists.") % self._name,
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   132
                         DOMAIN_EXISTS)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   133
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   134
    def _update_tables(self, column, value):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   135
        """Update table columns in the domain_data table."""
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   136
        dbc = self._dbh.cursor()
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   137
        dbc.execute('UPDATE domain_data SET %s = %%s WHERE gid = %%s' % column,
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   138
                    (value, self._gid))
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   139
        if dbc.rowcount > 0:
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   140
            self._dbh.commit()
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   141
        dbc.close()
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   142
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   143
    def _update_tables_ref(self, column, value, force=False):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   144
        """Update various columns in the domain_data table. When *force* is
534
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   145
        `True`, the corresponding column in the users table will be reset to
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   146
        NULL.
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   147
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   148
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   149
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   150
        `column` : basestring
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   151
          Name of the table column. Currently: qid, ssid and tid
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   152
        `value` : long
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   153
          The referenced key
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   154
        `force` : bool
534
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   155
          reset existing users. Default: `False`
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   156
        """
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   157
        if column not in ('qid', 'ssid', 'tid'):
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   158
            raise ValueError('Unknown column: %r' % column)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   159
        self._update_tables(column, value)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   160
        if force:
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   161
            dbc = self._dbh.cursor()
534
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   162
            dbc.execute('UPDATE users SET %s = NULL WHERE gid = %%s' % column,
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   163
                        (self._gid,))
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   164
            if dbc.rowcount > 0:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   165
                self._dbh.commit()
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   166
            dbc.close()
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   167
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   168
    @property
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   169
    def gid(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   170
        """The GID of the Domain."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   171
        return self._gid
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   172
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   173
    @property
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   174
    def name(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   175
        """The Domain's name."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   176
        return self._name
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   177
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   178
    @property
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   179
    def directory(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   180
        """The Domain's directory."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   181
        return self._directory
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   182
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   183
    @property
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   184
    def quotalimit(self):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   185
        """The Domain's quota limit."""
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   186
        return self._qlimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   187
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   188
    @property
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   189
    def serviceset(self):
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   190
        """The Domain's serviceset."""
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   191
        return self._services
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   192
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   193
    @property
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   194
    def transport(self):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   195
        """The Domain's transport."""
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   196
        return self._transport
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   197
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   198
    @property
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   199
    def note(self):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   200
        """The Domain's note."""
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   201
        return self._note
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   202
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   203
    def set_directory(self, basedir):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   204
        """Set the path value of the Domain's directory, inside *basedir*.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   205
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   206
        Argument:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   207
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   208
        `basedir` : basestring
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   209
          The base directory of all domains
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   210
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   211
        self._chk_state(False)
363
502d59f4bb34 VMM/domain: set_{directory,transport} make sure the domain is new.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 352
diff changeset
   212
        assert self._directory is None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   213
        self._set_gid()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   214
        self._directory = os.path.join(basedir, choice(MAILDIR_CHARS),
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   215
                                       str(self._gid))
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   216
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   217
    def set_quotalimit(self, quotalimit):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   218
        """Set the quota limit for the new Domain.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   219
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   220
        Argument:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   221
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   222
        `quotalimit` : VirtualMailManager.quotalimit.QuotaLimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   223
          The quota limit of the new Domain.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   224
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   225
        self._chk_state(False)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   226
        assert isinstance(quotalimit, QuotaLimit)
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   227
        self._qlimit = quotalimit
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   228
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   229
    def set_serviceset(self, serviceset):
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   230
        """Set the services for the new Domain.
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   231
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   232
        Argument:
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   233
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   234
       `serviceset` : VirtualMailManager.serviceset.ServiceSet
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   235
         The service set for the new Domain.
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   236
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   237
        self._chk_state(False)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   238
        assert isinstance(serviceset, ServiceSet)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   239
        self._services = serviceset
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   240
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   241
    def set_transport(self, transport):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   242
        """Set the transport for the new Domain.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   243
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   244
        Argument:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   245
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   246
        `transport` : VirtualMailManager.Transport
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   247
          The transport of the new Domain
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   248
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   249
        self._chk_state(False)
363
502d59f4bb34 VMM/domain: set_{directory,transport} make sure the domain is new.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 352
diff changeset
   250
        assert isinstance(transport, Transport)
615
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   251
        validate_transport(transport,
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   252
                           MailLocation(self._dbh,
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   253
                                        mbfmt=cfg_dget('mailbox.format'),
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   254
                                        directory=cfg_dget('mailbox.root')))
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   255
        self._transport = transport
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   256
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   257
    def set_note(self, note):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   258
        """Set the domain's (optional) note.
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   259
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   260
        Argument:
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   261
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   262
        `note` : basestring or None
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   263
          The note, or None to remove
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   264
        """
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   265
        self._chk_state(False)
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   266
        assert note is None or isinstance(note, str)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   267
        self._note = note
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   268
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   269
    def save(self):
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   270
        """Stores the new domain in the database."""
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   271
        self._chk_state(False)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   272
        assert all((self._directory, self._qlimit, self._services,
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   273
                    self._transport))
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   274
        dbc = self._dbh.cursor()
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   275
        dbc.execute('INSERT INTO domain_data (gid, qid, ssid, tid, domaindir, '
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   276
                    'note) '
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   277
                    'VALUES (%s, %s, %s, %s, %s, %s)', (self._gid,
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   278
                    self._qlimit.qid, self._services.ssid, self._transport.tid,
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   279
                    self._directory, self._note))
379
7518d927d443 VMM/*: Use target column names in all INSERT statements.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 366
diff changeset
   280
        dbc.execute('INSERT INTO domain_name (domainname, gid, is_primary) '
7518d927d443 VMM/*: Use target column names in all INSERT statements.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 366
diff changeset
   281
                    'VALUES (%s, %s, TRUE)', (self._name, self._gid))
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   282
        self._dbh.commit()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   283
        dbc.close()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   284
        self._new = False
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   285
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   286
    def delete(self, force=False):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   287
        """Deletes the domain.
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   288
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   289
        Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   290
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   291
        `force` : bool
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   292
          force the deletion of all available accounts, aliases and
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   293
          relocated users.  When *force* is `False` and there are accounts,
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   294
          aliases and/or relocated users a DomainError will be raised.
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   295
          Default `False`
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   296
        """
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   297
        if not isinstance(force, bool):
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   298
            raise TypeError('force must be a bool')
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   299
        self._chk_state()
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   300
        if not force:
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   301
            self._check_for_addresses()
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   302
        dbc = self._dbh.cursor()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   303
        for tbl in ('alias', 'users', 'relocated', 'domain_name',
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   304
                    'domain_data'):
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   305
            dbc.execute("DELETE FROM %s WHERE gid = %u" % (tbl, self._gid))
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   306
        self._dbh.commit()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   307
        dbc.close()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   308
        self._gid = 0
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   309
        self._directory = self._qlimit = self._transport = None
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   310
        self._services = None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   311
        self._new = True
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   312
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   313
    def update_quotalimit(self, quotalimit, force=False):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   314
        """Update the quota limit of the Domain.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   315
534
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   316
        If *force* is `True`, accounts-specific overrides will be reset
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   317
        for all existing accounts of the domain. Otherwise, the limit
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   318
        will only affect accounts that use the default.
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   319
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   320
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   321
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   322
        `quotalimit` : VirtualMailManager.quotalimit.QuotaLimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   323
          the new quota limit of the domain.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   324
        `force` : bool
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   325
          enforce new quota limit for all accounts, default `False`
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   326
        """
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
   327
        if cfg_dget('misc.dovecot_version') < 0x10102f00:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   328
            raise VMMError(_('PostgreSQL-based dictionary quota requires '
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   329
                             'Dovecot >= v1.1.2.'), VMM_ERROR)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   330
        self._chk_state()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   331
        assert isinstance(quotalimit, QuotaLimit)
402
8984b1f4e6e3 VMM/domain: Execute the database updates of
Pascal Volk <neverseen@users.sourceforge.net>
parents: 392
diff changeset
   332
        if not force and quotalimit == self._qlimit:
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   333
            return
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   334
        self._update_tables_ref('qid', quotalimit.qid, force)
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   335
        self._qlimit = quotalimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   336
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   337
    def update_serviceset(self, serviceset, force=False):
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   338
        """Assign a different set of services to the Domain,
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   339
534
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   340
        If *force* is `True`, accounts-specific overrides will be reset
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   341
        for all existing accounts of the domain. Otherwise, the service
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   342
        set will only affect accounts that use the default.
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   343
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   344
        Arguments:
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   345
        `serviceset` : VirtualMailManager.serviceset.ServiceSet
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   346
          the new set of services
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   347
        `force`
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   348
          enforce the serviceset for all accounts, default `False`
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   349
        """
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   350
        self._chk_state()
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   351
        assert isinstance(serviceset, ServiceSet)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   352
        if not force and serviceset == self._services:
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   353
            return
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   354
        self._update_tables_ref('ssid', serviceset.ssid, force)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   355
        self._services = serviceset
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   356
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   357
    def update_transport(self, transport, force=False):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   358
        """Sets a new transport for the Domain.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   359
534
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   360
        If *force* is `True`, accounts-specific overrides will be reset
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   361
        for all existing accounts of the domain. Otherwise, the transport
6a27c7529cd7 Change 'force' argument to reset user records for tid/ssid/qid
martin f. krafft <madduck@madduck.net>
parents: 515
diff changeset
   362
        setting will only affect accounts that use the default.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   363
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   364
        Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   365
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   366
        `transport` : VirtualMailManager.Transport
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   367
          the new transport
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   368
        `force` : bool
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   369
          enforce new transport setting for all accounts, default `False`
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   370
        """
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   371
        self._chk_state()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   372
        assert isinstance(transport, Transport)
402
8984b1f4e6e3 VMM/domain: Execute the database updates of
Pascal Volk <neverseen@users.sourceforge.net>
parents: 392
diff changeset
   373
        if not force and transport == self._transport:
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   374
            return
615
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   375
        validate_transport(transport,
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   376
                           MailLocation(self._dbh,
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   377
                                        mbfmt=cfg_dget('mailbox.format'),
5882bfdf83e8 VMM/domain: Enabled transport-validation.
Pascal Volk <user@localhost.localdomain.org>
parents: 611
diff changeset
   378
                                        directory=cfg_dget('mailbox.root')))
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   379
        self._update_tables_ref('tid', transport.tid, force)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   380
        self._transport = transport
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   381
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   382
    def update_note(self, note):
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   383
        """Sets a new note for the Domain.
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   384
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   385
        Arguments:
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   386
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   387
        `transport` : basestring or None
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   388
          the new note
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   389
        """
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   390
        self._chk_state()
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   391
        assert note is None or isinstance(note, str)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   392
        if note == self._note:
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   393
            return
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   394
        self._update_tables('note', note)
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   395
        self._note = note
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   396
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   397
    def get_info(self):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   398
        """Returns a dictionary with information about the domain."""
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   399
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   400
        dbc = self._dbh.cursor()
447
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   401
        dbc.execute('SELECT aliasdomains "alias domains", accounts, aliases, '
515
09fa019bb330 Include catch-all count in domaininfo output
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   402
                    'relocated, catchall "catch-all dests" '
09fa019bb330 Include catch-all count in domaininfo output
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   403
                    'FROM vmm_domain_info WHERE gid = %s', (self._gid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   404
        info = dbc.fetchone()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   405
        dbc.close()
515
09fa019bb330 Include catch-all count in domaininfo output
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   406
        keys = ('alias domains', 'accounts', 'aliases', 'relocated',
09fa019bb330 Include catch-all count in domaininfo output
martin f. krafft <madduck@madduck.net>
parents: 510
diff changeset
   407
                'catch-all dests')
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   408
        info = dict(list(zip(keys, info)))
392
ffce67e3c6eb VMM/domain: Adjusted Domain.get_info() to the updated vmm_domain_info view.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
   409
        info['gid'] = self._gid
447
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   410
        info['domain name'] = self._name
392
ffce67e3c6eb VMM/domain: Adjusted Domain.get_info() to the updated vmm_domain_info view.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
   411
        info['transport'] = self._transport.transport
447
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   412
        info['domain directory'] = self._directory
392
ffce67e3c6eb VMM/domain: Adjusted Domain.get_info() to the updated vmm_domain_info view.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
   413
        info['bytes'] = self._qlimit.bytes
ffce67e3c6eb VMM/domain: Adjusted Domain.get_info() to the updated vmm_domain_info view.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
   414
        info['messages'] = self._qlimit.messages
447
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   415
        services = self._services.services
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   416
        services = [s.upper() for s in services if services[s]]
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   417
        if services:
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   418
            services.sort()
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   419
        else:
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   420
            services.append('None')
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   421
        info['active services'] = ' '.join(services)
539
5806fb74130b Add note field to Account/Domain and CLI
martin f. krafft <madduck@madduck.net>
parents: 534
diff changeset
   422
        info['note'] = self._note
392
ffce67e3c6eb VMM/domain: Adjusted Domain.get_info() to the updated vmm_domain_info view.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
   423
        return info
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   424
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   425
    def get_accounts(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   426
        """Returns a list with all accounts of the domain."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   427
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   428
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   429
        dbc.execute('SELECT local_part from users where gid = %s ORDER BY '
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   430
                    'local_part', (self._gid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   431
        users = dbc.fetchall()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   432
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   433
        accounts = []
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   434
        if users:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   435
            addr = '@'.join
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   436
            _dom = self._name
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   437
            accounts = [addr((account[0], _dom)) for account in users]
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   438
        return accounts
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   439
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   440
    def get_aliases(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   441
        """Returns a list with all aliases e-mail addresses of the domain."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   442
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   443
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   444
        dbc.execute('SELECT DISTINCT address FROM alias WHERE gid = %s ORDER '
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   445
                    'BY address', (self._gid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   446
        addresses = dbc.fetchall()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   447
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   448
        aliases = []
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   449
        if addresses:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   450
            addr = '@'.join
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   451
            _dom = self._name
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   452
            aliases = [addr((alias[0], _dom)) for alias in addresses]
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   453
        return aliases
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   454
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   455
    def get_relocated(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   456
        """Returns a list with all addresses of relocated users."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   457
        self._chk_state()
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   458
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   459
        dbc.execute('SELECT address FROM relocated WHERE gid = %s ORDER BY '
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   460
                    'address', (self._gid,))
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   461
        addresses = dbc.fetchall()
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   462
        dbc.close()
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   463
        relocated = []
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   464
        if addresses:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   465
            addr = '@'.join
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   466
            _dom = self._name
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   467
            relocated = [addr((address[0], _dom)) for address in addresses]
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   468
        return relocated
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   469
510
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   470
    def get_catchall(self):
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   471
        """Returns a list with all catchall e-mail addresses of the domain."""
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   472
        self._chk_state()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   473
        dbc = self._dbh.cursor()
611
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 568
diff changeset
   474
        dbc.execute('SELECT DISTINCT destination FROM catchall WHERE gid = %s '
8e9b0046bc8f PEP8: Fixed all PEP8 related issues.
Pascal Volk <user@localhost.localdomain.org>
parents: 568
diff changeset
   475
                    'ORDER BY destination', (self._gid,))
510
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   476
        addresses = dbc.fetchall()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   477
        dbc.close()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   478
        return addresses
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   479
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   480
    def get_aliase_names(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   481
        """Returns a list with all alias domain names of the domain."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   482
        self._chk_state()
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   483
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   484
        dbc.execute('SELECT domainname FROM domain_name WHERE gid = %s AND '
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   485
                    'NOT is_primary ORDER BY domainname', (self._gid,))
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   486
        anames = dbc.fetchall()
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   487
        dbc.close()
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   488
        aliasdomains = []
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   489
        if anames:
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   490
            aliasdomains = [aname[0] for aname in anames]
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   491
        return aliasdomains
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   492
198
02d467e4fbab VMM/Domain: added function get_gid() to the Domain module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   493
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   494
def check_domainname(domainname):
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   495
    """Returns the validated domain name `domainname`.
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   496
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   497
    Throws an `DomainError`, if the domain name is too long or doesn't
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   498
    look like a valid domain name (label.label.label).
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   499
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   500
    """
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   501
    if not RE_DOMAIN.match(domainname):
653
cf07e4468934 VMM: Post-2to3 fixes.
Pascal Volk <user@localhost.localdomain.org>
parents: 643
diff changeset
   502
        domainname = domainname.encode('idna').decode()
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   503
    if len(domainname) > 255:
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   504
        raise DomErr(_('The domain name is too long'), DOMAIN_TOO_LONG)
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   505
    if not RE_DOMAIN.match(domainname):
643
df1e3b67882a Ran 2to3 from Python 3.2.3.
Pascal Volk <user@localhost.localdomain.org>
parents: 637
diff changeset
   506
        raise DomErr(_("The domain name '%s' is invalid") % domainname,
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   507
                     DOMAIN_INVALID)
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   508
    return domainname
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   509
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   510
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   511
def get_gid(dbh, domainname):
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   512
    """Returns the group id of the domain *domainname*.
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   513
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   514
    If the domain couldn't be found in the database 0 will be returned.
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   515
    """
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   516
    domainname = check_domainname(domainname)
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   517
    dbc = dbh.cursor()
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   518
    dbc.execute('SELECT gid FROM domain_name WHERE domainname = %s',
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   519
                (domainname,))
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   520
    gid = dbc.fetchone()
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   521
    dbc.close()
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   522
    if gid:
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   523
        return gid[0]
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   524
    return 0
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   525
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   526
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   527
def search(dbh, pattern=None, like=False):
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   528
    """'Search' for domains by *pattern* in the database.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   529
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   530
    *pattern* may be a domain name or a partial domain name - starting
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   531
    and/or ending with a '%' sign.  When the *pattern* starts or ends with
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   532
    a '%' sign *like* has to be `True` to perform a wildcard search.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   533
    To retrieve all available domains use the arguments' default values.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   534
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   535
    This function returns a tuple with a list and a dict: (order, domains).
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   536
    The order list contains the domains' gid, alphabetical sorted by the
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   537
    primary domain name.  The domains dict's keys are the gids of the
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   538
    domains. The value of item is a list.  The first list element contains
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   539
    the primary domain name or `None`.  The elements [1:] contains the
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   540
    names of alias domains.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   541
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   542
    Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   543
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   544
    `pattern` : basestring
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   545
      a (partial) domain name (starting and/or ending with a "%" sign)
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   546
    `like` : bool
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   547
      should be `True` when *pattern* starts/ends with a "%" sign
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   548
    """
242
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   549
    if pattern and not like:
199
0684790fff7c VMM: renamed function chk_domainname() -> check_domainname().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 198
diff changeset
   550
        pattern = check_domainname(pattern)
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   551
    sql = 'SELECT gid, domainname, is_primary FROM domain_name'
242
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   552
    if pattern:
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   553
        if like:
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   554
            sql += " WHERE domainname LIKE '%s'" % pattern
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   555
        else:
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   556
            sql += " WHERE domainname = '%s'" % pattern
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   557
    sql += ' ORDER BY is_primary DESC, domainname'
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   558
    dbc = dbh.cursor()
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   559
    dbc.execute(sql)
239
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   560
    result = dbc.fetchall()
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   561
    dbc.close()
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   562
239
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   563
    gids = [domain[0] for domain in result if domain[2]]
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   564
    domains = {}
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   565
    for gid, domain, is_primary in result:
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   566
        if is_primary:
239
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   567
            if not gid in domains:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   568
                domains[gid] = [domain]
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   569
            else:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   570
                domains[gid].insert(0, domain)
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   571
        else:
239
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   572
            if gid in gids:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   573
                if gid in domains:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   574
                    domains[gid].append(domain)
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   575
                else:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   576
                    domains[gid] = [domain]
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   577
            else:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   578
                gids.append(gid)
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   579
                domains[gid] = [None, domain]
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   580
    return gids, domains
45
9e66138aad0b * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 44
diff changeset
   581
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
   582
del _, cfg_dget