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:
parent
344f7798ed
commit
72c86d700c
6 changed files with 160 additions and 44 deletions
|
@ -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"><<</a>
|
string:?cal_year=${calendar/previousYear}&cal_month=$month">«</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}"><</a>
|
string:?cal_year=${m/year}&cal_month=${m/month}">‹</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}">></a>
|
string:?cal_year=${m/year}&cal_month=${m/month}">›</a>
|
||||||
<a tal:attributes="href
|
<a tal:attributes="href
|
||||||
string:?cal_year=${calendar/nextYear}&cal_month=$month">>></a>
|
string:?cal_year=${calendar/nextYear}&cal_month=$month">»</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> </td>
|
<td> </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>
|
||||||
|
|
|
@ -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.
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue