hepserver-commits Mailing List for Hep Message Server
Status: Alpha
Brought to you by:
abefettig
You can subscribe to this list here.
| 2003 |
Jan
|
Feb
|
Mar
|
Apr
(5) |
May
(23) |
Jun
|
Jul
(26) |
Aug
(18) |
Sep
|
Oct
|
Nov
|
Dec
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2005 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Neateye <nit...@ao...> - 2005-05-03 21:09:32
|
Call out Gouranga be happy!!! Gouranga Gouranga Gouranga .... That which brings the highest happiness!! |
|
From: <abe...@us...> - 2003-08-13 14:47:52
|
Update of /cvsroot/hepserver//messaging/messaging
In directory sc8-pr-cvs1:/tmp/cvs-serv3556/messaging
Modified Files:
message.py
Log Message:
fix a couple bugs with setting/reading message headers.
Index: message.py
===================================================================
RCS file: /cvsroot/hepserver//messaging/messaging/message.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** message.py 12 Aug 2003 17:50:39 -0000 1.3
--- message.py 13 Aug 2003 14:32:11 -0000 1.4
***************
*** 128,132 ****
return self._attributeProxies[headerName](self._message[headerName], headerName, self)
else:
! return self._message.get(key)
def get(self, key, default=''):
--- 128,132 ----
return self._attributeProxies[headerName](self._message[headerName], headerName, self)
else:
! return self._message.get(headerName)
def get(self, key, default=''):
***************
*** 134,139 ****
def __setitem__(self, key, value):
! del(self._message[key])
! self._message[key] = value
def has_key(self, key):
--- 134,144 ----
def __setitem__(self, key, value):
! key = key.lower()
! if self._headerMap.has_key(key):
! headerName = self._headerMap[key].lower()
! else:
! headerName = key
! del(self._message[headerName])
! self._message[headerName] = value
def has_key(self, key):
|
|
From: <abe...@us...> - 2003-08-12 21:30:37
|
Update of /cvsroot/hepserver/hep/hep/web/styles
In directory sc8-pr-cvs1:/tmp/cvs-serv17996/hep/web/styles
Modified Files:
tabs.css
Log Message:
css for login link
Index: tabs.css
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/styles/tabs.css,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** tabs.css 7 Aug 2003 17:00:26 -0000 1.2
--- tabs.css 12 Aug 2003 17:51:15 -0000 1.3
***************
*** 1,6 ****
--- 1,17 ----
+ #tabs {
+ width: 100%;
+ text-align: right;
+ }
+
+ #authinfo {
+ padding-right: 1em;
+ font-size: .8em;
+ }
+
#tabs ul {
margin: 0;
padding: 0;
display: inline;
+ float: right;
}
***************
*** 11,27 ****
#tabs a {
- float: right;
- font-size: .8em;
- line-height: 1em;
- display: inline;
- margin-top: .2em;
- margin-right: .3em;
- padding: .2em 1em .3em 1em;
- text-decoration: none;
color: #000;
}
#tabs li a {
! float: right;
font-size: .8em;
font-weight: bold;
--- 22,32 ----
#tabs a {
color: #000;
+ text-decoration: underline;
}
+
#tabs li a {
! float: left;
font-size: .8em;
font-weight: bold;
|
|
From: <abe...@us...> - 2003-08-12 20:21:07
|
Update of /cvsroot/hepserver/hep/hep/web
In directory sc8-pr-cvs1:/tmp/cvs-serv16562/hep/web
Modified Files:
messages.py models.py
Log Message:
made nav tree use a generic View and Model,
so it can be used accross all pages.
Index: messages.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/messages.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** messages.py 7 Aug 2003 17:00:26 -0000 1.3
--- messages.py 12 Aug 2003 17:42:34 -0000 1.4
***************
*** 60,63 ****
--- 60,70 ----
+ class LinkWithAttributes(widgets.Link):
+ def setUp(self, request, node, data):
+ widgets.Link.setUp(self, request, node, data)
+ for attr in data.keys():
+ if attr not in ('href', 'text'):
+ node.setAttribute(attr, data[attr])
+
class MessageWidget(widgets.Widget):
def setUp(self, request, node, message):
***************
*** 74,82 ****
div.text(message.getHTML(bodyOnly=1, safeTagsOnly=1) or "", raw=1)
div.div(_class='timestamp').small().text("%s, %s" % (
! message['author'].address and message['author'] or message['author'].name,
time.strftime('%I:%M %p', message.getTimestamp())))
class BlogView(view.View):
-
templateDirectory = sibpath(hep.web.__file__, 'templates')
templateFile = "blogview.html"
--- 81,88 ----
div.text(message.getHTML(bodyOnly=1, safeTagsOnly=1) or "", raw=1)
div.div(_class='timestamp').small().text("%s, %s" % (
! message['author'].address and message['author'] or message['author'].name or "Unknown Author",
time.strftime('%I:%M %p', message.getTimestamp())))
class BlogView(view.View):
templateDirectory = sibpath(hep.web.__file__, 'templates')
templateFile = "blogview.html"
***************
*** 86,93 ****
self.setSubviewFactory("message", MessageWidget)
self.setSubviewFactory("calendar", Calendar)
-
! class MessagesPage(page.Page):
!
templateDirectory = sibpath(hep.web.__file__, 'templates')
templateFile = "messages.html"
--- 92,118 ----
self.setSubviewFactory("message", MessageWidget)
self.setSubviewFactory("calendar", Calendar)
! appendModel = widgets.appendModel
! class Tree(widgets.List):
! def _iterateData(self, parentNode, submodel, data):
! currentListItem = 0
! retVal = [None] * len(data)
! for itemNum in range(len(data)):
! newNode = self.getPattern('listItem')
! if newNode.getAttribute('model') == '.':
! newNode.removeAttribute('model')
! elif not newNode.attributes.get("view"):
! newNode.attributes["view"] = self.defaultItemView
! appendModel(newNode, "%i/0" % itemNum)
! retVal[itemNum] = newNode
! newNode.parentNode = parentNode
! if data[itemNum][1]:
! newParent = self.templateNode.cloneNode(1)
! newParent.attributes['model'] = '../1'
! newNode.appendChild(newParent)
! self._iterateData(newParent, "", data[itemNum][1])
! parentNode.childNodes.extend(retVal)
!
! class MessagesPage(page.Page):
templateDirectory = sibpath(hep.web.__file__, 'templates')
templateFile = "messages.html"
***************
*** 95,129 ****
def initialize(self, *args, **kwargs):
! self.setSubviewFactory("blogview", BlogView)
!
! def wvupdate_folderList(self, request, node, data):
! stores = data.items()
! item = lmx(node)
! list = item.ul()
! stores.sort(lambda a, b: cmp(
! [a[0].startswith('Connections'), a[0].lower()],
! [b[0].startswith('Connections'), b[0].lower()]
! ))
! depth = 1
! for storePath, store in stores:
! difference = storePath.count('/') - depth
! if difference == 1:
! list = item.ul()
! elif difference < 0:
! for n in range(abs(difference)):
! if list.node.parentNode:
! list = lmx(list.node.parentNode.parentNode)
! else:
! break
!
! item = list.li()
! a = item.a(href='/'.join(['', 'messages', storePath, '']))
! if '/'.join(request.postpath).strip('/') == storePath.strip('/'):
! a['class'] = 'selected'
! a.img(src='/images/icons/small/%s.png' % store.url.protocol, align='absmiddle')
! storeName = storePath.split('/')[-1]
! a.text(len(storeName) > 18 and (storeName[:16] + '...') or storeName)
!
! depth = depth + difference
!
! #components.registerAdapter(StoreModel, messaging.MessageStore, interfaces.IModel)
\ No newline at end of file
--- 120,124 ----
def initialize(self, *args, **kwargs):
! self.setSubviewFactory("pageContent", BlogView)
! self.setSubviewFactory("Tree", Tree)
! self.setSubviewFactory("linkWithAttributes", LinkWithAttributes)
Index: models.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/models.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** models.py 7 Aug 2003 17:00:26 -0000 1.3
--- models.py 12 Aug 2003 17:42:34 -0000 1.4
***************
*** 1,2 ****
--- 1,3 ----
+ from __future__ import nested_scopes
from twisted.internet import defer
from twisted.web.woven import model
***************
*** 10,14 ****
def getStore(self, request):
path = "/".join(request.postpath).strip('/')
- print "PATH", path
if path:
return self.user.messages.openChildStores().addCallback(lambda stores: stores.get(path) or self.user.messages)
--- 11,14 ----
***************
*** 16,20 ****
return defer.succeed(self.user.messages)
! def wmfactory_messages(self, request):
finished = defer.Deferred()
self.getStore(request).addCallback(
--- 16,20 ----
return defer.succeed(self.user.messages)
! def wmfactory_messages(self, request):
finished = defer.Deferred()
self.getStore(request).addCallback(
***************
*** 22,29 ****
)
return finished
!
! def wmfactory_connectionList(self, request):
! allChildren = self.user.messages.openChildStores()
! return allChildren
def wmfactory_storeName(self, request):
--- 22,60 ----
)
return finished
!
! def wmfactory_name(self, request):
! return self.user.name
!
! def wmfactory_treeData(self, request):
! if request.prepath[0] == 'messages':
! def buildHierarchy(storeList):
! storeList = storeList.items()
! storeList.sort(lambda a, b: cmp(
! [a[0].startswith('Connections'), a[0].lower()],
! [b[0].startswith('Connections'), b[0].lower()]
! ))
! hierarchy = []
! for path, store in storeList:
! pathParts = path.split('/')
! branch = pathParts[:-1]
! leaf = pathParts[-1]
! currentList = hierarchy
! for level in branch:
! currentList = currentList[-1][1]
! label= store.name or leaf
! if len(label) > 18: label = label[:15] + "..."
! currentList.append([{'text':label,
! 'href':"/".join(('', 'messages', path)),
! 'icon':'/images/icons/small/%s.png' % store.url.protocol,
! }, []])
! return hierarchy
!
! d = self.user.messages.openChildStores()
! d.addCallback(buildHierarchy)
! return d
! elif request.prepath[0] == 'setup':
! return self.user.connections.keys()
! else:
! return []
def wmfactory_storeName(self, request):
***************
*** 39,42 ****
--- 70,81 ----
return {'href':'/perspective-destroy', 'text':'Log Out'}
+ def wmfactory_tabs(self, request):
+ if self.user.name == 'anonymous':
+ return ()
+ else:
+ return ({'href':'/messages', 'text':'Messages', 'class':'active'},
+ {'href':'/setup', 'text':'Setup'},
+ {'href':'/docs', 'text':'Documentaton'},
+ )
def gotList(self, messageList, store, request, finished):
|
|
From: <abe...@us...> - 2003-08-12 20:12:23
|
Update of /cvsroot/hepserver//messaging/messaging
In directory sc8-pr-cvs1:/tmp/cvs-serv17863/messaging
Modified Files:
message.py __init__.py
Log Message:
bug fixes, some small improvements to support IMAP.
Index: message.py
===================================================================
RCS file: /cvsroot/hepserver//messaging/messaging/message.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** message.py 7 Aug 2003 03:32:28 -0000 1.2
--- message.py 12 Aug 2003 17:50:39 -0000 1.3
***************
*** 45,56 ****
def updateParent(self):
! if self._parent and self._name: self._parent[self._name] = self.getValue()
def __str__(self):
return str(self._value)
- def __repr__(self):
- return self._value
-
def __len__(self):
return len(self._value)
--- 45,54 ----
def updateParent(self):
! if self._parent and self._name:
! self._parent[self._name] = self.getValue()
def __str__(self):
return str(self._value)
def __len__(self):
return len(self._value)
***************
*** 128,132 ****
if self._attributeProxies.has_key(headerName):
! return self._attributeProxies[headerName](self._message[headerName], key, self)
else:
return self._message.get(key)
--- 126,130 ----
if self._attributeProxies.has_key(headerName):
! return self._attributeProxies[headerName](self._message[headerName], headerName, self)
else:
return self._message.get(key)
Index: __init__.py
===================================================================
RCS file: /cvsroot/hepserver//messaging/messaging/__init__.py,v
retrieving revision 1.13
retrieving revision 1.14
diff -C2 -d -r1.13 -r1.14
*** __init__.py 9 Jul 2003 16:15:23 -0000 1.13
--- __init__.py 12 Aug 2003 17:50:39 -0000 1.14
***************
*** 6,9 ****
--- 6,10 ----
from urllib import quote_plus as quote
import time
+ from email.Utils import parsedate, parsedate_tz, mktime_tz
log = sys.stdout
***************
*** 11,14 ****
--- 12,18 ----
VERSION = '0.0.3'
+ def parseDate(rfcDate):
+ return time.localtime(mktime_tz(parsedate_tz(rfcDate)))
+
class MessageStore(object):
***************
*** 40,44 ****
def getMessage(self, messageID):
! return self.messages[int(messageID)]
def editMessage(self, messageID, newMessage):
--- 44,48 ----
def getMessage(self, messageID):
! return defer.succeed(self.messages[int(messageID)])
def editMessage(self, messageID, newMessage):
***************
*** 48,51 ****
--- 52,61 ----
del self.messages[int(messageID)]
+ def getCount(self):
+ "override with a more-efficient implementation if desired."
+ d = self.listMessages()
+ d.addCallback(lambda messages: len(messages))
+ return d
+
def listWithHeaders(self):
"""
***************
*** 69,73 ****
def _gotMessageForHeaders(self, message, messageid, messageCount, deferred, headers):
# fixme: pull all headers from message
! headers[messageid] = {"author": message.author, "title": message.title, "id":message.guid, "timestamp":message.timestamp}
if len(headers) == messageCount:
deferred.callback(headers)
--- 79,83 ----
def _gotMessageForHeaders(self, message, messageid, messageCount, deferred, headers):
# fixme: pull all headers from message
! headers[messageid] = message.getAllHeaders()
if len(headers) == messageCount:
deferred.callback(headers)
|
|
From: <abe...@us...> - 2003-08-12 20:10:01
|
Update of /cvsroot/hepserver/hep/hep/web/templates
In directory sc8-pr-cvs1:/tmp/cvs-serv16562/hep/web/templates
Modified Files:
messages.html
Log Message:
made nav tree use a generic View and Model,
so it can be used accross all pages.
Index: messages.html
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/templates/messages.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** messages.html 7 Aug 2003 17:00:27 -0000 1.2
--- messages.html 12 Aug 2003 17:42:34 -0000 1.3
***************
*** 11,29 ****
<h1>Hep Message Server</h1>
<div id='tabs'>
! <ul>
! <li><a href='/doc'>Documentation</a></li>
! <li><a href='/setup'>Setup</a></li>
! <li><a href='/messages' class='active'>Messages</a></li>
</ul>
! <a view='Link' model='loginLink'>Log In</a>
</div>
</div>
<div>
! <div id='messages' view='blogview'>
Content goes here
</div>
! <div id='sidebar' model="connectionList" view="folderList"></div>
</div>
--- 11,35 ----
<h1>Hep Message Server</h1>
<div id='tabs'>
! <ul view='List' model='tabs'>
! <li pattern='listItem'><a view='linkWithAttributes'>Tab One</a></li>
</ul>
! <span id='authinfo'>You are <span model='name'>anonymous</span>. <a view='Link' model='loginLink'>Log In</a></span>
</div>
</div>
<div>
! <div id='messages' view='pageContent'>
Content goes here
</div>
! <div id='sidebar'>
! <ul model="treeData" view="Tree">
! <li pattern='listItem'>
! <a view='Link' model='href'>
! <img view="Image" model='../icon' alt=' ' /> <span view='Text' model='../text'>Link</span>
! </a>
! </li>
! </ul>
! </div>
</div>
|
|
From: <abe...@us...> - 2003-08-07 17:01:02
|
Update of /cvsroot/hepserver/hep/hep/services
In directory sc8-pr-cvs1:/tmp/cvs-serv22419/hep/services
Modified Files:
datamanager.py
Log Message:
Added login/logout link to web pages for switching between
anonymous and authenticated users.
Index: datamanager.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/services/datamanager.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** datamanager.py 7 Aug 2003 03:26:34 -0000 1.2
--- datamanager.py 7 Aug 2003 17:00:27 -0000 1.3
***************
*** 153,160 ****
self.config = {}
self.connections = {}
self.messages = messaging.MessageStore()
from messaging.message import Message
m = Message()
m['title'] = 'Welcome'
! m.setHTML("Welcome to Hep!<p><a href='perspective-init'>Log in</a>")
self.messages.messages.append(m)
--- 153,161 ----
self.config = {}
self.connections = {}
+ self.name = 'anonymous'
self.messages = messaging.MessageStore()
from messaging.message import Message
m = Message()
m['title'] = 'Welcome'
! m.setHTML("Welcome to Hep!<p><a href='/perspective-init'>Log in</a>")
self.messages.messages.append(m)
|
|
From: <abe...@us...> - 2003-08-07 17:01:00
|
Update of /cvsroot/hepserver/hep/hep/web
In directory sc8-pr-cvs1:/tmp/cvs-serv22419/hep/web
Modified Files:
messages.py models.py
Log Message:
Added login/logout link to web pages for switching between
anonymous and authenticated users.
Index: messages.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/messages.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** messages.py 7 Aug 2003 03:29:35 -0000 1.2
--- messages.py 7 Aug 2003 17:00:26 -0000 1.3
***************
*** 118,122 ****
item = list.li()
! a = item.a(href='/'.join(['/messages', '', storePath, '']))
if '/'.join(request.postpath).strip('/') == storePath.strip('/'):
a['class'] = 'selected'
--- 118,122 ----
item = list.li()
! a = item.a(href='/'.join(['', 'messages', storePath, '']))
if '/'.join(request.postpath).strip('/') == storePath.strip('/'):
a['class'] = 'selected'
Index: models.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/models.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** models.py 7 Aug 2003 03:28:56 -0000 1.2
--- models.py 7 Aug 2003 17:00:26 -0000 1.3
***************
*** 33,36 ****
--- 33,43 ----
print "***********************ERROR!**********************", err
+ def wmfactory_loginLink(self, request):
+ if self.user.name == 'anonymous':
+ return {'href':'/perspective-init', 'text':'Log In'}
+ else:
+ return {'href':'/perspective-destroy', 'text':'Log Out'}
+
+
def gotList(self, messageList, store, request, finished):
messageList = messageList.items()
|
|
From: <abe...@us...> - 2003-08-07 17:01:00
|
Update of /cvsroot/hepserver/hep/hep/web/templates In directory sc8-pr-cvs1:/tmp/cvs-serv22419/hep/web/templates Modified Files: messages.html Log Message: Added login/logout link to web pages for switching between anonymous and authenticated users. Index: messages.html =================================================================== RCS file: /cvsroot/hepserver/hep/hep/web/templates/messages.html,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** messages.html 10 Jul 2003 16:09:37 -0000 1.1 --- messages.html 7 Aug 2003 17:00:27 -0000 1.2 *************** *** 13,19 **** <ul> <li><a href='/doc'>Documentation</a></li> ! <li><a href='/messages'>Setup</a></li> ! <li><a href='/messages' class='active'>Messages</a></li> </ul> </div> </div> --- 13,20 ---- <ul> <li><a href='/doc'>Documentation</a></li> ! <li><a href='/setup'>Setup</a></li> ! <li><a href='/messages' class='active'>Messages</a></li> </ul> + <a view='Link' model='loginLink'>Log In</a> </div> </div> |
|
From: <abe...@us...> - 2003-08-07 17:00:58
|
Update of /cvsroot/hepserver/hep/hep/web/styles
In directory sc8-pr-cvs1:/tmp/cvs-serv22419/hep/web/styles
Modified Files:
tabs.css
Log Message:
Added login/logout link to web pages for switching between
anonymous and authenticated users.
Index: tabs.css
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/styles/tabs.css,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** tabs.css 10 Jul 2003 16:09:37 -0000 1.1
--- tabs.css 7 Aug 2003 17:00:26 -0000 1.2
***************
*** 9,14 ****
display: inline;
}
!
#tabs a {
float: right;
font-size: .8em;
--- 9,26 ----
display: inline;
}
!
#tabs a {
+ float: right;
+ font-size: .8em;
+ line-height: 1em;
+ display: inline;
+ margin-top: .2em;
+ margin-right: .3em;
+ padding: .2em 1em .3em 1em;
+ text-decoration: none;
+ color: #000;
+ }
+
+ #tabs li a {
float: right;
font-size: .8em;
|
|
From: <abe...@us...> - 2003-08-07 03:47:09
|
Update of /cvsroot/hepserver/hep/hep/services
In directory sc8-pr-cvs1:/tmp/cvs-serv17447/hep/services
Modified Files:
http.py
Log Message:
fix the root site object to actually make sense
Index: http.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/services/http.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** http.py 7 Aug 2003 03:24:22 -0000 1.2
--- http.py 7 Aug 2003 03:47:07 -0000 1.3
***************
*** 28,42 ****
def getFactory(app):
portal = app.getServiceNamed('Authenticator').portal
- res = resource.Resource()
- site = server.Site(res)
-
- # add static paths
- for staticPath in ('images', 'styles'):
- res.putChild(staticPath, static.File(sibpath(hep.web.__file__, staticPath)))
-
- res.putChild("", Redirect("/messages"))
from twisted.web.woven.guard import UsernamePasswordWrapper, SessionWrapper
! res.putChild("messages", SessionWrapper(
! UsernamePasswordWrapper(portal))) #,lambda _: Redirect("/messages")))))
return site
--- 28,35 ----
def getFactory(app):
portal = app.getServiceNamed('Authenticator').portal
from twisted.web.woven.guard import UsernamePasswordWrapper, SessionWrapper
! res = SessionWrapper(UsernamePasswordWrapper(portal))
! site = server.Site(res)
!
return site
***************
*** 46,57 ****
self.user = user
resource.Resource.__init__(self)
def render(self, request):
- print "RENDERNG!"
request.redirect('/messages')
return ""
def getChild(self, name, request):
! #if name == 'messages':
! return MessagesPage(self.user)
!
\ No newline at end of file
--- 39,53 ----
self.user = user
resource.Resource.__init__(self)
+ # add static paths
+ for staticPath in ('images', 'styles'):
+ self.putChild(staticPath, static.File(sibpath(hep.web.__file__, staticPath)))
def render(self, request):
request.redirect('/messages')
return ""
def getChild(self, name, request):
! if name == 'messages':
! return MessagesPage(self.user)
! else:
! return Redirect('/messages')
\ No newline at end of file
|
|
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)
|
|
From: <abe...@us...> - 2003-08-07 03:31:02
|
Update of /cvsroot/hepserver//messaging/messaging/formats
In directory sc8-pr-cvs1:/tmp/cvs-serv15557/messaging/formats
Modified Files:
rss.py
Log Message:
use new message API with dict-like interface
for headers (still in flux).
Index: rss.py
===================================================================
RCS file: /cvsroot/hepserver//messaging/messaging/formats/rss.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** rss.py 9 Jul 2003 16:15:24 -0000 1.8
--- rss.py 7 Aug 2003 03:30:57 -0000 1.9
***************
*** 1,5 ****
from messaging.message import Message
from messaging.formats import Parser
! from extlib import rssparser
import md5
import base64
--- 1,5 ----
from messaging.message import Message
from messaging.formats import Parser
! from extlib import feedparser
import md5
import base64
***************
*** 33,37 ****
headers = {}
! parser = rssparser.RSSParser()
parser.feed(rssDocument)
channel, items = parser.channel, parser.items
--- 33,37 ----
headers = {}
! parser = feedparser.FeedParser()
parser.feed(rssDocument)
channel, items = parser.channel, parser.items
***************
*** 43,49 ****
if item.has_key('title'):
! m.title = html2text(item['title'])
else:
! m.title = headers.get('title','')
if item.has_key('content_encoded'):
--- 43,49 ----
if item.has_key('title'):
! m['title'] = html2text(item['title'])
else:
! m['title'] = headers.get('title','')
if item.has_key('content_encoded'):
***************
*** 57,91 ****
if item.has_key('link'):
! m.link = item['link']
elif item.has_key('guid'):
if parser.guidislink:
! m.link = item['guid']
if item.has_key('guid'):
! m.guid = "<rss:%s>" % item['guid']
! else:
! # calculate the ID by hashing the title and body
! # FIXME: this should include link, and probably content:encoded if description
! # isn't there. also it should use messages.title instead of m.title.
! # Or it could not set the guid at all, and let the Message class generate
! # it automatically....
!
! hash = md5.new()
! if item.has_key('title'):
! hash.update(item['title'])
! if item.has_key('description'):
! hash.update(item['description'])
! m.guid = "<" + safeChars(hash.hexdigest() + "@" + m.title[:10]) + ">"
if item.has_key('date'):
! try: m.timestamp = item['date']
except: pass
elif channel.has_key('date'):
# fall back to the channel's modify date
! try: m.timestamp = channel['date']
except: pass
if channel.has_key('title'):
! m.author.name = channel['title']
messages.append(m)
--- 57,78 ----
if item.has_key('link'):
! m['link'] = item['link']
elif item.has_key('guid'):
if parser.guidislink:
! m['link'] = item['guid']
if item.has_key('guid'):
! m['Message-ID'] = "<rss:%s>" % item['guid']
if item.has_key('date'):
! try: m.setTimestamp(item['date'])
except: pass
elif channel.has_key('date'):
# fall back to the channel's modify date
! try: m.setTimestamp(channel['date'])
except: pass
if channel.has_key('title'):
! m['author'].name = channel['title']
messages.append(m)
|
|
From: <abe...@us...> - 2003-08-07 03:30:33
|
Update of /cvsroot/hepserver//messaging/messaging/protocols
In directory sc8-pr-cvs1:/tmp/cvs-serv15513/messaging/protocols
Modified Files:
http.py
Log Message:
use new message API with dict-like interface
for headers (still in flux).
Index: http.py
===================================================================
RCS file: /cvsroot/hepserver//messaging/messaging/protocols/http.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** http.py 9 Jul 2003 16:15:23 -0000 1.6
--- http.py 7 Aug 2003 03:30:31 -0000 1.7
***************
*** 32,37 ****
name = headers.get('title','').strip() or url.server
for message in messages:
! if not message.author:
! message.author.name = name
else:
name = ''
--- 32,37 ----
name = headers.get('title','').strip() or url.server
for message in messages:
! if not message.get('author'):
! message['author'].name = name
else:
name = ''
|
|
From: <abe...@us...> - 2003-08-07 03:29:38
|
Update of /cvsroot/hepserver/hep/hep/web
In directory sc8-pr-cvs1:/tmp/cvs-serv15283/hep/web
Modified Files:
messages.py
Log Message:
use new message API with dict-like interface
for headers (still in flux).
Index: messages.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/messages.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** messages.py 10 Jul 2003 16:09:36 -0000 1.1
--- messages.py 7 Aug 2003 03:29:35 -0000 1.2
***************
*** 58,62 ****
else:
td.text(str(curDay))
- print "DONE GENERATING CALENDAR"
--- 58,61 ----
***************
*** 67,95 ****
div['class'] = 'message'
head = div.div(_class='messageHeader')
! if message.link:
! head.h4().a(href=message.link).text(message.title)
else:
! head.h4().text(message.title)
- if 0: #for header in ('author', 'to', 'link'):
- headerValue = getattr(message, header, '')
- if headerValue:
- head.strong().text(header.capitalize())
- head.text(": ")
- if header == 'link':
- head.a(href=headerValue).text(headerValue)
- elif header == 'author':
- fromText = headerValue.address and headerValue or headerValue.name
- head.text(headerValue.name)
- else:
- head.text(headerValue)
- head.br()
head.br()
div.text(message.getHTML(bodyOnly=1, safeTagsOnly=1) or "", raw=1)
div.div(_class='timestamp').small().text("%s, %s" % (
! message.author.address and message.author or message.author.name,
! time.strftime('%I:%M %p', message.timestamp)))
!
! print "DONE GENERATING MESSAGE"
class BlogView(view.View):
--- 66,79 ----
div['class'] = 'message'
head = div.div(_class='messageHeader')
! if message.get('link'):
! head.h4().a(href=message['link']).text(message['title'])
else:
! head.h4().text(message['title'])
head.br()
div.text(message.getHTML(bodyOnly=1, safeTagsOnly=1) or "", raw=1)
div.div(_class='timestamp').small().text("%s, %s" % (
! message['author'].address and message['author'] or message['author'].name,
! time.strftime('%I:%M %p', message.getTimestamp())))
class BlogView(view.View):
***************
*** 134,139 ****
item = list.li()
! a = item.a(href="/messages//" + storePath)
! if "/".join(request.postpath[:-1]) == storePath[1:]:
a['class'] = 'selected'
a.img(src='/images/icons/small/%s.png' % store.url.protocol, align='absmiddle')
--- 118,123 ----
item = list.li()
! a = item.a(href='/'.join(['/messages', '', storePath, '']))
! if '/'.join(request.postpath).strip('/') == storePath.strip('/'):
a['class'] = 'selected'
a.img(src='/images/icons/small/%s.png' % store.url.protocol, align='absmiddle')
|
|
From: <abe...@us...> - 2003-08-07 03:28:58
|
Update of /cvsroot/hepserver/hep/hep/web
In directory sc8-pr-cvs1:/tmp/cvs-serv15165/hep/web
Modified Files:
models.py
Log Message:
use new message API with dict-like interface
for headers (still in flux).
Index: models.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/web/models.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** models.py 10 Jul 2003 16:09:36 -0000 1.1
--- models.py 7 Aug 2003 03:28:56 -0000 1.2
***************
*** 2,6 ****
from twisted.web.woven import model
import time
!
class UserModel(model.MethodModel):
--- 2,6 ----
from twisted.web.woven import model
import time
! from messaging import parseDate
class UserModel(model.MethodModel):
***************
*** 9,13 ****
def getStore(self, request):
! path = "/".join(request.postpath)
if path:
return self.user.messages.openChildStores().addCallback(lambda stores: stores.get(path) or self.user.messages)
--- 9,14 ----
def getStore(self, request):
! path = "/".join(request.postpath).strip('/')
! print "PATH", path
if path:
return self.user.messages.openChildStores().addCallback(lambda stores: stores.get(path) or self.user.messages)
***************
*** 39,43 ****
# sort messageList by date
! messageList.sort(lambda a,b: cmp(a[1]['timestamp'], b[1]['timestamp']))
finished.count = 0
--- 40,47 ----
# sort messageList by date
! messageList.sort(lambda a,b: cmp(
! parseDate(a[1]['Date']),
! parseDate(b[1]['Date'])
! ))
finished.count = 0
***************
*** 48,56 ****
day = time.strptime(date, "%Y-%m-%d")[:3]
else:
! day = messageList[-1][1]['timestamp'][:3]
idsToFetch = []
for id, headers in messageList:
! if headers['timestamp'][:3] == day:
idsToFetch.append(id)
--- 52,62 ----
day = time.strptime(date, "%Y-%m-%d")[:3]
else:
! print messageList[-1][1]['Date']
! print parseDate(messageList[-1][1]['Date'])
! day = parseDate(messageList[-1][1]['Date'])[:3]
idsToFetch = []
for id, headers in messageList:
! if parseDate(headers['Date'])[:3] == day:
idsToFetch.append(id)
***************
*** 69,73 ****
finished.messages.append(message)
if len(finished.messages) == finished.count:
! finished.messages.sort(lambda a,b: cmp(b.timestamp, a.timestamp))
print "GOT ALL MESSAGES, CALLING BACK"
finished.callback(finished.messages)
--- 75,79 ----
finished.messages.append(message)
if len(finished.messages) == finished.count:
! finished.messages.sort(lambda a,b: cmp(b.getTimestamp(), a.getTimestamp()))
print "GOT ALL MESSAGES, CALLING BACK"
finished.callback(finished.messages)
***************
*** 93,98 ****
days = []
for id, headers in messageList.items():
! if headers['timestamp'][1] == month:
! days.append(headers['timestamp'][2])
print "CALLING BACK CAL DATES"
--- 99,106 ----
days = []
for id, headers in messageList.items():
! timestamp = parseDate(headers['Date'])
! print "PARSED DATE", timestamp
! if timestamp[1] == month:
! days.append(timestamp[2])
print "CALLING BACK CAL DATES"
|
|
From: <abe...@us...> - 2003-08-07 03:26:37
|
Update of /cvsroot/hepserver/hep/hep/services
In directory sc8-pr-cvs1:/tmp/cvs-serv14879/hep/services
Modified Files:
datamanager.py
Log Message:
Added 'anonymous' user
Index: datamanager.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/services/datamanager.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** datamanager.py 10 Jul 2003 16:09:36 -0000 1.1
--- datamanager.py 7 Aug 2003 03:26:34 -0000 1.2
***************
*** 48,52 ****
os.makedirs(fullPath)
self.users[userName] = HepUser(userDir, self.cacheDir, userName)
!
reactor.callLater(0, self.loadConnections)
--- 48,53 ----
os.makedirs(fullPath)
self.users[userName] = HepUser(userDir, self.cacheDir, userName)
! self.users['anonymous'] = PublicUser(self)
!
reactor.callLater(0, self.loadConnections)
***************
*** 147,148 ****
--- 148,160 ----
def HepUserWrapper(user):
return user
+
+ class PublicUser:
+ def __init__(self, data):
+ self.config = {}
+ self.connections = {}
+ self.messages = messaging.MessageStore()
+ from messaging.message import Message
+ m = Message()
+ m['title'] = 'Welcome'
+ m.setHTML("Welcome to Hep!<p><a href='perspective-init'>Log in</a>")
+ self.messages.messages.append(m)
|
|
From: <abe...@us...> - 2003-08-07 03:25:13
|
Update of /cvsroot/hepserver/hep/hep/services
In directory sc8-pr-cvs1:/tmp/cvs-serv14719/hep/services
Modified Files:
imap.py
Log Message:
IMAP support getting closer, but still not
working.
Index: imap.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/services/imap.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** imap.py 10 Jul 2003 16:09:36 -0000 1.1
--- imap.py 7 Aug 2003 03:25:11 -0000 1.2
***************
*** 9,12 ****
--- 9,13 ----
from twisted.internet import reactor, defer
from twisted.python import components
+ from twisted.python.util import InsensitiveDict
class Service(ApplicationService):
***************
*** 49,53 ****
def loadMailboxes(self):
! self.mailboxes = []
d = defer.Deferred()
listing = self.original.messages.openChildStores()
--- 50,54 ----
def loadMailboxes(self):
! self.mailboxes = InsensitiveDict()
d = defer.Deferred()
listing = self.original.messages.openChildStores()
***************
*** 56,65 ****
def listMailboxes(self, ref, wildcard):
! return self.mailboxes
def finishedLoadingMailboxes(self, stores, d):
results = []
for path, store in stores.items():
! self.mailboxes.append([path, Mailbox(store)])
d.callback(self)
--- 57,68 ----
def listMailboxes(self, ref, wildcard):
! return self.mailboxes.items()
def finishedLoadingMailboxes(self, stores, d):
results = []
for path, store in stores.items():
! if not path.count('Connections/'):
! self.mailboxes[path.lower()] = Mailbox(store)
! self.mailboxes[path].refreshValues()
d.callback(self)
***************
*** 72,75 ****
--- 75,84 ----
def subscribe(self, path):
return 1
+
+ def unsubscribe(self, path):
+ return 1
+
+ def select(self, path, rw):
+ return self.mailboxes[path.lower()]
class Mailbox(components.Adapter):
***************
*** 80,82 ****
def getFlags(self):
! return []
\ No newline at end of file
--- 89,224 ----
def getFlags(self):
! return []
!
! def refreshValues(self):
! self.messageCount = 0
! self.uidMap = {}
! # this should be better
! import time
! self.timestamp = int(time.time())
! self.original.getCount().addCallback(self.setMessageCount)
! self.original.listMessages().addCallback(self.loadedMessageList)
!
! def setMessageCount(self, count):
! self.messageCount = count
!
! def loadedMessageList(self, messageIds):
! for mID in messageIds:
! self.uidMap[self.getUIDNext()] = mID
!
! def getMessageCount(self):
! return self.messageCount
!
! getUnseenCount = getRecentCount = getMessageCount
!
! def isWriteable(self):
! return self.original.canEdit
!
! def getUIDValidity(self):
! return self.timestamp
!
! def getUID(self, messageNo):
! uids = self.uidMap.keys()
! uids.sort()
! return uids[messageNo-1]
!
! def getUIDNext(self):
! return self.uidMap and max(self.uidMap.keys())+1 or 1
!
! def fetch(self, messages, uid):
! print "FETCH", messages, uid, self.uidMap
! d = defer.Deferred()
! d.responses = []
! d.messageCount = 0
! if not messages.last:
! messages.last = uid and max(self.uidMap.keys()) or len(self.uidMap.keys())
!
! idsToFetch = []
! for m in messages:
! if not uid:
! print 'NO UID', uid, 'looking up', m, self.uidMap
! idsToFetch.append(self.getUID(m))
! else:
! idsToFetch.append(m)
!
! d.messageCount = len(idsToFetch)
! for mID in idsToFetch:
! self.original.getMessage(self.uidMap[mID]).addCallback(
! self.fetchedMessage, d, m).addErrback(
! printError)
! return d
!
! def fetchedMessage(self, message, finished, mID):
! print "APPENDING MESSAGE, UID", mID, "of", finished.messageCount
! finished.responses.append((mID, MessageAdapter(message)))
! if len(finished.responses) == finished.messageCount:
! print "GOT ALL MESSAGES, CALLING BACK!"
! finished.callback(iter(finished.responses))
!
! def addListener(self, *args):
! return 1
!
! def removeListener(self, *args):
! return 1
!
! requestStatus = imap4.statusRequestHelper
!
! def search(self, query, uid):
! if uid:
! return self.uidMap.values()
! else:
! return self.uidMap.keys()
!
! class MessageAdapter(components.Adapter):
! __implements__ = (imap4.IMessage)
!
! def getHeaders(self, names, negate):
! print "names", names, "NEGATE", repr(negate)
! if not names: return self.original.getAllHeaders()
! headers = {}
! if negate:
! for header in self.original.keys():
! if header.upper() not in names:
! headers[header] = self.original[header]
! else:
! for name in names:
! name = str(name)
! print name,
! headers[name] = str(self.original[name])
! print "HEADERS:", headers
! return headers
!
! def getFlags(self):
! print "RETURNING FLAGS"
! return [r"\Recent"]
!
! def getInternalDate(self):
! print "RETURNING DATE"
! return self.original['Date']
!
! def getBodyFile(self):
! print "GETTING BODY FILE"
! from cStringIO import StringIO
! return StringIO(str(self.original))
!
! def getSize(self):
! print "RETURNING SIZE"
! return len(str(self.original))
!
! def getUID(self):
! print 'RETURNING UID'
! return 1
!
! def getSubPart(self, part):
! """Retrieve a MIME sub-message
!
! @type part: C{int}
! @param part: The number of the part to retrieve, indexed from 0.
!
! @rtype: Any object implementing C{IMessage}.
! @return: The specified sub-part.
! """
! return None
!
! def printError(*args):
! print args
\ No newline at end of file
|
|
From: <abe...@us...> - 2003-08-07 03:24:25
|
Update of /cvsroot/hepserver/hep/hep/services
In directory sc8-pr-cvs1:/tmp/cvs-serv14617/hep/services
Modified Files:
http.py
Log Message:
start of public pages for users who aren't
logged in
Index: http.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hep/services/http.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** http.py 10 Jul 2003 16:09:36 -0000 1.1
--- http.py 7 Aug 2003 03:24:22 -0000 1.2
***************
*** 2,7 ****
from twisted.internet import app, reactor
import hep.web
- from hep.web.messages import MessagesPage
from hep.web.models import UserModel
from twisted.python.util import sibpath
--- 2,8 ----
from twisted.internet import app, reactor
import hep.web
from hep.web.models import UserModel
+ from hep.web.messages import MessagesPage
+ from twisted.web.util import Redirect
from twisted.python.util import sibpath
***************
*** 13,20 ****
# register an IResource interface with the data manager
dm = self.serviceParent.getServiceNamed('Data Manager')
! dm.avatarInterfaces[resource.IResource] = getResource
self.factory = getFactory(self.serviceParent)
reactor.listenTCP(self.PORT, self.factory)
def getFactory(app):
--- 14,28 ----
# register an IResource interface with the data manager
dm = self.serviceParent.getServiceNamed('Data Manager')
! dm.avatarInterfaces[resource.IResource] = self.getResource
self.factory = getFactory(self.serviceParent)
reactor.listenTCP(self.PORT, self.factory)
+
+ def getResource(self, user):
+ if user:
+ return UserResource(UserModel(user=user))
+ else:
+ anonUser = self.serviceParent.getServiceNamed('Data Manager').users['anonymous']
+ return UserResource(UserModel(user=anonUser))
def getFactory(app):
***************
*** 27,39 ****
res.putChild(staticPath, static.File(sibpath(hep.web.__file__, staticPath)))
! res.putChild("", static.Data("<html><a href='messages'>Messages</a>", "text/html"))
from twisted.web.woven.guard import UsernamePasswordWrapper, SessionWrapper
! res.putChild("messages", SessionWrapper(UsernamePasswordWrapper(portal)))
return site
! def getResource(user):
! if user:
! return MessagesPage(UserModel(user=user))
! else:
! return static.Data("anonymous browsing - <a href='perspective-init'>login</a>", "text/html")
!
\ No newline at end of file
--- 35,57 ----
res.putChild(staticPath, static.File(sibpath(hep.web.__file__, staticPath)))
! res.putChild("", Redirect("/messages"))
from twisted.web.woven.guard import UsernamePasswordWrapper, SessionWrapper
! res.putChild("messages", SessionWrapper(
! UsernamePasswordWrapper(portal))) #,lambda _: Redirect("/messages")))))
return site
! class UserResource(resource.Resource):
!
! def __init__(self, user):
! self.user = user
! resource.Resource.__init__(self)
!
! def render(self, request):
! print "RENDERNG!"
! request.redirect('/messages')
! return ""
!
! def getChild(self, name, request):
! #if name == 'messages':
! return MessagesPage(self.user)
!
\ No newline at end of file
|
|
From: <abe...@us...> - 2003-07-10 16:52:00
|
Update of /cvsroot/hepserver/hep/hep
In directory sc8-pr-cvs1:/tmp/cvs-serv13622/hep
Added Files:
connection.py __init__.py
Log Message:
left these out before...
--- NEW FILE: connection.py ---
from messaging.url import Url
import re
validName = re.compile("[a-zA-Z0-9]*\Z")
class UserConnection:
def __init__(self, name, url, description=None):
self.name = name
self.url = Url(url)
self.description = description
def __setattr__(self, attribute, value):
if attribute == 'name':
if validName.match(value):
self.__dict__['name'] = value
else:
raise "Invalid name string."
else:
self.__dict__[attribute] = value
--- NEW FILE: __init__.py ---
pass
|
|
From: <abe...@us...> - 2003-07-10 16:47:26
|
Update of /cvsroot/hepserver/hep/hep/services
In directory sc8-pr-cvs1:/tmp/cvs-serv6713/hep/services
Added Files:
__init__.py authenticator.py datamanager.py http.py imap.py
Log Message:
imported files
--- NEW FILE: __init__.py ---
pass
--- NEW FILE: authenticator.py ---
from twisted.cred import credentials
from twisted.cred.error import UnauthorizedLogin
from twisted.cred import checkers, portal
from twisted.internet import defer, app
import os.path
class Service(app.ApplicationService):
NAME = 'Authenticator'
def startService(self):
realm = self.serviceParent.getServiceNamed('Data Manager')
self.portal = portal.Portal(realm)
passwordFileName = os.path.join(self.serviceParent.dataPath, 'passwd')
self.portal.registerChecker(PasswordAuthenticator(passwordFileName))
self.portal.registerChecker(checkers.AllowAnonymousAccess())
class PasswordAuthenticator:
__implements__ = checkers.ICredentialsChecker
credentialInterfaces = credentials.IUsernamePassword,
def __init__(self, passwordFileName):
self.passwords = {}
passwordFile = open(passwordFileName)
userLines = passwordFile.readlines()
for listing in userLines:
userName, password = listing.strip().split(":")
self.passwords[userName] = password
def requestAvatarId(self, credentials):
if self.passwords.get(credentials.username) == credentials.password:
return defer.succeed(credentials.username)
else:
return defer.fail(UnauthorizedLogin())
--- NEW FILE: datamanager.py ---
import os
import os.path
import urllib
import cPickle as pickle
import time
import messaging
from messaging.url import Url
import messaging.cache
from twisted.internet import reactor, defer
from twisted.internet.defer import maybeDeferred
import twisted.python.log
twisted.python.log.logfile = messaging.log
from hep import connection
from twisted.internet.app import ApplicationService
from messaging.protocols.file import MaildirStore
from twisted.cred.portal import IRealm
class DataManagerService(ApplicationService):
NAME = 'Data Manager'
__implements__ = IRealm
def startService(self):
dataDir = self.serviceParent.dataPath
self.connections = {}
self.avatarInterfaces = {}
self.avatarInterfaces[HepUser] = HepUserWrapper
# make sure dataDir has the sub-folders and files that it should
userDir = os.path.join(dataDir, 'users')
if not os.path.exists(userDir): os.makedirs(userDir)
self.cacheDir = os.path.join(dataDir, "cache")
if not os.path.exists(self.cacheDir): os.makedirs(self.cacheDir)
passwordFileName = os.path.join(dataDir, "passwd")
if not os.path.isfile(passwordFileName):
# create the file.
open(passwordFile, 'w').close()
self.connector = messaging.Connector()
self.connector.cachePath = self.cacheDir
self.users = {}
for userName in os.listdir(os.path.join(dataDir, 'users')):
userDir = os.path.join(dataDir, 'users', userName)
# make sure the user folder has the neccessary sub-folders
for path in ('messages/local', 'messages/connections', 'messages/index'):
fullPath = os.path.join(*([userDir] + path.split('/')))
if not os.path.exists(fullPath):
os.makedirs(fullPath)
self.users[userName] = HepUser(userDir, self.cacheDir, userName)
reactor.callLater(0, self.loadConnections)
def requestAvatar(self, avatarID, mind, *interfaces):
# rudely ignore the requested interface - always return a HepUser object
# FIXME (yawn...)
for iface in interfaces:
if iface in self.avatarInterfaces:
avatar = maybeDeferred(self.avatarInterfaces[iface], self.users.get(avatarID))
avatar.addCallback(lambda a: (iface, a, lambda: None))
return avatar
else:
raise NotImplementedError("no interface")
def loadConnections(self):
for user in self.users.values():
for connection in user.connections.values():
if self.connections.has_key(str(connection.url)):
user.messages.connectionStore.childFolders[connection.name] = self.connections[str(connection.url)]
d = self.connector.openUrl(connection.url)
d.addCallback(self.gotConnection, connection, user)
def gotConnection(self, store, connection, user):
self.connections[str(connection.url)] = store
user.messages.connectionStore.childFolders[connection.name] = store
user.messages.connectionStore.childFolders[connection.name].name = connection.name
class RootMessageStore(MaildirStore):
"""
A message store used for organizing child stores only.
It contains a number of MaildirStores, plus 'connections'
"""
canPost = 0
canEdit = 0
canDelete = 0
def __init__(self, url, connections):
MaildirStore.__init__(self, url)
self.name = ''
self.connectionStore = connections
def listChildFolders(self):
return MaildirStore.listChildFolders(self).addCallback(lambda names: names + ['Connections'])
def openChildFolder(self, folderName):
if folderName == 'Connections':
return defer.succeed(self.connectionStore)
else:
return MaildirStore.openChildFolder(self, folderName)
class HepUser:
def __init__(self, baseFolder, cacheFolder, username):
self.name = username
self.baseFolder = baseFolder
self.connector = messaging.Connector()
#self.index = search.MessageIndex(os.path.join(baseFolder,'messages','index'))
self.config = {}
self.connections = {}
connectionStore = messaging.MessageStore()
connectionStore.name = 'Connections'
mailboxPath = os.path.join(self.baseFolder, 'messages', 'local')
self.messages = RootMessageStore(Url(mailboxPath), connectionStore)
self.loadConfig()
self.loadConnections()
def loadConnections(self):
for connection in self.connections.values():
del(connection)
self.connections = {}
datafilePath = os.path.join(self.baseFolder, 'connections.dat')
if os.path.exists(datafilePath):
try: connections = pickle.load(file(datafilePath))
except:
print "ERROR LOADING CONNECTIONS FOR USER %s!!!" % self.name
connections = []
for connection in connections:
self.connections[str(connection.name)] = connection
def saveConnections(self):
datafile = open(os.path.join(self.baseFolder, 'connections.dat'),'w')
pickle.dump(self.connections, datafile)
datafile.close()
def loadConfig(self):
try:
datafile = open(os.path.join(self.baseFolder, 'config.dat'),'r')
self.connector.preferences = pickle.load(datafile)
datafile.close()
except: pass
def saveConfig(self):
datafile = open(os.path.join(self.baseFolder, 'config.dat'),'w')
pickle.dump(self.connector.preferences, datafile)
datafile.close()
def HepUserWrapper(user):
return user
--- NEW FILE: http.py ---
from twisted.web import server, static, resource
from twisted.internet import app, reactor
import hep.web
from hep.web.messages import MessagesPage
from hep.web.models import UserModel
from twisted.python.util import sibpath
class Service(app.ApplicationService):
PORT = 5080
NAME = 'HTTP'
def startService(self):
# register an IResource interface with the data manager
dm = self.serviceParent.getServiceNamed('Data Manager')
dm.avatarInterfaces[resource.IResource] = getResource
self.factory = getFactory(self.serviceParent)
reactor.listenTCP(self.PORT, self.factory)
def getFactory(app):
portal = app.getServiceNamed('Authenticator').portal
res = resource.Resource()
site = server.Site(res)
# add static paths
for staticPath in ('images', 'styles'):
res.putChild(staticPath, static.File(sibpath(hep.web.__file__, staticPath)))
res.putChild("", static.Data("<html><a href='messages'>Messages</a>", "text/html"))
from twisted.web.woven.guard import UsernamePasswordWrapper, SessionWrapper
res.putChild("messages", SessionWrapper(UsernamePasswordWrapper(portal)))
return site
def getResource(user):
if user:
return MessagesPage(UserModel(user=user))
else:
return static.Data("anonymous browsing - <a href='perspective-init'>login</a>", "text/html")
--- NEW FILE: imap.py ---
"""
imap support for Hep.
"""
from twisted.protocols import imap4
from twisted.internet.app import ApplicationService
from twisted.internet.protocol import Factory
from twisted.internet import reactor, defer
from twisted.python import components
class Service(ApplicationService):
PORT = 5143
NAME = 'IMAP'
def startService(self):
# add support for getting IMAP accounts out of the datamanager service
dm = self.serviceParent.getServiceNamed('Data Manager')
dm.avatarInterfaces[imap4.IAccount] = openAccount
portal = self.serviceParent.getServiceNamed('Authenticator').portal
self.factory = IMAPFactory(portal)
self.factory.app = self.serviceParent
self.factory.protocol = HepIMAPServer
reactor.listenTCP(self.PORT, self.factory)
class IMAPFactory(Factory):
def __init__(self, portal):
self.portal = portal
def buildProtocol(self, address):
p = self.protocol()
p.portal = self.portal
p.factory = self
return p
class HepIMAPServer(imap4.IMAP4Server):
pass
def openAccount(user):
account = HepAccount(user)
return account.loadMailboxes()
class HepAccount(components.Adapter):
__implements = (imap4.IAccount,)
def loadMailboxes(self):
self.mailboxes = []
d = defer.Deferred()
listing = self.original.messages.openChildStores()
listing.addCallback(self.finishedLoadingMailboxes, d)
return d
def listMailboxes(self, ref, wildcard):
return self.mailboxes
def finishedLoadingMailboxes(self, stores, d):
results = []
for path, store in stores.items():
self.mailboxes.append([path, Mailbox(store)])
d.callback(self)
def create(self, path):
raise imap4.MailboxException("Permission denied")
def isSubscribed(self, path):
return 0
def subscribe(self, path):
return 1
class Mailbox(components.Adapter):
__implements__ = (imap4.IMailbox,)
def getHierarchicalDelimiter(self):
return '/'
def getFlags(self):
return []
|
|
From: <abe...@us...> - 2003-07-10 16:41:12
|
Update of /cvsroot/hepserver/hep/hep/web/images/icons/small In directory sc8-pr-cvs1:/tmp/cvs-serv6352/small Log Message: Directory /cvsroot/hepserver/hep/hep/web/images/icons/small added to the repository |
|
From: <abe...@us...> - 2003-07-10 16:39:50
|
Update of /cvsroot/hepserver/hep
In directory sc8-pr-cvs1:/tmp/cvs-serv7814
Modified Files:
hepserver.py
Log Message:
removed reference to scanner service (for now)
Index: hepserver.py
===================================================================
RCS file: /cvsroot/hepserver/hep/hepserver.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** hepserver.py 10 Jul 2003 16:00:43 -0000 1.1
--- hepserver.py 10 Jul 2003 16:16:10 -0000 1.2
***************
*** 5,9 ****
from twisted.internet.app import Application
from hep.services.datamanager import DataManagerService
! from hep.services import authenticator, scanner, http, imap
application = Application("Hep")
--- 5,9 ----
from twisted.internet.app import Application
from hep.services.datamanager import DataManagerService
! from hep.services import authenticator, http, imap
application = Application("Hep")
|
|
From: <abe...@us...> - 2003-07-10 16:35:19
|
Update of /cvsroot/hepserver/hep/hep/web/images/icons/large In directory sc8-pr-cvs1:/tmp/cvs-serv6352/large Log Message: Directory /cvsroot/hepserver/hep/hep/web/images/icons/large added to the repository |
|
From: <abe...@us...> - 2003-07-10 16:22:36
|
Update of /cvsroot/hepserver/hep/hep/web
In directory sc8-pr-cvs1:/tmp/cvs-serv6713/hep/web
Added Files:
__init__.py messages.py models.py
Log Message:
imported files
--- NEW FILE: __init__.py ---
pass
--- NEW FILE: messages.py ---
import os
from twisted.internet import app, defer
from twisted.web.woven import page, input, guard, widgets, view, model, interfaces
from twisted.web import server, static, microdom, domhelpers, resource
from twisted.web.microdom import lmx
from twisted.python import components
from twisted.python.util import sibpath
import messaging
import hep
import hep.web
import time
from hep.services.datamanager import DataManagerService, HepUser
import calendar
calendar.setfirstweekday(calendar.SUNDAY)
class Calendar(widgets.Widget):
def setUp(self, request, node, data):
yearNo, monthNo, today = time.localtime()[:3]
date = request.args.get('date',[''])[0]
if date.count('-') == 1:
yearNo, monthNo, today = time.strptime(date, "%Y-%m")[:3]
elif date.count('-') == 2:
yearNo, monthNo, today = time.strptime(date, "%Y-%m-%d")[:3]
node.tagName = "table"
curTime = time.localtime()
curMonth = calendar.monthcalendar(yearNo, monthNo)
month = lmx(node)
row = month.tr()
row.th().a(href='prev').text('< ')
row.th(colspan='5').text(time.strftime("%B %Y", curTime))
row.th().a(href='prev').text('> ')
headers = month.tr()
for dayName in ["Su", "M", "T", "W", "Th", "F" , "S"]:
headers.th(
_class="dayName", align="right"
).text(dayName)
for curWeek in curMonth:
week = month.tr(_class="week")
for curDay in curWeek:
if curDay == 0:
week.td(_class="blankDay")
else:
if curDay == today:
className = "today"
else:
className = "day"
td = week.td()
td['class'] = className
td['align'] = 'right'
if data.count(curDay):
formattedDate = str("?date=%s" % time.strftime('%Y-%m-%d', (yearNo, monthNo, int(curDay), 0, 0, 0, 0, 0, 0)))
td.a(href=formattedDate).text(str(curDay))
else:
td.text(str(curDay))
print "DONE GENERATING CALENDAR"
class MessageWidget(widgets.Widget):
def setUp(self, request, node, message):
node.tagName = "div"
div = lmx(node)
div['class'] = 'message'
head = div.div(_class='messageHeader')
if message.link:
head.h4().a(href=message.link).text(message.title)
else:
head.h4().text(message.title)
if 0: #for header in ('author', 'to', 'link'):
headerValue = getattr(message, header, '')
if headerValue:
head.strong().text(header.capitalize())
head.text(": ")
if header == 'link':
head.a(href=headerValue).text(headerValue)
elif header == 'author':
fromText = headerValue.address and headerValue or headerValue.name
head.text(headerValue.name)
else:
head.text(headerValue)
head.br()
head.br()
div.text(message.getHTML(bodyOnly=1, safeTagsOnly=1) or "", raw=1)
div.div(_class='timestamp').small().text("%s, %s" % (
message.author.address and message.author or message.author.name,
time.strftime('%I:%M %p', message.timestamp)))
print "DONE GENERATING MESSAGE"
class BlogView(view.View):
templateDirectory = sibpath(hep.web.__file__, 'templates')
templateFile = "blogview.html"
def __init__(self, *args, **kwargs):
view.View.__init__(self, *args, **kwargs)
self.setSubviewFactory("message", MessageWidget)
self.setSubviewFactory("calendar", Calendar)
class MessagesPage(page.Page):
templateDirectory = sibpath(hep.web.__file__, 'templates')
templateFile = "messages.html"
isLeaf = 1
def initialize(self, *args, **kwargs):
self.setSubviewFactory("blogview", BlogView)
def wvupdate_folderList(self, request, node, data):
stores = data.items()
item = lmx(node)
list = item.ul()
stores.sort(lambda a, b: cmp(
[a[0].startswith('Connections'), a[0].lower()],
[b[0].startswith('Connections'), b[0].lower()]
))
depth = 1
for storePath, store in stores:
difference = storePath.count('/') - depth
if difference == 1:
list = item.ul()
elif difference < 0:
for n in range(abs(difference)):
if list.node.parentNode:
list = lmx(list.node.parentNode.parentNode)
else:
break
item = list.li()
a = item.a(href="/messages//" + storePath)
if "/".join(request.postpath[:-1]) == storePath[1:]:
a['class'] = 'selected'
a.img(src='/images/icons/small/%s.png' % store.url.protocol, align='absmiddle')
storeName = storePath.split('/')[-1]
a.text(len(storeName) > 18 and (storeName[:16] + '...') or storeName)
depth = depth + difference
#components.registerAdapter(StoreModel, messaging.MessageStore, interfaces.IModel)
--- NEW FILE: models.py ---
from twisted.internet import defer
from twisted.web.woven import model
import time
class UserModel(model.MethodModel):
def initialize(self, *args, **kwargs):
self.user = kwargs['user']
def getStore(self, request):
path = "/".join(request.postpath)
if path:
return self.user.messages.openChildStores().addCallback(lambda stores: stores.get(path) or self.user.messages)
else:
return defer.succeed(self.user.messages)
def wmfactory_messages(self, request):
finished = defer.Deferred()
self.getStore(request).addCallback(
lambda store: store.listWithHeaders().addCallback(self.gotList, store, request, finished)
)
return finished
def wmfactory_connectionList(self, request):
allChildren = self.user.messages.openChildStores()
return allChildren
def wmfactory_storeName(self, request):
return self.getStore(request).addCallback(lambda store: store.name)
def printError(self, err):
print "***********************ERROR!**********************", err
def gotList(self, messageList, store, request, finished):
messageList = messageList.items()
if not messageList:
finished.callback([])
return
# sort messageList by date
messageList.sort(lambda a,b: cmp(a[1]['timestamp'], b[1]['timestamp']))
finished.count = 0
finished.messages = []
date = request.args.get('date',[''])[0]
if date:
day = time.strptime(date, "%Y-%m-%d")[:3]
else:
day = messageList[-1][1]['timestamp'][:3]
idsToFetch = []
for id, headers in messageList:
if headers['timestamp'][:3] == day:
idsToFetch.append(id)
if not idsToFetch:
finished.callback([])
return
finished.count = len(idsToFetch)
for id in idsToFetch:
d = store.getMessage(id)
d.addCallback(self.gotMessage, finished)
d.addErrback(self.printError)
def gotMessage(self, message, finished):
print "GOT MESSAGE (%s of %s)" % (len(finished.messages), finished.count)
finished.messages.append(message)
if len(finished.messages) == finished.count:
finished.messages.sort(lambda a,b: cmp(b.timestamp, a.timestamp))
print "GOT ALL MESSAGES, CALLING BACK"
finished.callback(finished.messages)
def wmfactory_calendarDates(self, request):
finished = defer.Deferred()
self.getStore(request).addCallback(
lambda store: store.listWithHeaders().addCallback(
self.gotListForCalendar, request, finished
).addErrback(self.printError)
)
return finished
def gotListForCalendar(self, messageList, request, finished):
print "GOT LIST FOR CALENDAR!"
month = request.args.get('date',[''])[0]
if not month:
month = time.localtime()[1]
else:
month = time.strptime(month, "%Y-%m-%d")[1]
days = []
for id, headers in messageList.items():
if headers['timestamp'][1] == month:
days.append(headers['timestamp'][2])
print "CALLING BACK CAL DATES"
finished.callback(days)
|