[Hepserver-commits] messaging/messaging message.py,1.1,1.2
Status: Alpha
Brought to you by:
abefettig
|
From: <abe...@us...> - 2003-08-07 03:32:30
|
Update of /cvsroot/hepserver//messaging/messaging
In directory sc8-pr-cvs1:/tmp/cvs-serv15791/messaging
Modified Files:
message.py
Log Message:
Changed the API for messages - now all
headers are accessed via __getitem__, instead
of __getattr__.
Index: message.py
===================================================================
RCS file: /cvsroot/hepserver//messaging/messaging/message.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** message.py 9 Jul 2003 16:15:22 -0000 1.1
--- message.py 7 Aug 2003 03:32:28 -0000 1.2
***************
*** 4,8 ****
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
- from email.Utils import parsedate, parsedate_tz, mktime_tz
import re
import md5
--- 4,7 ----
***************
*** 11,14 ****
--- 10,14 ----
from extlib import stripogram
from url import Url
+ import messaging
def html2safehtml(html, tags=[]):
***************
*** 39,43 ****
self.__dict__['_name'] = name
self.__dict__['_parent'] = parentObject
! self.__dict__['_value'] = value
def getValue(self):
--- 39,43 ----
self.__dict__['_name'] = name
self.__dict__['_parent'] = parentObject
! self.__dict__['_value'] = value or ''
def getValue(self):
***************
*** 45,49 ****
def updateParent(self):
! if self._parent and self._name: setattr(self._parent, self._name, self.getValue())
def __str__(self):
--- 45,49 ----
def updateParent(self):
! if self._parent and self._name: self._parent[self._name] = self.getValue()
def __str__(self):
***************
*** 92,113 ****
class Message(object):
_headerMap = {
! 'guid':'Message-Id',
! 'to':'To',
! 'author':'From',
! 'title': 'Subject',
! 'replyTo': 'Reply-To',
! 'inReplyTo': 'In-Reply-To',
! 'timestamp': 'Date',
! 'isNew': 'X-Hep-UnRead',
! 'source': 'X-Hep-Source-Uri',
! 'sourceID': 'X-Hep-Source-ID',
! 'link': 'X-Hep-Link',
! 'status': 'X-Hep-Status',
}
_attributeProxies = {
! 'author': Address,
! 'replyTo': Address,
! }
def __init__(self, loadFrom=None, charset=None):
--- 92,104 ----
class Message(object):
_headerMap = {
! 'title': 'Subject',
! 'author': 'From',
! 'link': 'X-Hep-Link',
}
_attributeProxies = {
! 'from': Address,
! 'reply-to': Address,
! }
def __init__(self, loadFrom=None, charset=None):
***************
*** 126,226 ****
self._message.epilogue = ""
- # publicized message methods
- self.get_all = self._message.get_all
-
# set timestamp to now
! if not self._message['Date']: self.timestamp = time.localtime(time.time())
!
!
! def __setattr__(self, name, value):
! if name not in self._headerMap.keys():
! self.__dict__[name] = value
! return
!
! headerName = self._headerMap[name]
!
! if name == 'isNew':
! if value:
! value == 'yes'
! else:
! value = 'no'
! elif name == 'timestamp':
! timestamp = value
! # detect the format of the timestamp and convert it
! # to email format.
! # TODO: support formats like 2003-03-29T14:40:38-08:00
! ts = None
! if not timestamp:
! pass
! elif type(timestamp) in (type([]), type((0,)), time.struct_time):
! if len(timestamp) == 9:
! # localtime 9-tuple format
! ts = email.Utils.formatdate(time.mktime(timestamp))
! elif re.match('\d{8}T\d\d:\d\d:\d\d', timestamp):
! # xmlrpc format
! dateStr, timeStr = timestamp.split('T')
! yr, mo, day = dateStr[0:4], dateStr[4:6], dateStr[6:8]
! hr, min, sec = timeStr[0:8].split(":")
! timebits = [yr, mo, day, hr, min, sec, 0, 0, 0]
! # convert all parts to ints
! for bit in timebits:
! timebits[timebits.index(bit)] = int(bit)
! ts = email.Utils.formatdate(time.mktime(timebits))
! else:
! parsed = email.Utils.parsedate(timestamp)
! if parsed: ts = timestamp
! if ts:
! value = ts
! else:
! raise "Bad date format: %s" % timestamp
! del(self._message['Date'])
! self._message['Date'] = ts
!
! del(self._message[headerName])
! self._message[headerName] = str(value).replace('\n', ' ')
! def __getattr__(self, name):
! if self._headerMap.has_key(name):
! headerName = self._headerMap[name]
else:
! headerName = name
! if name == 'sourceUri':
! return Uri(self._message[headerName])
! elif name == 'isNew':
! if self._message.get(headerName,'no').lower() in ('yes','1'):
! return 1
! else:
! return 0
! elif name == 'guid':
! if self._message.get(headerName, ''):
! return self._message.get(headerName)
! else:
! # fallback, generate an ID based on the hash of this message's
! # from: to: subject: headers + the body.
! hash = md5.new()
! for header in ['from', 'to', 'subject']:
! hash.update(self._message.get(header, ''))
! text = self.getText(convertHTML=0)
! if text: hash.update(text)
! html = self.getHTML(convertText=0)
! if html: hash.update(html)
! return "<md5id:%s>" % hash.hexdigest()
! elif name == 'timestamp':
! return time.localtime(mktime_tz(parsedate_tz(self._message.get(headerName))))
! elif name in self._attributeProxies.keys():
! return self._attributeProxies[name](self._message.get(headerName, ''), name, self)
! elif self.__dict__.has_key(name):
! return self.__dict__[name]
! elif self._headerMap.has_key(name):
! return self._message.get(headerName,'')
! elif self._message[headerName]:
! return self._message.get(headerName,'')
else:
! raise AttributeError(name)
!
! def getHeader(self, name, default=''):
! return self._message.get(name, default)
def setPart(self, mimetype, contents, charset=None):
if sys.version_info[0:3] >= (2,2,2):
--- 117,207 ----
self._message.epilogue = ""
# set timestamp to now
! if not self._message['Date']: self.setTimestamp(time.localtime(time.time()))
! def __getitem__(self, key):
! key = key.lower()
! if self._headerMap.has_key(key):
! headerName = self._headerMap[key].lower()
else:
! headerName = key
! if self._attributeProxies.has_key(headerName):
! return self._attributeProxies[headerName](self._message[headerName], key, self)
else:
! return self._message.get(key)
!
! def get(self, key, default=''):
! return self[key] or default
!
! def __setitem__(self, key, value):
! del(self._message[key])
! self._message[key] = value
!
! def has_key(self, key):
! return self._message.has_key(key) or self._message.has_key(self._headerMap.get(key.lower()))
!
! def keys(self):
! return self._message.keys()
+ def getAllHeaders(self):
+ headers = {}
+ for key in self.keys():
+ headers[key] = str(self[key])
+ return headers
+
+ def getTimestamp(self):
+ return messaging.parseDate(self._message.get('Date', ''))
+
+ def setTimestamp(self, value):
+ timestamp = value
+ # detect the format of the timestamp and convert it
+ # to email format.
+ # TODO: support formats like 2003-03-29T14:40:38-08:00
+ ts = None
+ if not timestamp:
+ pass
+ elif type(timestamp) in (type([]), type((0,)), time.struct_time):
+ if len(timestamp) == 9:
+ # localtime 9-tuple format
+ ts = email.Utils.formatdate(time.mktime(timestamp))
+ elif re.match('\d{8}T\d\d:\d\d:\d\d', timestamp):
+ # xmlrpc format
+ dateStr, timeStr = timestamp.split('T')
+ yr, mo, day = dateStr[0:4], dateStr[4:6], dateStr[6:8]
+ hr, min, sec = timeStr[0:8].split(":")
+ timebits = [yr, mo, day, hr, min, sec, 0, 0, 0]
+ # convert all parts to ints
+ for bit in timebits:
+ timebits[timebits.index(bit)] = int(bit)
+ ts = email.Utils.formatdate(time.mktime(timebits))
+ else:
+ parsed = email.Utils.parsedate(timestamp)
+ if parsed: ts = timestamp
+ if ts:
+ del(self._message['Date'])
+ self._message['Date'] = ts
+ else:
+ raise "Bad date format: %s" % timestamp
+
+ def getMessageId(self):
+ """
+ return a Message-ID, generating one based on the message contents
+ if there's is no Message-ID field in the message's headers.
+ """
+ if self._message.get(headerName, ''):
+ return self._message.get(headerName)
+ else:
+ # fallback, generate an ID based on the hash of this message's
+ # from: to: subject: headers + the body.
+ hash = md5.new()
+ for header in ['from', 'to', 'subject']:
+ hash.update(self._message.get(header, ''))
+ text = self.getText(convertHTML=0)
+ if text: hash.update(text)
+ html = self.getHTML(convertText=0)
+ if html: hash.update(html)
+ return "<%s.md5@FIXMEPUTHOSTHERE>" % hash.hexdigest()
+
def setPart(self, mimetype, contents, charset=None):
if sys.version_info[0:3] >= (2,2,2):
***************
*** 282,291 ****
def getText(self, convertHTML=1, addLink=0):
text = (self.getPart('text/plain') or "").strip()
if (not text) and convertHTML:
html = self.getPart('text/html') or ""
if html: text = html2text(html)
! if addLink and self.link and not text.count(self.link):
! text = (text and (text + '\n\n')) + self.link + '\n'
return text
--- 263,273 ----
def getText(self, convertHTML=1, addLink=0):
+ link = self['link']
text = (self.getPart('text/plain') or "").strip()
if (not text) and convertHTML:
html = self.getPart('text/html') or ""
if html: text = html2text(html)
! if addLink and link and not text.count(link):
! text = (text and (text + '\n\n')) + link + '\n'
return text
***************
*** 295,302 ****
if convertText:
text = self.getPart('text/plain') or ""
! if text:
! for line in text.split('\n'):
! print len(line)
! html = "<html><head><title>%s</title></head><body>%s</body></html>" % (self.title, textile(text))
if html == None: return
--- 277,282 ----
if convertText:
text = self.getPart('text/plain') or ""
! if text:
! html = "<html><head><title>%s</title></head><body>%s</body></html>" % (self['subject'], textile(text))
if html == None: return
***************
*** 312,318 ****
'pre', 'code', 'table', 'th', 'td', 'tr']
html = html2safehtml(html, safetags)
! if addLink and self.link and not html.count(self.link):
endOfBody = re.compile('(</(body|html)>.*|\\Z)', re.IGNORECASE | re.MULTILINE | re.DOTALL)
! linkHTML = '<p><a href="%s">%s</a></p>' % (self.link, self.link)
html = endOfBody.sub(('%s\\1' % linkHTML), html)
return html
--- 292,298 ----
'pre', 'code', 'table', 'th', 'td', 'tr']
html = html2safehtml(html, safetags)
! if addLink and self['link'] and not html.count(self['link']):
endOfBody = re.compile('(</(body|html)>.*|\\Z)', re.IGNORECASE | re.MULTILINE | re.DOTALL)
! linkHTML = '<p><a href="%s">%s</a></p>' % (self['link'], self['link'])
html = endOfBody.sub(('%s\\1' % linkHTML), html)
return html
***************
*** 324,338 ****
m = Message(self._message.as_string())
! if generateMissingParts and (self.link or not self._message.get('Message-Id')):
m.setText(m.getText(addLink=1))
! if self.link:
html = self.getHTML(convertText=0, addLink=1)
if html: m.setHTML(html)
if not m._message.get('Message-Id'):
! m._message['Message-Id'] = self.guid # this will generate a guid.
! if not m.author.address and defaultFromAddress:
! m.author.address = defaultFromAddress
return m._message.as_string(unixFrom)
--- 304,318 ----
m = Message(self._message.as_string())
! if generateMissingParts and (self['link'] or not self._message.get('Message-Id')):
m.setText(m.getText(addLink=1))
! if self['link']:
html = self.getHTML(convertText=0, addLink=1)
if html: m.setHTML(html)
if not m._message.get('Message-Id'):
! m._message['Message-Id'] = self.getMessageID() # this will generate a guid.
! if not m['from'].address and defaultFromAddress:
! m['from'].address = defaultFromAddress
return m._message.as_string(unixFrom)
|