diff --git a/roundup/roundupdb.py b/roundup/roundupdb.py
index 56176a908fdd335ba183cd4f8550a10ace25f64e..5bc4928a7af2e94a67591345661b6602e37d9a35 100644 (file)
--- a/roundup/roundupdb.py
+++ b/roundup/roundupdb.py
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
#
-# $Id: roundupdb.py,v 1.85 2003-04-24 07:19:58 richard Exp $
+# $Id: roundupdb.py,v 1.89 2003-09-08 09:28:28 jlgijsbers Exp $
__doc__ = """
Extending hyperdb with types specific to issue-tracking.
"""
import re, os, smtplib, socket, time, random
-import MimeWriter, cStringIO
-import base64, quopri, mimetypes
+import cStringIO, base64, quopri, mimetypes
from rfc2822 import encode_header
-# if available, use the 'email' module, otherwise fallback to 'rfc822'
-try :
- from email.Utils import formataddr as straddr
-except ImportError :
- # code taken from the email package 2.4.3
- def straddr(pair, specialsre = re.compile(r'[][\()<>@,:;".]'),
- escapesre = re.compile(r'[][\()"]')):
- name, address = pair
- if name:
- quotes = ''
- if specialsre.search(name):
- quotes = '"'
- name = escapesre.sub(r'\\\g<0>', name)
- return '%s%s%s <%s>' % (quotes, name, quotes, address)
- return address
-
-from roundup import hyperdb
-from roundup.mailgw import openSMTPConnection
-
-# set to indicate to roundup not to actually _send_ email
-# this var must contain a file to write the mail to
-SENDMAILDEBUG = os.environ.get('SENDMAILDEBUG', '')
+from roundup import password, date, hyperdb
+
+# MessageSendError is imported for backwards compatibility
+from roundup.mailer import Mailer, straddr, MessageSendError
class Database:
def getuid(self):
timezone = 0
return timezone
-class MessageSendError(RuntimeError):
- pass
+ def figure_curuserid(self):
+ """Figure out the 'curuserid'."""
+ if self.journaltag is None:
+ self.curuserid = None
+ elif self.journaltag == 'admin':
+ # admin user may not exist, but always has ID 1
+ self.curuserid = '1'
+ else:
+ self.curuserid = self.user.lookup(self.journaltag)
+
+ def confirm_registration(self, otk):
+ props = self.otks.getall(otk)
+ for propname, proptype in self.user.getprops().items():
+ value = props.get(propname, None)
+ if value is None:
+ pass
+ elif isinstance(proptype, hyperdb.Date):
+ props[propname] = date.Date(value)
+ elif isinstance(proptype, hyperdb.Interval):
+ props[propname] = date.Interval(value)
+ elif isinstance(proptype, hyperdb.Password):
+ props[propname] = password.Password()
+ props[propname].unpack(value)
+
+ # tag new user creation with 'admin'
+ self.journaltag = 'admin'
+ self.figure_curuserid()
+
+ # create the new user
+ cl = self.user
+
+ props['roles'] = self.config.NEW_WEB_USER_ROLES
+ del props['__time']
+ userid = cl.create(**props)
+ # clear the props from the otk database
+ self.otks.destroy(otk)
+ self.commit()
+
+ return userid
+
class DetectorError(RuntimeError):
- ''' Raised by detectors that want to indicate that something's amiss
- '''
+ """ Raised by detectors that want to indicate that something's amiss
+ """
pass
# deviation from spec - was called IssueClass
# anonymous
if (users.get(authid, 'username') != 'anonymous' and
not r.has_key(authid)):
- if self.db.config.MESSAGES_TO_AUTHOR == 'yes':
- # always CC the author of the message
- sendto.append(authid)
- recipients.append(authid)
- elif self.db.config.MESSAGES_TO_AUTHOR == 'new' and not oldvalues:
- # only CC the author if the issue is new
- sendto.append(authid)
- recipients.append(authid)
+ if (self.db.config.MESSAGES_TO_AUTHOR == 'yes' or
+ (self.db.config.MESSAGES_TO_AUTHOR == 'new' and not oldvalues)):
+ # make sure they have an address
+ add = users.get(authid, 'address')
+ if add:
+ # send it to them
+ sendto.append(add)
+ recipients.append(authid)
+
r[authid] = 1
# now deal with cc people.
for cc_userid in cc :
if r.has_key(cc_userid):
continue
- # send it to them
- sendto.append(cc_userid)
- recipients.append(cc_userid)
+ # make sure they have an address
+ add = users.get(cc_userid, 'address')
+ if add:
+ # send it to them
+ sendto.append(add)
+ recipients.append(cc_userid)
# now figure the nosy people who weren't recipients
nosy = self.get(nodeid, whichnosy)
continue
# make sure they haven't seen the message already
if not r.has_key(nosyid):
- # send it to them
- sendto.append(nosyid)
- recipients.append(nosyid)
+ # make sure they have an address
+ add = users.get(nosyid, 'address')
+ if add:
+ # send it to them
+ sendto.append(add)
+ recipients.append(nosyid)
# generate a change note
if oldvalues:
# we have new recipients
if sendto:
- # map userids to addresses
- sendto = [users.get(i, 'address') for i in sendto]
-
# update the message's recipients list
messages.set(msgid, recipients=recipients)
if from_tag:
from_tag = ' ' + from_tag
+ subject = '[%s%s] %s' % (cn, nodeid, encode_header(title))
+ author = straddr((encode_header(authname) + from_tag, from_address))
+
# create the message
- message = cStringIO.StringIO()
- writer = MimeWriter.MimeWriter(message)
- writer.addheader('Subject', '[%s%s] %s'%(cn, nodeid,
- encode_header(title)))
- writer.addheader('To', ', '.join(sendto))
- writer.addheader('From', straddr((encode_header(authname) +
- from_tag, from_address)))
+ mailer = Mailer(self.db.config)
+ message, writer = mailer.get_standard_message(', '.join(sendto),
+ subject, author)
+
tracker_name = encode_header(self.db.config.TRACKER_NAME)
writer.addheader('Reply-To', straddr((tracker_name, from_address)))
- writer.addheader('Date', time.strftime("%a, %d %b %Y %H:%M:%S +0000",
- time.gmtime()))
- writer.addheader('MIME-Version', '1.0')
if messageid:
writer.addheader('Message-Id', messageid)
if inreplyto:
writer.addheader('In-Reply-To', inreplyto)
- # add a uniquely Roundup header to help filtering
- writer.addheader('X-Roundup-Name', tracker_name)
-
- # avoid email loops
- writer.addheader('X-Roundup-Loop', 'hello')
-
# attach files
if message_files:
part = writer.startmultipartbody('mixed')
body = writer.startbody('text/plain; charset=utf-8')
body.write(content_encoded)
- # now try to send the message
- if SENDMAILDEBUG:
- open(SENDMAILDEBUG, 'a').write('FROM: %s\nTO: %s\n%s\n'%(
- self.db.config.ADMIN_EMAIL,
- ', '.join(sendto),message.getvalue()))
- else:
- try:
- # send the message as admin so bounces are sent there
- # instead of to roundup
- smtp = openSMTPConnection(self.db.config)
- smtp.sendmail(self.db.config.ADMIN_EMAIL, sendto,
- message.getvalue())
- except socket.error, value:
- raise MessageSendError, \
- "Couldn't send confirmation email: mailhost %s"%value
- except smtplib.SMTPException, value:
- raise MessageSendError, \
- "Couldn't send confirmation email: %s"%value
+ mailer.smtp_send(sendto, message)
def email_signature(self, nodeid, msgid):
''' Add a signature to the e-mail with some useful information