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"
|
||||
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"><<</a>
|
||||
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>
|
||||
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>
|
||||
<td class="arrows" align="right">
|
||||
<a tal:define="m calendar/nextMonth"
|
||||
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
|
||||
string:?cal_year=${calendar/nextYear}&cal_month=$month">>></a>
|
||||
string:?cal_year=${calendar/nextYear}&cal_month=$month">»</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table width="100%"
|
||||
<table width="100%" class="calendar"
|
||||
tal:define="mc calendar/monthCalendar">
|
||||
<tr>
|
||||
<td> </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>
|
||||
|
|
|
@ -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.
|
@ -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"
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue