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') node_macros = ViewPageTemplateFile('node_macros.pt')
info_macros = ViewPageTemplateFile('info.pt') info_macros = ViewPageTemplateFile('info.pt')
calendar_macros = ViewPageTemplateFile('calendar.pt')
class NodeView(BaseView): class NodeView(BaseView):
@ -141,6 +142,10 @@ class NodeView(BaseView):
subMacro=node_macros.macros['presence'], subMacro=node_macros.macros['presence'],
icon='cybertools.icons/group.png', icon='cybertools.icons/group.png',
priority=11) 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 # force early portlet registrations by target by setting up target view
self.virtualTarget self.virtualTarget

View file

@ -423,6 +423,24 @@ Show Presence of Other Users
>>> component.provideUtility(Presence()) >>> 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 Fin de partie
============= =============

View file

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

View file

@ -22,7 +22,8 @@ Definition of view classes and other browser related stuff for tasks.
$Id$ $Id$
""" """
from datetime import datetime, timedelta import calendar
from datetime import date, datetime, timedelta
from zope import interface, component from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
@ -37,7 +38,25 @@ from loops.util import _
organize_macros = ViewPageTemplateFile('view_macros.pt') 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 @Lazy
def macro(self): def macro(self):
@ -58,18 +77,76 @@ class Events(ConceptView):
self.registerDojoDateWidget() self.registerDojoDateWidget()
return actions return actions
def events(self):
cm = self.loopsRoot.getConceptManager() class CalendarInfo(BaseEvents):
tEvent = cm['event']
hasType = cm.getTypePredicate() monthNames = ('January', 'February', 'March', 'April', 'May', 'June',
now = datetime.today() 'July', 'August', 'September', 'October', 'November', 'December')
delta = int(self.request.get('delta',
IOptions(adapted(self.context))('delta', [0])[0])) weekDays = ('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su')
sort = lambda x: x.adapted.start or now
relViews = (self.childViewFactory(r, self.request, contextIsSecond=True) def __init__(self, context, request):
for r in tEvent.getChildRelations([hasType], sort=None)) self.context = context
return sorted((rv for rv in relViews self.request = request
if not rv.adapted.end or
rv.adapted.end >= now - timedelta(delta)), @Lazy
key=sort) 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 []