[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>&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