==========
TODO ITEMS
==========

Future releases:

[ ] - Basic profiling of this product and the larger integration stack
[ ] - User deletion, make sure this is sensible and conservative (IUserManagement, doDeleteUser)
    [ ] - Make this user-configurable?
    [ ] - Mark an 'inactive' boolean on the object in SF instead of completely removing it?
[ ] - some autogenerated help text that let's you know which fields are required on join form
      if doAddUser is enabled (deferred)
[ ] - enable caching of passwords by default


Completed Todos (as lead up to initial release):

  [X] - move docs into standard locations for eggs
  [X] - implement sensible default caching strategy, add logical configuration options
      [X] - add caching info to install docs
      [X] - invalidate cache when localToSFAuthMapping value changes
  [X] - trap common issues due to misconfiguration within authenticate credentials by 
        returning none in appropriate places
  [X] - trap common issues due to misconfiguration within property plugin by 
        returning an empty property sheet (??) in appropriate places
  [X] - strip out assumptions for mapping fields and username/password fields from __init__
  [X] - userid vs. login name -- provide easy path for email address authentication
  [X] - remove the harcoded "Doe" from lastname insertion
  [X] - Data type marshaling
      [X] - get of properties
          [X] - write test coverage for int, float
      [X] - set of user properties
          [X] - write test coverage for date
          [X] - write test coverage for boolean
  [X] - look at "Misc" methods, put in interface?
  [X] - Look at security on the methods
  [X] - warnings when multiple users are found
  [X] - implement optional encryption enabled by default on passwords for each
        created auth plugin
      [X] - make sure we're using a sensible default for this (going with md5)
  [X] - IUserEnumerationPlugin:
    
      [X] - Support enumerateUser queries of multiple logins and/or multiple ids
      [X] - Support sorting of results
      [X] - cleanup obscure original code in enumerateUsers

  [X] - Don't allow configuration to be wiped out on product reinstall, due to removing of plugin
  [X] - Troubleshoot password reseting capabilities -- though it looks like Plone disabled this??
  [X] - Fix this bug:

    2008-02-15 15:27:13 ERROR Zope.SiteErrorLog http://localhost:8080/props/personalize_form
    Traceback (innermost last):
      Module ZPublisher.Publish, line 119, in publish
      Module ZPublisher.mapply, line 88, in mapply
      Module ZPublisher.Publish, line 42, in call_object
      Module Products.CMFFormController.FSControllerPageTemplate, line 90, in __call__
      Module Products.CMFFormController.BaseControllerPageTemplate, line 28, in _call
      Module Products.CMFFormController.ControllerBase, line 231, in getNext
      Module Products.CMFFormController.Actions.TraverseTo, line 38, in __call__
      Module ZPublisher.mapply, line 88, in mapply
      Module ZPublisher.Publish, line 42, in call_object
      Module Products.CMFFormController.FSControllerPythonScript, line 104, in __call__
      Module Products.CMFFormController.Script, line 145, in __call__
      Module Products.CMFCore.FSPythonScript, line 140, in __call__
      Module Shared.DC.Scripts.Bindings, line 313, in __call__
      Module Shared.DC.Scripts.Bindings, line 350, in _bindAndExec
      Module Products.CMFCore.FSPythonScript, line 196, in _exec
      Module None, line 5, in personalize
       - <FSControllerPythonScript at /props/personalize>
       - Line 5
      Module Products.CMFCore.MemberDataTool, line 295, in setProperties
      Module Products.PlonePAS.tools.memberdata, line 142, in setMemberProperties
      Module Products.PlonePAS.sheet, line 97, in setProperty
      Module collective.salesforce.authplugin.mixins.propertymgmtmixin, line 73, in setPropertiesForUser
      Module collective.salesforce.authplugin.mixins.propertymgmtmixin, line 113, in updateUserInfo
      Module Products.salesforcebaseconnector.salesforcebaseconnector, line 308, in update
      Module beatbox.python_client, line 126, in update
      Module beatbox._beatbox, line 88, in update
      Module beatbox._beatbox, line 325, in post
    SoapFaultError: 'Client' "'1942/03/04' is not a valid value for the type xsd:date"

  [X] - implement caching for enumerateUsers
      [X] - use this cache from allowPasswordSet, if available
  [X] - remove improper implementation of IManageCapabilities, which is actually intended for 
        MemberData objects
  [X] - run tests on Plone 3.1
  [X] - cache invalidation when tool settings are changed
  [X] - Change this "Additional soql auth query saved"
  [X] - Uninstall should remove this plugin (to prevent 'id already used' upon reinstall)
  [X] - Ensure that UI presents all configuration options:
          [X] - enable password encryption
          [X] - choose password encryption
  [X] - Add a sample customization of the join/personalize form to docs
  [X] - Add salesforce logo as a browser resource in integrate into UI
  [X] - The various mapping fields in config have the same help text and no clear explanation of 
        desired format.
  [X] - flush out default configuration story, currently it looks like:

              IAuthenticationPlugin

              1) salesforceauthmultiplugin
              2) source_users
              3) session

              IUserEnumerationPlugin

              1) salesforceauthmultiplugin
              2) source_users
              3) mutable_properties

              IPropertiesPlugin

              1) mutable_properties
              2) salesforceauthmultiplugin

              IUpdatePlugin

              1) salesforceauthmultiplugin

              IUserAdderPlugin

              1) salesforceauthmultiplugin
              2) source_users

              IUserManagement

              1) salesforceauthmultiplugin
              2) source_users

  [X] - Better explanation for desired auth and property configuration format
  [X] - update explanatory text about how to test this product by joining a site TTW within docs section
  [X] - Install.txt that reflects the more minimal required Salesforce.com modifications
  [X] - Technical explanation for why this release couldn't support doAddUser of a chosen object type of event

      [X] - list of required items needed by doAddUser to successfully 
            create the user (i.e. LastName for Contact, LastName, LeadSource for Lead, etc.).  2 options 
            for configuration:
        
              Workflow:
        
                  1) Choose sfobject.
                      Chosen sfobject type has several required fields that 
                      doAddUser doesn't accept.  For example:
                          - Contact needs a LastName
                          - Lead needs a LastName & Source
                          - Account needs some other stuff
                          - Event needs date and length in minutes (this is a ridiculous example)
            
                  2) One would either want to:
            
                      1) shove login into the required field
                      2) set a default value (for example, TTW, we might want to add 1 minute for the event,
                         and 01/01/1900 or something for a default date to start). this would only be because
                         login is the wrong data type (think a required date field)
                              - to speed up usability, in the short term we could create a 
                                list of "known bad out of the box types"
                              - medium term, we could do something sensible in code by inspecting 
                                the required field types data type (in the case of date 
                                we'd just now = DateTime())
                      3) provide some custom logic -- this would be development, not configuration and should
                         be put off until needed
            
                  3) In the case of #1 and #2, the integrator would have the option of providing their own
                     ultimate values vie that join form, which will ultimately overwrite the silly defaults
                     when PlonePAS' setMemberProperties delegates to setPropertiesForUser.  
                     This scenario should provide all predicted functionality (i.e. 
                     CMFFormControl/Formlib delegates logic to anything really for the 
                     default -- i think this renders #3 obsolute)

