Using the Calendar tag product with CMF
explains how to install the calendar tag product. I'll probably try to add some more info about usage.
Using Calendar tag with the CMFCalendar
This document describes basic installation of the calendar tag product within a CMFSite. The installation instructions assume that you have CMF 1.1 or above installed and have added a CMFSitePre-Installation
Installation
The CMFCalendar object is now usable. If you look in the folder portal_skins, you will now see a folder named calendar.
Test your Installation
<dtml-with calendarDisplay>
<dtml-var calendar>
</dtml-with>
Notes
1. If you want you can paste the monthRange code into Zope directly but it needs modifications. In the Zope management interface, you must add 'dt' as a parameter to the function and paste in the following code :
from DateTime import DateTime
month_len =((0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31))
"""
Return a pair of DateTime values representing the
earliest and latest times in the month in which 'dt'
falls.
"""
y, m, d = dt.year(), dt.month(), dt.day()
first = DateTime( y, m, 1 )
last = first - 1 + month_len[ dt.isLeapYear() ][ m ]
return first.earliestTime(), last.latestTime()
The reason to modify the code is to get around the inability to get to the DateTime._month_len attribute because of the Zope engines restrictions.
2. The monthRange.py code that is in 0.2 CMFCalendar was not formatted properly when I downloaded it. It has carriage returns in it and Zope wants only line feeds. If you have a dos2unix command you can get rid of the carriage returns or you can run this short Python program which will do it as well :
infile = open('monthRange.py')
outfile = open('monthRange2.py', 'w+b')
lines = infile.readlines()
for i in range(len(lines)):
    line = lines[i][:-1] + '\n'
    outfile.write(line)
infile.close()
outfile.close()