[Chandler-dev] Re: [commits] (grant) [12207] r13792@Pro-Grammar (orig r12108): bear | 2006-10-26 16:32:18 -0700

Grant Baillie grant at osafoundation.org
Thu Nov 2 09:51:07 PST 2006


Oh, crap.

I'll fix that.

--Grant

On 2 Nov, 2006, at 09:39, Jeffrey Harris wrote:

> Hmm, was that really what you wanted to do?
>
> commits at osafoundation.org wrote:
>> Revision
>>     12207 <http://viewcvs.osafoundation.org/chandler? 
>> view=rev&rev=12207>
>> Author
>>     grant
>> Date
>>     2006-11-02 09:34:07 -0800 (Thu, 02 Nov 2006)
>>
>>
>>       Log Message
>>
>> r13792 at Pro-Grammar (orig r12108): bear | 2006-10-26 16:32:18 -0700
>> Setting version info for trunk to 0.7alpha5.dev
>>
>> r13794 at Pro-Grammar (orig r12109): bkirsch | 2006-10-26 16:49:49 -0700
>> fixes bug [Bug 7163
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7163>] Mail marked
>> read on IMAP server when Chandler syncs by unsetting the \Seen  
>> flag on
>> the IMAP Server
>> r13795 at Pro-Grammar (orig r12110): heikki | 2006-10-26 17:14:30 -0700
>> Need to set TIME variable on Linux as well or startup timings  
>> won't work.
>> r13796 at Pro-Grammar (orig r12111): vajda | 2006-10-26 17:49:18 -0700
>> - fixed bug 7112 <http://bugzilla.osafoundation.org/show_bug.cgi? 
>> id=7112>
>> (http://bugzilla.osafoundation.org/show_bug.cgi?id=7112)
>> (Import calendar performance regression with r12016)
>> - introduced 'init' monitor op code used during initial value setting
>>
>> r13798 at Pro-Gr ammar (orig r12113): vajda | 2006-10-26 17:59:56 -0700
>> - upgraded build to chandlerdb 0.6-53 (bug 7126
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7126>)
>>
>> r13799 at Pro-Grammar (orig r12114): vajda | 2006-10-26 18:07:27 -0700
>> - added 'plugins' target to Makefile
>>
>> r13801 at Pro-Grammar (orig r12116): bear | 2006-10-26 19:23:37 -0700
>> Reverting change made in revision 12114
>> <http://viewcvs.osafoundation.org/chandler?view=rev&rev=12114> to  
>> add a
>> plugins target. The change broke the sub-targets that tbox uses.
>>
>> r13807 at Pro-Grammar (orig r12117): vajda | 2006-10-26 20:16:21 -0700
>> put back Makefile, removing the missing plugin
>> r13810 at Pro-Grammar (orig r12120): morgen | 2006-10-27 10:31:11 -0700
>> (trunk) Fix for bug 7199
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7199> (Incomplete
>> events), r=capps
>>
>> r13811 at Pro-Grammar (orig r12121): heikki | 2006-10-27 10:52:12 -0700
>> vobject is actually Jeffrey's code.
>> r13813 at Pro-Grammar (orig r12123): morgen | 2006-10-27 13:50:34 -0700
>> Copy the cached resource list, since get( ) makes modifications to it
>> along the way, and we want put( ) to get a pristine copy
>>
>> r13814 at Pro-Grammar (orig r12124): heikki | 2006-10-27 14:10:51 -0700
>> Bug 6785 <http://bugzilla.osafoundation.org/show_bug.cgi?id=6785>,
>> do_tests.sh should output test output as it is happening, r=bear.
>> r13816 at Pro-Grammar (orig r12126): heikki | 2006-10-27 15:44:29 -0700
>> Bug 6751 <http://bugzilla.osafoundation.org/show_bug.cgi?id=6751>,  
>> tests
>> should stop on first error. Functional tests patch by Dan, r=heikki.
>> Other changes by heikki, r=bear.
>> r13819 at Pro-Grammar (orig r12129): heikki | 2006-10-27 16:21:09 -0700
>> Ignore more stuff.
>> r13823 at Pro-Grammar (orig r12133): vajda | 2006-10-27 17:47:16 -0700
>> - fixed bug 7215 <http://
>> bugzilla.osafoundation.org/show_bug.cgi?id=7215> on trunk
>> (http://bugzilla.osafoundation.org/show_bug.cgi?id=7215)
>> (AssertionError: (<UUID: ec00d6d0-7d4e-11da-b55b-000e35a7c68a>, 'item
>> not found', <UUID: ec00d6d0-7d4e-11da-b55b-000e35a7c68a>))
>> - reworked AppCollection's schema to not create an exclusions  
>> ListCollection
>>
>> r13824 at Pro-Grammar (orig r12134): morgen | 2006-10-27 17:51:28 -0700
>> One less call to EventStamp()
>>
>> r13826 at Pro-Grammar (orig r12136): jeffrey | 2006-10-30 11:04:21 -0800
>> - Commit Darshana's fix for bug 7078
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7078>, the year  
>> 2099
>> doesn't work.
>> Changed date editors to use four digit years, and updated the
>> parsedatetime module
>>
>> r13835 at Pro-Grammar (orig r12141): jeffrey | 2006-10-30 12:53:06 -0800
>> - Fix test failures caused by changing the way date attribute  
>> editors work
>> (and an inexplicable failure in TestRemoveFromTrashOnImport caused  
>> by an
>> old, and seemingly no longer necessary workaround)
>>
>> r13840 at Pro-Grammar (orig r12144): heikki | 2006-10-30 15:25:59 -0800
>> Change Chandler sharing tests to test temporarily against
>> https://osaf.us. This
>> will give us some more coverage on Chandler+Cosmo 0.5.0  
>> combination, as
>> well as
>> giving us some additional SSL testing.
>>
>> In a couple of week's time (barring any problems), we intend to  
>> migrate
>> qacosmo
>> to Cosmo 0.5.0 and switch Chandler back to that. The next step is to
>> make Chandler
>> test against some dedicated Chandler-sharing-test-server instance,
>> perhaps cosmo-test.
>> r13841 at Pro-Grammar (orig r12145): vajda | 2006-10-30 15:28:14 -0800
>> - fixed bug 7240
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7240> on trunk
>> (http://bugzilla.osafoundation.org/show_bug.cgi?id=7240)
>> (instantiateItem s hould accept a "values" dict)
>>
>> r13843 at Pro-Grammar (orig r12147): morgen | 2006-10-30 15:31:04 -0800
>> (Trunk) Fix for bug 7230
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7230> (Incomplete
>> events when subscribing to a calendar that a non-Chandler client like
>> CosmoUI has created events in) r=grant
>>
>> r13846 at Pro-Grammar (orig r12149): vajda | 2006-10-30 17:38:01 -0800
>> - upgraded build to chandlerdb 0.6-54
>>
>> r13848 at Pro-Grammar (orig r12151): morgen | 2006-10-30 18:03:36 -0800
>> Fix for bug 7224
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7224> (Platform in
>> Chandler HTTP user-agent)
>>
>> r13853 at Pro-Grammar (orig r12152): bear | 2006-10-30 20:23:36 -0800
>> Enabling ConfigObj for Chandler use. This change also enables the
>> install of python-only eggs.
>> bug 6949 <http://bugzilla.osafoundation.org/show_bug.cgi?id=6949>
>>
>> r13857 at Pro-Grammar (or ig r12156): bear | 2006-10-30 20:42:44 -0800
>> make the PYEGGS download target a dependency to the install-plugin- 
>> core
>> so that the new eggs will be downloaded if the install target is
>> requested in an environment that has already been installed.
>>
>> r13858 at Pro-Grammar (orig r12157): bear | 2006-10-30 21:29:15 -0800
>> merging the two find's that purge pyc's and pyo's to a single find
>> (thanks Grant)
>> bug 7234 <http://bugzilla.osafoundation.org/show_bug.cgi?id=7234>
>>
>> r13859 at Pro-Grammar (orig r12158): bear | 2006-10-30 22:23:53 -0800
>> bug 7234 <http://bugzilla.osafoundation.org/show_bug.cgi?id=7234>  
>> redux
>> - completely missed the -delete option to find in Grant's example
>> Will post part two of the fix tomorrow - the different external/
>> Makefile's that had the same pattern
>>
>> r13862 at Pro-Grammar (orig r12161): grant | 2006-10-31 09:01:33 -0800
>> r13776 at Pro-Grammar: grant | 2006-10-25 19:01:01 -07 00
>> First cut at a "Purge" button in Chandler:
>>
>> - Issues:
>>
>> + Needs a real icon.
>> + Does the "Purge" button purge all your items, or just the
>> ones in the currently selected collection?
>> + Is it active all the time, or only when the dashboard view is  
>> visible?
>>
>>
>> r13863 at Pro-Grammar (orig r12162): grant | 2006-10-31 09:02:13 -0800
>>
>> r13864 at Pro-Grammar (orig r12163): grant | 2006-10-31 09:02:18 -0800
>>
>> r13865 at Pro-Grammar (orig r12164): grant | 2006-10-31 09:02:23 -0800
>> r13782 at Pro-Grammar: grant | 2006-10-25 21:03:58 -0700
>> Purge button icon
>>
>> r13866 at Pro-Grammar (orig r12165): grant | 2006-10-31 09:02:27 -0800
>> r13783 at Pro-Grammar: grant | 2006-10-25 21:07:19 -0700
>> Remove commented-out UpdateUI for Purge events.
>>
>>
>> r13867 at Pro-Grammar (orig r12166): grant | 2006-10-31 09:02:33 -0800
>> r13784 at Pro- Grammar: grant | 2006-10-25 21:29:41 -0700
>> Terminology change: editedTriageStatus --> unpurgedTriageStatus
>>
>> r13868 at Pro-Grammar (orig r12167): grant | 2006-10-31 09:02:41 -0800
>>
>> r13869 at Pro-Grammar (orig r12168): grant | 2006-10-31 09:02:46 -0800
>>
>> r13870 at Pro-Grammar (orig r12169): grant | 2006-10-31 09:02:50 -0800
>>
>> r13871 at Pro-Grammar (orig r12170): grant | 2006-10-31 09:02:54 -0800
>> r13850 at Pro-Grammar: grant | 2006-10-30 18:21:47 -0800
>> I need to change the schema version, too
>>
>> r13875 at Pro-Grammar (orig r12174): pje | 2006-10-31 09:51:41 -0800
>> Initial checkin of Phase 1 and partial Phase 2 implementation of  
>> the EIM
>> API.
>> (Includes a copy of simplegeneric==0.6 from the Cheeseshop, which  
>> should be
>> replaced at some point with an egg-based dependency in the Makefile.)
>> See EIM.txt for documentation of the current features.
>>
>> r13876 at Pro-Grammar (orig r12175): mm mm | 2006-10-31 10:08:16 -0800
>> ix bug 6729 <http://bugzilla.osafoundation.org/show_bug.cgi?id=6729>
>> r13877 at Pro-Grammar (orig r12176): mmmm | 2006-10-31 10:10:54 -0800
>> Partial Fix bug 6729
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=6729>: The save
>> settings feature does not work with Unicode. r=jeffrey, bkirsch.
>> r13878 at Pro-Grammar (orig r12177): mmmm | 2006-10-31 10:11:25 -0800
>> Partial Fix bug 6729
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=6729>: The save
>> settings feature does not work with Unicode. r=jeffrey, bkirsch.
>> r13879 at Pro-Grammar (orig r12178): pje | 2006-10-31 10:45:35 -0800
>> Attempt to fix import problem on tbox.
>>
>> r13880 at Pro-Grammar (orig r12179): bkirsch | 2006-10-31 12:00:40 -0800
>> Streamlines mail code for Preview by no longer storing attachments  
>> and
>> rfc2822 data. These values will not be used by Chandler for  
>> Preview and
>> removing the storage of them i ncreases disk space and  
>> performance. The
>> hasMimeParts boolean attribute on MailStamp has also been removed.
>> r13881 at Pro-Grammar (orig r12180): stearns | 2006-10-31 12:35:50 -0800
>> Fix bug 7229 <http://bugzilla.osafoundation.org/show_bug.cgi? 
>> id=7229>:
>> extend TestReminderProcessing test period (from 3 seconds to 15)  
>> to deal
>> with slower machines and background tasks.
>>
>> r13882 at Pro-Grammar (orig r12181): mmmm | 2006-10-31 12:39:24 -0800
>> Partial Fix bug 6729
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=6729>: The save
>> settings feature does not work with Unicode. r=morgen, bkirsch.
>> r13883 at Pro-Grammar (orig r12182): heikki | 2006-10-31 12:53:02 -0800
>> Bug 6837 <http://bugzilla.osafoundation.org/show_bug.cgi?id=6837>,  
>> need
>> a little space between the Restart and Close button in the
>> feedback dialog, most visible on the Mac.
>> r13884 at Pro-Grammar (orig r12183): mmmm | 2006-10-31 13:04:59 -0800*
>> Partial Fix bug 6729
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=6729>: The save
>> settings feature does not work with Unicode. r=morgen, bkirsch.
>> r13885 at Pro-Grammar (orig r12184): heikki | 2006-10-31 14:17:30 -0800
>> Ignore configobj*.egg
>> r13886 at Pro-Grammar (orig r12185): vajda | 2006-10-31 14:41:41 -0800
>> - added missing _self.cursor variable initializations
>>
>> r13887 at Pro-Grammar (orig r12186): bear | 2006-10-31 14:46:05 -0800
>> Change the install location for PYEGGS from CHANDLERHOME to the  
>> normal
>> site-packages directory.
>> bug 7264 <http://bugzilla.osafoundation.org/show_bug.cgi?id=7264>
>>
>> r13888 at Pro-Grammar (orig r12187): vajda | 2006-10-31 14:56:25 -0800
>> - remove potential filter attribute duplicates
>>
>> r13889 at Pro-Grammar (orig r12188): vajda | 2006-10-31 15:18:56 -0800
>> - added attribute name hash clash check to kind.c.allNames caching
>>
>> r1 3890 at Pro-Grammar (orig r12189): heikki | 2006-10-31 20:44:03 -0800
>> Bug 7268 <http://bugzilla.osafoundation.org/show_bug.cgi?id=7268>,  
>> add
>> NOTICE.txt to distribution, r=bear.
>> r13892 at Pro-Grammar (orig r12191): dan | 2006-11-01 08:30:02 -0800
>> Change the way the CATS logger reports times. Elapsed times are  
>> reported
>> only in seconds (bug 6935
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=6935>), and  
>> accuracy
>> of times is limited to 1/100 of a second (bug 6934
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=6934>)
>> r13896 at Pro-Grammar (orig r12195): bear | 2006-11-01 09:33:12 -0800
>> Removing obsolete ChangeLog and platform specific README's
>> bug 7116 <http://bugzilla.osafoundation.org/show_bug.cgi?id=7116>,  
>> patch
>> by heikki, r=bear
>>
>> r13904 at Pro-Grammar (orig r12203): heikki | 2006-11-01 15:38:39 -0800
>> Make the feedback window a singleton to avoid the cases where we  
>> end up
>> wit h
>> multiple feedback windows up at the same time, r=robin.
>>
>> The idea for the singleton implementation from
>> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52558
>> r13905 at Pro-Grammar (orig r12204): jeffrey | 2006-11-01 15:44:19 -0800
>> - Fix traceback when drawing swatches in lozenges, variable names in
>> ConfigParser
>> aren't case sensitive but they are in ConfigObj. So this typo went
>> undiscovered
>> till now...
>>
>> r13906 at Pro-Grammar (orig r12205): jeffrey | 2006-11-01 18:05:23 -0800
>> - Commit Darshana's implementation of bug 7198
>> <http://bugzilla.osafoundation.org/show_bug.cgi?id=7198>, parse  
>> item body
>> for date times when stamping as an event
>> *
>>
>>
>>       *Modified Paths*
>>
>>     * *branches/0.7alpha4/chandler/Chandler.py
>>       <#branches07alpha4chandlerChandlerpy>*
>>     * *branches/0.7alpha4/chandler/Makefile
>>       <#branches07alpha4chandlerMakefile>*
>>     * *branches/0.7alpha4/chandler/NOTICE.txt
>>       <#branches07alpha4chandlerNOTICEtxt>*
>>     * *branches/0.7alpha4/chandler/application/Utility.py
>>       <#branches07alpha4chandlerapplicationUtilitypy>*
>>     * *branches/0.7alpha4/chandler/application/feedback.py
>>       <#branches07alpha4chandlerapplicationfeedbackpy>*
>>     * *branches/0.7alpha4/chandler/application/feedback.xrc
>>       <#branches07alpha4chandlerapplicationfeedbackxrc>*
>>     * *branches/0.7alpha4/chandler/application/styles.conf
>>       <#branches07alpha4chandlerapplicationstylesconf>*
>>     * *branches/0.7alpha4/chandler/application/styles.py
>>       <#branches07alpha4chandlerapplicationstylespy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/framework/ 
>> attributeEditors/AttributeEditors.py
>>        
>> <#branches07alpha4chandlerparcelsosafframeworkattributeEditorsAttribu 
>> teEditorspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/framework/blocks/ 
>> calendar/CalendarCanvas.py
>>        
>> <#branches07alpha4chandlerparcelsosafframeworkblockscalendarCalendarC 
>> anvaspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/mail/constants.py
>>       <#branches07alpha4chandlerparcelsosafmailconstantspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/mail/imap.py
>>       <#branches07alpha4chandlerparcelsosafmailimappy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/mail/message.py
>>       <#branches07alpha4chandlerparcelsosafmailmessagepy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/mail/tests/ 
>> TestMessage.py
>>       <#branches07alpha4chandlerparcelsosafmailtestsTestMessagepy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> Calendar.py
>>       <#branches07alpha4chandlerparcelsosafpimcalendarCalendarpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> DateTimeUtil.py
>>        
>> <#branches07alpha4chandlerparcelsosafpimcalendarDateTimeUtilpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/tests/ 
>> TestFormatters.py
>>        
>> <#branches07alpha4chandlerparcelsosafpimcalendartestsTestFormatterspy 
>> >*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/collections.py
>>       <#branches07alpha4chandlerparcelsosafpimcollectionspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/items.py
>>       <#branches07alpha4chandlerparcelsosafpimitemspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/mail.py
>>       <#branches07alpha4chandlerparcelsosafpimmailpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/pim/tests/ 
>> TestStamping.py
>>       <#branches07alpha4chandlerparcelsosafpimtestsTestStampingpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/servlets/xmlrpc.py
>>       <#branches07alpha4chandlerparcelsosafservletsxmlrpcpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/settings.py
>>       <#branches07alpha4chandlerparcelsosafsettingspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/Sharing.py
>>       <#branches07alpha4chandlerparcelsosafsharingSharingpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/tests/bad.xml
>>       <#branches07alpha4chandlerparcelsosafsharingtestsbadxml>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/tests/ 
>> compatibility/ComplexMail.xml
>>        
>> <#branches07alpha4chandlerparcelsosafsharingtestscompatibilityComplex 
>> Mailxml>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/tests/ 
>> compatibility/Mail.xml
>>        
>> <#branches07alpha4chandlerparcelsosafsharingtestscompatibilityMailxml 
>> >*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/tests/ 
>> compatibility/MailedEventTask.xml
>>        
>> <#branches07alpha4chandlerparcelsosafsharingtestscompatibilityMailedE 
>> ventTaskxml>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/tests/ 
>> compatibility/TestXMLCompatibility.py
>>        
>> <#branches07alpha4chandlerparcelsosafsharingtestscompatibilityTestXML 
>> Compatibilitypy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/views/detail/ 
>> detail.py
>>       <#branches07alpha4chandlerparcelsosafviewsdetaildetailpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/views/main/ 
>> Dashboard.py
>>       <#branches07alpha4chandlerparcelsosafviewsmainDashboardpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/views/main/events.py
>>       <#branches07alpha4chandlerparcelsosafviewsmaineventspy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/views/main/ 
>> mainblocks.py
>>       <#branches07alpha4chandlerparcelsosafviewsmainmainblockspy>*
>>     * *branches/0.7alpha4/chandler/repository/item/Item.py
>>       <#branches07alpha4chandlerrepositoryitemItempy>*
>>     * *branches/0.7alpha4/chandler/repository/item/Monitors.py
>>       <#branches07alpha4chandlerrepositoryitemMonitorspy>*
>>     * *branches/0.7alpha4/chandler/repository/item/Sets.py
>>       <#branches07alpha4chandlerrepositoryitemSetspy>*
>>     * *branches/0.7alpha4/chandler/repository/item/Values.py
>>       <#branches07alpha4chandlerrepositoryitemValuespy>*
>>     * *branches/0.7alpha4/chandler/repository/persistence/ 
>> DBContainer.py
>>       <#branches07alpha4chandlerrepositorypersistenceDBContainerpy>*
>>     * *branches/0.7alpha4/chandler/repository/persistence/DBRefs.py
>>       <#branches07alpha4chandlerrepositorypersistenceDBRefspy>*
>>     * *branches/0.7alpha4/chandler/repository/persistence/ 
>> DBRepositoryView.py
>>        
>> <#branches07alpha4chandlerrepositorypersistenceDBRepositoryViewpy>*
>>     * *branches/0.7alpha4/chandler/repository/persistence/ 
>> RepositoryError.py
>>        
>> <#branches07alpha4chandlerrepositorypersistenceRepositoryErrorpy>*
>>     * *branches/0.7alpha4/chandler/repository/persistence/ 
>> RepositoryView.py
>>        
>> <#branches07alpha4chandlerrepositorypersistenceRepositoryViewpy>*
>>     * *branches/0.7alpha4/chandler/repository/schema/Kind.py
>>       <#branches07alpha4chandlerrepositoryschemaKindpy>*
>>     * *branches/0.7alpha4/chandler/repository/schema/Types.py
>>       <#branches07alpha4chandlerrepositoryschemaTypespy>*
>>     * *branches/0.7alpha4/chandler/tools/QAUITestAppLib.py
>>       <#branches07alpha4chandlertoolsQAUITestAppLibpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestCreateAccounts.py
>>        
>> <#branches07alpha4chandlertoolscatsFunctionalTestCreateAccountspy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestEventStacking.py
>>        
>> <#branches07alpha4chandlertoolscatsFunctionalTestEventStackingpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestMoveToTrash.py
>>        
>> <#branches07alpha4chandlertoolscatsFunctionalTestMoveToTrashpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestNewEvent.py
>>       <#branches07alpha4chandlertoolscatsFunctionalTestNewEventpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestRecurringEvent.py
>>        
>> <#branches07alpha4chandlertoolscatsFunctionalTestRecurringEventpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestReminderProcessing.py
>>        
>> <#branches07alpha4chandlertoolscatsFunctionalTestReminderProcessingpy 
>> >*
>>     * *branches/0.7alpha4/chandler/tools/cats/Functional/ 
>> TestRemoveFromTrashOnImport.py
>>        
>> <#branches07alpha4chandlertoolscatsFunctionalTestRemoveFromTrashOnImp 
>> ortpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/framework/ 
>> ChandlerTestLib.py
>>       <#branches07alpha4chandlertoolscatsframeworkChandlerTestLibpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/framework/TestOutput.py
>>       <#branches07alpha4chandlertoolscatsframeworkTestOutputpy>*
>>     * *branches/0.7alpha4/chandler/tools/cats/framework/runTests.py
>>       <#branches07alpha4chandlertoolscatsframeworkrunTestspy>*
>>     * *branches/0.7alpha4/chandler/tools/do_tests.sh
>>       <#branches07alpha4chandlertoolsdo_testssh>*
>>     * *branches/0.7alpha4/chandler/util/task.py
>>       <#branches07alpha4chandlerutiltaskpy>*
>>     * *branches/0.7alpha4/chandler/version.py
>>       <#branches07alpha4chandlerversionpy>*
>>
>>
>>       *Added Paths*
>>
>>     * *branches/0.7alpha4/chandler/Chandler.egg-info/resources/ 
>> images/ApplicationBarTriage.png
>>        
>> <#branches07alpha4chandlerChandleregginforesourcesimagesApplicationBa 
>> rTriagepng>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/EIM.txt
>>       <#branches07alpha4chandlerparcelsosafsharingEIMtxt>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/eim.py
>>       <#branches07alpha4chandlerparcelsosafsharingeimpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/ 
>> simplegeneric.py
>>       <#branches07alpha4chandlerparcelsosafsharingsimplegenericpy>*
>>     * *branches/0.7alpha4/chandler/parcels/osaf/sharing/tests/ 
>> TestEIM.py
>>       <#branches07alpha4chandlerparcelsosafsharingtestsTestEIMpy>*
>>
>>
>>       *Property Changed*
>>
>>     * *branches/0.7alpha4/chandler/*
>>
>>
>>       *Diff*
>>
>> * *
>>
>>
>>         *Property changes: branches/0.7alpha4/chandler*
>>
>> *Name: svn:ignore
>>    - __repository__*
>> debug
>> release
>> docs
>> dist
>> build
>> .settings
>> .project
>> cacert.pem
>> randpool.dat
>> profile.dat
>> Chandler-project.wpu
>> Chandler-project-debug.wpu
>> site.py
>> setuptools*.egg
>> *.pyc
>> *.pyo
>> *.log
>> *.inst
>> *.gz
>> *.md5
>> *.lock
>> *.exe
>> *.diff
>> *.patch
>> *.prof
>> *.egg-link
>> *.pth
>>    + __repository__*
>> debug
>> release
>> docs
>> dist
>> build
>> .settings
>> .project
>> cacert.pem
>> randpool.dat
>> profile.dat
>> Chandler-project.wpu
>> Chandler-project-debug.wpu
>> site.py
>> setuptools*.egg
>> configobj*.egg
>> *.pyc
>> *.pyo
>> *.log
>> *.inst
>> *.gz
>> *.md5
>> *.lock
>> *.exe
>> *.diff
>> *.patch
>> *.prof
>> *.egg-link
>> *.pth
>> test_profile
>> chandler
>> chandlerDebug
>> chandler.ini
>> Name: svk:merge
>>    - 8c82eac9-66b6-4f75-afda-ac985f890e1b:/projects/stamping/ 
>> chandler:13086
>> bfa2d993-0e2c-4a41-9bab-303d141a821e:/local/stamping/chandler:7577
>>    + 3c49585b-f0f7-0310-b5f9-dfe92a88fbfe:/trunk/chandler:12205
>> 8c82eac9-66b6-4f75-afda-ac985f890e1b:/fixes/purge/chandler:13850
>> 8c82eac9-66b6-4f75-afda-ac985f890e1b:/projects/stamping/chandler: 
>> 13086
>> bfa2d993-0e2c-4a41-9bab-303d141a821e:/local/stamping/chandler:7577
>> *
>>
>> * *
>>
>>
>>         *Added:
>>         branches/0.7alpha4/chandler/Chandler.egg-info/resources/ 
>> images/ApplicationBarTriage.png*
>>
>> *(Binary files differ)
>> *
>>
>> *Property changes on:
>> branches/0.7alpha4/chandler/Chandler.egg-info/resources/images/ 
>> ApplicationBarTriage.png
>> ___________________________________________________________________
>> Name: svn:mime-type + image/png ** *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/Chandler.py (12206  
>> => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/Chandler.py	2006-11-02 02:32:00  
>> UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/Chandler.py	2006-11-02 17:34:07  
>> UTC (rev 12207)
>> **@@ -120,10 +120,8 @@
>> **                 # See if we already have a window up, and if  
>> so, reuse it
>>                  from application import feedback
>>                  feedback.destroyAppOnClose = True
>> **-                win = feedback.activeWindow
>> -                if win is None:
>> -                    win = feedback.FeedbackWindow()
>> -                    win.CreateOutputWindow('')
>> **+                win = feedback.FeedbackWindow()
>> +                win.CreateOutputWindow('')
>> **                 for line in backtrace:
>>                      win.write(line)
>>                  if not app.IsMainLoopRunning():
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/Makefile (12206 =>  
>> 12207)*
>>
>> *--- branches/0.7alpha4/chandler/Makefile	2006-11-02 02:32:00 UTC  
>> (rev 12206)
>> +++ branches/0.7alpha4/chandler/Makefile	2006-11-02 17:34:07 UTC  
>> (rev 12207)
>> **@@ -16,6 +16,8 @@
>> **                 Chandler-PhotoPlugin \
>>                  EggTranslations-Plugin
>>
>> **+PYEGGS = $(CHANDLERARCHIVES)/configobj-4.3.2-py$(PYTHON_VER).egg
>> +
>> ** # When a version changes, the ARCHIVES lists below needs to be  
>> updated.
>>  # these get installed into release or debug
>>  ARCHIVES = $(CHANDLERARCHIVES)/Launchers-$(SNAP)-0.8-$(BP)G.tar.gz \
>> **@@ -29,7 +31,7 @@
>> **            $(CHANDLERARCHIVES)/pychecker-$(SNAP)-0.8.13-$(BP) 
>> 6.tar.gz \
>>             $(CHANDLERARCHIVES)/PyICU-$(SNAP)-0.5-62-$(BP)5.tar.gz \
>>             $(CHANDLERARCHIVES)/PyLucene-$(SNAP)-2.0.0-2-$(BP) 
>> 1.tar.gz \
>> **-           $(CHANDLERARCHIVES)/twisted-$(SNAP)-r15399-$(BP) 
>> 4.tar.gz \
>> **+           $(CHANDLERARCHIVES)/twisted-$(SNAP)-r15399-$(BP) 
>> 5.tar.gz \
>> **            $(CHANDLERARCHIVES)/wxPython-$(SNAP)-2.7.0.0-r113-$ 
>> (BP)1.tar.gz \
>>             $(CHANDLERARCHIVES)/zopeinterface-$(SNAP)-3.1.0c1-$(BP) 
>> 4.tar.gz \
>>             $(CHANDLERARCHIVES)/dateutil-$(SNAP)-1.1-$(BP)3.tar.gz \
>> **@@ -39,7 +41,7 @@
>> **            $(CHANDLERARCHIVES)/astng-$(SNAP)-0.16.0-$(BP) 
>> 3.tar.gz \
>>             $(CHANDLERARCHIVES)/common-$(SNAP)-0.15.0-$(BP)4.tar.gz \
>>             $(CHANDLERARCHIVES)/pylint-$(SNAP)-0.11.0-$(BP)3.tar.gz \
>> **-           $(CHANDLERARCHIVES)/parsedatetime-$(SNAP)-0.7.4-$(BP) 
>> 1.tar.gz
>> **+           $(CHANDLERARCHIVES)/parsedatetime-$(SNAP)-0.8.0-$(BP) 
>> 1.tar.gz
>> **
>>  OS         = $(shell uname)
>>  PYTHON_VER = 2.4
>> **@@ -130,7 +132,7 @@
>> **     endif
>>  endif
>>
>> **-# readline is only needed for OSX
>> **+# readline is only needed for OS X
>> ** ifeq ($(OS),Darwin)
>>      ARCHIVES += $(CHANDLERARCHIVES)/readline-$(SNAP)-5.1-$(BP) 
>> 2.tar.gz
>>  endif
>> **@@ -146,8 +148,9 @@
>> **     CURL=curl $(CHANDLER_CURL_OPTIONS) -f -o
>>  endif
>>
>> **-HOST = builds.osafoundation.org
>> -URL  = http://$(HOST)/external/$(PLATFORM)
>> **+HOST  = builds.osafoundation.org
>> +URL   = http://$(HOST)/external
>> +P_URL = $(URL)/$(PLATFORM)
>> **
>>  SETUPTOOLS_EGG  = $(CHANDLERARCHIVES)/setuptools-0.6c4dev_r52047- 
>> py2.4.egg
>>  SETUPTOOLS_ABS  = $(SETUPTOOLS_EGG)
>> **@@ -178,6 +181,11 @@
>> **                 $(addprefix $(C_BIN)/$(SNAP)/, \
>>                              $(notdir $(ARCHIVES))))
>>
>> **+PYEGGS_INST = \
>> +    $(addsuffix .inst, \
>> +                $(addprefix $(C_BIN)/$(SNAP)/, \
>> +                            $(notdir $(PYEGGS))))
>> +
>> ** downloads: $(ARCHIVES)
>>
>>  $(addprefix binaries-, $(BUILD_PLUGINS)):
>> **@@ -211,15 +219,25 @@
>> **
>>  $(ARCHIVES):
>>  	mkdir -p $(CHANDLERARCHIVES)
>> **-	$(CURL) $@ $(URL)/$(notdir $@)
>> **+	$(CURL) $@ $(P_URL)/$(notdir $@)
>> **
>>  $(ARCHIVES_INST):
>>  	tar -C $(C_BIN) -xvzf $(CHANDLERARCHIVES)/$(notdir $(basename $@))
>>  	touch $@
>>
>> **+$(PYEGGS):
>> +	mkdir -p $(CHANDLERARCHIVES)
>> +	$(CURL) $@ $(P_URL)/$(notdir $@)
>> +
>> +$(PYEGGS_INST):
>> +	MACOSX_DEPLOYMENT_TARGET= PYTHONPATH='$(PLUGIN_INST)'  
>> CHANDLERHOME='$(CHANDLERHOME)' $(PYTHON_BIN) \
>> +      -c "from setuptools.command.easy_install import main; main 
>> ()" \
>> +      $(CHANDLERARCHIVES)/$(notdir $(basename $@))
>> +	touch $@
>> +
>> ** $(SETUPTOOLS_EGG):
>>  	mkdir -p $(CHANDLERARCHIVES)
>> **-	$(CURL) $@ http://$(HOST)/external/$(notdir $@)
>> **+	$(CURL) $@ $(URL)/$(notdir $@)
>> **
>>  setuptools: $(SETUPTOOLS_EGG)
>>  	MACOSX_DEPLOYMENT_TARGET= PYTHONPATH='$(PLUGIN_INST)'  
>> CHANDLERHOME='$(CHANDLERHOME)' $(PYTHON_BIN) \
>> **@@ -240,13 +258,15 @@
>> **
>>  install-core: $(ARCHIVES) $(ARCHIVES_INST) manifest_exe
>>
>> **-install-plugin-core: setuptools chandler-locale-data
>> **+install-plugin-core: $(SETUPTOOLS_EGG) $(PYEGGS) setuptools  
>> chandler-locale-data $(PYEGGS_INST)
>> **
>> **-install: install-core install-plugin-core build-plugins
>> **+plugins: install-plugin-core build-plugins
>> **
>> **+install: install-core plugins
>> +
>> ** distrib: install-core install-plugin-core distrib-plugins
>>
>> **-download: $(ARCHIVES) $(SETUPTOOLS_EGG)
>> **+download: $(ARCHIVES) $(SETUPTOOLS_EGG) $(PYEGGS)
>> **
>>  # to install individual binaries, for example: make chandlerdb
>>
>> **@@ -296,8 +316,7 @@
>> ** 	rm -rf $(C_BIN)/$(SNAP)
>>  	rm -rf __repository__
>>  	rm -f chandler.log randpool.dat
>> **-	find . -name '*.pyc' | xargs rm -f
>> -	find . -name '*.pyo' | xargs rm -f
>> **+	find . -name '*.py[co]' -delete
>> **
>>  distclean: clean
>>  	rm -rf $(C_BIN)/debug
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/NOTICE.txt (12206  
>> => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/NOTICE.txt	2006-11-02 02:32:00  
>> UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/NOTICE.txt	2006-11-02 17:34:07 UTC  
>> (rev 12207)
>> **@@ -214,6 +214,42 @@
>> **      */
>>
>>
>> **+external/configobj
>> +
>> +    Copyright (c) 2003-2006, Michael Foord
>> +    All rights reserved.
>> +    E-mail : fuzzyman AT voidspace DOT org DOT uk
>> +
>> +    Redistribution and use in source and binary forms, with or  
>> without
>> +    modification, are permitted provided that the following  
>> conditions are
>> +    met:
>> +
>> +
>> +     * Redistributions of source code must retain the above  
>> copyright
>> +       notice, this list of conditions and the following disclaimer.
>> +
>> +     * Redistributions in binary form must reproduce the above
>> +       copyright notice, this list of conditions and the following
>> +       disclaimer in the documentation and/or other materials  
>> provided
>> +       with the distribution.
>> +
>> +     * Neither the name of Michael Foord nor the name of Voidspace
>> +       may be used to endorse or promote products derived from this
>> +       software without specific prior written permission.
>> +
>> +    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND  
>> CONTRIBUTORS
>> +    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT  
>> NOT
>> +    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  
>> FITNESS FOR
>> +    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE  
>> COPYRIGHT
>> +    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,  
>> INCIDENTAL,
>> +    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
>> +    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS  
>> OF USE,
>> +    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  
>> AND ON ANY
>> +    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,  
>> OR TORT
>> +    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF  
>> THE USE
>> +    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH  
>> DAMAGE.
>> +
>> +
>> ** external/dateutil
>>
>>      B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
>> **@@ -686,7 +722,7 @@
>> **     (zlib format), rfc1951.txt (deflate format) and rfc1952.txt  
>> (gzip format).
>>
>>
>> **-external/readline
>> **+external/readline (OS X)
>> **
>>      /* Copyright (C) 1987-2005 Free Software Foundation, Inc.
>>
>> **@@ -768,8 +804,7 @@
>> **     /*  
>> ====================================================================
>>       * The Apache Software License, Version 1.1
>>       *
>> **-     * Copyright (c) 2000 The Apache Software Foundation.  All  
>> rights
>> -     * reserved.
>> **+     * Copyright (c) 2004-2006 Jeffrey Harris.  All rights  
>> reserved.
>> **      *
>>       * Redistribution and use in source and binary forms, with or  
>> without
>>       * modification, are permitted provided that the following  
>> conditions
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/application/Utility.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/application/Utility.py	2006-11-02  
>> 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/application/Utility.py	2006-11-02  
>> 17:34:07 UTC (rev 12207)
>> **@@ -33,7 +33,7 @@
>> ** # with your name (and some helpful text). The comment's really  
>> there just to
>>  # cause Subversion to warn you of a conflict when you update, in  
>> case someone
>>  # else changes it at the same time you do (that's why it's on the  
>> same line).
>> **-SCHEMA_VERSION = "268" # grant: Rebuild to get consistency  
>> after observers weren't working (bug 7170)
>> **+SCHEMA_VERSION = "270" # grant: "Purge" button (bug 6329)
>> **
>>
>>  logger = None # initialized in initLogging()
>> **@@ -170,6 +170,7 @@
>> **         'chandlerTestMask': ('-M', '--chandlerTestMask', 's',  
>> 3, None, '0=print all, 1=hide reports, 2=also hide actions, 3=also  
>> hide test names'),
>>          'chandlerPerformanceTests': ('', '-- 
>> chandlerPerformanceTests', 's', None, None,  
>> 'file:TestClass,file2:TestClass2 to be executed by performance new  
>> framework'),
>>          'chandlerTestLogfile': ('', '--chandlerTestLogfile', 's',  
>> None, None, 'file for chandlerTests output'),
>> **+        'continueTestsOnFailure': ('-F','-- 
>> continueTestsOnFailure', 'b', False, None, 'Do not stop functional  
>> test suite on first failure'),
>> **         'scriptTimeout': ('-s', '--scriptTimeout', 's', 0,   
>> None, 'script file timeout'),
>>          'catsProfile':('',   '--catsProfile','s', None,  None,  
>> 'file for hotshot profile of script execution'),
>>          'catsPerfLog':('',   '--catsPerfLog','s', None,  None,  
>> 'file to output a performance number'),
>> **@@ -636,38 +637,30 @@
>> **
>>  def fileConfig(fname, defaults=None):
>>      """
>> **-    Read the logging configuration from a ConfigParser-format  
>> file.
>> **+    Read the logging configuration from a ConfigObj-format file.
>> **
>>      This can be called several times from an application,  
>> allowing an end user
>>      the ability to select from various pre-canned configurations  
>> (if the
>>      developer provides a mechanism to present the choices and  
>> load the chosen
>>      configuration).
>> **-    In versions of ConfigParser which have the readfp method  
>> [typically
>> -    shipped in 2.x versions of Python], you can pass in a file- 
>> like object
>> -    rather than a filename, in which case the file-like object  
>> will be read
>> -    using readfp.
>> **     """
>> **-    import ConfigParser
>> **+    from configobj import ConfigObj
>> **
>> **-    cp = ConfigParser.ConfigParser(defaults)
>> -    if hasattr(cp, 'readfp') and hasattr(fname, 'readline'):
>> -        cp.readfp(fname)
>> -    else:
>> -        cp.read(fname)
>> **+    cp = ConfigObj(fname, encoding="UTF8")
>> **     #first, do the formatters...
>> **-    flist = cp.get("formatters", "keys")
>> **+    flist = cp[u"formatters"][u"keys"]
>> **     if len(flist):
>> **-        flist = string.split(flist, ",")
>> **+        flist = flist.split(",")
>> **         formatters = {}
>>          for form in flist:
>> **-            sectname = "formatter_%s" % form
>> -            opts = cp.options(sectname)
>> -            if "format" in opts:
>> -                fs = cp.get(sectname, "format", 1)
>> **+            sectname = u"formatter_%s" % form
>> +            section = cp[sectname]
>> +            if section.has_key(u"format"):
>> +                fs = section[u"format"]
>> **             else:
>>                  fs = None
>> **-            if "datefmt" in opts:
>> -                dfs = cp.get(sectname, "datefmt", 1)
>> **+            if section.has_key("datefmt"):
>> +                dfs = section[u"datefmt"]
>> **             else:
>>                  dfs = None
>>              f = logging.Formatter(fs, dfs)
>> **@@ -680,33 +673,33 @@
>> **             #first, lose the existing handlers...
>>              logging._handlers.clear()
>>              #now set up the new ones...
>> **-            hlist = cp.get("handlers", "keys")
>> **+            hlist = cp[u"handlers"][u"keys"]
>> **             if len(hlist):
>> **-                hlist = string.split(hlist, ",")
>> **+                hlist = hlist.split(",")
>> **                 handlers = {}
>>                  fixups = [] #for inter-handler references
>>                  for hand in hlist:
>>                      try:
>> **-                        sectname = "handler_%s" % hand
>> -                        klass = cp.get(sectname, "class")
>> -                        opts = cp.options(sectname)
>> -                        if "formatter" in opts:
>> -                            fmt = cp.get(sectname, "formatter")
>> **+                        sectname = u"handler_%s" % hand
>> +                        section = cp[sectname]
>> +                        klass = section[u"class"]
>> +                        if section.has_key(u"formatter"):
>> +                            fmt = section[u"formatter"]
>> **                         else:
>>                              fmt = ""
>>                          klass = eval(klass, vars(logging))
>> **-                        args = cp.get(sectname, "args")
>> **+                        args = section[u"args"]
>> **                         args = eval(args, vars(logging))
>>                          h = apply(klass, args)
>> **-                        if "level" in opts:
>> -                            level = cp.get(sectname, "level")
>> **+                        if section.has_key(u"level"):
>> +                            level = section[u"level"]
>> **                             h.setLevel(logging._levelNames[level])
>>                          if len(fmt):
>>                              h.setFormatter(formatters[fmt])
>>                          #temporary hack for FileHandler and  
>> MemoryHandler.
>>                          if klass == logging.handlers.MemoryHandler:
>> **-                            if "target" in opts:
>> -                                target = cp.get(sectname,"target")
>> **+                            if section.has_key(u"target"):
>> +                                target = section[u"target"]
>> **                             else:
>>                                  target = ""
>>                              if len(target): #the target handler  
>> may not be loaded yet, so keep for later...
>> **@@ -720,19 +713,18 @@
>> **                     t = fixup[1]
>>                      h.setTarget(handlers[t])
>>              #at last, the loggers...first the root...
>> **-            llist = cp.get("loggers", "keys")
>> **+            llist = cp[u"loggers"][u"keys"]
>> **             llist = string.split(llist, ",")
>>              llist.remove("root")
>> **-            sectname = "logger_root"
>> **+            section = cp[u"logger_root"]
>> **             root = logging.root
>>              log = root
>> **-            opts = cp.options(sectname)
>> -            if "level" in opts:
>> -                level = cp.get(sectname, "level")
>> **+            if section.has_key(u"level"):
>> +                level = section[u"level"]
>> **                 log.setLevel(logging._levelNames[level])
>>              for h in root.handlers[:]:
>>                  root.removeHandler(h)
>> **-            hlist = cp.get(sectname, "handlers")
>> **+            hlist = section[u"handlers"]
>> **             if len(hlist):
>>                  hlist = string.split(hlist, ",")
>>                  for hand in hlist:
>> **@@ -749,24 +741,24 @@
>> **             existing = root.manager.loggerDict.keys()
>>              #now set up the new ones...
>>              for log in llist:
>> **-                sectname = "logger_%s" % log
>> -                qn = cp.get(sectname, "qualname")
>> -                opts = cp.options(sectname)
>> -                if "propagate" in opts:
>> -                    propagate = cp.getint(sectname, "propagate")
>> **+                sectname = u"logger_%s" % log
>> +                section = cp[sectname]
>> +                qn = section[u"qualname"]
>> +                if section.has_key(u"propagate"):
>> +                    propagate = section.as_int(u"propagate")
>> **                 else:
>>                      propagate = 1
>>                  logger = logging.getLogger(qn)
>>                  if qn in existing:
>>                      existing.remove(qn)
>> **-                if "level" in opts:
>> -                    level = cp.get(sectname, "level")
>> **+                if section.has_key(u"level"):
>> +                    level = section[u"level"]
>> **                     logger.setLevel(logging._levelNames[level])
>>                  for h in logger.handlers[:]:
>>                      logger.removeHandler(h)
>>                  logger.propagate = propagate
>>                  logger.disabled = 0
>> **-                hlist = cp.get(sectname, "handlers")
>> **+                hlist = section[u"handlers"]
>> **                 if len(hlist):
>>                      hlist = string.split(hlist, ",")
>>                      for hand in hlist:
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/application/ 
>> feedback.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/application/feedback.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/application/feedback.py	2006-11-02  
>> 17:34:07 UTC (rev 12207)
>> **@@ -22,7 +22,6 @@
>> **
>>  LOGLINES = 500
>>
>> **-activeWindow = None
>> ** destroyAppOnClose = False
>>
>>  def initRuntimeLog(profileDir):
>> **@@ -57,6 +56,11 @@
>> **     An error dialog that would be shown in case there is an  
>> uncaught
>>      exception. The user can send the error report back to us as  
>> well.
>>      """
>> **+    def __call__(self, *args, **kw):
>> +        # Make this a Singleton to avoid the problem of multiple  
>> feedback
>> +        # windows popping up at the same time
>> +        return self
>> +
>> **     def _fillOptionalSection(self):
>>          try:
>>              # columns
>> **@@ -182,9 +186,6 @@
>> **         self.frame.text.AppendText(st)
>>
>>      def CreateOutputWindow(self, st):
>> **-        global activeWindow
>> -        activeWindow = self
>> -
>> **         self.frame = xrcFRAME(None)
>>          self.text = self.frame.text # superclass expects self.text
>>          try:
>> **@@ -304,7 +305,8 @@
>> **         else:
>>              self.frame.sendButton.SetLabel(_(u'Sent'))
>>              self.logReport(body, response.read())
>> **-
>> **+
>> +FeedbackWindow = FeedbackWindow()
>> **
>>  def buildXML(comments, email, optional, required):
>>      """
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/application/ 
>> feedback.xrc
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/application/feedback.xrc	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/application/feedback.xrc	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -140,6 +140,8 @@
>> **               <object class="wxButton" name="restartButton">
>>                  <label>&amp;Restart</label>
>>                </object>
>> **+              <flag>wxRIGHT</flag>
>> +              <border>8</border>
>> **             </object>
>>              <object class="sizeritem">
>>                <object class="wxButton" name="closeButton">
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/application/ 
>> styles.conf
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/application/styles.conf	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/application/styles.conf	2006-11-02  
>> 17:34:07 UTC (rev 12207)
>> **@@ -1,18 +1,18 @@
>> ** [preview]
>> **-#RRGGBB hex values for text colors in the Preview Area
>> -UnSelectedText = #000000
>> -UnSelectedTextBackground = #FFFFFF
>> **+# rgbRRGGBB hex values for text colors in the Preview Area
>> +UnSelectedText = rgb000000
>> +UnSelectedTextBackground = rgbFFFFFF
>> **
>> **-SelectedText = #000000
>> -SelectedTextBackground = #FFFFFF
>> **+SelectedText = rgb000000
>> +SelectedTextBackground = rgbFFFFFF
>> **
>>  [summary]
>> **-SectionBackground = #cccccc
>> -SectionLabel = #000000
>> -SectionCount = #888888
>> -SectionSample_triageStatus_now = #00cc00
>> -SectionSample_triageStatus_later = #ffcc00
>> -SectionSample_triageStatus_done = #555555
>> **+SectionBackground = rgbcccccc
>> +SectionLabel = rgb000000
>> +SectionCount = rgb888888
>> +SectionSample_triageStatus_now = rgb00cc00
>> +SectionSample_triageStatus_later = rgbffcc00
>> +SectionSample_triageStatus_done = rgb555555
>> **
>>  [colororder]
>>  # listed colors must all be on one line
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/application/styles.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/application/styles.py	2006-11-02  
>> 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/application/styles.py	2006-11-02  
>> 17:34:07 UTC (rev 12207)
>> **@@ -22,20 +22,97 @@
>> ** can be changed by users in the course of using chandler.
>>  """
>>
>> **-import ConfigParser, os
>> **+import os
>> +from configobj import ConfigObj
>> +from ConfigParser import DuplicateSectionError, NoSectionError
>> **
>>  cfg = None
>>
>> **-class AcceptEmptyConfig(ConfigParser.SafeConfigParser):
>> -    def get(self, *args, **kwargs):
>> **+class AcceptEmptyConfig(ConfigObj):
>> +    # legacy interface to mimic ConfigParser
>> +    # (not a 100% complete)
>> +    def sections(self):
>> +        return self.keys()
>> +
>> +    def add_section(self, section):
>> +        if self.hasKey(unicode(section)):
>> +            raise DuplicateSectionError
>> +        self[unicode(section)] = {}
>> +
>> +    def has_section(self, section):
>> +        return self.hasKey(unicode(section))
>> +
>> +    def options(self, section):
>> +        if self.hasKey(unicode(section)):
>> +            return self[unicode(section)].items()
>> +        return []
>> +
>> +    def has_option(self, section, option):
>> +        return self.hasKey(unicode(section)) and self[unicode 
>> (section)].hasKey(unicode(option))
>> +
>> +    def get(self, section, option):
>> **         try:
>> **-            return ConfigParser.SafeConfigParser.get(self,  
>> *args, **kwargs)
>> -        except (ConfigParser.NoSectionError,  
>> ConfigParser.NoOptionError):
>> **+             entry = self[unicode(section)][unicode(option)]
>> +             if isinstance(entry, list):
>> +                 entry = u", ".join(entry)
>> +             elif not (isinstance(entry, str) or isinstance 
>> (entry, unicode)):
>> +                 entry = unicode(entry)
>> +             # hack for color entries
>> +             if entry.startswith(u"rgb"):
>> +                 entry = u"#%s" % entry[3:9]
>> +             return entry
>> +        except:
>> **             return None
>>
>> **+    def getint(self, section, option):
>> +        try:
>> +            return self[unicode(section)].as_int(unicode(option))
>> +        except:
>> +            return None
>> +
>> +    def getfloat(self, section, option):
>> +        try:
>> +            return self[unicode(section)].as_float(unicode(option))
>> +        except:
>> +            return None
>> +
>> +    def getboolean(self, section, option):
>> +        try:
>> +            return self[unicode(section)].as_bool(unicode(option))
>> +        except:
>> +            return None
>> +
>> +    def items(self, section):
>> +        try:
>> +            return self[unicode(section)].items()
>> +        except:
>> +            return []
>> +
>> +    def set(self, section, option, value):
>> +        if self.hasKey(unicode(section)):
>> +            self[unicode(section)][unicode(option)] = value
>> +        else:
>> +            raise NoSectionError
>> +
>> +    def remove_option(self, section, option):
>> +        if self.hasKey(unicode(section)):
>> +            if self[unicode(section)].hasKey(unicode(option)):
>> +                del self[unicode(section)][unicode(option)]
>> +                return True
>> +            else:
>> +                return False
>> +        else:
>> +            raise NoSectionError
>> +
>> +    def remove_section(self, section):
>> +        if self.hasKey(unicode(section)):
>> +            del self[unicode(section)]
>> +            return True
>> +        else:
>> +            return False
>> +
>> ** def loadConfig():
>>      global cfg
>> **-    cfg = AcceptEmptyConfig()
>> -    cfg.read(os.path.join(os.path.dirname(__file__), 'styles.conf'))
>> **+    cfg = AcceptEmptyConfig(os.path.join(os.path.dirname 
>> (__file__), 'styles.conf'), encoding="UTF8")
>> **
>>  loadConfig()
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/framework/ 
>> attributeEditors/AttributeEditors.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/framework/ 
>> attributeEditors/AttributeEditors.py	2006-11-02 02:32:00 UTC (rev  
>> 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/framework/ 
>> attributeEditors/AttributeEditors.py	2006-11-02 17:34:07 UTC (rev  
>> 12207)
>> **@@ -1793,15 +1793,18 @@
>> **             if ((cls.textMatches[matchKey]).lower()).startswith 
>> (target):
>>                  cal = parsedatetime.Calendar()
>>                  (dateVar, invalidFlag) = cal.parse(matchKey)
>> **-                #invalidFlag is True if the string cannot be  
>> parsed successfully
>> -                if dateVar is not None and invalidFlag is False:
>> **+                #invalidFlag = 0 implies no date/time
>> +                #invalidFlag = 2 implies only time, no date
>> +                if invalidFlag != 0 and invalidFlag != 2:
>> **                     dateStr = pim.shortDateFormat.format 
>> (datetime(*dateVar[:3]))
>>                      matchKey = cls.textMatches[matchKey]+ " : %s"  
>> % dateStr
>>                      yield matchKey
>>              else:
>>                  cal = parsedatetime.Calendar(ptc.Constants(str 
>> (getLocaleSet()[0])))
>>                  (dateVar, invalidFlag) = cal.parse(target)
>> **-                if dateVar is not None and invalidFlag is False:
>> **+                #invalidFlag = 0 implies no date/time
>> +                #invalidFlag = 2 implies only time, no date
>> +                if invalidFlag != 0 and invalidFlag != 2:
>> **                     # temporary fix: parsedatetime sometimes  
>> returns day == 0
>>                      if not filter(lambda x: not x, dateVar[:3]):
>>                          match = pim.shortDateFormat.format 
>> (datetime(*dateVar[:3]))
>> **@@ -1881,15 +1884,18 @@
>> **             if ((cls.textMatches[matchKey]).lower()).startswith 
>> (target):
>>                  cal = parsedatetime.Calendar()
>>                  (timeVar, invalidFlag) = cal.parse(matchKey)
>> **-                #invalidFlag is True if the string cannot be  
>> parsed successfully
>> -                if timeVar is not None and invalidFlag is False:
>> **+                #invalidFlag = 0 implies no date/time
>> +                #invalidFlag = 1 implies only date, no time
>> +                if invalidFlag != 0 and invalidFlag != 1:
>> **                     timeVar = pim.shortTimeFormat.format 
>> (datetime(*timeVar[:5]))
>>                      matchKey = cls.textMatches[matchKey]+ " - %s"  
>> %timeVar
>>                      yield matchKey
>>              else:
>>                  cal = parsedatetime.Calendar()
>>                  (timeVar, invalidFlag) = cal.parse(target)
>> **-                if timeVar != None and invalidFlag is False:
>> **+                #invalidFlag = 0 implies no date/time
>> +                #invalidFlag = 1 implies only date, no time
>> +                if invalidFlag != 0 and invalidFlag != 1:
>> **                     match = pim.shortTimeFormat.format(datetime 
>> (*timeVar[:5]))
>>                      if unicode(match).lower() !=target:
>>                          yield match
>> **@@ -2402,14 +2408,17 @@
>> **             TimeZoneList.buildTZChoiceList(self.item.itsView,  
>> control, value)
>>
>>  class TriageAttributeEditor(BaseAttributeEditor):
>> **+    # Set this to '' to show/edit the "real" triageStatus  
>> everywhere.
>> +    editingAttribute = 'unpurgedTriageStatus'
>> +
>> **     def Draw (self, dc, rect, (item, attributeName),  
>> isInSelection=False):
>>          # Get the value we'll draw, and its label
>>          item = RecurrenceDialog.getProxy(u'ui', item,  
>> createNew=False)
>> **-        value = getattr(item, attributeName, '')
>> **+        value = getattr(item, self.editingAttribute or  
>> attributeName, '')
>> **         label = value and pim.getTriageStatusName(value) or u''
>>
>>          # Paint our box in the right color
>> **-        backgroundColor = styles.cfg.get('summary',  
>> 'SectionSample_%s_%s'
>> **+        backgroundColor = styles.cfg.get('summary',  
>> 'SectionSample_%s_%s'
>> **                                          % (attributeName,  
>> value)) or '#000000'
>>          dc.SetPen(wx.WHITE_PEN)
>>          brush = wx.Brush(backgroundColor, wx.SOLID)
>> **@@ -2428,6 +2437,7 @@
>> **         """
>>          Handle live changes of mouse state related to our cell.
>>          """
>> **+        attributeName = self.editingAttribute or attributeName
>> **         # Note down-ness changes; eat the event if the downness  
>> changed, and
>>          # trigger an advance if appropriate.
>>          if isDown != getattr(self, 'wasDown', False):
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/framework/blocks/ 
>> calendar/CalendarCanvas.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/framework/blocks/ 
>> calendar/CalendarCanvas.py	2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/framework/blocks/ 
>> calendar/CalendarCanvas.py	2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -700,7 +700,7 @@
>> **         sidebarCollections = app_ns.sidebarCollection
>>          allCollection = schema.ns('osaf.pim',  
>> self.event.itsItem.itsView).allCollection
>>          if self.isActive:
>> **-            fillColorLozengeType = 'UnselectedGradientRight'
>> **+            fillColorLozengeType = 'UnSelectedGradientRight'
>> **             outlinePre1 = 'Selected'
>>          else:
>>              fillColorLozengeType = 'OverlayGradientRight'
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/mail/constants.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/mail/constants.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/mail/constants.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -63,3 +63,4 @@
>> **    i.e. __debug__ == True
>>  """
>>  VERBOSE = False
>> **+IGNORE_ATTACHMENTS = True
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/parcels/osaf/mail/ 
>> imap.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/mail/imap.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/mail/imap.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -340,6 +340,11 @@
>> **         if curMessage[0] > self.lastUID:
>>              self.lastUID = curMessage[0]
>>
>> **+        if  "\\Seen" in curMessage[1]:
>> +            callback = defer.succeed(True)
>> +        else:
>> +            callback = self.proto.removeFlags(curMessage[0],  
>> ["\Seen"], uid=True)
>> +
>> **         messageText = msgs[msg]['RFC822']
>>
>>          #XXX: Need a more perforrmant way to do this
>> **@@ -365,15 +370,16 @@
>> **         if self.numDownloaded == self.numToDownload:
>>              self._setNextUID(self.lastUID + 1)
>>              self.totalDownloaded += self.numDownloaded
>> **-            self._commitDownloadedMail()
>> **
>> **+            return callback.addBoth(lambda x:  
>> self._commitDownloadedMail())
>> +
>> **         else:
>>              m = self.pending.pop(0)
>>
>> **-            return self.proto.fetchMessage(str(m[0]), uid=True
>> -                         ).addCallback(self._fetchMessage, m
>> -                         ).addErrback(self.catchErrors)
>> -
>> **+            return callback.addBoth(lambda x:  
>> self.proto.fetchMessage(str(m[0]), uid=True
>> +                                        ).addCallback 
>> (self._fetchMessage, m
>> +                                        ).addErrback 
>> (self.catchErrors)
>> +                                    )
>> **     def _expunge(self, result):
>>          if __debug__:
>>              trace("_expunge")
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/mail/message.py  
>> (12206
>>         => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/mail/message.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/mail/message.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -30,11 +30,11 @@
>> ** #Chandler imports
>>  import osaf.pim.mail as Mail
>>  from osaf.pim import has_stamp, EventStamp, Remindable
>> **-from PyICU import UnicodeString
>> ** from i18n import ChandlerMessageFactory as _
>>
>>  #Chandler Mail Service imports
>>  import constants
>> **+from constants import IGNORE_ATTACHMENTS
>> ** from utils import *
>>  from utils import Counter
>>  from osaf.pim import TriageEnum
>> **@@ -73,16 +73,16 @@
>> **     except(UnicodeError, UnicodeDecodeError, LookupError):
>>          return unicode("".join(header.splitlines()), charset,  
>> 'ignore')
>>
>> **-def getUnicodeValue(val, charset=constants.DEFAULT_CHARSET):
>> **+def getUnicodeValue(val, charset=constants.DEFAULT_CHARSET,  
>> ignore=False):
>> **     assert isinstance(val, str), "The value to convert must be  
>> a string"
>>      assert charset is not None, "A charset must be specified"
>>
>>      try:
>> **-        # The PyICU UnicodeString is used because
>> -        # ICU has support for more character set
>> -        # encodings than Python.
>> -        return unicode(UnicodeString(val, charset))
>> **+        if ignore:
>> +            return unicode(val, charset, 'ignore')
>> **
>> **+        return unicode(val, charset)
>> +
>> **     except Exception:
>>          if  charset != constants.DEFAULT_CHARSET:
>>              return getUnicodeValue(val)
>> **@@ -258,14 +258,15 @@
>> **         # Didn't find a parsable ICS attachment: just treat it  
>> as a mail msg.
>>          m = Mail.MailMessage(itsView=view)
>>
>> **-    """
>> -    Save the original message text in a text blob
>> -    """
>> -    if messageText is None:
>> -        messageText = messageObject.as_string()
>> **+    if not IGNORE_ATTACHMENTS:
>> +        """
>> +        Save the original message text in a text blob
>> +        """
>> +        if messageText is None:
>> +            messageText = messageObject.as_string()
>> **
>> **-    m.rfc2822Message = dataToBinary(m, "rfc2822Message",  
>> messageText,
>> -                                    'message/rfc822',  
>> compression, False)
>> **+        m.rfc2822Message = dataToBinary(m, "rfc2822Message",  
>> messageText,
>> +                                        'message/rfc822',  
>> compression, False)
>> **
>>      counter = Counter()
>>      bodyBuffer = {'plain': [], 'html': []}
>> **@@ -282,12 +283,6 @@
>> **     __parsePart(view, messageObject, m, bodyBuffer, counter, buf,
>>                  compression=compression)
>>
>> **-    """
>> -    If the message has attachments set hasMimeParts to True
>> -    """
>> -    if len(m.mimeParts) > 0:
>> -        m.hasMimeParts = True
>> -
>> **     if len(bodyBuffer.get('plain')):
>>          body = constants.LF.join(bodyBuffer.get('plain')).replace 
>> (constants.CR, constants.EMPTY)
>>
>> **@@ -438,7 +433,7 @@
>> **
>>          for attachment in attachments:
>>              if has_stamp(attachment, Mail.MailStamp):
>> **-            # The attachment is another MailMessage
>> **+                # The attachment is another MailMessage
>> **                 try:
>>                      rfc2822 = binaryToData(Mail.MailStamp 
>> (attachment).rfc2822Message)
>>                  except AttributeError:
>> **@@ -463,7 +458,7 @@
>> **     return messageObject
>>
>>
>> **-def kindToMessageText(mailMessage, saveMessage=True):
>> **+def kindToMessageText(mailMessage, saveMessage=False):
>> **     """
>>      This method converts a email message string to
>>      a Chandler C{Mail.MailMessage} object
>> **@@ -620,6 +615,7 @@
>> **
>>  def __parsePart(view, mimePart, parentMIMEContainer, bodyBuffer,  
>> counter, buf,
>>                  level=0, compression='bz2'):
>> **+
>> **     __checkForDefects(mimePart)
>>
>>      if isinstance(mimePart, str):
>> **@@ -802,6 +798,10 @@
>> **
>>  def __handleBinary(view, mimePart, parentMIMEContainer,
>>                     counter, buf, level, compression):
>> **+
>> +    if IGNORE_ATTACHMENTS:
>> +        return
>> +
>> **     contype = mimePart.get_content_type()
>>
>>      if verbose():
>> **@@ -855,30 +855,31 @@
>> **     size = len(body)
>>
>>      charset = mimePart.get_content_charset 
>> (constants.DEFAULT_CHARSET)
>> **-    lang    = mimePart.get("Content-language")
>> **
>> **-    if subtype == "plain" or subtype == "rfc822-headers":
>> -        #XXX: Will want to leverage the language to aid the GUI  
>> layer
>> -        size > 0 and bodyBuffer.get('plain').append 
>> (getUnicodeValue(body, charset))
>> **+    if size and (subtype == "plain" or subtype == "rfc822- 
>> headers"):
>> +        bodyBuffer.get('plain').append(getUnicodeValue(body,  
>> charset,ignore=True))
>> **
>>      else:
>> **-        if subtype == "html":
>> -            size > 0 and bodyBuffer.get('html').append 
>> (getUnicodeValue(body, charset))
>> **+        if size and subtype == "html" and len(bodyBuffer.get 
>> ('plain')) == 0:
>> +            bodyBuffer.get('html').append(getUnicodeValue(body,  
>> charset, ignore=True))
>> **
>> **+        if IGNORE_ATTACHMENTS:
>> +            return
>> +
>> **         mimeText = Mail.MIMEText(itsView=view)
>> **-
>> **         mimeText.mimeType = mimePart.get_content_type()
>>          mimeText.charset  = charset
>>          mimeText.filesize = len(body)
>>          mimeText.filename = __getFileName(mimePart, counter)
>>
>> **+        lang = mimePart.get("Content-language")
>> +
>> **         if lang:
>>              mimeText.lang = lang
>>
>>          mimeText.itsItem.body = getUnicodeValue(body, charset)
>>
>>          parentMIMEContainer.mimeParts.append(mimeText.itsItem)
>> **-        parentMIMEContainer.hasMimeParts = True
>> **
>>  def __getFileName(mimePart, counter):
>>      #This can return none, a str, or unicode :(
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/mail/tests/ 
>> TestMessage.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/mail/tests/ 
>> TestMessage.py	2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/mail/tests/ 
>> TestMessage.py	2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -27,6 +27,7 @@
>> ** from osaf.pim.stamping import has_stamp
>>  from osaf.pim.mail import MailStamp
>>  from osaf.pim.calendar import EventStamp
>> **+from osaf.mail.constants import IGNORE_ATTACHMENTS
>> **
>>  from PyICU import ICUtzinfo
>>  from datetime import datetime
>> **@@ -168,8 +169,10 @@
>> **         m.dateSentString = dateString
>>
>>          m.itsItem.body = u"This is the body"
>> **-        m.rfc2822Message = utils.dataToBinary(m,  
>> "rfc2822Message", self.__mail)
>> **
>> **+        if not IGNORE_ATTACHMENTS:
>> +            m.rfc2822Message = utils.dataToBinary(m,  
>> "rfc2822Message", self.__mail)
>> +
>> **         self.__mailMessage = m
>>
>>          return self.__mailMessage
>> **@@ -221,9 +224,12 @@
>> **         self.assertEquals(mOne.headers['Content-Transfer- 
>> Encoding'], mTwo.headers['Content-Transfer-Encoding'])
>>          self.assertEquals(mOne.headers['Mime-Version'],  
>> mTwo.headers['Mime-Version'])
>>          self.assertEquals(mOne.itsItem.body, mTwo.itsItem.body)
>> **-        self.assertEquals(utils.binaryToData 
>> (mOne.rfc2822Message), utils.binaryToData(mTwo.rfc2822Message))
>> **
>> **+        if not IGNORE_ATTACHMENTS:
>> +            self.assertEquals(utils.binaryToData 
>> (mOne.rfc2822Message), \
>> +                          utils.binaryToData(mTwo.rfc2822Message))
>> **
>> **+
>> **     def __compareMessageObjects(self, mOne, mTwo):
>>          self.assertNotEqual(mOne, None)
>>          self.assertNotEqual(mTwo, None)
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> Calendar.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> Calendar.py	2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> Calendar.py	2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -1931,4 +1931,88 @@
>> **
>>  class RecurrencePattern(ContentItem):
>>      """Unused, should be removed."""
>> **+
>> +def parseText(text):
>> +    """
>> +    Parses the given text and returns the start date/time and the  
>> end date/time and
>> +    a countFlag  and a typeFlag.
>> +
>> +    countFlag indicates the number of date/times present in the  
>> text. It is an enum.
>> +    0 indicates no date/time, 1 indicates only one date/time, 2  
>> indicates more than one date/time.
>> +
>> +    typeFlag indicates the type of date/time information present.  
>> It is an ennum too.
>> +    0 indicates no date/time, 1 indicates only date, 2 indicates  
>> only time
>> +    and 3 indicates both date and time
>> +    """
>> +
>> +    import parsedatetime.parsedatetime as parsedatetime
>> +    import parsedatetime.parsedatetime_consts as ptc
>> +    from i18n import getLocaleSet
>> +    import time
>> +    import string
>> +
>> +    cal = parsedatetime.Calendar(ptc.Constants(str(getLocaleSet() 
>> [0])))
>> +    countFlag = 0   #counts the number of date/times in the text
>> +    for line in (text.split('.')):
>> +        line = string.strip(line)
>> +        if  countFlag > 1:
>> +            #More than one date time exists.
>> +            break
>> +        else:
>> +            if line is not '' and line is not None:
>> +                (dt1, dt2, typeFlag) = cal.evalRanges(line)
>> +                if typeFlag != 0:
>> +                    countFlag += 1
>> +                    # Date/time range exists
>> +                    (yr1, mth1, dy1, hr1, mn1, sec1, wd1, yd1,  
>> isdst1) = dt1
>> +                    (yr2, mth2, dy2, hr2, mn2, sec2, wd2, yd2,  
>> isdst2) = dt2
>> +
>> +                    if typeFlag == 1:
>> +                        #only date exists
>> +                        startTime = datetime(yr1, mth1, dy1,  
>> tzinfo=ICUtzinfo.default)
>> +                        endTime = datetime(yr2, mth2, dy2,  
>> tzinfo=ICUtzinfo.default)
>> +                    else:
>> +                        #time exists
>> +                        startTime = datetime(yr1, mth1, dy1, hr1,  
>> mn1, tzinfo=ICUtzinfo.default)
>> +                        endTime = datetime(yr2, mth2, dy2, hr2,  
>> mn2, tzinfo=ICUtzinfo.default)
>> +                else:
>> +                    # Check whether there is a single date/time
>> +                    (dt, typeFlag) = cal.parse(line)
>> +                    if typeFlag != 0:
>> +                        # Date/time exists
>> +                        countFlag += 1
>> +                        (yr, mth, dy, hr, mn, sec, wd, yd, isdst)  
>> = dt
>> +
>> +                        if typeFlag == 1:
>> +                            #only date exists
>> +                            startTime = endTime = datetime(yr,  
>> mth, dy, tzinfo=ICUtzinfo.default)
>> +                        else:
>> +                            #time exists
>> +                            startTime = endTime = datetime(yr,  
>> mth, dy, hr, mn, tzinfo=ICUtzinfo.default)
>> +
>> +    #If no date/time exists or more than one date/time exists,
>> +    #set the date as today's date and time as Anytime
>> +    if (countFlag == 2) or (countFlag == 0):
>> +        (yr, mth, dy, hr, mn, sec, wd, yd, isdst) = time.localtime()
>> +        startTime = endTime = datetime(yr, mth, dy,  
>> tzinfo=ICUtzinfo.default)
>> +        typeFlag = 0
>> +
>> +    return startTime, endTime, countFlag, typeFlag
>> **
>> **+
>> +def setEventDateTime(item, startTime, endTime, typeFlag):
>> +    """
>> +    Sets the startTime and the endTime of the item  
>> (CalendarEvent) depending on the typeFlag.
>> +    typeFlag = 0 indicates no date/time, 1 indicates only date, 2  
>> indicates only time
>> +    and 3 indicates both date and time
>> +    """
>> +    from osaf import pim
>> +
>> +    if (typeFlag == 1) or (typeFlag == 0):
>> +        # No time is present
>> +        pim.EventStamp(item).anyTime = True
>> +    else:
>> +        pim.EventStamp(item).anyTime = False
>> +
>> +    pim.EventStamp(item).startTime = startTime
>> +    pim.EventStamp(item).endTime = endTime
>> **\ No newline at end of file
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> DateTimeUtil.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> DateTimeUtil.py	2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> DateTimeUtil.py	2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -96,10 +96,18 @@
>> **         self.dateFormat.setTimeZone(tzinfo.timezone)
>>          return unicode(self.dateFormat.format(datetime))
>>
>> **-shortDateFormat = DatetimeFormatter(
>> -    PyICU.DateFormat.createDateInstance(PyICU.DateFormat.kShort))
>> -mediumDateFormat = DatetimeFormatter(
>> -    PyICU.DateFormat.createDateInstance(PyICU.DateFormat.kMedium))
>> **+def forceFourDigitDates(formatter):
>> +    #""" If this formatter isn't using a 4-digit year, force it  
>> to. """
>> +    pattern = formatter.dateFormat.toPattern()
>> +    if pattern.find('yyyy') == -1:
>> +        formatter.dateFormat.applyPattern(pattern.replace 
>> ('yy','yyyy'))
>> +    return formatter
>> +
>> +
>> +shortDateFormat = forceFourDigitDates(DatetimeFormatter(
>> +    PyICU.DateFormat.createDateInstance(PyICU.DateFormat.kShort)))
>> +mediumDateFormat = forceFourDigitDates(DatetimeFormatter(
>> +    PyICU.DateFormat.createDateInstance(PyICU.DateFormat.kMedium)))
>> ** shortTimeFormat = DatetimeFormatter(
>>      PyICU.DateFormat.createTimeInstance(PyICU.DateFormat.kShort))
>>  durationFormat = PyICU.SimpleDateFormat(_(u"H:mm"))
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/ 
>> tests/TestFormatters.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/tests/ 
>> TestFormatters.py	2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/calendar/tests/ 
>> TestFormatters.py	2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -52,7 +52,7 @@
>> ** class ShortDateParse(AbstractTestCase):
>>
>>      def testSimple(self):
>> **-        parsed = DateTimeUtil.shortDateFormat.parse("12/11/04")
>> **+        parsed = DateTimeUtil.shortDateFormat.parse("12/11/2004")
>> **
>>          self.failUnlessEqual(parsed, datetime(2004,12,11))
>>
>> **@@ -72,7 +72,7 @@
>> **     def testSimpleWithReference(self):
>>          tzinfo = ICUtzinfo.getInstance("US/Eastern")
>>          parsed = DateTimeUtil.shortDateFormat.parse(
>> **-                    "12/11/04",
>> **+                    "12/11/2004",
>> **                     datetime(2006, 1, 1,tzinfo=tzinfo))
>>
>>          self.failUnlessEqual(parsed, datetime(2004,12,11,  
>> tzinfo=tzinfo))
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/pim/collections.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/collections.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/collections.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -124,10 +124,10 @@
>> **     # other side of 'sources'
>>      sourceFor = schema.Sequence(otherName='sources')
>>
>> **-    # other side of AppCollection.exclusions
>> **+    # other side of AppCollection.collectionExclusions
>> **     exclusionsFor = schema.Sequence()
>>
>> **-    # other side of AppCollection.trash
>> **+    # other side of AppCollection.collectionTrash
>> **     trashFor = schema.Sequence()
>>
>>      schema.addClouds(
>> **@@ -475,12 +475,7 @@
>> **         if source is None:
>>              s = EmptySet()
>>          else:
>> **-            attrTuples = set()
>> -            for name in self.filterAttributes:
>> -                attrTuples.add((name, "set"))
>> -                attrTuples.add((name, "remove"))
>> -            attrs = tuple(attrTuples)
>> -
>> **+            attrs = tuple(set(self.filterAttributes))
>> **             if hasattr(self, 'filterExpression'):
>>                  s = ExpressionFilteredSet(source,  
>> self.filterExpression, attrs)
>>              else:
>> **@@ -504,16 +499,43 @@
>> **     # must be named 'inclusions' to match ListCollection
>>      inclusions = schema.Sequence(otherName='collections',  
>> initialValue=[])
>>
>> **-    exclusions = schema.One 
>> (inverse=ContentCollection.exclusionsFor)
>> -    trash = schema.One(inverse=ContentCollection.trashFor,  
>> initialValue=None)
>> **+    # the exclusions used when no exclusions collection is given
>> +    collectionExclusions = schema.Sequence(otherName='excludedBy')
>> **
>> **+    exclusionsCollection = schema.One 
>> (inverse=ContentCollection.exclusionsFor,
>> +                                      initialValue=None)
>> +    trashCollection = schema.One(inverse=ContentCollection.trashFor,
>> +                                 initialValue=None)
>> +
>> +    # an AppCollection may have another collection for exclusions  
>> and that
>> +    # other collection may be the global trash collection. If no  
>> collection
>> +    # is specified for exclusions, a local ref collection is used  
>> instead.
>> +
>> +    def _getExclusions(self):
>> +        exclusions = self.exclusionsCollection
>> +        if exclusions is None:
>> +            exclusions = self.collectionExclusions
>> +        return exclusions
>> +    exclusions = property(_getExclusions)
>> +
>> +    # an AppCollection may have another collection for trash. If no
>> +    # collection is given for trash, the collection's exclusions  
>> is used
>> +    # instead following the logic above.
>> +
>> +    def _getTrash(self):
>> +        trash = self.trashCollection
>> +        if trash is None:
>> +            trash = self.exclusions
>> +        return trash
>> +    trash = property(_getTrash)
>> +
>> **     # __collection__ denotes a bi-ref set,
>>      # therefore it must be added to the copying cloud def for it  
>> to be copied.
>>
>>      schema.addClouds(
>>          copying = schema.Cloud(
>> **-            byCloud=[inclusions, exclusions],
>> -            byRef=[trash, __collection__]
>> **+            byCloud=[inclusions, collectionExclusions,  
>> exclusionsCollection],
>> +            byRef=[trashCollection, __collection__]
>> **         ),
>>      )
>>
>> **@@ -523,15 +545,17 @@
>> **         """
>>          self.inclusions.add(item)
>>
>> **-        if item in self.exclusions:
>> -            self.exclusions.remove(item)
>> **+        exclusions = self.exclusions
>> +        if item in exclusions:
>> +            exclusions.remove(item)
>> **
>>          # If a trash is associated with this collection, remove  
>> the item
>>          # from the trash.  This has the additional benefit of  
>> having the item
>>          # reappear in any collection which has the item in its  
>> inclusions
>>
>> **-        if self.trash is not None and item in self.trash:
>> -            self.trash.remove(item)
>> **+        trash = self.trash
>> +        if trash is not None and item in trash:
>> +            trash.remove(item)
>> **
>>      def remove(self, item):
>>          """
>> **@@ -552,15 +576,17 @@
>> **         if item in self.inclusions:
>>              self.inclusions.remove(item)
>>
>> **-        if not (isDeleting or self.trash is None):
>> -            for collection in self.trash.trashFor:
>> -                if collection is not self and item in collection:
>> -                    # it exists somewhere else, definitely don't add
>> -                    # to trash
>> -                    break
>> -            else:
>> -                # we couldn't find it anywhere else, so it goes  
>> in the trash
>> -                self.trash.add(item)
>> **+        trash = self.trash
>> +        if not (isDeleting or trash is None):
>> +            if isinstance(trash, ContentCollection):
>> +                for collection in trash.trashFor:
>> +                    if collection is not self and item in  
>> collection:
>> +                        # it exists somewhere else, definitely  
>> don't add
>> +                        # to trash
>> +                        break
>> +                else:
>> +                    # we couldn't find it anywhere else, so it  
>> goes in the trash
>> +                    trash.add(item)
>> **
>>      def __init__(self, itsName=None, itsParent=None,
>>                   itsKind=None, itsView=None,
>> **@@ -602,14 +628,16 @@
>> **         if source is not None:
>>              innerSource = Union(source, innerSource)
>>
>> **-        # Typically we will create an exclusions  
>> ListCollection; however,
>> -        # a collection like 'All' will instead want to use the  
>> Trash collection
>> -        # for exclusions
>> **+        # Typically we will create a collectionExclusions ref  
>> collection;
>> +        # however, a collection like 'All' will instead want to  
>> use the
>> +        # Trash collection for exclusions
>> **
>>          if exclusions is None:
>> **-            exclusions = ListCollection(itsParent=self,
>> -                                        displayName=u"(Exclusions)")
>> -        self.exclusions = exclusions
>> **+            self.collectionExclusions = []
>> +            set = Difference(innerSource, (self,  
>> 'collectionExclusions'))
>> +        else:
>> +            self.exclusionsCollection = exclusions
>> +            set = Difference(innerSource, exclusions)
>> **
>>          # You can designate a certain ListCollection to be used  
>> for this
>>          # collection's trash; in this case, an additional  
>> DifferenceCollection
>> **@@ -621,12 +649,9 @@
>> **         #   be moved to the trash if it doesn't appear in any  
>> collection which
>>          #   shares that trash
>>
>> **-        set = Difference(innerSource, exclusions)
>> **         if trash is not None:
>>              set = Difference(set, trash)
>> **-            self.trash = trash
>> -        else:
>> -            self.trash = exclusions
>> **+            self.trashCollection = trash
>> **
>>          setattr(self, self.__collection__, set)
>>
>> **@@ -640,7 +665,7 @@
>> **         # their Difference set. This means that when they are  
>> hooked
>>          # into a larger collection tree, they need to only give out
>>          # the _left side, which has no trash.
>> **-
>> **+
>> **         if self.trash is schema.ns('osaf.pim',  
>> self.itsView).trashCollection:
>>              return self.set._left.copy(self.itsUUID)
>>
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/parcels/osaf/pim/ 
>> items.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/items.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/items.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -178,7 +178,26 @@
>> **
>>      triageStatus = schema.One(TriageEnum, indexed=True,
>>                                defaultValue=TriageEnum.now)
>> **-
>> **+
>> +    _unpurgedTriageStatus = schema.One(TriageEnum)
>> +
>> +    def getUnpurgedTriageStatus(self):
>> +        result = self.getAttributeValue('_unpurgedTriageStatus',  
>> default=None)
>> +        if result is None:
>> +            result = self.triageStatus
>> +        return result
>> +
>> +    def setUnpurgedTriageStatus(self, value):
>> +        self._unpurgedTriageStatus = value
>> +
>> +    unpurgedTriageStatus = schema.Calculated(
>> +                            TriageEnum,
>> +                            fset=setUnpurgedTriageStatus,
>> +                            fget=getUnpurgedTriageStatus,
>> +                            basedOn=(_unpurgedTriageStatus,  
>> triageStatus),
>> +                            doc="Calculated for edited  
>> triageStatus, before"
>> +                                "user has committed changes")
>> +
>> **     # For sorting by how recently triageStatus changed, we keep  
>> this attribute,
>>      # which is the time (in seconds) of the last change, negated  
>> for proper
>>      # order. It's updated automatically when triageStatus is  
>> changed by
>> **@@ -199,6 +218,9 @@
>> **     # ContentItem instances can be put into ListCollections and  
>> AppCollections
>>      collections = schema.Sequence(otherName='inclusions',  
>> notify=True)
>>
>> **+    # ContentItem instances can be excluded by AppCollections
>> +    excludedBy = schema.Sequence(otherName='collectionExclusions')
>> +
>> **     # ContentItem instances can be put into SmartCollections  
>> (which define
>>      # the other end of this biref)
>>      appearsIn = schema.Sequence()
>> **@@ -458,6 +480,9 @@
>> **         when = when or datetime.now(tz=ICUtzinfo.default)
>>          self.triageStatusChanged = time.mktime(when.utctimetuple())
>>          logger.debug("%s.triageStatus = %s @ %s", self, getattr 
>> (self, 'triageStatus', None), when)
>> **+
>> +        if getattr(self, '_unpurgedTriageStatus', None) ==  
>> self.triageStatus:
>> +            del self._unpurgedTriageStatus
>> **
>>      def getBasedAttributes(self, attribute):
>>          """ Determine the schema attributes that affect this  
>> attribute
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/parcels/osaf/pim/ 
>> mail.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/mail.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/mail.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -283,7 +283,6 @@
>> **     mailStamp.referencesMID = []
>>      mailStamp.spamScore = 0.0
>>      mailStamp.mimeContainer = None
>> **-    mailStamp.hasMimeParts = False
>> **     mailStamp.mimeParts = []
>>      mailStamp.messageId = u""
>>
>> **@@ -732,13 +731,12 @@
>> ** class MIMEContainer(MIMEBase):
>>      schema.kindInfo(annotates=items.ContentItem)
>>
>> **-    hasMimeParts = schema.One(schema.Boolean, initialValue =  
>> False)
>> **     mimeParts = schema.Sequence(
>>          MIMEBase,
>>          initialValue = [],
>>          inverse = MIMEBase.mimeContainer,
>>      )
>> **-    schema.addClouds(sharing = schema.Cloud(hasMimeParts,  
>> mimeParts))
>> **+    schema.addClouds(sharing = schema.Cloud(mimeParts))
>> **
>>
>>  class MailStamp(stamping.Stamp, MIMEContainer):
>> **@@ -819,7 +817,7 @@
>> **     # on with schema.observer here.
>>      @schema.observer(toAddress, stamping.Stamp.stamp_types)
>>      def updateWho(self, op, name):
>> **-        if op == 'set' and stamping.has_stamp(self, MailStamp):
>> **+        if op in ('init', 'set') and stamping.has_stamp(self,  
>> MailStamp):
>> **             self.itsItem.who = u", ".join(unicode(x) for x in  
>> self.toAddress)
>>          else:
>>              self.itsItem.who = u""
>> **@@ -918,12 +916,6 @@
>> **         """
>>          return len(self.mimeParts)
>>
>> **-    def hasAttachments(self):
>> -        """
>> -        First pass at API will be expanded upon later.
>> -        """
>> -        return self.hasMimeParts
>> -
>> **     def getSendability(self, ignoreAttr=None):
>>          """
>>          Return whether this item is ready to send: 'sendable',  
>> 'sent',
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/pim/tests/ 
>> TestStamping.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/pim/tests/ 
>> TestStamping.py	2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/pim/tests/ 
>> TestStamping.py	2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -313,7 +313,6 @@
>> **         stampedWelcome.add()
>>
>>          self.failUnlessEqual(list(stampedWelcome.mimeParts), [])
>> **-        self.failUnlessEqual(stampedWelcome.hasMimeParts, False)
>> **         self.failUnlessEqual(stampedWelcome.mimeType, '')
>>          self.failUnlessEqual(stampedWelcome.mimeContainer, None)
>>
>> *
>>
>> * *
>>
>>
>>         *Modified:
>>         branches/0.7alpha4/chandler/parcels/osaf/servlets/xmlrpc.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/servlets/xmlrpc.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/servlets/xmlrpc.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -83,8 +83,8 @@
>> **         view = getServletView(self.repositoryView.repository,  
>> viewName)
>>          view.refresh()
>>          note = pim.Note(itsView=view, displayName=title, body=body)
>> **-        pim.EventStamp(note).add()
>> **         event = pim.EventStamp(note)
>> **+        event.add()
>> **         event.startTime = datetime.datetime.now 
>> (tz=ICUtzinfo.floating)
>>          event.duration = datetime.timedelta(minutes=60)
>>          event.anyTime = False
>> *
>>
>> * *
>>
>>
>>         *Modified: branches/0.7alpha4/chandler/parcels/osaf/ 
>> settings.py
>>         (12206 => 12207)*
>>
>> *--- branches/0.7alpha4/chandler/parcels/osaf/settings.py	 
>> 2006-11-02 02:32:00 UTC (rev 12206)
>> +++ branches/0.7alpha4/chandler/parcels/osaf/settings.py	 
>> 2006-11-02 17:34:07 UTC (rev 12207)
>> **@@ -15,10 +15,10 @@
>> **
>>  """Save and Restore Application Settings"""
>>
>> **-import ConfigParser, logging
>> **+import logging
>> +from configobj import ConfigObj
>> ** from application import schema
>>  from osaf import pim, sharing, usercollections
>> **-from osaf.framework.blocks import Block
>> ** from osaf.pim.structs import ColorType
>>  from application.dialogs import SubscribeCollection
>>  from chandlerdb.util.c import UUID
>> **@@ -29,179 +29,167 @@
>> ** def save(rv, filename):
>>      """Save selected settings information, including all sharing  
>> accounts
>>      and shares (whether published or subscribed), to an INI file"""
>> **-
>> -    cfg = ConfigParser.ConfigParser()
>> -
&g