diff --git a/browser/calendar.pt b/browser/calendar.pt index daaa793..88e0910 100644 --- a/browser/calendar.pt +++ b/browser/calendar.pt @@ -3,30 +3,31 @@ - + month calendar/selectedMonth; + events calendar/events"> +
- -
+ << + string:?cal_year=${calendar/previousYear}&cal_month=$month">« < + string:?cal_year=${m/year}&cal_month=${m/month}">‹ February 2010 + > + string:?cal_year=${m/year}&cal_month=${m/month}">› >> + string:?cal_year=${calendar/nextYear}&cal_month=$month">»
- @@ -37,16 +38,16 @@ - diff --git a/browser/loops.css b/browser/loops.css index 4b7ed18..0bc8ded 100644 --- a/browser/loops.css +++ b/browser/loops.css @@ -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 { diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 53e07b5..28ca5cb 100644 Binary files a/locales/de/LC_MESSAGES/loops.mo and b/locales/de/LC_MESSAGES/loops.mo differ diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index e7ec839..7242934 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -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 \n" "Language-Team: loops developers \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" + diff --git a/organize/browser/event.py b/organize/browser/event.py index a6b19c8..7cb039d 100644 --- a/organize/browser/event.py +++ b/organize/browser/event.py @@ -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) diff --git a/organize/browser/view_macros.pt b/organize/browser/view_macros.pt index 1d598aa..71a44c0 100644 --- a/organize/browser/view_macros.pt +++ b/organize/browser/view_macros.pt @@ -35,9 +35,10 @@

- Event + tal:attributes="href python: '%s?cal_year=%s&cal_month=%s' % + (view.getUrlForTarget(related), start.year, start.month);" />

 
- - +