Hello,
So I played around with Bug 6857: In and Out collections should compute
their contents based on the sender or recipient of an email, not the
isOutbound attribute.
Based on my experimenting I really don't see how it will be possible to
have the In / Out collection work as described below with out a filter
collection.
From the design spec written by Mimi:
Items end up in the In and Out collections regardless of whether
they were
received via the Mail Service or Sharing Service.
Items end up in the In and Out collections regardless of whether
they were
received as Mine or Not-Mine collections.
The only criteria is:
+ Item is a message; AND
+ If the user is in the FROM: Send via: Sent by: Edited by: Updated
by fields,
item goes into the OUT collection
+ If the user is in the TO: CC: fields, item goes into the IN collection
+ If the user received the email via the Mail Service, the item goes
into the
IN collection (even if they are not specifically enumerated in the
Addressing
fields)
A single item could show up in the IN and OUT collections
There will be some set of email in your repo that will NOT show up
in either
IN/OUT, namely email you receive through sharing that is neither
FROM nor TO
you.
IN and OUT should not show up automatically in the Dashboard. This
is to avoid
the awkward scenario where a user subscribes to a share that they
explicitly
want to 'Keep out of Dashboard', but the share contains emails that
are either
FROM: or TO: them, which will in turn get picked up by the IN and OUT
collections.
All mail received via Mail Service should be added to the Dashboard
collection.
When we have a notion of Spheres, then we can have separate IN/OUT
collections
per sphere, and that will solve a lot of the funkiness described above.
The main issue I see is control of changes to the MailStamp type. A user
can change the to or cc of a message at anytime. There are also a number
of codepoints where a MailStamp is added to an item. This lack of
control makes it very difficult to enforce the In / Out collection logic.
I have attached some Python code which I used during my experimenting to
determine the In / Out collection adding. The mail service logic works
great but it is the other areas where a MailStamp is assigned and its
values altered that concerns me.
I also looked in to using an observer on the toAddress, fromAddress, and
ccAddress of a MailStamp. But after conversations with pje it looks like
this is not a feasible option since the value that changes
EmailAddress.emailAddress is contained in these lists.
Unless someone has a suggestion that I am overlooking it looks like a
filter collection for "In" and "Out" really is needed.
-Brian
--
Brian Kirsch
Internationalization Architect / Mail Service Engineer
Open Source Applications Foundation
543 Howard Street 5th Floor
San Francisco, CA 94105
http://www.osafoundation.org
from osaf.pim.mail import *
from application import schema
"""
MailService
1. Always add in
2. Always add dashboard
THOUGHTS:
1. inbound and outbound flags what are there role now?
"""
def addToMailCollections(view, mailMessage, fromMailService=False):
assert(isinstance(mailMessage, MailMessage))
pim_ns = schema.ns('osaf.pim', view)
if fromMailService:
pim_ns.inCollection.add(mailMessage)
pim_ns.allCollection.add(mailMessage)
else:
if isInbound(view, MailStamp(mailMessage)):
pim_ns.inCollection.add(mailMessage)
#XXX this may not be right. Do you do this for service
# stuff as well
if isOutbound(view, MailStamp(mailMessage)):
pim_ns.outCollection.add(mailMessage)
def isInbound(view, mailStamp):
assert(isinstance(mailStamp, MailStamp))
me = EmailAddress.getCurrentMeEmailAddress(view)
if me is None:
return False
me = EmailAddress.format(me)
for addr in mailStamp.toAddress:
if EmailAddress.emailAddressesAreEqual(me, \
EmailAddress.format(addr))
return True
for addr in mailStamp.ccAddress:
if EmailAddress.emailAddressesAreEqual(me, \
EmailAddress.format(addr))
return True
return False
def isOutbound(view, mailStamp):
assert(isinstance(mailStamp, MailStamp))
me = EmailAddress.getCurrentMeEmailAddress(view)
if me is None:
return False
me = EmailAddress.format(me)
if mailStamp.replyToAddress != None and \
EmailAddress.emailAddressesAreEqual(me, \
EmailAddress.format(mailStamp.replyToAddress)):
return True
if mailStamp.fromAddress != None and \
EmailAddress.emailAddressesAreEqual(me, \
EmailAddress.format(mailStamp.fromAddress)):
return True
#XXX: Add sent by: edited by: updated by:
# we don't have these values yet in mail schema
return False
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Open Source Applications Foundation "chandler-dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/chandler-dev