Following code was sent to me by Marcus Priesch. I modified it for Roundup 0.8. I am assuming you have added a Date field called 'deadline' to your 'issue' class.
This customization is structured as follows: A file called '_generic.calendar.html' in the 'html' folder of your tracker home, a file called 'datehelp.py' in the 'extensions' folder of your tracker home, and code to display the link in your item template.
To display the link for the DateHelp in your item template use following tag: '<span tal:content="structure python:utils.date_help(request, context.deadline)"/>' Put the tag in your 'issue.item.html' template.
The 'utils.date_help' call has following arguments:
- *request*: The request object. Just leave this.
- *item*: The name of the property you wish to modify. Should probably be of the form 'context.property'
- *width*: (optional) The width of the popup window, default=300
- *height*: (optional) The height of the popup window, default=200
- *label*: (optional) The link text to display, default="(cal)"
- *form*: (optional) The form to write the selected date back to, default="itemSynopsis"
In the html folder of your tracker home add a file called '_generic.calendar.html' with following contents::
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="@@file/style.css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8;" />
<title tal:content="string:Roundup Calendar"></title>
<disabled script language="Javascript"
type="text/javascript"
tal:content="structure string:
// this is the name of the field in the original form that we're working on
form = window.opener.document.${request/form/form/value};
field = '${request/form/property/value}';" >
<disabled /script>
</head>
<body class="body"
tal:content="structure python:utils.html_calendar (request)">
</body>
</html>In the extensions folder of your tracker home add a file called 'datehelp.py' with following contents::
from roundup import date
import calendar
import time
r_date = date
def date_help ( request
, item
, width = 300
, height = 200
, label = "(cal)"
, form = "itemSynopsis"
) :
"""dump out the link to a calendar pop-up window
item: HTMLProperty e.g.: context.deadline
"""
if item.isset () :
date = "&date=%s" % item
else :
date = ""
return ( """<a class="classhelp" """
"""href="javascript:help_window """
"""('%s?@template=calendar"""
"""&property=%s"""
"""&form=%s%s', %d, %d)">%s</a>"""
% ( request.classname
, item._name
, form
, date
, width
, height
, label
)
)
# end def date_help
def html_calendar (request) :
"""returns a html calendar.
`request` the roundup.request object
- @template : name of the template
- form : name of the form to store back the date
- property : name of the property of the form to store
back the date
- date : current date
- display : when browsing, specifies year and month
html will simply be a table.
"""
print request.form
date_str = request.form.getfirst ("date", ".")
display = request.form.getfirst ("display", date_str)
template = request.form.getfirst ("@template", "calendar")
form = request.form.getfirst ("form")
property = request.form.getfirst ("property")
curr_date = r_date.Date (date_str) # to highlight
display = r_date.Date (display) # to show
year = display.year
month = display.month
day = display.day
# for navigation
date_prev_month = display + r_date.Interval ("-1m")
date_next_month = display + r_date.Interval ("+1m")
date_prev_year = display + r_date.Interval ("-1y")
date_next_year = display + r_date.Interval ("+1y")
res = []
res.append ("""<table class="calendar">""")
base_link = "%s?@template=%s&property=%s&form=%s&date=%s" % \
(request.classname, template, property, form, curr_date)
# navigation
# month
res.append (""" <tr>""")
res.append (""" <td>""")
res.append (""" <table width="100%" class="calendar_nav">""")
res.append (""" <tr>""")
link = base_link + "&display=%s" % date_prev_month
res.append (""" <td><a href="%s"><</a></td>""" % link)
res.append (""" <td>%s</td>""" % calendar.month_name [month])
link = base_link + "&display=%s" % date_next_month
res.append (""" <td><a href="%s">></a></td>""" % link)
# spacer
res.append (""" <td width="100%"></td>""")
# year
link = base_link + "&display=%s" % date_prev_year
res.append (""" <td><a href="%s"><</a></td>""" % link)
res.append (""" <td>%s</td>""" % year)
link = base_link + "&display=%s" % date_next_year
res.append (""" <td><a href="%s">></a></td>""" % link)
res.append (""" </tr>""")
res.append (""" </table>""")
res.append (""" </td>""")
res.append (""" </tr>""")
# the calendar
res.append (""" <tr>""")
res.append (""" <td>""")
res.append (""" <table class="calendar_display">""")
res.append (""" <tr class="weekdays">""")
for day_ in calendar.weekheader (3).split () :
res.append \
(""" <td>%s</td>""" % day_)
res.append (""" </tr>""")
for week_ in calendar.monthcalendar (year, month) :
res.append \
(""" <tr>""")
for day_ in week_ :
link = "javascript:form[field].value = '%d-%02d-%02d'; " \
"window.close ();" % (year, month, day_)
print curr_date, day_, month, year
if day_ == curr_date.day and \
month == curr_date.month and \
year == curr_date.year :
# highlight
style = "today"
else :
style = ""
if day_ :
res.append \
(""" <td class="%s"><a href="%s">%s</a></td>""" %
(style, link, day_))
else :
res.append \
(""" <td></td>""")
res.append \
(""" </tr>""")
res.append (""" </table>""")
res.append (""" </tb>""")
res.append (""" </tr>""")
res.append ("""</table>""")
return "\n".join (res)
# end def html_calendar
def init(instance):
instance.registerUtil('date_help', date_help)
instance.registerUtil('html_calendar', html_calendar)