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:
parent
636a61524a
commit
344f7798ed
5 changed files with 176 additions and 16 deletions
54
browser/calendar.pt
Normal file
54
browser/calendar.pt
Normal 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"><<</a>
|
||||||
|
<a tal:define="m calendar/previousMonth"
|
||||||
|
tal:attributes="href
|
||||||
|
string:?cal_year=${m/year}&cal_month=${m/month}"><</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}">></a>
|
||||||
|
<a tal:attributes="href
|
||||||
|
string:?cal_year=${calendar/nextYear}&cal_month=$month">>></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<table width="100%"
|
||||||
|
tal:define="mc calendar/monthCalendar">
|
||||||
|
<tr>
|
||||||
|
<td> </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>
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 []
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue