# [Edu-sig] Teaching Python with the Calendar

Gregor Lingl glingl at aon.at
Sun Nov 14 11:50:53 CET 2004

```Very interesting, Kirby!
Would you mind to publish the source of the cgi-script,
e.g. provide it as an attachment?
As a first step I'd like to try to produce an Austrian version
of your calendar (different holidays, of course).
Regards,
Gregor

Kirby Urner schrieb:

>Since starting with Python tutoring, I've already learned a lot.  For
>example, I'm a new convert to this technique of programming around the
>Gregorian calendar (that's the familiar one, to us ISO-Latin types).
>
>It's a good mix of real world and abstraction, in that figuring the holidays
>is kinda messy (given the calendar is -- leap year and all that), yet coded
>solutions exist (most easily within the epoch -- I've not ventured outside
>it).
>
>For example, Columbus Day is the Monday nearest to October 12th.  Here's my
>code for that:
>
>def getcolday(y):
>    """
>    Get Columbus Day, return daynum
>    Monday closest to Oct 12
>    """
>    i = j = 12
>    while calendar.weekday(y, 10, i) <> 0:
>        i -= 1
>    while calendar.weekday(y, 10, j) <> 0:
>        j += 1
>    if abs(12-i) > abs(12-j):
>        closest = j
>    else:
>        closest = i
>    return getdaynum(y, 10, closest)
>
>def getdaynum(y, m, d):
>    """
>    Return day number
>    """
>    return time.localtime(time.mktime((y, m, d, 0, 0, 0, 0, 0, 0)))[7]
>
>What gets returned is an integer between 1 and 365 (or 366 on leap years),
>which I then use against a dictionary that looks like this (my student
>compiled it -- I credit him in the comments, but redact for here):
>
>def alldates(year):
>    """
>    Returns all the dates of holidays in a year in a dictionary
>    Compiled by xxx
>    """
>    leap    = calendar.isleap(year)
>    easter  = geteaster(year)
>    easter  = apply(getdaynum, easter)
>    thedays = {304 + leap    : 'Halloween',
>               185 + leap    : 'July 4th',
>               359 + leap    : 'Christmas',
>               305 + leap    : 'All Saints Day',
>               306 + leap    : 'All Souls Day',
>               1             : 'New Year\'s Day',
>               365 + leap    : 'New Year\'s Eve',
>               315 + leap    : 'Veterans Day',
>               165 + leap    : 'Flag Day',
>               easter        : 'Easter',
>               easter - 1    : 'Holy Saturday',
>               easter - 2    : 'Good Friday',
>               easter - 7    : 'Palm Sunday',
>               easter - 40   : 'Ash Wednesday',
>               getnthday(year,11,3,4) : 'Thanks- giving',
>               getnthday(year,1,0,3)  : "MLK B'day",
>               getnthday(year,2,0,3)  : "Presidents Day",
>               getmemday(year)        : "Memorial Day",
>               getnthday(year,9,0,1)  : "Labor Day",
>               getcolday(year)        : "Columbus Day"
>              }
>    return thedays
>
>Beyond just coding the holidays (I focused on some Xtian plus a few secular,
>in part because my student is interested in the Roman Catholic calendar --
>alternative dictionaries suggest themselves) there's the CGI angle.
>
>Of course this is not a new idea, I found many websites implementing it, but
>to roll one of one's own, in Python, provides a useful exercise:  in cgi,
>HTML, even CSS.
>
>Here's my latest example:  http://www.4dsolutions.net/cgi-bin/calendar2.cgi
>
>Kirby
>
>
>_______________________________________________
>Edu-sig mailing list
>Edu-sig at python.org
>http://mail.python.org/mailman/listinfo/edu-sig
>
>
>
>
```