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
	
	 helmutm
						helmutm