work in progress: calendar portlet

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3741 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-02-17 16:33:07 +00:00
parent 636a61524a
commit 344f7798ed
5 changed files with 176 additions and 16 deletions

54
browser/calendar.pt Normal file
View file

@ -0,0 +1,54 @@
<!-- $Id$ -->
<metal:calendar define-macro="main"
tal:define="calendar nocall:context/@@calendar_info;
year calendar/selectedYear;
month calendar/selectedMonth">
<table width="100%">
<tr>
<td>
<a tal:attributes="href
string:?cal_year=${calendar/previousYear}&cal_month=$month">&lt;&lt;</a>
<a tal:define="m calendar/previousMonth"
tal:attributes="href
string:?cal_year=${m/year}&cal_month=${m/month}">&lt;</a>
</td>
<td align="center">
<span i18n:translate=""
tal:content="python:calendar.monthNames[month-1]">February</span>
<span tal:content="year">2010</span></td>
<td>
<a tal:define="m calendar/nextMonth"
tal:attributes="href
string:?cal_year=${m/year}&cal_month=${m/month}">&gt;</a>
<a tal:attributes="href
string:?cal_year=${calendar/nextYear}&cal_month=$month">&gt;&gt;</a>
</td>
</tr>
</table>
<table width="100%"
tal:define="mc calendar/monthCalendar">
<tr>
<td>&nbsp;</td>
<td align="center"
tal:repeat="weekday calendar/weekDays">
<span i18n:translate=""
tal:content="weekday" />
</td>
</tr>
<tr tal:repeat="week mc">
<td align="center"
tal:content="python:calendar.getWeekNumber(week)"></td>
<td align="center"
tal:attributes="style python:calendar.isToday(day) and
'border: 1px solid red'"
tal:repeat="day week">
<span tal:define="events python:calendar.getEvents(day)">
<a tal:omit-tag="not:events"
tal:attributes="href string:#;
style string:font-weight:bold"
tal:content="python: day or u''" /></span>
</td>
</tr>
</table>
</metal:calendar>

View file

@ -66,6 +66,7 @@ from loops.versioning.util import getVersion
node_macros = ViewPageTemplateFile('node_macros.pt')
info_macros = ViewPageTemplateFile('info.pt')
calendar_macros = ViewPageTemplateFile('calendar.pt')
class NodeView(BaseView):
@ -141,6 +142,10 @@ class NodeView(BaseView):
subMacro=node_macros.macros['presence'],
icon='cybertools.icons/group.png',
priority=11)
if self.globalOptions('organize.showCalendar'):
cm.register('portlet_left', 'calendar', title=_(u'Calendar'),
subMacro=calendar_macros.macros['main'],
priority=90)
# force early portlet registrations by target by setting up target view
self.virtualTarget

View file

@ -423,6 +423,24 @@ Show Presence of Other Users
>>> component.provideUtility(Presence())
Calendar
========
>>> from loops.organize.browser.event import CalendarInfo
>>> calendar = CalendarInfo(menu, TestRequest(cal_year=2009, cal_month=2))
>>> mc = calendar.monthCalendar
>>> mc
[[0, 0, 0, 0, 0, 0, 1],
[2, 3, 4, 5, 6, 7, 8],
[9, 10, 11, 12, 13, 14, 15],
[16, 17, 18, 19, 20, 21, 22],
[23, 24, 25, 26, 27, 28, 0]]
>>> calendar.getWeekNumber(mc[0])
5
>>> calendar.isToday(18)
False
Fin de partie
=============

View file

@ -69,6 +69,12 @@
factory="loops.organize.browser.party.SendEmail"
permission="zope.View" />
<browser:page
name="calendar_info"
for="loops.interfaces.ILoopsObject"
class="loops.organize.browser.event.CalendarInfo"
permission="zope.View" />
<!-- authentication -->
<browser:addform

View file

@ -22,7 +22,8 @@ Definition of view classes and other browser related stuff for tasks.
$Id$
"""
from datetime import datetime, timedelta
import calendar
from datetime import date, datetime, timedelta
from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
@ -37,7 +38,25 @@ from loops.util import _
organize_macros = ViewPageTemplateFile('view_macros.pt')
class Events(ConceptView):
class BaseEvents(object):
def events(self):
cm = self.loopsRoot.getConceptManager()
tEvent = cm['event']
hasType = cm.getTypePredicate()
now = datetime.today()
delta = int(self.request.get('delta',
IOptions(adapted(self.context))('delta', [0])[0]))
sort = lambda x: x.adapted.start or now
relViews = (self.childViewFactory(r, self.request, contextIsSecond=True)
for r in tEvent.getChildRelations([hasType], sort=None))
return sorted((rv for rv in relViews
if not rv.adapted.end or
rv.adapted.end >= now - timedelta(delta)),
key=sort)
class Events(ConceptView, BaseEvents):
@Lazy
def macro(self):
@ -58,18 +77,76 @@ class Events(ConceptView):
self.registerDojoDateWidget()
return actions
def events(self):
cm = self.loopsRoot.getConceptManager()
tEvent = cm['event']
hasType = cm.getTypePredicate()
now = datetime.today()
delta = int(self.request.get('delta',
IOptions(adapted(self.context))('delta', [0])[0]))
sort = lambda x: x.adapted.start or now
relViews = (self.childViewFactory(r, self.request, contextIsSecond=True)
for r in tEvent.getChildRelations([hasType], sort=None))
return sorted((rv for rv in relViews
if not rv.adapted.end or
rv.adapted.end >= now - timedelta(delta)),
key=sort)
class CalendarInfo(BaseEvents):
monthNames = ('January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December')
weekDays = ('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su')
def __init__(self, context, request):
self.context = context
self.request = request
@Lazy
def today(self):
return date.today()
@Lazy
def selectedYear(self):
return int(self.request.get('cal_year') or self.today.year)
@Lazy
def selectedMonth(self):
return int(self.request.get('cal_month') or self.today.month)
@Lazy
def previousYear(self):
return self.selectedYear - 1
@Lazy
def nextYear(self):
return self.selectedYear + 1
@Lazy
def previousMonth(self):
m = self.selectedMonth
y = self.selectedYear
if m == 1:
y, m = y - 1, 12
else:
m -= 1
return dict(year=y, month=m)
@Lazy
def nextMonth(self):
m = self.selectedMonth
y = self.selectedYear
if m == 12:
y, m = y + 1, 1
else:
m += 1
return dict(year=y, month=m)
@Lazy
def monthCalendar(self):
return calendar.monthcalendar(self.selectedYear, self.selectedMonth)
def isToday(self, day):
if not day:
return False
return date(self.selectedYear, self.selectedMonth, day) == self.today
def getWeekNumber(self, week):
for day in week:
if day:
break
return datetime(self.selectedYear, self.selectedMonth, day).isocalendar()[1]
def getEvents(self, day):
if not day:
return False
d = datetime(self.selectedYear, self.selectedMonth, day)
return []