Once the tinderboxes have somehow been resurrected from their state of wretchedness, I'll be checking in changes to the internals of reminders. There's a summary below; a lot of this is in the docstrings.

--Grant

- I split up Reminder functionality into 2 kinds:

1. osaf.pim.reminders.Reminder, the base kind, which supports "absolute"
     (a.k.a. "custom") reminders as before.

2. osaf.pim.calendar.Calendar.RelativeReminder, which supports "relative"
     reminders, including handling recurring events.

This allows us to resolve some nasty circular dependency issues we had
  before: EventStamp depended on Reminder (so as to be able to update
Reminders when an event's startTime changes, for example), but Reminder
  also depended on EventStamp (since relativeTo would default to
  EventStamp.startTime.name).

  In particular, this means we no longer have to have Remindable be an
  Annotation subclass; instead, it's a subclass of ContentItem as it
  was before.

- Before, we had expiredReminders and reminders reflists to track which
  Reminders on a ContentItem were expired. The idea is to have
one reflist (reminders), and a list of pending reminders. If a reminder
  doesn't appear in the "pending" list, it's assumed to have expired if
  it's in the past.

- Each "pending reminder" is an instance of the PendingReminderEntry kind. The
  idea is that the Reminders dialog could make a KindCollection of all
PendingReminderEntries, and display those to the user. (The current code
  has a classmethod Reminder.getPendingTuples that does just this, and
  this is used by the UI to display the entries in the dialog).

- There are book-keeping methods and attributes on Reminder to update its
  pending list:

     The nextPoll attribute, which is a datetime, tells when the next
     change in the pending reminders list will occur. It starts out as
     None, and is set to Reminder.farFuture when all reminders for this
     Reminder have expired.

The updatePending() method actually updates the pendingReminder reflist,
     and then changes nextPoll if necessary.

- There are changes that that in the future will help us avoid generating actual
  Items for (unmodified) occurrences:

    + A Reminder now has at most one Remindable instance, i.e.

        reminderItems = schema.Sequence(Remindable)

      has become

        reminderItem = schema.One(Remindable)

      In the case of recurring events, RelativeReminder handles
      making sure its pendingEntries is updated to point at the correct
      occurrences (i.e. the 'item' PendingReminderEntry attribute won't
      be the master). The plan is to track which occurrence the entry
      pertains to by recurrenceID, rather than by actual Item.

+ Modifications to a master event only get their own reminders reflist if
     they have a THIS reminder change.

- Lastly, I left the userReminderTime Calculated attribute on the Remindable class. The userReminderInterval one, though, only applies to EventStamps
  right now, so I moved it there.


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Open Source Applications Foundation "chandler-dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/chandler-dev

Reply via email to