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')
|
||||
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
|
||||
|
||||
|
|
|
@ -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
|
||||
=============
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 []
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue