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

View file

@ -460,6 +460,27 @@ div.comment {
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 */
.dijitDialog {

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: $Id$\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"
"Language-Team: loops developers <helmutm@cy55.de>\n"
"MIME-Version: 1.0\n"
@ -559,6 +559,9 @@ msgstr "Zielobjekt zuordnen"
msgid "Search Term"
msgstr "Suchbegriff"
msgid "Calendar"
msgstr "Kalender"
msgid "Day"
msgstr "Tag"
@ -595,3 +598,39 @@ msgstr "Samstag"
msgid "Sunday"
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
from datetime import date, datetime, timedelta
from urllib import urlencode
from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
@ -31,6 +32,7 @@ from zope.cachedescriptors.property import Lazy
from cybertools.meta.interfaces import IOptions
from loops.browser.action import DialogAction
from loops.browser.concept import ConceptView
from loops.browser.node import NodeView
from loops.common import adapted
from loops.util import _
@ -38,25 +40,7 @@ from loops.util import _
organize_macros = ViewPageTemplateFile('view_macros.pt')
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):
class Events(ConceptView):
@Lazy
def macro(self):
@ -77,8 +61,39 @@ class Events(ConceptView, BaseEvents):
self.registerDojoDateWidget()
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',
'July', 'August', 'September', 'October', 'November', 'December')
@ -144,9 +159,48 @@ class CalendarInfo(BaseEvents):
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 []
@Lazy
def eventListQuery(self):
calOption = self.globalOptions('organize.showCalendar')
if isinstance(calOption, list):
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">
<tal:child define="data related/data">
<h2 class="headline">
<a href="#"
<a tal:define="start related/adapted/start"
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>
<div class="description"
tal:define="description data/description"