Remove old materials from categories
[cds-indico.git] / indico / MaKaC / webinterface / pages / category.py
blob9445260d26e9c485872e883a4760e014709df969
1 # This file is part of Indico.
2 # Copyright (C) 2002 - 2015 European Organization for Nuclear Research (CERN).
4 # Indico is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License as
6 # published by the Free Software Foundation; either version 3 of the
7 # License, or (at your option) any later version.
9 # Indico is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with Indico; if not, see <http://www.gnu.org/licenses/>.
17 from copy import copy
18 from flask import session
19 from xml.sax.saxutils import quoteattr
20 from datetime import timedelta, datetime
21 import time
22 import os
23 import calendar
24 import MaKaC.webinterface.pages.main as main
25 import MaKaC.webinterface.urlHandlers as urlHandlers
26 import MaKaC.webinterface.wcomponents as wcomponents
27 from MaKaC.webinterface.wcalendar import Overview
28 import MaKaC.conference as conference
29 from MaKaC.conference import CategoryManager
30 from indico.core.config import Config
31 import MaKaC.webinterface.wcalendar as wcalendar
32 import MaKaC.webinterface.linking as linking
33 from MaKaC.webinterface.pages.metadata import WICalExportBase
34 from MaKaC import schedule
35 import MaKaC.common.info as info
36 from MaKaC.i18n import _
37 from indico.modules.users.legacy import AvatarUserWrapper
38 from indico.modules.groups.legacy import GroupWrapper
39 from indico.util.i18n import i18nformat
41 from MaKaC.webinterface.common.timezones import TimezoneRegistry
42 from MaKaC.webinterface.common.tools import escape_html
43 from MaKaC.common.timezoneUtils import DisplayTZ,nowutc
44 from pytz import timezone
45 from MaKaC.common.TemplateExec import truncateTitle
47 from MaKaC.common.fossilize import fossilize
49 from indico.core import signals
50 from indico.core.index import Catalog
51 from indico.modules import ModuleHolder
52 from indico.modules.upcoming import WUpcomingEvents
53 from indico.util.signals import values_from_signal
56 class WPCategoryBase (main.WPMainBase):
57 def __init__(self, rh, categ, **kwargs):
58 main.WPMainBase.__init__(self, rh, **kwargs)
59 self._target = categ
60 title = "Indico"
61 if self._target:
62 title = "Indico [%s]"%(self._target.getName() )
63 self._setTitle(title)
64 self._conf = None
66 def getCSSFiles(self):
67 return main.WPMainBase.getCSSFiles(self) + self._asset_env['category_sass'].urls()
69 def _currentCategory(self):
70 return self._target
73 class WPCategoryDisplayBase(WPCategoryBase):
74 pass
77 class WCategoryDisplay(WICalExportBase):
79 def __init__(self, target, wfReg, tz):
80 self._target = target
81 self._wfReg = wfReg
82 self._timezone = timezone(tz)
84 def _getResourceName(self, resource):
85 if isinstance(resource, conference.Link):
86 return resource.getName() if resource.getName() != "" and resource.getName() != resource.getURL() \
87 else resource.getURL()
88 else:
89 return resource.getName() if resource.getName() != "" and resource.getName() != resource.getFileName() \
90 else resource.getFileName()
92 def getHTML(self, aw, params):
93 self._aw = aw
94 return wcomponents.WTemplated.getHTML(self, params)
96 def getVars(self):
97 vars = wcomponents.WTemplated.getVars(self)
98 isRootCategory = self._target.getId() == "0"
100 vars["name"] = self._target.getName()
101 vars["description"] = self._target.getDescription()
102 vars["img"] = self._target.getIconURL()
103 vars["categ"] = vars["target"] = self._target;
104 vars["urlICSFile"] = urlHandlers.UHCategoryToiCal.getURL(self._target)
105 vars["isRootCategory"] = isRootCategory
106 vars["timezone"] = self._timezone
107 subcats = self._target.subcategories
109 confs = self._target.conferences
110 if subcats:
111 cl = wcomponents.WCategoryList(self._target)
112 params = {"categoryDisplayURLGen": vars["categDisplayURLGen"]}
113 vars["contents"] = cl.getHTML( self._aw, params )
114 elif confs:
115 pastEvents = session.get('fetchPastEventsFrom', set())
116 showPastEvents = (self._target.getId() in pastEvents or
117 (session.user and session.user.settings.get('show_past_events')))
118 cl = wcomponents.WConferenceList(self._target, self._wfReg, showPastEvents)
119 params = {"conferenceDisplayURLGen": vars["confDisplayURLGen"]}
120 vars["contents"] = cl.getHTML( self._aw, params )
121 else:
122 cl = wcomponents.WEmptyCategory()
123 vars["contents"] = cl.getHTML( self._aw )
125 mgrs = []
126 for mgr in self._target.getManagerList():
127 if isinstance(mgr, AvatarUserWrapper):
128 mgrs.append(("avatar", mgr.getAbrName()))
129 elif isinstance(mgr, GroupWrapper):
130 mgrs.append(("group", mgr.getName()))
132 vars["managers"] = sorted(mgrs)
134 # Export ICS
135 if self._target.conferences:
136 vars.update(self._getIcalExportParams(self._aw.getUser(), '/export/categ/%s.ics' % self._target.getId(), {'from':"-7d"}))
138 vars["isLoggedIn"] = self._aw.getUser() is not None
140 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
141 vars["isNewsActive"] = minfo.isNewsActive()
143 # if this is the front page, include the
144 # upcoming event information (if there are any)
145 if isRootCategory:
146 upcoming = ModuleHolder().getById('upcoming_events')
147 upcoming_list = upcoming.getUpcomingEventList()
148 if upcoming_list:
149 vars["upcomingEvents"] = WUpcomingEvents(self._timezone, upcoming_list).getHTML(vars)
150 else:
151 vars["upcomingEvents"] = ''
153 return vars
156 class WPCategoryDisplay(WPCategoryDisplayBase):
158 def __init__(self, rh, target, wfReg):
159 WPCategoryDisplayBase.__init__(self, rh, target)
160 self._wfReg = wfReg
161 tzUtil = DisplayTZ(self._getAW(), target) # None,useServerTZ=1)
162 self._locTZ = tzUtil.getDisplayTZ()
164 def _getHeadContent(self):
165 # add RSS feed
166 url = urlHandlers.UHCategoryToAtom.getURL(self._target)
168 return WPCategoryDisplayBase._getHeadContent( self ) + \
169 i18nformat("""<link rel="alternate" type="application/atom+xml" title="_('Indico Atom Feed')" href="%s">""") % url
171 def _getBody( self, params ):
172 wc = WCategoryDisplay(self._target, self._wfReg, self._locTZ)
173 pars = { "categDisplayURLGen": urlHandlers.UHCategoryDisplay.getURL, \
174 "confDisplayURLGen": urlHandlers.UHConferenceDisplay.getURL, \
175 "allowUserModif": self._target.canModify( self._getAW() ), \
176 "allowCreateEvent": self._target.canCreateConference(self._getAW().getUser()) }
177 page = wc.getHTML( self._getAW(), pars )
178 return page
180 def _getNavigationDrawer(self):
181 pars = {"target": self._target, "isModif": False}
182 return wcomponents.WNavigationDrawer( pars )
184 class WOverviewBreak( wcomponents.WTemplated ):
186 def __init__( self, aw, entry ):
187 self._break = entry
188 self._aw = aw
190 def getVars( self ):
191 tz = DisplayTZ(self._aw).getDisplayTZ()
192 vars = wcomponents.WTemplated.getVars( self )
193 vars["startTime"] = self._break.getAdjustedStartDate(tz).strftime("%H:%M")
194 vars["title"] = self._break.getTitle()
195 return vars
198 class WOverviewContribBase( wcomponents.WTemplated ):
200 def __init__( self, aw, contrib, date, details="conference" ):
201 self._aw = aw
202 self._contrib = contrib
203 self._date = date
204 self._details = details
206 def _getSpeakerText( self ):
207 l = []
208 if self._contrib.getSpeakerText()!="":
209 l.append( self._contrib.getSpeakerText() )
210 for av in self._contrib.getSpeakerList():
211 l.append( "%s"%av.getAbrName() )
212 speakers = ""
213 if len(l)>0:
214 speakers = "(%s)"%"; ".join(l)
215 return speakers
217 def _getLocation( self ):
218 loc = ""
219 if self._contrib.getOwnLocation() != None:
220 loc = self._contrib.getLocation().getName()
221 room = ""
222 if self._contrib.getOwnRoom() != None:
223 if loc != "":
224 loc = "%s: "%loc
225 room = self._contrib.getRoom().getName()
226 url = linking.RoomLinker().getURL( self._contrib.getRoom(), \
227 self._contrib.getLocation() )
228 if url != "":
229 room = """<a href="%s" style="font-size: 0.9em">%s</a>"""%(url, room)
230 if loc != "" or room != "":
231 return "(%s %s)"%(loc, room)
232 else:
233 return ""
235 def getHTML( self, params={} ):
236 return wcomponents.WTemplated.getHTML( self, params )
238 def getVars( self ):
239 vars = wcomponents.WTemplated.getVars( self )
240 tz = DisplayTZ(self._aw).getDisplayTZ()
241 vars["timezone"] = tz
242 vars["startTime"] = self._contrib.getAdjustedStartDate(tz).strftime( "%H:%M" )
243 vars["title"] = self._contrib.getTitle()
244 vars["speakers"] = self._getSpeakerText()
245 vars["location"] = self._getLocation()
246 return vars
249 class WOverviewContribFullDisplay( WOverviewContribBase ):
250 pass
253 class WOverviewContribMinDisplay( WOverviewContribBase ):
254 pass
257 class WOverviewContribution:
259 def __init__( self, aw, contrib, date, details="conference" ):
260 self._comp = None
262 """ This is needed for the future? The two
263 templates are currently identical """
265 if contrib.canAccess( aw ):
266 self._comp = WOverviewContribFullDisplay( aw, \
267 contrib, \
268 date, \
269 details )
270 else:
271 self._comp = WOverviewContribMinDisplay( aw, \
272 contrib, \
273 date, \
274 details )
275 def getHTML( self, params={} ):
276 if not self._comp:
277 return ""
278 return self._comp.getHTML( params )
281 class WOverviewSessionBase( wcomponents.WTemplated ):
283 def __init__( self, aw, session, date, details="conference" ):
284 self._aw = aw
285 self._session = session
286 self._date = date
287 self._details = details
289 def _getConvenerText( self ):
290 l = []
291 if self._session.getConvenerText()!="":
292 l.append( self._session.getConvenerText() )
293 for av in self._session.getConvenerList():
294 l.append( "%s"%av.getAbrName() )
295 conveners = ""
296 if len(l)>0:
297 conveners = "(%s)"%"; ".join(l)
298 return conveners
300 def _getLocation( self ):
301 loc = ""
302 if self._session.getOwnLocation() != None:
303 loc = self._session.getLocation().getName()
304 room = ""
305 if self._session.getOwnRoom() != None:
306 if loc != "":
307 loc = "%s: "%loc
308 url = linking.RoomLinker().getURL( self._session.getRoom(), \
309 self._session.getLocation() )
310 room = self._session.getRoom().getName()
311 if url != "":
312 room = """<a href="%s" style="font-size: 0.9em">%s</a>"""%(url, room)
313 if loc != "" or room != "":
314 return "(%s %s)"%(loc, room)
315 else:
316 return ""
318 def _getBreakItem( self, entry ):
319 wc = WOverviewBreak( self._aw, entry )
320 return wc.getHTML( {} )
322 def _getDetails( self ):
323 if self._details != "contribution":
324 return ""
325 res = []
326 tz = DisplayTZ(self._aw).getDisplayTZ()
327 for entry in self._session.getSchedule().getEntriesOnDay( self._date ):
328 if self._details == "contribution":
329 if isinstance( entry, schedule.LinkedTimeSchEntry) and \
330 isinstance( entry.getOwner(), conference.Contribution):
331 wc = WOverviewContribution( self._aw, \
332 entry.getOwner(), \
333 self._date, \
334 self._details )
335 res.append( wc.getHTML( ) )
336 elif isinstance( entry, schedule.BreakTimeSchEntry):
337 res.append( self._getBreakItem( entry ) )
338 return "".join( res )
340 def getVars( self ):
341 vars = wcomponents.WTemplated.getVars( self )
342 tz = DisplayTZ(self._aw).getDisplayTZ()
343 vars["startTime"] = self._session.getStartDate().astimezone(timezone(tz)).strftime("%H:%M")
344 conf=self._session.getConference()
345 import MaKaC.webinterface.webFactoryRegistry as webFactoryRegistry
346 wr = webFactoryRegistry.WebFactoryRegistry()
347 wf = wr.getFactory(conf)
348 if wf != None:
349 type = wf.getId()
350 else:
351 type = "conference"
352 if type != 'meeting':
353 vars["title"] = self._session.getTitle()
354 vars["titleUrl"] = None
355 else:
356 vars["title"] = self._session.getTitle()
357 vars["titleUrl"] = """%s#%s""" % (urlHandlers.UHConferenceDisplay.getURL(conf), self._session.getId())
358 vars["conveners"] = self._getConvenerText()
359 vars["location"] = self._getLocation()
360 vars["details"] = self._getDetails()
361 return vars
363 class WOverviewSessionSlot( WOverviewSessionBase ):
365 def __init__( self, aw, slot, date, details="conference" ):
366 self._aw = aw
367 self._session = slot.getSession()
368 self._slot = slot
369 self._date = date
370 self._details = details
372 def _getDetails( self ):
373 if self._details != "contribution":
374 return ""
375 res = []
376 tz = DisplayTZ(self._aw).getDisplayTZ()
377 for entry in self._slot.getSchedule().getEntriesOnDay( self._date ):
378 if self._details == "contribution":
379 if isinstance( entry, schedule.LinkedTimeSchEntry) and type(entry.getOwner()) is conference.Contribution:
380 wc = WOverviewContribution( self._aw, \
381 entry.getOwner(), \
382 self._date, \
383 self._details )
384 res.append( wc.getHTML( ) )
385 elif isinstance( entry, schedule.BreakTimeSchEntry):
386 res.append( self._getBreakItem( entry ) )
387 return "".join( res )
389 class WOverviewSessionFullDisplay( WOverviewSessionBase ):
390 pass
393 class WOverviewSessionMinDisplay( WOverviewSessionBase ):
395 def _getBreakItem( self, entry ):
396 return ""
399 class WOverviewSession:
401 def __init__( self, aw, session, date, details="conference" ):
402 self._comp = None
403 if session.canAccess( aw ):
404 self._comp = WOverviewSessionFullDisplay( aw, \
405 session, \
406 date, \
407 details )
408 else:
409 self._comp = WOverviewSessionMinDisplay( aw, \
410 session, \
411 date, \
412 details )
413 def getHTML( self, params ):
414 if not self._comp:
415 return ""
416 return self._comp.getHTML( params )
419 class WOverviewConfBase( wcomponents.WTemplated ):
421 def __init__( self, aw, conference, date, url, icons, details="conference", startTime = None ):
422 self._conf = conference
423 self._url = url
424 self._aw = aw
425 self._details = details
426 self._date = date
427 self._icons = icons
428 self._startTime = startTime
431 def _getChairText( self ):
432 l = []
433 if self._conf.getChairmanText()!="":
434 l.append( self._conf.getChairmanText() )
435 for av in self._conf.getChairList():
436 l.append( "%s"%av.getFullName() )
437 chairs = ""
438 if len(l)>0:
439 chairs = "(%s)"%"; ".join(l)
440 return chairs
442 def _getLocation( self ):
443 loc = ""
444 if self._conf.getLocation() != None:
445 loc = self._conf.getLocation().getName()
446 room = ""
447 if self._conf.getRoom() != None and self._conf.getRoom().getName() != None:
448 room = self._conf.getRoom().getName()
449 url = "javascript:redirectToRoomLoc('" + escape_html(room) + "','" + escape_html(loc) +"')"
450 loc = "%s: "%loc
451 room = """<a href="%s" style="font-size: 0.9em">%s</a>"""%(url, room)
452 if loc != "" or room != "":
453 return "(%s%s)"%(loc, room)
454 else:
455 return ""
457 def _getBreakItem( self, entry ):
458 wc = WOverviewBreak( self._aw, entry )
459 return wc.getHTML( {} )
461 def _getDetails( self ):
462 if self._details == "conference":
463 return ""
464 res = []
465 tz = DisplayTZ(self._aw,useServerTZ=1).getDisplayTZ()
466 for entry in self._conf.getSchedule().getEntriesOnDay( self._date ):
467 if isinstance( entry, schedule.LinkedTimeSchEntry) and \
468 isinstance( entry.getOwner(), conference.Session ) and entry.getOwner().canView(self._aw):
469 wc = WOverviewSession( self._aw, \
470 entry.getOwner(), \
471 self._date, \
472 self._details )
473 res.append( wc.getHTML({}) )
474 elif isinstance( entry, schedule.LinkedTimeSchEntry) and \
475 isinstance( entry.getOwner(), conference.SessionSlot ) and entry.getOwner().canView(self._aw):
476 wc = WOverviewSessionSlot( self._aw, \
477 entry.getOwner(), \
478 self._date, \
479 self._details )
480 res.append( wc.getHTML({}) )
481 elif self._details == "contribution":
482 if isinstance(entry, conference.ContribSchEntry) or \
483 isinstance( entry, schedule.LinkedTimeSchEntry) and isinstance(entry.getOwner(), conference.Contribution) and entry.getOwner().canView(self._aw):
484 wc = WOverviewContribution( self._aw, \
485 entry.getOwner(), \
486 self._date, \
487 self._details )
488 res.append( wc.getHTML( ) )
489 elif isinstance( entry, schedule.BreakTimeSchEntry):
490 res.append( self._getBreakItem( entry ) )
491 return "".join( res )
493 def _getIcon( self ):
494 confid = self._conf.getId()
495 iconHtml = ""
496 for icon in self._icons.keys():
497 if confid in self._icons[icon]:
498 cm=CategoryManager()
499 categ = cm.getById(str(icon))
500 iconHtml += """<img src="%s" width="16" height="16" alt="categ" onmouseover="IndicoUI.Widgets.Generic.tooltip(this, event, '%s')" />""" %(urlHandlers.UHCategoryIcon.getURL(categ), categ.getName())
501 return iconHtml
503 def getVars( self ):
504 vars = wcomponents.WTemplated.getVars( self )
505 tz = DisplayTZ(self._aw,useServerTZ=1).getDisplayTZ()
506 if self._startTime:
507 vars["startTime"] = self._startTime.strftime("%H:%M")
508 else:
509 vars["startTime"] = self._conf.calculateDayStartTime(self._date).strftime("%H:%M")
510 vars["timezone"] = tz
511 vars["title"] = self._conf.getTitle()
512 if self._conf.isProtected():
513 vars["title"] += """&nbsp;<img src=%s style="vertical-align: middle; border: 0;">""" % Config.getInstance().getSystemIconURL("protected")
514 vars["url"] = self._url
515 vars["chairs"] = self._getChairText()
516 vars["location"] = self._getLocation()
517 vars["details"] = self._getDetails()
518 vars["icon"] = self._getIcon()
519 return vars
522 class WOverviewConfFullDisplay( WOverviewConfBase ):
523 pass
525 class WOverviewConfMinDisplay( WOverviewConfBase ):
527 def _getDetails( self ):
528 return ""
530 def _getBreakItem( self, entry ):
531 return ""
534 class WOverviewConferenceItem:
536 def __init__(self, aw, conference, date, displayURL, icons, details="conference", startTime = None):
537 self._comp = None
538 if details=="conference" or conference.canAccess( aw ):
539 self._comp = WOverviewConfFullDisplay( aw, \
540 conference, \
541 date, \
542 displayURL, \
543 icons, \
544 details,
545 startTime )
546 else:
547 self._comp = WOverviewConfMinDisplay( aw, \
548 conference, \
549 date, \
550 displayURL, \
551 icons, \
552 details,
553 startTime )
555 def getHTML( self, params ):
556 if not self._comp:
557 return ""
558 return self._comp.getHTML( params )
561 class WDayOverview(wcomponents.WTemplated):
563 def __init__( self, ow ):
564 self._ow = ow
566 def getVars( self ):
567 vars = wcomponents.WTemplated.getVars( self )
568 prevOW = self._ow.getOverviewPrevPeriod()
569 prevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( prevOW )
570 nextOW = self._ow.getOverviewNextPeriod()
571 nextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nextOW )
572 pprevOW = self._ow.getOverviewPrevBigPeriod()
573 pprevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( pprevOW )
574 nnextOW = self._ow.getOverviewNextBigPeriod()
575 nnextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nnextOW )
576 vars["date"] = """<a href="%s">&lt;&lt;</a>&nbsp;&nbsp;<a href="%s">&lt;</a>&nbsp;&nbsp;%s&nbsp;&nbsp;<a href="%s">&gt;</a>&nbsp;&nbsp;<a href="%s">&gt;&gt;</a>""" % (\
577 pprevsel, \
578 prevsel,\
579 self._ow.getDate().strftime("%A %d %B %Y"), \
580 nextsel,\
581 nnextsel)
582 l = []
583 confs = self._ow.getConferencesWithStartTime()
584 for tuple in confs:
585 conf = tuple[0]
586 startTime = tuple[1]
587 oi = WOverviewConferenceItem( self._ow.getAW(), \
588 conf, \
589 self._ow.getDate(), \
590 vars["displayConfURLGen"]( conf ),\
591 self._ow._cal.getIcons(), \
592 self._ow.getDetailLevel(),
593 startTime )
594 l.append( oi.getHTML( {} ) )
595 if len(confs)==0:
596 l.append( _("There are no conferences on the selected day"))
597 vars["items"] = "".join(l)
598 return vars
600 class WWeekOverview(wcomponents.WTemplated):
602 def __init__( self, ow ):
603 self._ow = ow
605 def getVars( self ):
606 vars = wcomponents.WTemplated.getVars( self )
607 isWeekendFree = True
608 prevOW = self._ow.getOverviewPrevPeriod()
609 prevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( prevOW )
610 nextOW = self._ow.getOverviewNextPeriod()
611 nextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nextOW )
613 startDate = """<a href="%s">&lt;</a>&nbsp;&nbsp;%s""" % (\
614 prevsel,\
615 self._ow.getStartDate().strftime("%A %d %B %Y"))
616 endDate = """%s&nbsp;&nbsp;<a href="%s">&gt;</a>""" %(\
617 self._ow.getEndDate().strftime("%A %d %B %Y"),\
618 nextsel)
619 vars["dates"] = """%s &nbsp;&ndash;&nbsp; %s"""%(startDate, endDate)
621 inc = timedelta(1)
622 sd = self._ow.getStartDate()
623 idx = 0
624 while sd <= self._ow.getEndDate():
625 weekend = sd.weekday() >= 5
626 vars["date%i" % idx] = sd.strftime("%a %d/%m")
627 res = []
628 confs = self._ow.getConferencesWithStartTime(sd)
629 for conf, stTime in confs:
630 if weekend and not conf.hasSomethingOnWeekend(sd.date()):
631 continue
632 wc = WOverviewConferenceItem(self._ow.getAW(), conf, sd, vars["displayConfURLGen"](conf),
633 self._ow._cal.getIcons(), self._ow.getDetailLevel(), stTime)
634 res.append(wc.getHTML({}))
635 if not res:
636 res.append("<tr><td></td></tr>")
637 elif weekend:
638 isWeekendFree = False
639 vars["item%i" % idx] = "".join(res)
640 sd += inc
641 idx += 1
642 vars["isWeekendFree"] = isWeekendFree
643 return vars
646 class WMonthOverview(wcomponents.WTemplated):
648 def __init__( self, ow ):
649 self._ow = ow
650 self._isWeekendFree = True
652 def _getDayCell( self, day ):
653 res = []
654 confs = day.getConferencesWithStartTime()
655 if confs:
656 for tuple in confs:
657 conf = tuple[0]
658 stTime = tuple[1]
659 wc = WOverviewConferenceItem( self._ow.getAW(), \
660 conf, \
661 day.getDate(), \
662 self._displayConfURLGen( conf ),\
663 self._ow._cal.getIcons(), \
664 self._ow.getDetailLevel(),
665 stTime )
666 res.append( wc.getHTML( {} ) )
667 return "".join(res)
669 def _getMonth( self ):
670 dayList = [[]]
671 numWeek=0
672 dl = self._ow.getDayList()
673 for i in range( dl[0].getWeekDay() ):
674 dayList[numWeek].append(None)
675 for day in self._ow.getDayList():
676 dayList[numWeek].append(day)
677 if day.getWeekDay() >= 5:
678 if day.getConferencesWithStartTime():
679 self._isWeekendFree = False
680 if day.getWeekDay() == 6:
681 numWeek +=1
682 dayList.append([])
684 for i in range( 6-dl[-1].getWeekDay() ):
685 dayList[numWeek].append(None)
686 return dayList
689 def getVars( self ):
690 vars = wcomponents.WTemplated.getVars( self )
691 prevOW = self._ow.getOverviewPrevPeriod()
692 prevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( prevOW )
693 nextOW = self._ow.getOverviewNextPeriod()
694 nextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nextOW )
695 pprevOW = self._ow.getOverviewPrevBigPeriod()
696 pprevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( pprevOW )
697 nnextOW = self._ow.getOverviewNextBigPeriod()
698 nnextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nnextOW )
699 startDate = """<a href="%s">&lt;&lt;</a>&nbsp;&nbsp;<a href="%s">&lt;</a>&nbsp;&nbsp;&nbsp;%s""" % (\
700 pprevsel,\
701 prevsel,\
702 self._ow.getStartDate().strftime("%A %d %B %Y"))
703 endDate = """%s&nbsp;&nbsp;&nbsp;<a href="%s">&gt;</a>&nbsp;&nbsp;<a href="%s">&gt;&gt;</a>""" %(\
704 self._ow.getEndDate().strftime("%A %d %B %Y"),\
705 nextsel,\
706 nnextsel)
707 vars["dates"] = """%s &nbsp;&ndash;&nbsp; %s"""%(startDate, endDate)
709 dayNames = [ _("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"), _("Friday"), \
710 _("Saturday"), _("Sunday") ]
711 #if calendar.SUNDAY == calendar.firstweekday():
712 # dayNames.remove( "Sunday" )
713 # dayNames.insert( "0", "Sunday" )
714 for name in dayNames:
715 vars["nameDay%i"%dayNames.index(name)] = name
716 self._displayConfURLGen = vars["displayConfURLGen"]
717 vars["month"] = self._getMonth()
718 vars["isWeekendFree"] = self._isWeekendFree
719 vars["getDayCell"] = lambda day: self._getDayCell(day)
720 return vars
723 class WCategoryOverview(wcomponents.WTemplated):
725 def __init__( self, ow, aw ):
726 self._categ = ow.getCategoryList()[0]
727 self._ow = ow
728 self._aw = aw
730 def _getDetailLevelOpts( self ):
731 l = []
732 for dl in self._ow.getAllowedDetailLevels():
733 selected = ""
734 if dl == self._ow.getDetailLevel():
735 selected = "selected"
736 if dl == "conference":
737 dltext = "agenda"
738 else:
739 dltext = dl
740 l.append("""<option value="%s" %s>%s</option>"""%( dl, selected, dltext ))
741 return "".join(l)
743 def _getKey( self, vars):
744 l = []
745 icons = self._ow._cal.getIcons().keys()
746 if len(icons) > 0:
747 for icon in icons:
748 cm= CategoryManager()
749 categ=cm.getById(str(icon))
750 otherOW = self._ow.getOverviewOtherCateg(categ)
751 a=(""" <a href="%s" style="font-size: 1.0em;" onmouseover="IndicoUI.Widgets.Generic.tooltip(this, event, '%s')"><img src="%s" width="16" height="16" border="0">&nbsp;%s</a> <br/>""" %(
752 vars["categOverviewURLGen"]( otherOW ),
753 categ.getName(),
754 urlHandlers.UHCategoryIcon.getURL(categ),
755 truncateTitle(categ.getName(), 20)))
756 if not a in l:
757 l.append(a)
758 return "". join(l)
760 def getVars( self ):
761 vars = wcomponents.WTemplated.getVars( self )
762 l = self._ow.getLocator()
763 del l["detail"]
764 del l["period"]
765 del l["day"]
766 del l["month"]
767 del l["year"]
769 vars["selDay"] = ""
770 vars["selWeek"] = ""
771 vars["selMonth"] = ""
772 vars["selYear"] = ""
774 vars["detailLevelOpts"] = self._getDetailLevelOpts()
776 if isinstance( self._ow, wcalendar.MonthOverview ):
777 displayOW = WMonthOverview( self._ow )
778 vars["selMonth"] = "selected"
779 elif isinstance( self._ow, wcalendar.WeekOverview ):
780 displayOW = WWeekOverview( self._ow )
781 vars["selWeek"] = "selected"
782 else:
783 displayOW = WDayOverview( self._ow )
784 vars["selDay"] = "selected"
786 p = { "displayConfURLGen": vars["displayConfURLGen"] }
787 vars["overview"] = displayOW.getHTML( p )
789 vars["locator"] = l.getWebForm()
790 vars["key"] = self._getKey(vars)
792 vars["day"] = self._ow.getDate().day
793 vars["month"] = self._ow.getDate().month
794 vars["year"] = self._ow.getDate().year
796 return vars
798 def _getWeekDays(self):
799 """returns a list with the current week days"""
801 year=int(self._ow.getDate().year)
802 month=int(self._ow.getDate().month)
803 day=int(self._ow.getDate().day)
804 daynumber=int(calendar.weekday(year,month,day))
806 date = self._ow.getDate() - timedelta(daynumber)
807 delta = timedelta(1)
808 res = []
809 for i in range(7):
810 res.append((str(date.day)+"-"+str(date.month)+"-"+str(date.year)))
811 date += delta
813 return res
818 def _getNextWeekDays(self):
821 y=int(self._ow.getDate().year)
822 m=int(self._ow.getDate().month)
823 d=int(self._ow.getDate().day)
825 res=[]
827 while i<=6:
829 if (d+i)<=31 and (m==8 or m==1 or m==3 or m==5 or m==7 or m==10):
830 res+=[str(d+i)+"-"+str(m)+"-"+str(y)]
831 if (d+i)<=30 and (m==4 or m==6 or m==9 or m==11):
832 res+=[str(d+i)+'-'+str(m)+'-'+str(y)]
833 if (d+i)<=28 and m==2 and ((y%4!=0) or (y %4 ==0 and y %100==0)):
834 res+=[(str(d+i)+"-"+str(m)+"-"+str(y))]
835 if (d+i)<30 and m==2 and ((y%4==0 and y%100!=0) or y%400==0):
836 res+=[(str(d+i)+"-"+str(m)+"-"+str(y))]
837 i+=1
840 if d<7 and len(res)<7:
841 while j<(7-len(res)):
842 res+=[(str(d+i+j)+"-"+str(m)+"-"+str(y))]
843 j+=1
846 return res
848 def _whichPeriod(self, vars):
849 if vars["selDay"] == "selected":
850 return "day"
851 if vars["selWeek"] == "selected":
852 return "week"
853 if vars["selMonth"] == "selected":
854 return "month"
856 def _getMonthDays(self):
857 year=int(self._ow.getDate().year)
858 month=int(self._ow.getDate().month)
859 res=[]
860 for day in range(1,calendar.monthrange(year,month)[1]+1):
861 res+=[str(day)+'-'+str(month)+'-'+str(year)]
863 return res
865 class WPCategOverview( WPCategoryDisplayBase ):
867 def __init__( self, rh, categ, ow ):
868 WPCategoryDisplayBase.__init__( self, rh, categ )
869 self._ow = ow
870 self._categ = categ
871 self._locTZ = DisplayTZ(self._getAW(),None,useServerTZ=1).getDisplayTZ()
873 def _getTitle(self):
874 return WPCategoryDisplayBase._getTitle(self) + " - " + _("Events Display")
876 def _getHeadContent( self ):
877 # add RSS feed
878 if self._ow.getDate().date() == nowutc().astimezone(timezone(self._locTZ)).date():
879 url = urlHandlers.UHCategOverviewToRSS.getURL(self._categ)
880 return i18nformat("""<link rel="alternate" type="application/rss+xml" title= _("Indico RSS Feed") href="%s">""") % url
881 return ""
883 def _getBody( self, params ):
884 if self._categ.getId() == "0" and type(self._ow) is Overview and self._ow.getDate().date() == nowutc().astimezone(timezone(self._locTZ)).date():
885 path = os.path.join(Config.getInstance().getXMLCacheDir(),"categOverview")
886 currenttime = int(time.mktime(time.strptime((datetime.now()-timedelta(minutes=60)).strftime("%a %b %d %H:%M:%S %Y"))))
887 if os.path.exists(path) and os.path.getmtime(path) > currenttime:
888 fp = file(path, 'rb')
889 cache = fp.read()
890 fp.close()
891 return cache
892 else:
893 wc = WCategoryOverview( self._ow, self._rh.getAW())
894 pars = { "postURL": urlHandlers.UHCategoryOverview.getURL(), \
895 "displayConfURLGen": urlHandlers.UHConferenceDisplay.getURL, \
896 "categOverviewURLGen": urlHandlers.UHCategoryOverview.getURLFromOverview }
897 cache = wc.getHTML( pars )
898 fp = file(path, 'wb')
899 fp.write(cache)
900 fp.close()
901 return cache
902 else:
903 wc = WCategoryOverview( self._ow, self._rh.getAW())
904 pars = { "postURL": urlHandlers.UHCategoryOverview.getURL(), \
905 "displayConfURLGen": urlHandlers.UHConferenceDisplay.getURL, \
906 "categDisplayURL": urlHandlers.UHCategoryDisplay.getURL(self._categ), \
907 "categOverviewURLGen": urlHandlers.UHCategoryOverview.getURLFromOverview, \
908 "categoryTitle": self._categ.getTitle() }
909 return wc.getHTML( pars )
911 def _getNavigationDrawer(self):
912 #link = [{"url": urlHandlers.UHCategoryOverview.getURL(self._target), "title": _("Events overview")}]
913 pars = {"target": self._target, "isModif": False}
914 return wcomponents.WNavigationDrawer( pars, type = "Overview" )
916 class WCategoryMap(wcomponents.WTemplated):
918 def __init__( self, categ ):
919 self._categ = categ
921 def getCategMap( self, categ ):
922 res = []
923 if len(categ.getSubCategoryList()) > 0:
924 res.append("<ul>")
925 for subcat in categ.getSubCategoryList():
926 res.append("<li><a href='%s'>%s</a>"% (urlHandlers.UHCategoryDisplay.getURL(subcat), subcat.getName()))
927 if subcat.hasAnyProtection():
928 res.append("""&nbsp;<span style="font-size: 0.8em; color: gray;">(%s)</span>"""% _("protected"))
929 res.append(self.getCategMap(subcat))
930 res.append("</ul>")
931 return "".join(res)
933 def getVars( self ):
934 vars = wcomponents.WTemplated.getVars( self )
935 vars['categName'] = self._categ.getName()
936 vars["categDisplayURL"] = urlHandlers.UHCategoryDisplay.getURL(self._categ)
937 vars['map'] = self.getCategMap(self._categ)
938 return vars
940 class WPCategoryMap( WPCategoryDisplayBase ):
942 def __init__( self, rh, categ ):
943 WPCategoryDisplayBase.__init__( self, rh, categ )
945 def _getTitle(self):
946 return WPCategoryDisplayBase._getTitle(self) + " - " + _("Category Map")
948 def _getBody( self, params ):
949 wc = WCategoryMap( self._target )
950 pars = {}
951 return wc.getHTML( pars )
953 def _getNavigationDrawer(self):
954 #link = [{"url": urlHandlers.UHCategoryMap.getURL(self._target), "title": _("Category map")}]
955 pars = {"target": self._target, "isModif": False}
956 return wcomponents.WNavigationDrawer( pars, type = "Map" )
958 class WCategoryStatistics(wcomponents.WTemplated):
960 def __init__( self, target, wfReg, stats ):
961 self.__target = target
962 self._wfReg = wfReg
963 self._stats = stats
965 def getHTML( self, aw ):
966 self._aw = aw
967 return wcomponents.WTemplated.getHTML( self )
969 def getVars( self ):
970 vars = wcomponents.WTemplated.getVars( self )
971 vars["name"] = self.__target.getName()
972 vars["img"] = self.__target.getIconURL()
973 vars["categDisplayURL"] = urlHandlers.UHCategoryDisplay.getURL(self.__target)
975 if self._stats != None:
976 stats = []
977 # Number of events:
978 if self._stats["events"]:
979 wcsl=wcomponents.WCategoryStatisticsList( _("Number of events"), self._stats["events"] )
980 stats.append(wcsl.getHTML( self._aw ))
981 # Number of contributions:
982 if self._stats["contributions"] != {}:
983 wcsl=wcomponents.WCategoryStatisticsList( _("Number of contributions"), self._stats["contributions"] )
984 stats.append(wcsl.getHTML( self._aw ))
985 else:
986 stats.append( i18nformat("""<b> _("Number of contributions"): 0</b>"""))
987 stats.append("<strong>{}</strong>: {}".format(
988 _("Number of attached files"), self._stats.get("files", _("Not available"))))
989 vars["updated"] = self._stats["updated"].strftime("%d %B %Y %H:%M")
990 else:
991 stats.append(i18nformat("""<b> _("No statistics for the events").</b>"""))
992 stats.append(i18nformat("""<b> _("No statistics for the contributions").</b>"""))
993 stats.append(i18nformat("<strong>{}</strong>".format(_("No statistics for attached files"))))
994 vars["updated"] = nowutc().strftime("%d %B %Y %H:%M")
995 vars["contents"] = "<br><br>".join( stats )
996 else:
997 vars["contents"] = _("This category doesn't contain any event. No statistics are available.")
998 vars["updated"] = nowutc().strftime("%d %B %Y %H:%M")
999 return vars
1001 class WPCategoryStatistics( WPCategoryDisplayBase ):
1003 def __init__( self, rh, target, wfReg, stats ):
1004 WPCategoryDisplayBase.__init__( self, rh, target )
1005 self._wfReg = wfReg
1006 self._stats = stats
1008 def _getTitle(self):
1009 return WPCategoryDisplayBase._getTitle(self) + " - " + _("Category Statistics")
1011 def _getBody( self, params ):
1012 wcs = WCategoryStatistics( self._target, self._wfReg, self._stats )
1013 return wcs.getHTML( self._getAW() )
1015 def _getNavigationDrawer(self):
1016 #link = [{"url": urlHandlers.UHCategoryStatistics.getURL(self._target), "title": _("Category statistics")}]
1017 pars = {"target": self._target, "isModif": False}
1018 return wcomponents.WNavigationDrawer( pars, type = "Statistics" )
1021 #---------------------------------------------------------------------------
1023 class WConferenceCreation( wcomponents.WTemplated ):
1025 def __init__( self, targetCateg, type="conference", rh = None ):
1026 self._categ = targetCateg
1027 self._type = type
1028 self._rh = rh
1031 def getVars(self):
1032 vars = wcomponents.WTemplated.getVars( self )
1033 navigator = ""
1034 vars["title"] = vars.get("title","")
1035 vars["description"] = vars.get("description","")
1036 vars["keywords"] = vars.get("keywords","")
1037 vars["contactInfo"] = vars.get("contactInfo","")
1038 av=self._rh._getUser()
1039 tz=av.getTimezone()
1040 now = nowutc().astimezone(timezone(tz))
1041 vars["sDay"] = vars.get("sDay",now.day)
1042 vars["sMonth"] = vars.get("sMonth",now.month)
1043 vars["sYear"] = vars.get("sYear",now.year)
1044 vars["sHour"] = vars.get("sHour","8")
1045 vars["sMinute"] = vars.get("sMinute","00")
1046 vars["eDay"] = vars.get("eDay",now.day)
1047 vars["eMonth"] = vars.get("eMonth",now.month)
1048 vars["eYear"] = vars.get("eYear",now.year)
1049 vars["eHour"] = vars.get("eHour","18")
1050 vars["eMinute"] = vars.get("eMinute","00")
1052 vars["sDay_"] = {}
1053 vars["sMonth_"] = {}
1054 vars["sYear_"] = {}
1055 vars["sHour_"] = {}
1056 vars["sMinute_"] = {}
1057 vars["dur_"] = {}
1059 for i in range(0,10):
1060 vars["sDay_"][i] = vars.get("sDay_%s"%i,now.day)
1061 vars["sMonth_"][i] = vars.get("sMonth_%s"%i,now.month)
1062 vars["sYear_"][i] = vars.get("sYear_%s"%i,now.year)
1063 vars["sHour_"][i] = vars.get("sHour_%s"%i,"8")
1064 vars["sMinute_"][i] = vars.get("sMinute_%s"%i,"00")
1065 vars["dur_"][i] = vars.get("dur_%s"%i,"60")
1066 vars["nbDates"] = vars.get("nbDates",1)
1067 seltitle = Config.getInstance().getDefaultTimezone()
1068 if self._categ:
1069 seltitle= self._categ.getTimezone()
1070 vars["timezoneOptions"] = TimezoneRegistry.getShortSelectItemsHTML(seltitle)
1071 vars["locationName"] = vars.get("locationName","")
1072 vars["locationAddress"] = vars.get("locationAddress","")
1073 vars["roomName"] = vars.get("locationRoom","")
1074 #vars["locator"] = self._categ.getLocator().getWebForm()
1075 vars["protection"] = "public"
1076 vars["categ"] = {"id":"", "title":_("-- please, choose a category --")}
1077 if self._categ and not self._categ.hasSubcategories():
1078 if self._categ.isProtected() :
1079 vars["protection"] = "private"
1080 vars["categ"] = {"id":self._categ.getId(), "title":self._categ.getTitle()}
1081 vars["nocategs"] = False
1082 if not CategoryManager().getRoot().hasSubcategories():
1083 vars["nocategs"] = True
1084 rootcateg = CategoryManager().getRoot()
1085 if rootcateg.isProtected():
1086 vars["protection"] = "private"
1087 vars["categ"] = {"id":rootcateg.getId(), "title":rootcateg.getTitle()}
1088 #vars["event_type"] = ""
1089 vars["navigator"] = navigator
1090 vars["orgText"] = ""
1091 if vars.get("orgText","") != "":
1092 vars["orgText"] = vars.get("orgText","")
1093 elif self._rh._getUser():
1094 vars["orgText"] = self._rh._getUser().getStraightFullName()
1095 vars["chairText"] = vars.get("chairText","")
1096 vars["supportEmail"] = vars.get("supportEmail","")
1097 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1098 styles = styleMgr.getExistingStylesForEventType(self._type)
1099 styleoptions = ""
1100 defStyle = ""
1101 if self._categ:
1102 defStyle = self._categ.getDefaultStyle(self._type)
1103 if defStyle == "":
1104 defStyle = styleMgr.getDefaultStyleForEventType(self._type)
1105 for styleId in styles:
1106 if styleId == defStyle:
1107 selected = "selected"
1108 else:
1109 selected = ""
1110 styleoptions += "<option value=\"%s\" %s>%s</option>" % (styleId,selected,styleMgr.getStyleName(styleId))
1111 vars["styleOptions"] = styleoptions
1113 vars["chairpersonDefined"] = vars.get("chairpersonDefined", [])
1115 vars["useRoomBookingModule"] = Config.getInstance().getIsRoomBookingActive()
1117 return vars
1119 #---------------------------------------------------------------------------
1121 class WPConferenceCreationMainData( WPCategoryDisplayBase ):
1123 _userData = ['favorite-user-list', 'favorite-user-ids']
1125 def getJSFiles(self):
1126 return WPCategoryDisplayBase.getJSFiles(self) + \
1127 self._includeJSPackage('Management')
1129 def _getHeader( self ):
1132 wc = wcomponents.WHeader( self._getAW() )
1133 return wc.getHTML( { "subArea": self._getSiteArea(), \
1134 "loginURL": self._escapeChars(str(self.getLoginURL())),\
1135 "logoutURL": self._escapeChars(str(self.getLogoutURL())) } )
1137 def _getNavigationDrawer(self):
1138 if self._target and self._target.isRoot():
1139 return
1140 else:
1141 pars = {"target": self._target, "isModif": False}
1142 return wcomponents.WNavigationDrawer( pars )
1144 def _getWComponent( self ):
1145 return WConferenceCreation( self._target, self._rh._event_type, self._rh )
1147 def _getBody( self, params ):
1148 ## TODO: TO REMOVE?????????
1149 #p = { "categDisplayURLGen": urlHandlers.UHCategoryDisplay.getURL }
1150 wc = self._getWComponent()
1151 params.update({"postURL": urlHandlers.UHConferencePerformCreation.getURL() })
1152 return "%s"%wc.getHTML( params )
1154 class WPCategoryModifBase( WPCategoryBase ):
1156 _userData = ['favorite-user-ids']
1158 def getJSFiles(self):
1159 return WPCategoryBase.getJSFiles(self) + \
1160 self._includeJSPackage('Management')
1162 def _getHeader(self):
1163 wc = wcomponents.WHeader(self._getAW(), currentCategory=self._currentCategory())
1164 return wc.getHTML({
1165 'subArea': self._getSiteArea(),
1166 'loginURL': self._escapeChars(str(self.getLoginURL())),
1167 'logoutURL': self._escapeChars(str(self.getLogoutURL()))
1170 def _getNavigationDrawer(self):
1171 pars = {"target": self._target , "isModif" : True}
1172 return wcomponents.WNavigationDrawer( pars, bgColor = "white" )
1174 def _createSideMenu( self ):
1175 self._sideMenu = wcomponents.ManagementSideMenu()
1177 viewSection = wcomponents.SideMenuSection()
1179 self._viewMenuItem = wcomponents.SideMenuItem(_("View category"),
1180 urlHandlers.UHCategoryDisplay.getURL( self._target ))
1181 viewSection.addItem( self._viewMenuItem)
1183 self._sideMenu.addSection(viewSection)
1186 mainSection = wcomponents.SideMenuSection()
1188 self._generalSettingsMenuItem = wcomponents.SideMenuItem(_("General settings"),
1189 urlHandlers.UHCategoryModification.getURL( self._target ))
1190 mainSection.addItem( self._generalSettingsMenuItem)
1192 self._ACMenuItem = wcomponents.SideMenuItem(_("Protection"),
1193 urlHandlers.UHCategModifAC.getURL( self._target ))
1194 mainSection.addItem( self._ACMenuItem)
1196 self._toolsMenuItem = wcomponents.SideMenuItem(_("Tools"),
1197 urlHandlers.UHCategModifTools.getURL( self._target ))
1198 mainSection.addItem( self._toolsMenuItem)
1200 self._tasksMenuItem = wcomponents.SideMenuItem(_("Tasks"),
1201 urlHandlers.UHCategModifTasks.getURL( self._target ))
1202 mainSection.addItem( self._tasksMenuItem)
1203 if not self._target.tasksAllowed() :
1204 self._tasksMenuItem.setVisible(False)
1206 self.extra_menu_items = {}
1207 for name, item in sorted(values_from_signal(signals.category.management_sidemenu.send(self._target)),
1208 key=lambda x: x[1]._title):
1209 self.extra_menu_items[name] = item
1210 mainSection.addItem(item)
1212 self._sideMenu.addSection(mainSection)
1214 def _createTabCtrl( self ):
1215 pass
1217 def _setActiveTab( self ):
1218 pass
1220 def _setActiveSideMenuItem( self ):
1221 pass
1223 def _getBody( self, params ):
1224 self._createSideMenu()
1225 self._setActiveSideMenuItem()
1227 self._createTabCtrl()
1228 self._setActiveTab()
1230 sideMenu = self._sideMenu.getHTML()
1232 frame = WCategoryModifFrame()
1233 p = { "category": self._target,
1234 "body": self._getPageContent( params ),
1235 "sideMenu": self._sideMenu.getHTML() }
1237 return frame.getHTML( p )
1239 def _getTabContent( self, params ):
1240 return "nothing"
1242 def _getPageContent( self, params ):
1243 return "nothing"
1245 def _getSiteArea(self):
1246 return "ModificationArea"
1249 class WCategoryModifFrame(wcomponents.WTemplated):
1251 def __init__( self ):
1252 pass
1254 def getVars( self ):
1255 vars = wcomponents.WTemplated.getVars( self )
1256 return vars
1258 class WPCategModifMain( WPCategoryModifBase ):
1260 def _setActiveSideMenuItem( self ):
1261 self._generalSettingsMenuItem.setActive()
1264 class WCategModifMain(wcomponents.WTemplated):
1266 def __init__( self, category ):
1267 self._categ = category
1269 def __getSubCategoryItems( self, sl, modifURLGen ):
1270 temp = []
1271 for categ in sl:
1272 id = categ.getId()
1273 selbox = """<select name="newpos%s" onChange="this.form.oldpos.value='%s';this.form.submit();">""" % (sl.index(categ),sl.index(categ))
1274 for i in range (1,len(sl)+1):
1275 if i==sl.index(categ)+1:
1276 selbox += "<option selected value='%s'>%s" % (i-1,i)
1277 else:
1278 selbox += "<option value='%s'>%s" % (i-1,i)
1279 selbox += """
1280 </select>"""
1281 temp.append("""
1282 <tr>
1283 <td width="3%%">
1284 <input type="checkbox" name="selectedCateg" value="%s">
1285 </td>
1286 <td>%s</td>
1287 <td style="padding-left:10px;">
1288 <a href="%s">%s</a>
1289 </td>
1290 </tr>"""%(id, selbox,modifURLGen( categ ), categ.getName().strip() or "[no title]"))
1291 html = i18nformat("""
1292 <input type="hidden" name="oldpos">
1293 <table align="left" width="100%%">
1294 <tr>
1295 <td width="3%%" nowrap><img src="%s" border="0" alt="Select all" onclick="javascript:selectAll(document.contentForm.selectedCateg)"><img src="%s" border="0" alt="Deselect all" onclick="javascript:deselectAll(document.contentForm.selectedCateg)"></td>
1296 <td></td>
1297 <td class="titleCellFormat" width="100%%" style="padding-left:10px;"> _("Category name")</td>
1298 </tr>
1300 </table>""")%(Config.getInstance().getSystemIconURL("checkAll"), Config.getInstance().getSystemIconURL("uncheckAll"), "".join( temp ))
1301 return html
1303 def __getConferenceItems( self, cl, modifURLGen, modifURLOpen ):
1304 temp = []
1305 for conf in cl:
1306 if conf.isClosed():
1307 textopen = i18nformat(""" <b>[ <a href="%s"> _("re-open event")</a> ]</b>""") % modifURLOpen(conf)
1308 else:
1309 textopen = ""
1310 temp.append("""
1311 <tr>
1312 <td width="3%%">
1313 <input type="checkbox" name="selectedConf" value="%s">
1314 </td>
1315 <td align="center" width="17%%">%s</td>
1316 <td align="center" width="17%%">%s</td>
1317 <td width="100%%"><a href="%s">%s</a>%s</td>
1318 </tr>"""%(conf.getId(), conf.getAdjustedStartDate().date(), conf.getAdjustedEndDate().date(),modifURLGen(conf), conf.getTitle(), textopen))
1319 html = i18nformat("""<table align="left" width="100%%">
1320 <tr>
1321 <td width="3%%" nowrap><img src="%s" border="0" alt="Select all" onclick="javascript:selectAll(document.contentForm.selectedConf)"><img src="%s" border="0" alt="Deselect all" onclick="javascript:deselectAll(document.contentForm.selectedConf)"></td>
1322 <td align="center" width="17%%" class="titleCellFormat" style="border-right:5px solid #FFFFFF; border-bottom: 1px solid #FFFFFF;"> _("Start date")</td>
1323 <td align="center" width="17%%" class="titleCellFormat" style="border-right:5px solid #FFFFFF; border-bottom: 1px solid #FFFFFF;"> _("End date")</td>
1324 <td width="100%%" class="titleCellFormat" style="border-right:5px solid #FFFFFF; border-bottom: 1px solid #FFFFFF;"> _("Conference title")</td>
1325 </tr>
1326 %s</table>""")%(Config.getInstance().getSystemIconURL("checkAll"), Config.getInstance().getSystemIconURL("uncheckAll"), "".join( temp ))
1327 return html
1329 def getVars( self ):
1331 index = Catalog.getIdx('categ_conf_sd').getCategory(self._categ.getId())
1332 vars = wcomponents.WTemplated.getVars( self )
1333 vars["locator"] = self._categ.getLocator().getWebForm()
1334 vars["name"] = self._categ.getName()
1336 vars["description"] = self._categ.getDescription()
1338 if self._categ.getIcon() is not None:
1339 vars["icon"] = """<img src="%s" width="16" height="16" alt="category">"""%urlHandlers.UHCategoryIcon.getURL( self._categ)
1340 else:
1341 vars["icon"] = "None"
1342 vars["dataModifButton"] = ""
1343 if not self._categ.isRoot():
1344 vars["dataModifButton"] = i18nformat("""<input type="submit" class="btn" value="_("modify")">""")
1345 vars["removeItemsURL"] = vars["actionSubCategsURL"]
1346 if not self._categ.getSubCategoryList():
1347 vars['containsEvents'] = True
1348 vars["removeItemsURL"] = vars["actionConferencesURL"]
1349 vars["items"] = self.__getConferenceItems(index.itervalues(), vars["confModifyURLGen"], vars["confModifyURLOpen"])
1350 else:
1351 vars['containsEvents'] = False
1352 vars["items"] = self.__getSubCategoryItems( self._categ.getSubCategoryList(), vars["categModifyURLGen"] )
1353 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1354 vars["defaultMeetingStyle"] = styleMgr.getStyleName(self._categ.getDefaultStyle("meeting"))
1355 vars["defaultLectureStyle"] = styleMgr.getStyleName(self._categ.getDefaultStyle("simple_event"))
1357 ## vars["defaultVisibility"] = self._categ.getVisibility()
1358 vars["defaultTimezone"] = self._categ.getTimezone()
1359 visibility = self._categ.getVisibility()
1360 categpath = self._categ.getCategoryPath()
1361 categpath.reverse()
1362 if visibility > len(categpath):
1363 vars["defaultVisibility"] = _("Everywhere")
1364 elif visibility == 0:
1365 vars["defaultVisibility"] = _("Nowhere")
1366 else:
1367 categId = categpath[visibility-1]
1368 cat = conference.CategoryManager().getById(categId)
1369 vars["defaultVisibility"] = cat.getName()
1371 ###################################################################################################
1372 ## TODO: this code belongs to the TASKS MODULE. We should fix it or remove it.
1373 vars["enablePic"]=quoteattr(str(Config.getInstance().getSystemIconURL( "enabledSection" )))
1374 vars["disablePic"]=quoteattr(str(Config.getInstance().getSystemIconURL( "disabledSection" )))
1375 enabledText = _("Click to disable")
1376 disabledText = _("Click to enable")
1378 url = urlHandlers.UHCategoryTasksOption.getURL( self._categ )
1380 comment = ""
1381 if (self._categ.hasSubcategories()):
1382 icon=vars["disablePic"]
1383 textIcon = disabledText
1384 comment = i18nformat("""<b>&nbsp;&nbsp;[ _("Category contains subcategories - this module cannot be enabled")]</b>""")
1385 url = ""
1386 elif self._categ.tasksAllowed():
1387 icon=vars["enablePic"]
1388 textIcon=enabledText
1389 if len(self._categ.getTaskList()) > 0 :
1390 comment = i18nformat("""<b>&nbsp;&nbsp;[_("Task list is not empty - this module cannot be disabled")]</b>""")
1391 url = ""
1392 else:
1393 icon=vars["disablePic"]
1394 textIcon=disabledText
1395 tasksManagement = """
1396 <tr>
1397 <td>
1398 <a href=%s><img src=%s alt="%s" class="imglink"></a>&nbsp;<a href=%s>%s</a>%s
1399 </td>
1400 </tr>"""%(url,icon,textIcon,url, _("Tasks List"),comment)
1401 vars["tasksManagement"] = tasksManagement
1402 ###################################################################################################
1403 return vars
1406 class WPCategoryModification( WPCategModifMain ):
1408 def _getPageContent( self, params ):
1409 wc = WCategModifMain( self._target )
1410 pars = { \
1411 "dataModificationURL": urlHandlers.UHCategoryDataModif.getURL( self._target ), \
1412 "addSubCategoryURL": urlHandlers.UHCategoryCreation.getURL(self._target),
1413 "addConferenceURL": urlHandlers.UHConferenceCreation.getURL( self._target ), \
1414 "confModifyURLGen": urlHandlers.UHConferenceModification.getURL, \
1415 "confModifyURLOpen": urlHandlers.UHConferenceOpen.getURL, \
1416 "categModifyURLGen": urlHandlers.UHCategoryModification.getURL, \
1417 "actionSubCategsURL": urlHandlers.UHCategoryActionSubCategs.getURL(self._target),
1418 "actionConferencesURL": urlHandlers.UHCategoryActionConferences.getURL(self._target)}
1419 return wc.getHTML( pars )
1422 class WCategoryDataModification(wcomponents.WTemplated):
1424 def __init__( self, category ):
1425 self._categ = category
1427 def _getVisibilityHTML(self):
1428 visibility = self._categ.getVisibility()
1429 topcat = self._categ
1430 level = 0
1431 selected = ""
1432 if visibility == 0:
1433 selected = "selected"
1434 vis = [ i18nformat("""<option value="0" %s> _("Nowhere")</option>""") % selected]
1435 while topcat:
1436 level += 1
1437 selected = ""
1438 if level == visibility:
1439 selected = "selected"
1440 if topcat.getId() != "0":
1441 vis.append("""<option value="%s" %s>%s</option>""" % (level, selected, truncateTitle(topcat.getName(), 70)))
1442 topcat = topcat.getOwner()
1443 selected = ""
1444 if visibility > level:
1445 selected = "selected"
1446 vis.append( i18nformat("""<option value="999" %s> _("Everywhere")</option>""") % selected)
1447 vis.reverse()
1448 return "".join(vis)
1450 def getVars( self ):
1451 vars = wcomponents.WTemplated.getVars( self )
1452 vars["name"] = self._categ.getName()
1453 vars["description"] = self._categ.getDescription()
1454 vars["visibility"] = self._getVisibilityHTML()
1455 vars["timezoneOptions"] = TimezoneRegistry.getShortSelectItemsHTML(self._categ.getTimezone())
1456 if self._categ.getIcon() is not None:
1457 vars["icon"] = """<img src="%s" width="16" height="16" alt="category">"""%urlHandlers.UHCategoryIcon.getURL( self._categ)
1458 else:
1459 vars["icon"] = "None"
1460 for type in [ "simple_event", "meeting" ]:
1461 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1462 styles = styleMgr.getExistingStylesForEventType(type)
1463 styleoptions = ""
1464 for styleId in styles:
1465 defStyle = self._categ.getDefaultStyle(type)
1466 if defStyle == "":
1467 defStyle = styleMgr.getDefaultStyleForEventType(type)
1468 if styleId == defStyle:
1469 selected = "selected"
1470 else:
1471 selected = ""
1472 styleoptions += "<option value=\"%s\" %s>%s</option>" % (styleId,selected,styleMgr.getStyleName(styleId))
1473 vars["%sStyleOptions" % type] = styleoptions
1475 return vars
1478 class WPCategoryDataModification(WPCategModifMain):
1480 def _getPageContent(self, params):
1481 wc = WCategoryDataModification(self._target)
1482 pars = {"postURL": urlHandlers.UHCategoryPerformModification.getURL(self._target)}
1483 return wc.getHTML(pars)
1486 class WCategoryCreation(wcomponents.WTemplated):
1488 def __init__(self, target):
1489 self.__target = target
1491 def getVars(self):
1492 vars = wcomponents.WTemplated.getVars(self)
1493 vars["locator"] = self.__target.getLocator().getWebForm()
1495 for type in ["simple_event", "meeting"]:
1496 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1497 styles = styleMgr.getExistingStylesForEventType(type)
1498 styleoptions = ""
1500 for styleId in styles:
1501 defStyle = self.__target.getDefaultStyle(type)
1503 if defStyle == "":
1504 defStyle = styleMgr.getDefaultStyleForEventType(type)
1505 if styleId == defStyle:
1506 selected = "selected"
1507 else:
1508 selected = ""
1510 styleoptions += "<option value=\"%s\" %s>%s</option>" % (styleId, selected, styleMgr.getStyleName(styleId))
1511 vars["%sStyleOptions" % type] = styleoptions
1513 default_tz = Config.getInstance().getDefaultTimezone()
1514 vars["timezoneOptions"] = TimezoneRegistry.getShortSelectItemsHTML(default_tz)
1515 vars["categTitle"] = self.__target.getTitle()
1516 if self.__target.isProtected():
1517 vars["categProtection"] = "private"
1518 else:
1519 vars["categProtection"] = "public"
1520 vars["numConferences"] = len(self.__target.conferences)
1522 return vars
1525 class WPCategoryCreation(WPCategModifMain):
1527 def _getPageContent(self, params):
1528 wc = WCategoryCreation(self._target)
1529 pars = {"categDisplayURLGen": urlHandlers.UHCategoryDisplay.getURL, \
1530 "postURL": urlHandlers.UHCategoryPerformCreation.getURL(self._target)}
1531 return wc.getHTML(pars)
1534 class WCategoryDeletion(object):
1536 def __init__(self, categoryList):
1537 self._categList = categoryList
1539 def getHTML(self, actionURL):
1540 categories = []
1542 for categ in self._categList:
1543 categories.append("""<li><i>%s</i></li>""" % categ.getName())
1545 msg = {'challenge': _("Are you sure that you want to delete the following categories?"),
1546 'target': "".join(categories),
1547 'important': True,
1548 'subtext': _("Note that all the existing sub-categories below will also be deleted")
1551 wc = wcomponents.WConfirmation()
1552 categIdList = []
1554 for categ in self._categList:
1555 categIdList.append(categ.getId())
1557 return wc.getHTML(msg, actionURL, {"selectedCateg": categIdList},
1558 confirmButtonCaption=_("Yes"),
1559 cancelButtonCaption=_("No"),
1560 severity='danger')
1563 class WConferenceDeletion(wcomponents.WTemplated):
1564 pass
1567 class WPSubCategoryDeletion(WPCategModifMain):
1569 def _getPageContent(self, params):
1570 selCategs = params["subCategs"]
1571 wc = WCategoryDeletion(selCategs)
1572 return wc.getHTML(urlHandlers.UHCategoryActionSubCategs.getURL(self._target))
1575 class WPConferenceDeletion(WPCategModifMain):
1577 def _getPageContent(self, params):
1578 wc = WConferenceDeletion()
1579 return wc.getHTML({'eventList': params["events"],
1580 'postURL': urlHandlers.UHCategoryActionConferences.getURL(self._target),
1581 'cancelButtonCaption': _("No"),
1582 'confirmButtonCaption': _("Yes")})
1585 class WItemReallocation(wcomponents.WTemplated):
1587 def __init__(self, itemList):
1588 self._itemList = itemList
1590 def getHTML(self, selectTree, params):
1591 self._sTree = selectTree
1592 return wcomponents.WTemplated.getHTML(self, params)
1594 def _getItemDescription(self, item):
1595 return ""
1597 def getVars(self):
1598 vars = wcomponents.WTemplated.getVars( self )
1599 l = []
1600 for item in self._itemList:
1601 l.append("<li><b>%s</b>"%self._getItemDescription(item))
1602 vars["selectedItems"] = "".join(l)
1603 vars["categTree"] = self._sTree.getHTML()
1604 return vars
1607 class WCategoryReallocation( WItemReallocation ):
1609 def _getItemDescription( self, item ):
1610 return item.getName()
1613 class WConferenceReallocation( WItemReallocation ):
1615 def _getItemDescription( self, item ):
1616 return item.getTitle()
1619 class CategSelectTree:
1621 def __init__( self, aw, excludedCat, expandedCat, \
1622 selectURLGen, expandURLGen, movingConference = 0 ):
1623 self._aw = aw
1624 self._excludedCategs = excludedCat
1625 self._expandedCategs = expandedCat
1626 self._selectURLGen = selectURLGen
1627 self._expandURLGen = expandURLGen
1628 self._movingConference = movingConference
1630 def _getItem( self, categ, level=0 ):
1631 if not categ.canAccess( self._aw ):
1632 return ""
1633 html = ""
1634 for i in range(level):
1635 html = "%s&nbsp;&nbsp;&nbsp;"%html
1636 cfg = Config.getInstance()
1637 if categ in self._excludedCategs:
1638 return """%s<img src="%s" border="0" alt=""> %s"""%(html, cfg.getSystemIconURL("collapsd.png"), categ.getName())
1639 if (self._movingConference) and categ.getSubCategoryList():
1640 title = """%s"""%categ.getName()
1641 else:
1642 title = """<a href="%s">%s</a>"""%(self._selectURLGen( categ ), \
1643 categ.getName())
1644 if categ in self._expandedCategs:
1645 ex = copy( self._expandedCategs )
1646 ex.remove( categ )
1647 html = """%s<a href="%s"><img src="%s" border="0" alt=""></a> %s"""%(html, self._expandURLGen( ex ), cfg.getSystemIconURL("exploded.png"), title)
1648 for subcat in categ.getSubCategoryList():
1649 html = "%s<br>%s"%(html, self._getItem(subcat, level+1) )
1650 else:
1651 html = """%s<a href="%s"><img src="%s" border="0" alt=""></a> %s"""%(html, self._expandURLGen( self._expandedCategs+[categ] ), cfg.getSystemIconURL("collapsd.png"), title)
1652 return html
1654 def getHTML( self ):
1655 cm = conference.CategoryManager()
1656 return self._getItem( cm.getRoot() )
1659 class WPCategoryReallocation( WPCategModifMain ):
1661 def _getReAllocateCategsURL( self, destination ):
1662 url = urlHandlers.UHCategoryActionSubCategs.getURL( destination )
1663 selectedCategs = []
1664 for c in self._categs:
1665 selectedCategs.append( c.getId() )
1666 url.addParam( "selectedCateg", selectedCategs )
1667 url.addParam( "confirm", "" )
1668 url.addParam( "reallocate", "" )
1669 return url
1671 def _getCategExpandCategURL( self, expandedCategs ):
1672 selected = []
1673 for c in self._categs:
1674 selected.append( c.getId() )
1675 expanded = []
1676 for c in expandedCategs:
1677 expanded.append( c.getId() )
1678 url = urlHandlers.UHCategoryActionSubCategs.getURL( self._target )
1679 url.addParam( "selectedCateg", selected )
1680 url.addParam( "ex", expanded )
1681 url.addParam( "reallocate", "" )
1682 return url
1684 def _getExpandedCategs( self, params ):
1685 exIdList = params.get("ex", [])
1686 if not isinstance( exIdList, list ):
1687 exIdList = [ exIdList ]
1688 expanded = []
1689 cm = conference.CategoryManager()
1690 for categId in exIdList:
1691 expanded.append( cm.getById( categId ) )
1692 return expanded
1694 def _getPageContent( self, params ):
1695 self._categs = params["subCategs"]
1696 expanded = self._getExpandedCategs( params )
1697 pars = {"cancelURL": urlHandlers.UHCategoryModification.getURL( self._target ) }
1698 tree = CategSelectTree( self._getAW(), self._categs, \
1699 expanded, \
1700 self._getReAllocateCategsURL, \
1701 self._getCategExpandCategURL )
1702 wc = WCategoryReallocation( self._categs )
1703 return wc.getHTML( tree, pars )
1706 class WPConferenceReallocation( WPCategModifMain ):
1708 def _getReAllocateConfsURL( self, destination ):
1709 url = urlHandlers.UHCategoryActionConferences.getURL( destination )
1710 url.addParam( "srcCategId", self._target.getId() )
1711 url.addParam( "selectedConf", self._confIds)
1712 url.addParam( "confirm", "" )
1713 url.addParam( "reallocate", "" )
1714 return url
1716 def _getExpandCategURL( self, expandedCategs ):
1717 expanded = []
1718 for c in expandedCategs:
1719 expanded.append( c.getId() )
1720 url = urlHandlers.UHCategoryActionConferences.getURL( self._target )
1721 url.addParam( "ex", expanded )
1722 url.addParam( "reallocate", "" )
1723 url.addParam( "selectedConf", self._confIds )
1724 return url
1726 def _getExpandedCategs( self, params ):
1727 exIdList = params.get("ex", [])
1728 if not isinstance( exIdList, list ):
1729 exIdList = [ exIdList ]
1730 expanded = []
1731 cm = conference.CategoryManager()
1732 for categId in exIdList:
1733 expanded.append( cm.getById( categId ) )
1734 return expanded
1736 def _getPageContent( self, params ):
1737 self._confs = params["confs"]
1738 self._confIds = []
1739 for c in self._confs:
1740 self._confIds.append( c.getId() )
1741 expanded = self._getExpandedCategs( params )
1742 pars = {"cancelURL": urlHandlers.UHCategoryModification.getURL( self._target ) }
1743 tree = CategSelectTree( self._getAW(), [], \
1744 expanded, \
1745 self._getReAllocateConfsURL, \
1746 self._getExpandCategURL, 1 )
1747 wc = WConferenceReallocation( self._confs )
1748 return wc.getHTML( tree, pars )
1751 class WCategModifAC(wcomponents.WTemplated):
1753 def __init__( self, category ):
1754 self._categ = category
1756 def _getControlUserList(self):
1757 result = fossilize(self._categ.getManagerList())
1758 # get pending users
1759 for email in self._categ.getAccessController().getModificationEmail():
1760 pendingUser = {}
1761 pendingUser["email"] = email
1762 pendingUser["pending"] = True
1763 result.append(pendingUser)
1764 return result
1766 def getVars( self ):
1767 vars = wcomponents.WTemplated.getVars( self )
1769 vars["modifyControlFrame"] = wcomponents.WModificationControlFrame().getHTML(self._categ)
1770 if self._categ.isRoot() :
1771 type = 'Home'
1772 else :
1773 type = 'Category'
1775 vars["accessControlFrame"] = wcomponents.WAccessControlFrame().getHTML(\
1776 self._categ,\
1777 vars["setVisibilityURL"],\
1778 type)
1779 if not self._categ.isProtected():
1780 df = wcomponents.WDomainControlFrame( self._categ )
1781 vars["accessControlFrame"] += "<br>%s"%df.getHTML()
1782 vars["confCreationControlFrame"] = ""
1783 vars["categoryId"] = self._categ.getId()
1784 if not self._categ.getSubCategoryList():
1785 frame = wcomponents.WConfCreationControlFrame( self._categ )
1786 p = { "setStatusURL": vars["setConferenceCreationControlURL"] }
1787 vars["confCreationControlFrame"] = frame.getHTML(p)
1788 vars["managers"] = self._getControlUserList()
1789 return vars
1791 class WPCategModifAC( WPCategoryModifBase ):
1793 def _setActiveSideMenuItem( self ):
1794 self._ACMenuItem.setActive()
1796 def _getPageContent(self, params):
1797 wc = WCategModifAC(self._target)
1798 pars = {
1799 "setVisibilityURL": urlHandlers.UHCategorySetVisibility.getURL(self._target),
1800 "setConferenceCreationControlURL": urlHandlers.UHCategorySetConfCreationControl.getURL(self._target)
1802 return wc.getHTML(pars)
1804 #---------------------------------------------------------------------------------
1806 class WCategModifTools(wcomponents.WTemplated):
1808 def __init__( self, category ):
1809 self._categ = category
1811 def getVars( self ):
1812 vars = wcomponents.WTemplated.getVars( self )
1813 vars["deleteButton"] = ""
1814 vars["id"] = self._categ.getId()
1815 if not self._categ.isRoot():
1816 vars["deleteButton"] = i18nformat("""<input type="submit" class="btn" value="_("delete this category")">""")
1817 return vars
1820 class WPCategModifTools( WPCategoryModifBase ):
1822 def _setActiveSideMenuItem( self ):
1823 self._toolsMenuItem.setActive()
1825 def _getPageContent( self, params ):
1826 wc = WCategModifTools( self._target )
1827 pars = { \
1828 "deleteCategoryURL": urlHandlers.UHCategoryDeletion.getURL(self._target) }
1829 return wc.getHTML( pars )
1832 class WPCategoryDeletion( WPCategModifTools ):
1834 def _getPageContent( self, params ):
1835 wc = WCategoryDeletion( [self._target] )
1836 return wc.getHTML( urlHandlers.UHCategoryDeletion.getURL( self._target ) )
1838 #---------------------------------------------------------------------------------
1840 class WCategModifTasks(wcomponents.WTemplated):
1842 def __init__( self, category ):
1843 self._categ = category
1845 def getVars( self ):
1846 vars = wcomponents.WTemplated.getVars( self )
1847 if self._categ.tasksAllowed() :
1848 vars["tasksAllowed"] = _("Adding tasks is allowed")
1849 else :
1850 vars["tasksAllowed"] = _("Adding tasks IS NOT allowed")
1851 vars["id"] = self._categ.getId()
1852 vars["taskAction"] = urlHandlers.UHCategModifTasksAction.getURL(self._categ)
1853 vars["locator"] = ""
1855 if self._categ.tasksPublic() :
1856 vars["accessVisibility"] = _("PUBLIC")
1857 oppVisibility = _("PRIVATE")
1858 else :
1859 vars["accessVisibility"] = _("PRIVATE")
1860 oppVisibility = _("PUBLIC")
1861 vars["changeAccessVisibility"] = i18nformat("""( _("make it") <input type="submit" class="btn" name="accessVisibility" value="%s">)""")%oppVisibility
1863 if not self._categ.tasksPublic() :
1864 vars["commentVisibility"] = _("PRIVATE")
1865 vars["changeCommentVisibility"] = """"""
1866 else :
1867 if self._categ.tasksCommentPublic() :
1868 vars["commentVisibility"] = _("PUBLIC")
1869 oppVisibility = _("PRIVATE")
1870 else :
1871 vars["commentVisibility"] = _("PRIVATE")
1872 oppVisibility = _("PUBLIC")
1873 vars["changeCommentVisibility"] = i18nformat("""( _("make it") <input type="submit" class="btn" name="commentVisibility" value="%s">)""")%oppVisibility
1876 vars["managerList"] = self._getPersonList("manager")
1877 vars["commentList"] = self._getPersonList("commentator")
1878 vars["accessList"] = self._getPersonList("access")
1880 vars["accessOptions"] = self._getAccessOptions()
1881 vars["commentOptions"] = self._getCommentOptions()
1882 vars["managerOptions"] = self._getManagerOptions()
1885 return vars
1887 def _getAccessOptions(self, names=[]):
1888 html = []
1889 if len(names) == 0 :
1890 html.append("""<option value=""> </option>""")
1891 for event in self._categ.getConferenceList() :
1892 index = 0
1893 for chair in event.getChairList() :
1894 text = """<option value="h%s-%s">%s</option>"""%(event.getId(),index,chair.getFullName())
1895 index = index + 1
1896 if not (chair.getFullName() in names) :
1897 html.append(text)
1898 names.append(chair.getFullName())
1899 index = 0
1900 for manager in event.getManagerList() :
1901 text = """<option value="m%s-%s">%s</option>"""%(event.getId(),index,manager.getFullName())
1902 index = index + 1
1903 if not (manager.getFullName() in names) :
1904 html.append(text)
1905 names.append(manager.getFullName())
1906 index = 0
1907 for participant in event.getParticipation().getParticipantList():
1908 text = """<option value="p%s-%s">%s</option>"""%(event.getId(),index,participant.getFullName())
1909 index = index + 1
1910 if not (participant.getFullName() in names) :
1911 html.append(text)
1912 names.append(participant.getFullName())
1913 return """
1914 """.join(html)
1916 def _getCommentOptions(self, names=[]):
1917 html = []
1918 if len(names) == 0 :
1919 html.append("""<option value=""> </option>""")
1920 index = 0
1921 for a in self._categ.getTasksAccessList() :
1922 text = """<option value="a%s">%s</option>"""%(index,a.getFullName())
1923 index = index + 1
1924 if not (a.getFullName() in names) :
1925 html.append(text)
1926 names.append(a.getFullName())
1927 list = """
1928 """.join(html)
1930 return list + """
1931 """+self._getAccessOptions(names)
1933 def _getManagerOptions(self):
1934 html = []
1935 names = []
1936 html.append("""<option value=""> </option>""")
1937 index = 0
1938 for c in self._categ.getTasksCommentatorList() :
1939 text = """<option value="c%s">%s</option>"""%(index,c.getFullName())
1940 index = index + 1
1941 if not (c.getFullName() in names) :
1942 html.append(text)
1943 names.append(c.getFullName())
1944 list = """
1945 """.join(html)
1947 return list + """
1948 """+self._getCommentOptions(names)
1951 def _getPersonList(self, personType):
1952 html = []
1953 index = 0
1954 if personType == "access" :
1955 personList = self._categ.getTasksAccessList()
1956 elif personType == "manager" :
1957 personList = self._categ.getTasksManagerList()
1958 elif personType == "comentator" :
1959 personList = self._categ.getTasksCommentatorList()
1960 else :
1961 return ""
1963 for a in personList :
1964 line = """
1965 <tr>
1966 <td><input type="checkbox" name="%s" value="%s"></td>
1967 <td>%s</td>
1968 </tr>
1969 """%(personType, index, a.getFullName())
1970 index = index + 1
1971 html.append(line)
1973 list = """
1974 """.join(html)
1975 out = """
1976 <table>
1978 </table>"""%list
1979 return out
1981 class WPCategModifTasks( WPCategoryModifBase ):
1983 def _setActiveSideMenuItem( self ):
1984 self._tasksMenuItem.setActive()
1986 def _getPageContent( self, params ):
1987 wc = WCategModifTasks( self._target )
1988 pars = { \
1989 "deleteCategoryURL": urlHandlers.UHCategoryDeletion.getURL(self._target) }
1991 return wc.getHTML( pars )