calender portlet basically OK

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3742 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-02-19 09:54:59 +00:00
parent 344f7798ed
commit 72c86d700c
6 changed files with 160 additions and 44 deletions

View file

@ -3,30 +3,31 @@
<metal:calendar define-macro="main" <metal:calendar define-macro="main"
tal:define="calendar nocall:context/@@calendar_info; tal:define="calendar nocall:context/@@calendar_info;
year calendar/selectedYear; year calendar/selectedYear;
month calendar/selectedMonth"> month calendar/selectedMonth;
<table width="100%"> events calendar/events">
<table width="100%" class="calendar">
<tr> <tr>
<td> <td class="arrows">
<a tal:attributes="href <a tal:attributes="href
string:?cal_year=${calendar/previousYear}&cal_month=$month">&lt;&lt;</a> string:?cal_year=${calendar/previousYear}&cal_month=$month">&laquo;</a>
<a tal:define="m calendar/previousMonth" <a tal:define="m calendar/previousMonth"
tal:attributes="href tal:attributes="href
string:?cal_year=${m/year}&cal_month=${m/month}">&lt;</a> string:?cal_year=${m/year}&cal_month=${m/month}">&lsaquo;</a>
</td> </td>
<td align="center"> <td align="center">
<span i18n:translate="" <span i18n:translate=""
tal:content="python:calendar.monthNames[month-1]">February</span> tal:content="python:calendar.monthNames[month-1]">February</span>
<span tal:content="year">2010</span></td> <span tal:content="year">2010</span></td>
<td> <td class="arrows" align="right">
<a tal:define="m calendar/nextMonth" <a tal:define="m calendar/nextMonth"
tal:attributes="href tal:attributes="href
string:?cal_year=${m/year}&cal_month=${m/month}">&gt;</a> string:?cal_year=${m/year}&cal_month=${m/month}">&rsaquo;</a>
<a tal:attributes="href <a tal:attributes="href
string:?cal_year=${calendar/nextYear}&cal_month=$month">&gt;&gt;</a> string:?cal_year=${calendar/nextYear}&cal_month=$month">&raquo;</a>
</td> </td>
</tr> </tr>
</table> </table>
<table width="100%" <table width="100%" class="calendar"
tal:define="mc calendar/monthCalendar"> tal:define="mc calendar/monthCalendar">
<tr> <tr>
<td>&nbsp;</td> <td>&nbsp;</td>
@ -37,16 +38,16 @@
</td> </td>
</tr> </tr>
<tr tal:repeat="week mc"> <tr tal:repeat="week mc">
<td align="center" <td align="center" class="week_number"
tal:content="python:calendar.getWeekNumber(week)"></td> tal:content="python:calendar.getWeekNumber(week)"></td>
<td align="center" <td align="center"
tal:attributes="style python:calendar.isToday(day) and tal:attributes="class python:'day ' + calendar.getCssClass(day)"
'border: 1px solid red'"
tal:repeat="day week"> tal:repeat="day week">
<span tal:define="events python:calendar.getEvents(day)"> <span tal:define="dayEvents python:day and events[day-1]">
<a tal:omit-tag="not:events" <a class="has_events"
tal:attributes="href string:#; tal:omit-tag="not:dayEvents"
style string:font-weight:bold" tal:attributes="href python:calendar.getEventsUrl(day);
title python:calendar.getEventTitles(day)"
tal:content="python: day or u''" /></span> tal:content="python: day or u''" /></span>
</td> </td>
</tr> </tr>

View file

@ -460,6 +460,27 @@ div.comment {
font-weight: bold; font-weight: bold;
} }
.calendar td.arrows {
font-size: 130%;
}
.calendar td.week_number {
color: grey;
}
.calendar td.day {
width: 12%;
}
.calendar td.today {
border: 1px solid red;
font-weight: normal;
}
.calendar a.has_events {
font-weight: bold;
}
/* dojo stuff */ /* dojo stuff */
.dijitDialog { .dijitDialog {

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: $Id$\n" "Project-Id-Version: $Id$\n"
"POT-Creation-Date: 2007-05-22 12:00 CET\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n"
"PO-Revision-Date: 2010-01-11 12:00 CET\n" "PO-Revision-Date: 2010-02-19 12:00 CET\n"
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n" "Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
"Language-Team: loops developers <helmutm@cy55.de>\n" "Language-Team: loops developers <helmutm@cy55.de>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -559,6 +559,9 @@ msgstr "Zielobjekt zuordnen"
msgid "Search Term" msgid "Search Term"
msgstr "Suchbegriff" msgstr "Suchbegriff"
msgid "Calendar"
msgstr "Kalender"
msgid "Day" msgid "Day"
msgstr "Tag" msgstr "Tag"
@ -595,3 +598,39 @@ msgstr "Samstag"
msgid "Sunday" msgid "Sunday"
msgstr "Sonntag" msgstr "Sonntag"
msgid "Tu"
msgstr "Di"
msgid "We"
msgstr "Mi"
msgid "Th"
msgstr "Do"
msgid "Su"
msgstr "So"
msgid "January"
msgstr "Januar"
msgid "February"
msgstr "Februar"
msgid "March"
msgstr "März"
msgid "May"
msgstr "Mai"
msgid "June"
msgstr "Juni"
msgid "July"
msgstr "Juli"
msgid "October"
msgstr "Oktober"
msgid "December"
msgstr "Dezember"

View file

@ -24,6 +24,7 @@ $Id$
import calendar import calendar
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from urllib import urlencode
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
@ -31,6 +32,7 @@ from zope.cachedescriptors.property import Lazy
from cybertools.meta.interfaces import IOptions from cybertools.meta.interfaces import IOptions
from loops.browser.action import DialogAction from loops.browser.action import DialogAction
from loops.browser.concept import ConceptView from loops.browser.concept import ConceptView
from loops.browser.node import NodeView
from loops.common import adapted from loops.common import adapted
from loops.util import _ from loops.util import _
@ -38,25 +40,7 @@ from loops.util import _
organize_macros = ViewPageTemplateFile('view_macros.pt') organize_macros = ViewPageTemplateFile('view_macros.pt')
class BaseEvents(object): class Events(ConceptView):
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):
@ -77,8 +61,39 @@ class Events(ConceptView, BaseEvents):
self.registerDojoDateWidget() self.registerDojoDateWidget()
return actions return actions
@Lazy
def selectedDate(self):
year = int(self.request.get('cal_year') or 0)
month = int(self.request.get('cal_month') or 0)
day = int(self.request.get('cal_day') or 0)
if year and month and day:
return datetime(year, month, day)
return None
class CalendarInfo(BaseEvents): 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))
if self.selectedDate:
end = self.selectedDate + timedelta(1)
return sorted((rv for rv in relViews
if rv.adapted.start >= self.selectedDate and
rv.adapted.start < end),
key=sort)
else:
return sorted((rv for rv in relViews
if not rv.adapted.end or
rv.adapted.end >= now - timedelta(delta)),
key=sort)
class CalendarInfo(NodeView):
monthNames = ('January', 'February', 'March', 'April', 'May', 'June', monthNames = ('January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December') 'July', 'August', 'September', 'October', 'November', 'December')
@ -144,9 +159,48 @@ class CalendarInfo(BaseEvents):
break break
return datetime(self.selectedYear, self.selectedMonth, day).isocalendar()[1] return datetime(self.selectedYear, self.selectedMonth, day).isocalendar()[1]
def getEvents(self, day): @Lazy
if not day: def eventListQuery(self):
return False calOption = self.globalOptions('organize.showCalendar')
d = datetime(self.selectedYear, self.selectedMonth, day) if isinstance(calOption, list):
return [] qu = self.conceptManager.get(calOption[0])
return Events(qu, self.request)
return None
@Lazy
def events(self):
eventList = [[] for i in range(31)]
cm = self.loopsRoot.getConceptManager()
tEvent = cm['event']
hasType = cm.getTypePredicate()
start = datetime(self.selectedYear, self.selectedMonth, 1)
end = start + timedelta(31)
view = self.eventListQuery
if view is not None:
relViews = (view.childViewFactory(r, self.request, contextIsSecond=True)
for r in tEvent.getChildRelations([hasType], sort=None))
events = sorted((rv for rv in relViews
if rv.adapted.start >= start and rv.adapted.start < end),
key=lambda x: (x.adapted.start, x.adapted.end))
for ev in events:
day = ev.adapted.start.day
eventList[day-1].append(ev)
return eventList
def getEventsUrl(self, day):
v = self.eventListQuery
if v is not None:
baseUrl = self.getUrlForTarget(v)
params = dict(cal_year=self.selectedYear, cal_month=self.selectedMonth,
cal_day=day)
return '?'.join((baseUrl, urlencode(params)))
def getCssClass(self, day, tag='td'):
if tag == 'td':
if self.isToday(day):
return 'today'
return ''
def getEventTitles(self, day):
events = self.events[day-1]
return '; '.join(ev.title for ev in events)

View file

@ -35,9 +35,10 @@
<div tal:repeat="related item/events"> <div tal:repeat="related item/events">
<tal:child define="data related/data"> <tal:child define="data related/data">
<h2 class="headline"> <h2 class="headline">
<a href="#" <a tal:define="start related/adapted/start"
tal:content="related/title" tal:content="related/title"
tal:attributes="href python: view.getUrlForTarget(related);">Event</a> tal:attributes="href python: '%s?cal_year=%s&cal_month=%s' %
(view.getUrlForTarget(related), start.year, start.month);" />
</h2> </h2>
<div class="description" <div class="description"
tal:define="description data/description" tal:define="description data/description"