work in progress: calendar portlet
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3741 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									636a61524a
								
							
						
					
					
						commit
						344f7798ed
					
				
					 5 changed files with 176 additions and 16 deletions
				
			
		
							
								
								
									
										54
									
								
								browser/calendar.pt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								browser/calendar.pt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,54 @@ | ||||||
|  | <!-- $Id$ --> | ||||||
|  | 
 | ||||||
|  | <metal:calendar define-macro="main" | ||||||
|  |                 tal:define="calendar nocall:context/@@calendar_info; | ||||||
|  |                             year calendar/selectedYear; | ||||||
|  |                             month calendar/selectedMonth"> | ||||||
|  |   <table width="100%"> | ||||||
|  |     <tr> | ||||||
|  |       <td> | ||||||
|  |         <a tal:attributes="href | ||||||
|  |             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> | ||||||
|  |       </td> | ||||||
|  |       <td align="center"> | ||||||
|  |         <span i18n:translate="" | ||||||
|  |               tal:content="python:calendar.monthNames[month-1]">February</span> | ||||||
|  |         <span tal:content="year">2010</span></td> | ||||||
|  |       <td> | ||||||
|  |         <a tal:define="m calendar/nextMonth" | ||||||
|  |            tal:attributes="href | ||||||
|  |             string:?cal_year=${m/year}&cal_month=${m/month}">></a> | ||||||
|  |         <a tal:attributes="href | ||||||
|  |             string:?cal_year=${calendar/nextYear}&cal_month=$month">>></a> | ||||||
|  |       </td> | ||||||
|  |     </tr> | ||||||
|  |   </table> | ||||||
|  |   <table width="100%" | ||||||
|  |          tal:define="mc calendar/monthCalendar"> | ||||||
|  |     <tr> | ||||||
|  |       <td> </td> | ||||||
|  |       <td align="center" | ||||||
|  |           tal:repeat="weekday calendar/weekDays"> | ||||||
|  |         <span i18n:translate="" | ||||||
|  |               tal:content="weekday" /> | ||||||
|  |       </td> | ||||||
|  |     </tr> | ||||||
|  |     <tr tal:repeat="week mc"> | ||||||
|  |       <td align="center" | ||||||
|  |           tal:content="python:calendar.getWeekNumber(week)"></td> | ||||||
|  |       <td align="center" | ||||||
|  |           tal:attributes="style python:calendar.isToday(day) and | ||||||
|  |                             'border: 1px solid red'" | ||||||
|  |           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" | ||||||
|  |              tal:content="python: day or u''" /></span> | ||||||
|  |       </td> | ||||||
|  |     </tr> | ||||||
|  |   </table> | ||||||
|  | </metal:calendar> | ||||||
|  | @ -66,6 +66,7 @@ from loops.versioning.util import getVersion | ||||||
| 
 | 
 | ||||||
| node_macros = ViewPageTemplateFile('node_macros.pt') | node_macros = ViewPageTemplateFile('node_macros.pt') | ||||||
| info_macros = ViewPageTemplateFile('info.pt') | info_macros = ViewPageTemplateFile('info.pt') | ||||||
|  | calendar_macros = ViewPageTemplateFile('calendar.pt') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class NodeView(BaseView): | class NodeView(BaseView): | ||||||
|  | @ -141,6 +142,10 @@ class NodeView(BaseView): | ||||||
|                             subMacro=node_macros.macros['presence'], |                             subMacro=node_macros.macros['presence'], | ||||||
|                             icon='cybertools.icons/group.png', |                             icon='cybertools.icons/group.png', | ||||||
|                             priority=11) |                             priority=11) | ||||||
|  |             if self.globalOptions('organize.showCalendar'): | ||||||
|  |                 cm.register('portlet_left', 'calendar', title=_(u'Calendar'), | ||||||
|  |                             subMacro=calendar_macros.macros['main'], | ||||||
|  |                             priority=90) | ||||||
|         # force early portlet registrations by target by setting up target view |         # force early portlet registrations by target by setting up target view | ||||||
|         self.virtualTarget |         self.virtualTarget | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -423,6 +423,24 @@ Show Presence of Other Users | ||||||
|   >>> component.provideUtility(Presence()) |   >>> component.provideUtility(Presence()) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | Calendar | ||||||
|  | ======== | ||||||
|  | 
 | ||||||
|  |   >>> from loops.organize.browser.event import CalendarInfo | ||||||
|  |   >>> calendar = CalendarInfo(menu, TestRequest(cal_year=2009, cal_month=2)) | ||||||
|  |   >>> mc = calendar.monthCalendar | ||||||
|  |   >>> mc | ||||||
|  |   [[0, 0, 0, 0, 0, 0, 1], | ||||||
|  |    [2, 3, 4, 5, 6, 7, 8], | ||||||
|  |    [9, 10, 11, 12, 13, 14, 15], | ||||||
|  |    [16, 17, 18, 19, 20, 21, 22], | ||||||
|  |    [23, 24, 25, 26, 27, 28, 0]] | ||||||
|  |   >>> calendar.getWeekNumber(mc[0]) | ||||||
|  |   5 | ||||||
|  |   >>> calendar.isToday(18) | ||||||
|  |   False | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| Fin de partie | Fin de partie | ||||||
| ============= | ============= | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -69,6 +69,12 @@ | ||||||
|       factory="loops.organize.browser.party.SendEmail" |       factory="loops.organize.browser.party.SendEmail" | ||||||
|       permission="zope.View" /> |       permission="zope.View" /> | ||||||
| 
 | 
 | ||||||
|  |   <browser:page | ||||||
|  |       name="calendar_info" | ||||||
|  |       for="loops.interfaces.ILoopsObject" | ||||||
|  |       class="loops.organize.browser.event.CalendarInfo" | ||||||
|  |       permission="zope.View" /> | ||||||
|  | 
 | ||||||
|   <!-- authentication --> |   <!-- authentication --> | ||||||
| 
 | 
 | ||||||
|   <browser:addform |   <browser:addform | ||||||
|  |  | ||||||
|  | @ -22,7 +22,8 @@ Definition of view classes and other browser related stuff for tasks. | ||||||
| $Id$ | $Id$ | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from datetime import datetime, timedelta | import calendar | ||||||
|  | from datetime import date, datetime, timedelta | ||||||
| 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 | ||||||
|  | @ -37,7 +38,25 @@ from loops.util import _ | ||||||
| organize_macros = ViewPageTemplateFile('view_macros.pt') | organize_macros = ViewPageTemplateFile('view_macros.pt') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class Events(ConceptView): | 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): | ||||||
| 
 | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def macro(self): |     def macro(self): | ||||||
|  | @ -58,18 +77,76 @@ class Events(ConceptView): | ||||||
|             self.registerDojoDateWidget() |             self.registerDojoDateWidget() | ||||||
|         return actions |         return actions | ||||||
| 
 | 
 | ||||||
|     def events(self): | 
 | ||||||
|         cm = self.loopsRoot.getConceptManager() | class CalendarInfo(BaseEvents): | ||||||
|         tEvent = cm['event'] | 
 | ||||||
|         hasType = cm.getTypePredicate() |     monthNames = ('January', 'February', 'March', 'April', 'May', 'June', | ||||||
|         now = datetime.today() |                   'July', 'August', 'September', 'October', 'November', 'December') | ||||||
|         delta = int(self.request.get('delta', | 
 | ||||||
|                         IOptions(adapted(self.context))('delta', [0])[0])) |     weekDays = ('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su') | ||||||
|         sort = lambda x: x.adapted.start or now | 
 | ||||||
|         relViews = (self.childViewFactory(r, self.request, contextIsSecond=True) |     def __init__(self, context, request): | ||||||
|                         for r in tEvent.getChildRelations([hasType], sort=None)) |         self.context = context | ||||||
|         return sorted((rv for rv in relViews |         self.request = request | ||||||
|                           if not rv.adapted.end or | 
 | ||||||
|                              rv.adapted.end >= now - timedelta(delta)), |     @Lazy | ||||||
|                       key=sort) |     def today(self): | ||||||
|  |         return date.today() | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def selectedYear(self): | ||||||
|  |         return int(self.request.get('cal_year') or self.today.year) | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def selectedMonth(self): | ||||||
|  |         return int(self.request.get('cal_month') or self.today.month) | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def previousYear(self): | ||||||
|  |         return self.selectedYear - 1 | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def nextYear(self): | ||||||
|  |         return self.selectedYear + 1 | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def previousMonth(self): | ||||||
|  |         m = self.selectedMonth | ||||||
|  |         y = self.selectedYear | ||||||
|  |         if m == 1: | ||||||
|  |             y, m = y - 1, 12 | ||||||
|  |         else: | ||||||
|  |             m -= 1 | ||||||
|  |         return dict(year=y, month=m) | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def nextMonth(self): | ||||||
|  |         m = self.selectedMonth | ||||||
|  |         y = self.selectedYear | ||||||
|  |         if m == 12: | ||||||
|  |             y, m = y + 1, 1 | ||||||
|  |         else: | ||||||
|  |             m += 1 | ||||||
|  |         return dict(year=y, month=m) | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def monthCalendar(self): | ||||||
|  |         return calendar.monthcalendar(self.selectedYear, self.selectedMonth) | ||||||
|  | 
 | ||||||
|  |     def isToday(self, day): | ||||||
|  |         if not day: | ||||||
|  |             return False | ||||||
|  |         return date(self.selectedYear, self.selectedMonth, day) == self.today | ||||||
|  | 
 | ||||||
|  |     def getWeekNumber(self, week): | ||||||
|  |         for day in week: | ||||||
|  |             if day: | ||||||
|  |                 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 [] | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm