[schooltool-dev] RFC Time managers and objects that track changes
during the term
Tom Hoffman
tom.hoffman at gmail.com
Fri Dec 7 14:47:52 EST 2007
This looks good to me on the surface.
Let's say I'm an attendance component, and I've got a query about the
attendance of a student who withdrew halfway through the term. Can I
query the section for the days this student was enrolled in the class?
--Tom
On Dec 7, 2007 12:46 PM, Ignas Mikalajunas <ignas.mikalajunas at gmail.com> wrote:
> Hi, i have written up some science fiction and would like to get some
> feedback before implementing it:
>
> Keyframes, TimeManagers and objects that can track changes
> ==========================================================
>
> Define the term that will serve as the time manager for the section
> (the dates are inclusive):
>
> >>> term = Term(date(2006, 1, 1), date(2005, 2, 1))
>
> And some objects to play with:
>
> >>> ann = Person("Ann")
> >>> john = Person("John")
> >>> pete = Person("Pete")
>
> >>> section = Section()
>
> To track it's changes section needs a time manager set:
>
> >>> setTimeManager(section, term)
>
> There's a utility that knows what day it is today.
>
> >>> from zope.component import queryUtility
> >>> sdm = queryUtility(ISchoolDayManager)
> >>> sdm.setSchoolDay(2006, 1, 15)
>
> If we access section directly, we're seeing its state as of the day
> that is today according to the ISchoolDayManager
>
> >>> list(section.members)
> []
>
> We can also modify the section
>
> >>> section.members.add(john)
> >>> section.members.add(pete)
>
> >>> list(section.members)
> [John, Pete]
>
> Time machine!
>
> >>> sdm.setSchoolDay(2006, 1, 14)
> >>> list(section.members)
> []
>
> There's a time viewer as well:
>
> >>> section2006_1_15 = getObjectForSchoolDay(section, date(2006, 1, 15))
> >>> list(section2006_1_15.members)
> [John, Pete]
>
> These are editable too:
>
> >>> section2006_1_15.remove(pete)
> >>> list(section2006_1_15.members)
> [John]
>
> getInitialObject is a shortcut for getObjectForSchoolDay(section,
> term.first_day). It is convenient for inializing the object without
> worrying bouyt lgobal IWatWasThatUtilityNameAgain urtilities:
>
> >>> initial_section = getInitialObject(section)
> >>> initial_section.members.add(ann)
> >>> list(initial_section.members)
> [Ann]
>
> Existing views into object state at a given time are updated automatically:
>
> >>> list(section)
> [Ann]
>
> >>> list(section2006_1_15)
> [Ann, John]
>
> The time-aware content objects store these state changes in
> keyframes.
>
> >>> kf = IKeyframes(section)
>
> These are accessible with a dict-like interface???, e.g. to see the dates
> of changes (in chronological order) use the keys() method:
>
> >>> kf.keys()
> [date(2006, 1, 1), date(2006, 1, 15)]
>
> You can retrieve both keyframe objects themselves, or the state of the
> section that was after that keyframe:
>
>
> >>> kf.getKeyframe(date(2006, 1, 15))
> <section_keyframe>
>
> >>> kf.getState(date(2006, 1, 14))
> <section_before_keyframe>
>
> >>> kf.getState(date(2006, 1, 15))
> <section_after_keyframe>
>
> >>> kf[date(2006, 1, 1)]
> <section_keyframe>
>
> >>> kf[date(2006, 1, 15)]
> <section_keyframe>
>
> A day past the term:
>
> >>> sdm.setSchoolDay(2007, 1, 14)
> >>> list(section.members)
> [Ann, John, Pete]
>
> >>> section.members.remove(john)
> Traceback (most recent call last):
> ...
> Exception: You can't modify objects after the last date of their related
> time manager!
>
> A day before the term:
>
> >>> tm.setSchoolDay(2005, 1, 14)
> >>> list(section.members)
> [Ann]
> >>> section.members.remove(ann)
> >>> list(section.members)
> []
>
> >>> list(section2007_1_15.members)
> [John, Pete]
>
>
> Ignas
> _______________________________________________
> Schooltool-dev mailing list
> Schooltool-dev at schooltool.org
> http://lists.schooltool.org/mailman/listinfo/schooltool-dev
>
More information about the Schooltool-dev
mailing list