VirtualMailManager/transport.py
changeset 760 b678a1c43027
parent 748 659c4476c57c
child 761 e4e656f19771
equal deleted inserted replaced
748:659c4476c57c 760:b678a1c43027
     1 # -*- coding: UTF-8 -*-
       
     2 # Copyright (c) 2008 - 2014, Pascal Volk
       
     3 # See COPYING for distribution information.
       
     4 """
       
     5     VirtualMailManager.transport
       
     6     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       
     7 
       
     8     Virtual Mail Manager's Transport class to manage the transport for
       
     9     domains and accounts.
       
    10 """
       
    11 
       
    12 from VirtualMailManager.pycompat import any
       
    13 
       
    14 _ = lambda msg: msg
       
    15 
       
    16 
       
    17 class Transport(object):
       
    18     """A wrapper class that provides access to the transport table"""
       
    19     __slots__ = ('_tid', '_transport', '_dbh')
       
    20 
       
    21     def __init__(self, dbh, tid=None, transport=None):
       
    22         """Creates a new Transport instance.
       
    23 
       
    24         Either tid or transport must be specified. When both arguments
       
    25         are given, tid will be used.
       
    26 
       
    27         Keyword arguments:
       
    28         dbh -- a pyPgSQL.PgSQL.connection
       
    29         tid -- the id of a transport (int/long)
       
    30         transport -- the value of the transport (str)
       
    31 
       
    32         """
       
    33         self._dbh = dbh
       
    34         self._tid = 0
       
    35         assert any((tid, transport))
       
    36         if tid:
       
    37             assert not isinstance(tid, bool) and isinstance(tid, (int, long))
       
    38             self._load_by_id(tid)
       
    39         else:
       
    40             assert isinstance(transport, basestring)
       
    41             self._transport = transport
       
    42             self._load_by_name()
       
    43 
       
    44     @property
       
    45     def tid(self):
       
    46         """The transport's unique ID."""
       
    47         return self._tid
       
    48 
       
    49     @property
       
    50     def transport(self):
       
    51         """The transport's value, ex: 'dovecot:'"""
       
    52         return self._transport
       
    53 
       
    54     def __eq__(self, other):
       
    55         if isinstance(other, self.__class__):
       
    56             return self._tid == other._tid
       
    57         return NotImplemented
       
    58 
       
    59     def __ne__(self, other):
       
    60         if isinstance(other, self.__class__):
       
    61             return self._tid != other._tid
       
    62         return NotImplemented
       
    63 
       
    64     def __str__(self):
       
    65         return self._transport
       
    66 
       
    67     def _load_by_id(self, tid):
       
    68         """load a transport by its id from the database"""
       
    69         dbc = self._dbh.cursor()
       
    70         dbc.execute('SELECT transport FROM transport WHERE tid = %s', (tid,))
       
    71         result = dbc.fetchone()
       
    72         dbc.close()
       
    73         if not result:
       
    74             raise ValueError('Unknown transport id specified: %r' % tid)
       
    75         self._transport = result[0]
       
    76         self._tid = tid
       
    77 
       
    78     def _load_by_name(self):
       
    79         """Load a transport by its transport name from the database."""
       
    80         dbc = self._dbh.cursor()
       
    81         dbc.execute('SELECT tid FROM transport WHERE transport = %s',
       
    82                     (self._transport,))
       
    83         result = dbc.fetchone()
       
    84         dbc.close()
       
    85         if result:
       
    86             self._tid = result[0]
       
    87         else:
       
    88             self._save()
       
    89 
       
    90     def _save(self):
       
    91         """Save the new transport in the database."""
       
    92         dbc = self._dbh.cursor()
       
    93         dbc.execute("SELECT nextval('transport_id')")
       
    94         self._tid = dbc.fetchone()[0]
       
    95         dbc.execute('INSERT INTO transport (tid, transport) VALUES (%s, %s)',
       
    96                     (self._tid, self._transport))
       
    97         self._dbh.commit()
       
    98         dbc.close()
       
    99 
       
   100 del _