VirtualMailManager/domain.py
author martin f. krafft <madduck@madduck.net>
Tue, 10 Apr 2012 22:56:30 +0200
branchv0.6.x
changeset 514 d863a44a6353
parent 510 1fa354bbdb90
child 515 09fa019bb330
permissions -rw-r--r--
Make PL/pgSQL function feed back identity for mailboxes/relocated when there are catchall destinations. Without catchall aliases, if no virtual_alias matches, the query can just return NULL and Postfix will later check mailboxes/relocated for the address to rewrite. However, since virtual aliases are handled long before mailboxes/relocated, a catchall alias would also catch mail to mailboxes and relocated addresses, which we do not want. The way to tell postfix to keep delivering is for the virtual alias map to return the search key itself (identity function). This patch changes the postfix_virtual_alias_maps Pl/pgSQL function to do exactly that, but only if there are catchall destinations defined for the domain in question — otherwise it returns NULL when no match is found.
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 -*-
366
d6573da35b5f Updated copyright notices to include the year 2011.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 363
diff changeset
     2
# Copyright (c) 2007 - 2011, 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
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
    18
from VirtualMailManager.errors import VMMError, DomainError as DomErr
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
    19
from VirtualMailManager.pycompat import all, any
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
    20
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
    21
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
    22
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
    23
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    24
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    25
MAILDIR_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
    26
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
    27
_ = 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
    28
cfg_dget = lambda option: None
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    29
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    30
122
30abf0abf8f8 Converted to new-style class, added __slots__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 110
diff changeset
    31
class Domain(object):
3
a9b44e04bf01 * VirtualMailManager/Account.py:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 0
diff changeset
    32
    """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
    33
    __slots__ = ('_directory', '_gid', '_name', '_qlimit', '_services',
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    34
                 '_transport', '_dbh', '_new')
225
a51809f7940b VMM/Transport: reworked Transport class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 222
diff changeset
    35
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    36
    def __init__(self, dbh, domainname):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    37
        """Creates a new Domain instance.
122
30abf0abf8f8 Converted to new-style class, added __slots__.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 110
diff changeset
    38
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    39
        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
    40
        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
    41
        set_transport() before save().
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    42
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    43
        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
    44
        an alias domain.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    45
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    46
        Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    47
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    48
        `dbh` : pyPgSQL.PgSQL.Connection
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    49
          a database connection for the database access
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    50
        `domainname` : basestring
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    51
          The name of the domain
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    52
        """
199
0684790fff7c VMM: renamed function chk_domainname() -> check_domainname().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 198
diff changeset
    53
        self._name = check_domainname(domainname)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    54
        self._dbh = dbh
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    55
        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
    56
        self._qlimit = None
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    57
        self._services = None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    58
        self._transport = None
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    59
        self._directory = None
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    60
        self._new = True
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    61
        self._load()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    62
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    63
    def _load(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    64
        """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
    65
        is the primary one.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    66
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    67
        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
    68
        domain.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    69
        """
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    70
        dbc = self._dbh.cursor()
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    71
        dbc.execute('SELECT dd.gid, qid, ssid, tid, domaindir, is_primary '
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    72
                    '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
    73
                    '%s AND dn.gid = dd.gid', (self._name,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    74
        result = dbc.fetchone()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    75
        dbc.close()
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    76
        if result:
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
    77
            if not result[5]:
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    78
                raise DomErr(_(u"The domain '%s' is an alias domain.") %
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    79
                             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
    80
            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
    81
            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
    82
            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
    83
            self._transport = Transport(self._dbh, tid=result[3])
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    84
            self._new = False
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    85
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    86
    def _set_gid(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    87
        """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
    88
        assert self._gid == 0
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    89
        dbc = self._dbh.cursor()
43
92a6132940f5 * 'VirtualMailManager/Account.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 35
diff changeset
    90
        dbc.execute("SELECT nextval('domain_gid')")
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
    91
        self._gid = dbc.fetchone()[0]
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    92
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    93
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
    94
    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
    95
        """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
    96
        are accounts, aliases and/or relocated users.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    97
        """
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
    98
        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
    99
        dbc.execute('SELECT '
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   100
                    '(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
   101
                    '  as account_count, '
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   102
                    '(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
   103
                    '  as alias_count, '
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 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
   105
                    '  as relocated_count'
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   106
                    % {'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
   107
        result = dbc.fetchall()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   108
        dbc.close()
492
e5c2b3647971 Modify address check query to obtain well-defined result
martin f. krafft <madduck@madduck.net>
parents: 453
diff changeset
   109
        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
   110
        if any(result):
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   111
            keys = ('account_count', 'alias_count', 'relocated_count')
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   112
            raise DomErr(_(u'There are %(account_count)u accounts, '
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   113
                           u'%(alias_count)u aliases and %(relocated_count)u '
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   114
                           u'relocated users.') % dict(zip(keys, result)),
216
0c8c053b451c Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 199
diff changeset
   115
                         ACCOUNT_AND_ALIAS_PRESENT)
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   116
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   117
    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
   118
        """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
   119
        VirtualMailManager.errors.DomainError:
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   120
          - 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
   121
          - 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
   122
        """
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   123
        if must_exist and self._new:
417
8209da83e256 VMM: Updated some messages. (doesn't, isn't) -> (does not, is not)
Pascal Volk <neverseen@users.sourceforge.net>
parents: 404
diff changeset
   124
            raise DomErr(_(u"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
   125
                         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
   126
        elif not must_exist and not self._new:
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   127
            raise DomErr(_(u"The domain '%s' already exists.") % self._name,
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   128
                         DOMAIN_EXISTS)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   129
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   130
    def _update_tables(self, column, value, force=False):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   131
        """Update various columns in the domain_data table. When *force* is
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   132
        `True` also the corresponding column in the users table will be
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   133
        updated.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   134
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   135
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   136
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   137
        `column` : basestring
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   138
          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
   139
        `value` : long
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   140
          The referenced key
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   141
        `force` : bool
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   142
          enforce the new setting also for existing users. Default: `False`
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   143
        """
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   144
        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
   145
            raise ValueError('Unknown column: %r' % column)
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   146
        dbc = self._dbh.cursor()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   147
        dbc.execute('UPDATE domain_data SET %s = %%s WHERE gid = %%s' % column,
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   148
                    (value, self._gid))
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   149
        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
   150
            self._dbh.commit()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   151
        if force:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   152
            dbc.execute('UPDATE users SET %s = %%s WHERE gid = %%s' % column,
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   153
                        (value, self._gid))
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   154
            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
   155
                self._dbh.commit()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   156
        dbc.close()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   157
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   158
    @property
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   159
    def gid(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   160
        """The GID of the Domain."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   161
        return self._gid
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   162
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   163
    @property
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   164
    def name(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   165
        """The Domain's name."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   166
        return self._name
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   167
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 directory(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   170
        """The Domain's directory."""
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   171
        return self._directory
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   172
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   173
    @property
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   174
    def quotalimit(self):
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   175
        """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
   176
        return self._qlimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   177
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   178
    @property
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   179
    def serviceset(self):
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   180
        """The Domain's serviceset."""
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   181
        return self._services
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   182
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   183
    @property
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   184
    def transport(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 transport."""
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   186
        return self._transport
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   187
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   188
    def set_directory(self, basedir):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   189
        """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
   190
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   191
        Argument:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   192
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   193
        `basedir` : basestring
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   194
          The base directory of all domains
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   195
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   196
        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
   197
        assert self._directory is None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   198
        self._set_gid()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   199
        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
   200
                                       str(self._gid))
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   201
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   202
    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
   203
        """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
   204
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   205
        Argument:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   206
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   207
        `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
   208
          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
   209
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   210
        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
   211
        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
   212
        self._qlimit = quotalimit
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   213
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   214
    def set_serviceset(self, serviceset):
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   215
        """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
   216
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   217
        Argument:
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   218
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   219
       `serviceset` : VirtualMailManager.serviceset.ServiceSet
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   220
         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
   221
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   222
        self._chk_state(False)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   223
        assert isinstance(serviceset, ServiceSet)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   224
        self._services = serviceset
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   225
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   226
    def set_transport(self, transport):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   227
        """Set the transport for the new Domain.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   228
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   229
        Argument:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   230
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   231
        `transport` : VirtualMailManager.Transport
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   232
          The transport of the new Domain
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   233
        """
453
f2934105181b VMM/domain: Extended Domain._chk_state() to support both states.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 447
diff changeset
   234
        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
   235
        assert isinstance(transport, Transport)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   236
        self._transport = transport
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   237
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   238
    def save(self):
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   239
        """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
   240
        self._chk_state(False)
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   241
        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
   242
                    self._transport))
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   243
        dbc = self._dbh.cursor()
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   244
        dbc.execute('INSERT INTO domain_data (gid, qid, ssid, tid, domaindir) '
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   245
                    'VALUES (%s, %s, %s, %s, %s)', (self._gid,
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   246
                    self._qlimit.qid, self._services.ssid, self._transport.tid,
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   247
                    self._directory))
379
7518d927d443 VMM/*: Use target column names in all INSERT statements.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 366
diff changeset
   248
        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
   249
                    '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
   250
        self._dbh.commit()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   251
        dbc.close()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   252
        self._new = False
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   253
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   254
    def delete(self, force=False):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   255
        """Deletes the domain.
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   256
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   257
        Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   258
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   259
        `force` : bool
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   260
          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
   261
          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
   262
          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
   263
          Default `False`
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   264
        """
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   265
        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
   266
            raise TypeError('force must be a bool')
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   267
        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
   268
        if not force:
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   269
            self._check_for_addresses()
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   270
        dbc = self._dbh.cursor()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   271
        for tbl in ('alias', 'users', 'relocated', 'domain_name',
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   272
                    'domain_data'):
331
270b57af85de VMM/domain: Simplified Domain.delete() related methods and their arguments,
Pascal Volk <neverseen@users.sourceforge.net>
parents: 320
diff changeset
   273
            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
   274
        self._dbh.commit()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   275
        dbc.close()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   276
        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
   277
        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
   278
        self._services = None
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   279
        self._new = True
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   280
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   281
    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
   282
        """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
   283
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   284
        If *force* is `True` the new *quotalimit* will be applied to
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   285
        all existing accounts of the domain. Otherwise the *quotalimit*
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   286
        will be only applied to accounts created from now on.
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   287
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   288
        Arguments:
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   289
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   290
        `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
   291
          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
   292
        `force` : bool
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   293
          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
   294
        """
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
   295
        if cfg_dget('misc.dovecot_version') < 0x10102f00:
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
   296
            raise VMMError(_(u'PostgreSQL-based dictionary quota requires '
417
8209da83e256 VMM: Updated some messages. (doesn't, isn't) -> (does not, is not)
Pascal Volk <neverseen@users.sourceforge.net>
parents: 404
diff changeset
   297
                             u'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
   298
        self._chk_state()
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   299
        assert isinstance(quotalimit, QuotaLimit)
402
8984b1f4e6e3 VMM/domain: Execute the database updates of
Pascal Volk <neverseen@users.sourceforge.net>
parents: 392
diff changeset
   300
        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
   301
            return
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   302
        self._update_tables('qid', quotalimit.qid, force)
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   303
        self._qlimit = quotalimit
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   304
441
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   305
    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
   306
        """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
   307
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   308
        If *force* is `True` the *serviceset* will be also assigned to
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   309
        all existing accounts of the Domain.  Otherwise the *serviceset*
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   310
        will be only the 'default' for accounts created from now on.
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   311
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   312
        Arguments:
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   313
        `serviceset` : VirtualMailManager.serviceset.ServiceSet
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   314
          the new set of services
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   315
        `force`
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   316
          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
   317
        """
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   318
        self._chk_state()
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   319
        assert isinstance(serviceset, ServiceSet)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   320
        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
   321
            return
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   322
        self._update_tables('ssid', serviceset.ssid, force)
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   323
        self._services = serviceset
1af5fe0683ce VMM/domain: Integrated class ServiceSet in class Domain.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 417
diff changeset
   324
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   325
    def update_transport(self, transport, force=False):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   326
        """Sets a new transport for the Domain.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   327
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   328
        If *force* is `True` the new *transport* will be assigned to all
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   329
        existing accounts.  Otherwise the *transport* will be only used for
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   330
        accounts created from now on.
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   331
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   332
        Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   333
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   334
        `transport` : VirtualMailManager.Transport
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   335
          the new transport
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   336
        `force` : bool
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   337
          enforce new transport setting for all accounts, default `False`
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   338
        """
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   339
        self._chk_state()
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   340
        assert isinstance(transport, Transport)
402
8984b1f4e6e3 VMM/domain: Execute the database updates of
Pascal Volk <neverseen@users.sourceforge.net>
parents: 392
diff changeset
   341
        if not force and transport == self._transport:
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   342
            return
390
660b42391c8e VMM/{account,domain,handler}: Added quota limit support. A few
Pascal Volk <neverseen@users.sourceforge.net>
parents: 379
diff changeset
   343
        self._update_tables('tid', transport.tid, force)
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   344
        self._transport = transport
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   345
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   346
    def get_info(self):
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   347
        """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
   348
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   349
        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
   350
        dbc.execute('SELECT aliasdomains "alias domains", accounts, aliases, '
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   351
                    'relocated FROM vmm_domain_info WHERE gid = %s',
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   352
                    (self._gid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   353
        info = dbc.fetchone()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   354
        dbc.close()
447
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   355
        keys = ('alias domains', 'accounts', 'aliases', 'relocated')
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
   356
        info = dict(zip(keys, info))
ffce67e3c6eb VMM/domain: Adjusted Domain.get_info() to the updated vmm_domain_info view.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 390
diff changeset
   357
        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
   358
        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
   359
        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
   360
        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
   361
        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
   362
        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
   363
        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
   364
        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
   365
        if services:
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   366
            services.sort()
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   367
        else:
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   368
            services.append('None')
c31d604e26d3 VMM/domain: Extended/updated Domain.get_info() in order to:
Pascal Volk <neverseen@users.sourceforge.net>
parents: 441
diff changeset
   369
        info['active services'] = ' '.join(services)
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
   370
        return info
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   371
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   372
    def get_accounts(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   373
        """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
   374
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   375
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   376
        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
   377
                    'local_part', (self._gid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   378
        users = dbc.fetchall()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   379
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   380
        accounts = []
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   381
        if users:
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   382
            addr = u'@'.join
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   383
            _dom = self._name
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   384
            accounts = [addr((account[0], _dom)) for account in users]
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   385
        return accounts
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   386
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   387
    def get_aliases(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   388
        """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
   389
        self._chk_state()
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   390
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   391
        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
   392
                    'BY address', (self._gid,))
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   393
        addresses = dbc.fetchall()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   394
        dbc.close()
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   395
        aliases = []
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   396
        if addresses:
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   397
            addr = u'@'.join
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   398
            _dom = self._name
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   399
            aliases = [addr((alias[0], _dom)) for alias in addresses]
0
bb0aa2102206 Initial import @sf.net
Pascal Volk <neverseen@users.sourceforge.net>
parents:
diff changeset
   400
        return aliases
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   401
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   402
    def get_relocated(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   403
        """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
   404
        self._chk_state()
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   405
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   406
        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
   407
                    'address', (self._gid,))
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   408
        addresses = dbc.fetchall()
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   409
        dbc.close()
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   410
        relocated = []
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   411
        if addresses:
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   412
            addr = u'@'.join
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   413
            _dom = self._name
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   414
            relocated = [addr((address[0], _dom)) for address in addresses]
80
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   415
        return relocated
5dedc673524e * 'create_tables.pgsql'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 76
diff changeset
   416
510
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   417
    def get_catchall(self):
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   418
        """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
   419
        self._chk_state()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   420
        dbc = self._dbh.cursor()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   421
        dbc.execute('SELECT DISTINCT destination FROM catchall WHERE gid = %s ORDER '
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   422
                    'BY destination', (self._gid,))
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   423
        addresses = dbc.fetchall()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   424
        dbc.close()
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   425
        return addresses
1fa354bbdb90 Add catchall info to domain_info output
martin f. krafft <madduck@madduck.net>
parents: 492
diff changeset
   426
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   427
    def get_aliase_names(self):
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   428
        """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
   429
        self._chk_state()
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   430
        dbc = self._dbh.cursor()
290
e2785e04f92e VMM/…: re-indented long queries and error messages.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 254
diff changeset
   431
        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
   432
                    'NOT is_primary ORDER BY domainname', (self._gid,))
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   433
        anames = dbc.fetchall()
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   434
        dbc.close()
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   435
        aliasdomains = []
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   436
        if anames:
142
28f26f7f3d8f Reduced the mixing/concatenating of str and unicode objects.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 138
diff changeset
   437
            aliasdomains = [aname[0] for aname in anames]
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   438
        return aliasdomains
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   439
198
02d467e4fbab VMM/Domain: added function get_gid() to the Domain module.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 185
diff changeset
   440
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   441
def check_domainname(domainname):
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   442
    """Returns the validated domain name `domainname`.
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   443
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   444
    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
   445
    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
   446
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   447
    """
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   448
    if not RE_DOMAIN.match(domainname):
294
7d1bafc6fa30 VMM/Domain: removed functions ace2idna() and idn2ascii().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 290
diff changeset
   449
        domainname = domainname.encode('idna')
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   450
    if len(domainname) > 255:
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   451
        raise DomErr(_(u'The domain name is too long'), DOMAIN_TOO_LONG)
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   452
    if not RE_DOMAIN.match(domainname):
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   453
        raise DomErr(_(u"The domain name '%s' is invalid") % domainname,
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   454
                     DOMAIN_INVALID)
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   455
    return domainname
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   456
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   457
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   458
def get_gid(dbh, domainname):
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   459
    """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
   460
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   461
    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
   462
    """
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   463
    domainname = check_domainname(domainname)
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   464
    dbc = dbh.cursor()
352
22d115376e4d VMM/…: Provide parameters as tuple to cursor.execute().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 336
diff changeset
   465
    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
   466
                (domainname,))
254
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   467
    gid = dbc.fetchone()
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   468
    dbc.close()
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   469
    if gid:
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   470
        return gid[0]
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   471
    return 0
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   472
8aecc83a0d32 VMM: moved functions ace2idna(), check_domainname(), idn2ascii()
Pascal Volk <neverseen@users.sourceforge.net>
parents: 242
diff changeset
   473
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   474
def search(dbh, pattern=None, like=False):
236
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   475
    """'Search' for domains by *pattern* in the database.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   476
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   477
    *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
   478
    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
   479
    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
   480
    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
   481
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   482
    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
   483
    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
   484
    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
   485
    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
   486
    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
   487
    names of alias domains.
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   488
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   489
    Arguments:
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   490
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   491
    `pattern` : basestring
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   492
      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
   493
    `like` : bool
084331dd1e4c VMM/Domain: reworked Domain class.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 225
diff changeset
   494
      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
   495
    """
242
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   496
    if pattern and not like:
199
0684790fff7c VMM: renamed function chk_domainname() -> check_domainname().
Pascal Volk <neverseen@users.sourceforge.net>
parents: 198
diff changeset
   497
        pattern = check_domainname(pattern)
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   498
    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
   499
    if pattern:
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   500
        if like:
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   501
            sql += " WHERE domainname LIKE '%s'" % pattern
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   502
        else:
496099847480 VMM/Domain: search() small code cleanups.
Pascal Volk <neverseen@users.sourceforge.net>
parents: 240
diff changeset
   503
            sql += " WHERE domainname = '%s'" % pattern
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   504
    sql += ' ORDER BY is_primary DESC, domainname'
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   505
    dbc = dbh.cursor()
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   506
    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
   507
    result = dbc.fetchall()
35
22cc616aef61 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 34
diff changeset
   508
    dbc.close()
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   509
239
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   510
    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
   511
    domains = {}
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   512
    for gid, domain, is_primary in result:
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   513
        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
   514
            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
   515
                domains[gid] = [domain]
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   516
            else:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   517
                domains[gid].insert(0, domain)
44
c9ab6900ede9 * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 43
diff changeset
   518
        else:
239
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   519
            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
   520
                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
   521
                    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
   522
                else:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   523
                    domains[gid] = [domain]
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   524
            else:
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   525
                gids.append(gid)
184970fd7486 VMM/Domain: search() lists now all matching domains, also when
Pascal Volk <neverseen@users.sourceforge.net>
parents: 162
diff changeset
   526
                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
   527
    return gids, domains
45
9e66138aad0b * 'VirtualMailManager/VirtualMailManager.py'
Pascal Volk <neverseen@users.sourceforge.net>
parents: 44
diff changeset
   528
404
0c52094447b0 VMM/{account,domain}: Added a versions check to the update_quotalimit
Pascal Volk <neverseen@users.sourceforge.net>
parents: 402
diff changeset
   529
del _, cfg_dget