Package svnmailer :: Package notifier :: Module _textnews

[hide private]

# Source Code for Module svnmailer.notifier._textnews

      1  # -*- coding: utf-8 -*-
      2  # pylint: disable-msg = W0613
      3  #
      4  # Copyright 2004-2006 André Malo or his licensors, as applicable
      5  #
      6  # Licensed under the Apache License, Version 2.0 (the "License");
      7  # you may not use this file except in compliance with the License.
      8  # You may obtain a copy of the License at
      9  #
     10  #     http://www.apache.org/licenses/LICENSE-2.0
     11  #
     12  # Unless required by applicable law or agreed to in writing, software
     13  # distributed under the License is distributed on an "AS IS" BASIS,
     14  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  # See the License for the specific language governing permissions and
     16  # limitations under the License.
     17  """
     18  Text based news notifier
     19  """
     20  __author__    = "André Malo"
     21  __docformat__ = "epytext en"
     22  __all__       = ['TextNewsNotifier']
     23
     24  # global imports
     25  from svnmailer.notifier import _textmail, _mail
     26
     27
     28 -def getNotifier(cls, settings, groupset):
     29      """ Returns an initialized notifier or nothing
     30
     31          @param cls: The notifier base class to use
     32          @type cls: C{class}
     33
     34          @param settings: The svnmailer settings
     35          @type settings: C{svnmailer.settings.Settings}
     36
     37          @param groupset: The groupset to process
     38          @type groupset: C{list}
     39
     40          @return: The list of notifiers (containing 0 or 1 member)
     41          @rtype: C{list}
     42      """
     43      from svnmailer import util
     44
     45      return [_textmail.decorateNotifier(
     46          util.inherit(cls, TextNewsNotifier),
     47          groupset.groups[0].long_news_action, settings, groupset
     48      )]
     49
     50
     51 -class TextNewsNotifier(_textmail.TextMailNotifier):
     52      """ Bases class for news notifiers """
     53      __implements__ = [_textmail.TextMailNotifier]
     54
     55 -    def sendMail(self, sender, to_addr, mail):
     56          """ Sends the news
     57
     58              @param sender: The mail sender (envelope from)
     59              @type sender: C{str}
     60
     61              @param to_addr: The receivers
     62              @type to_addr: C{list}
     63
     64              @param mail: The mail object
     65              @type mail: C{_TextMail}
     66          """
     67          self.sendNews(mail)
     68
     69
     70 -    def sendNews(self, posting):
     71          """ Sends the news
     72
     73              @param posting: The posting object
     74              @type posting: C{_textmail._TextMail}
     75          """
     76          raise NotImplementedError()
     77
     78
     79 -    def getTransferEncoding(self):
     80          """ Returns the news transfer encoding """
     81          return self.config.news_transfer_encoding
     82
     83
     84 -    def composeHeaders(self, groups):
     85          """ Compose the informational headers of the mail
     86
     87              @param groups: The groups to process
     88              @type groups: C{list}
     89
     90              @return: sender (C{unicode}), recipients (C{list}), headers
     91                  (C{dict})
     92              @rtype: C{tuple}
     93          """
     94          from email import Header
     95
     96          sender, from_addrs, to_newsgroups, reply_to = \
     97              self.getNewsAddresses(groups)
     98          if not to_newsgroups:
     99              raise _mail.NoRecipientsError()
    100
    101          headers = self.getBasicHeaders()
    102          headers['From'] = from_addrs[0]
    103          headers['Newsgroups'] = Header.Header(','.join(to_newsgroups))
    104
    105          if reply_to:
    106              headers['Reply-To'] = Header.Header(', '.join(reply_to))
    107          if len(from_addrs) > 1:
    108              # TODO: make Sender configurable?
    109              headers['Sender'] = Header.Header(from_addrs[0])
    110
    111          # TODO: generate message-id (using configured format string)?
    112
    113          if self._settings.runtime.debug:
    114              headers['X-Config-Groups'] = Header.Header(', '.join([
    115                  "[%s]" % group._name for group in groups
    116              ]), 'iso-8859-1')
    117
    118          return (sender, to_newsgroups, headers)
    119
    120
    121 -    def getNewsAddresses(self, groups):
    122          """ Returns the substituted mail addresses (from/to/reply-to)
    123
    124              @param groups: The groups to process
    125              @type groups: C{list}
    126
    127              @return: The address lists (sender, from, to, reply-to)
    128              @rtype: C{tuple}
    129          """
    130          from_addrs = []
    131          to_newsgroups = []
    132          reply_to = []
    133
    134          sender = None
    135          for group in groups:
    136              from_addrs.extend(group.from_addr or [])
    137              to_newsgroups.extend(group.to_newsgroup or [])
    138              reply_to.extend(
    139                  group.reply_to_addr and [group.reply_to_addr] or []
    140              )
    141
    142          from_addrs = dict.fromkeys(from_addrs).keys() or [
    143              (self.getAuthor() and self.getAuthor().decode('utf-8', 'replace'))
    144              or u'no_author'
    145          ]
    146          to_newsgroups = dict.fromkeys(to_newsgroups).keys()
    147          reply_to = dict.fromkeys(reply_to).keys()
    148
    149          return (sender or from_addrs[0], from_addrs, to_newsgroups, reply_to)
    150