From 72c86d700cd9b6a17da9e3fe4835350802d19321 Mon Sep 17 00:00:00 2001 From: helmutm Date: Fri, 19 Feb 2010 09:54:59 +0000 Subject: [PATCH] calender portlet basically OK git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3742 fd906abe-77d9-0310-91a1-e0d9ade77398 --- browser/calendar.pt | 33 +++++----- browser/loops.css | 21 +++++++ locales/de/LC_MESSAGES/loops.mo | Bin 11104 -> 11516 bytes locales/de/LC_MESSAGES/loops.po | 41 ++++++++++++- organize/browser/event.py | 104 ++++++++++++++++++++++++-------- organize/browser/view_macros.pt | 5 +- 6 files changed, 160 insertions(+), 44 deletions(-) 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 53e07b5c36a43234aff4e9f6a00b8b9d9ed478ce..28ca5cb3cb0a968c6494af6f3b1a0de9a3ba67d9 100644 GIT binary patch delta 4746 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 M)7\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);" />

 
- - +