Add category.management_sidemenu signal
[cds-indico.git] / indico / MaKaC / webinterface / pages / category.py
blobd72ef2765944fcb2f636b6f9b6c220111edd96f1
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 _getMaterials(self):
85 l = []
86 for mat in sorted(self._target.getAllMaterialList()):
87 if mat.canView(self._aw):
88 l.append(mat)
89 return l
91 def _getResourceName(self, resource):
92 if isinstance(resource, conference.Link):
93 return resource.getName() if resource.getName() != "" and resource.getName() != resource.getURL() \
94 else resource.getURL()
95 else:
96 return resource.getName() if resource.getName() != "" and resource.getName() != resource.getFileName() \
97 else resource.getFileName()
99 def getHTML(self, aw, params):
100 self._aw = aw
101 return wcomponents.WTemplated.getHTML(self, params)
103 def getVars(self):
104 vars = wcomponents.WTemplated.getVars(self)
105 isRootCategory = self._target.getId() == "0"
107 vars["name"] = self._target.getName()
108 vars["description"] = self._target.getDescription()
109 vars["img"] = self._target.getIconURL()
110 vars["categ"] = vars["target"] = self._target;
111 vars["urlICSFile"] = urlHandlers.UHCategoryToiCal.getURL(self._target)
112 vars["isRootCategory"] = isRootCategory
113 vars["timezone"] = self._timezone
114 vars["materials"] = self._getMaterials()
115 vars["getMaterialURL"] = lambda mat: urlHandlers.UHMaterialDisplay.getURL(mat)
116 vars["getResourceName"] = lambda resource: self._getResourceName(resource)
117 subcats = self._target.subcategories
119 confs = self._target.conferences
120 if subcats:
121 cl = wcomponents.WCategoryList(self._target)
122 params = {"categoryDisplayURLGen": vars["categDisplayURLGen"]}
123 vars["contents"] = cl.getHTML( self._aw, params )
124 elif confs:
125 pastEvents = session.get('fetchPastEventsFrom', set())
126 showPastEvents = (self._target.getId() in pastEvents or
127 (session.user and session.user.settings.get('show_past_events')))
128 cl = wcomponents.WConferenceList(self._target, self._wfReg, showPastEvents)
129 params = {"conferenceDisplayURLGen": vars["confDisplayURLGen"]}
130 vars["contents"] = cl.getHTML( self._aw, params )
131 else:
132 cl = wcomponents.WEmptyCategory()
133 vars["contents"] = cl.getHTML( self._aw )
135 mgrs = []
136 for mgr in self._target.getManagerList():
137 if isinstance(mgr, AvatarUserWrapper):
138 mgrs.append(("avatar", mgr.getAbrName()))
139 elif isinstance(mgr, GroupWrapper):
140 mgrs.append(("group", mgr.getName()))
142 vars["managers"] = sorted(mgrs)
144 # Export ICS
145 if self._target.conferences:
146 vars.update(self._getIcalExportParams(self._aw.getUser(), '/export/categ/%s.ics' % self._target.getId(), {'from':"-7d"}))
148 vars["isLoggedIn"] = self._aw.getUser() is not None
150 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
151 vars["isNewsActive"] = minfo.isNewsActive()
153 # if this is the front page, include the
154 # upcoming event information (if there are any)
155 if isRootCategory:
156 upcoming = ModuleHolder().getById('upcoming_events')
157 upcoming_list = upcoming.getUpcomingEventList()
158 if upcoming_list:
159 vars["upcomingEvents"] = WUpcomingEvents(self._timezone, upcoming_list).getHTML(vars)
160 else:
161 vars["upcomingEvents"] = ''
163 return vars
166 class WPCategoryDisplay(WPCategoryDisplayBase):
168 def __init__(self, rh, target, wfReg):
169 WPCategoryDisplayBase.__init__(self, rh, target)
170 self._wfReg = wfReg
171 tzUtil = DisplayTZ(self._getAW(), target) # None,useServerTZ=1)
172 self._locTZ = tzUtil.getDisplayTZ()
174 def getJSFiles(self):
175 return WPCategoryDisplayBase.getJSFiles(self) + self._includeJSPackage('MaterialEditor')
177 def _getHeadContent(self):
178 # add RSS feed
179 url = urlHandlers.UHCategoryToAtom.getURL(self._target)
181 return WPCategoryDisplayBase._getHeadContent( self ) + \
182 i18nformat("""<link rel="alternate" type="application/atom+xml" title="_('Indico Atom Feed')" href="%s">""") % url
184 def _getBody( self, params ):
185 wc = WCategoryDisplay(self._target, self._wfReg, self._locTZ)
186 pars = { "categDisplayURLGen": urlHandlers.UHCategoryDisplay.getURL, \
187 "confDisplayURLGen": urlHandlers.UHConferenceDisplay.getURL, \
188 "allowUserModif": self._target.canModify( self._getAW() ), \
189 "allowCreateEvent": self._target.canCreateConference(self._getAW().getUser()) }
190 page = wc.getHTML( self._getAW(), pars )
191 return page
193 def _getNavigationDrawer(self):
194 pars = {"target": self._target, "isModif": False}
195 return wcomponents.WNavigationDrawer( pars )
197 class WOverviewBreak( wcomponents.WTemplated ):
199 def __init__( self, aw, entry ):
200 self._break = entry
201 self._aw = aw
203 def getVars( self ):
204 tz = DisplayTZ(self._aw).getDisplayTZ()
205 vars = wcomponents.WTemplated.getVars( self )
206 vars["startTime"] = self._break.getAdjustedStartDate(tz).strftime("%H:%M")
207 vars["title"] = self._break.getTitle()
208 return vars
211 class WOverviewContribBase( wcomponents.WTemplated ):
213 def __init__( self, aw, contrib, date, details="conference" ):
214 self._aw = aw
215 self._contrib = contrib
216 self._date = date
217 self._details = details
219 def _getSpeakerText( self ):
220 l = []
221 if self._contrib.getSpeakerText()!="":
222 l.append( self._contrib.getSpeakerText() )
223 for av in self._contrib.getSpeakerList():
224 l.append( "%s"%av.getAbrName() )
225 speakers = ""
226 if len(l)>0:
227 speakers = "(%s)"%"; ".join(l)
228 return speakers
230 def _getLocation( self ):
231 loc = ""
232 if self._contrib.getOwnLocation() != None:
233 loc = self._contrib.getLocation().getName()
234 room = ""
235 if self._contrib.getOwnRoom() != None:
236 if loc != "":
237 loc = "%s: "%loc
238 room = self._contrib.getRoom().getName()
239 url = linking.RoomLinker().getURL( self._contrib.getRoom(), \
240 self._contrib.getLocation() )
241 if url != "":
242 room = """<a href="%s" style="font-size: 0.9em">%s</a>"""%(url, room)
243 if loc != "" or room != "":
244 return "(%s %s)"%(loc, room)
245 else:
246 return ""
248 def getHTML( self, params={} ):
249 return wcomponents.WTemplated.getHTML( self, params )
251 def getVars( self ):
252 vars = wcomponents.WTemplated.getVars( self )
253 tz = DisplayTZ(self._aw).getDisplayTZ()
254 vars["timezone"] = tz
255 vars["startTime"] = self._contrib.getAdjustedStartDate(tz).strftime( "%H:%M" )
256 vars["title"] = self._contrib.getTitle()
257 vars["speakers"] = self._getSpeakerText()
258 vars["location"] = self._getLocation()
259 return vars
262 class WOverviewContribFullDisplay( WOverviewContribBase ):
263 pass
266 class WOverviewContribMinDisplay( WOverviewContribBase ):
267 pass
270 class WOverviewContribution:
272 def __init__( self, aw, contrib, date, details="conference" ):
273 self._comp = None
275 """ This is needed for the future? The two
276 templates are currently identical """
278 if contrib.canAccess( aw ):
279 self._comp = WOverviewContribFullDisplay( aw, \
280 contrib, \
281 date, \
282 details )
283 else:
284 self._comp = WOverviewContribMinDisplay( aw, \
285 contrib, \
286 date, \
287 details )
288 def getHTML( self, params={} ):
289 if not self._comp:
290 return ""
291 return self._comp.getHTML( params )
294 class WOverviewSessionBase( wcomponents.WTemplated ):
296 def __init__( self, aw, session, date, details="conference" ):
297 self._aw = aw
298 self._session = session
299 self._date = date
300 self._details = details
302 def _getConvenerText( self ):
303 l = []
304 if self._session.getConvenerText()!="":
305 l.append( self._session.getConvenerText() )
306 for av in self._session.getConvenerList():
307 l.append( "%s"%av.getAbrName() )
308 conveners = ""
309 if len(l)>0:
310 conveners = "(%s)"%"; ".join(l)
311 return conveners
313 def _getLocation( self ):
314 loc = ""
315 if self._session.getOwnLocation() != None:
316 loc = self._session.getLocation().getName()
317 room = ""
318 if self._session.getOwnRoom() != None:
319 if loc != "":
320 loc = "%s: "%loc
321 url = linking.RoomLinker().getURL( self._session.getRoom(), \
322 self._session.getLocation() )
323 room = self._session.getRoom().getName()
324 if url != "":
325 room = """<a href="%s" style="font-size: 0.9em">%s</a>"""%(url, room)
326 if loc != "" or room != "":
327 return "(%s %s)"%(loc, room)
328 else:
329 return ""
331 def _getBreakItem( self, entry ):
332 wc = WOverviewBreak( self._aw, entry )
333 return wc.getHTML( {} )
335 def _getDetails( self ):
336 if self._details != "contribution":
337 return ""
338 res = []
339 tz = DisplayTZ(self._aw).getDisplayTZ()
340 for entry in self._session.getSchedule().getEntriesOnDay( self._date ):
341 if self._details == "contribution":
342 if isinstance( entry, schedule.LinkedTimeSchEntry) and \
343 isinstance( entry.getOwner(), conference.Contribution):
344 wc = WOverviewContribution( self._aw, \
345 entry.getOwner(), \
346 self._date, \
347 self._details )
348 res.append( wc.getHTML( ) )
349 elif isinstance( entry, schedule.BreakTimeSchEntry):
350 res.append( self._getBreakItem( entry ) )
351 return "".join( res )
353 def getVars( self ):
354 vars = wcomponents.WTemplated.getVars( self )
355 tz = DisplayTZ(self._aw).getDisplayTZ()
356 vars["startTime"] = self._session.getStartDate().astimezone(timezone(tz)).strftime("%H:%M")
357 conf=self._session.getConference()
358 import MaKaC.webinterface.webFactoryRegistry as webFactoryRegistry
359 wr = webFactoryRegistry.WebFactoryRegistry()
360 wf = wr.getFactory(conf)
361 if wf != None:
362 type = wf.getId()
363 else:
364 type = "conference"
365 if type != 'meeting':
366 vars["title"] = self._session.getTitle()
367 vars["titleUrl"] = None
368 else:
369 vars["title"] = self._session.getTitle()
370 vars["titleUrl"] = """%s#%s""" % (urlHandlers.UHConferenceDisplay.getURL(conf), self._session.getId())
371 vars["conveners"] = self._getConvenerText()
372 vars["location"] = self._getLocation()
373 vars["details"] = self._getDetails()
374 return vars
376 class WOverviewSessionSlot( WOverviewSessionBase ):
378 def __init__( self, aw, slot, date, details="conference" ):
379 self._aw = aw
380 self._session = slot.getSession()
381 self._slot = slot
382 self._date = date
383 self._details = details
385 def _getDetails( self ):
386 if self._details != "contribution":
387 return ""
388 res = []
389 tz = DisplayTZ(self._aw).getDisplayTZ()
390 for entry in self._slot.getSchedule().getEntriesOnDay( self._date ):
391 if self._details == "contribution":
392 if isinstance( entry, schedule.LinkedTimeSchEntry) and type(entry.getOwner()) is conference.Contribution:
393 wc = WOverviewContribution( self._aw, \
394 entry.getOwner(), \
395 self._date, \
396 self._details )
397 res.append( wc.getHTML( ) )
398 elif isinstance( entry, schedule.BreakTimeSchEntry):
399 res.append( self._getBreakItem( entry ) )
400 return "".join( res )
402 class WOverviewSessionFullDisplay( WOverviewSessionBase ):
403 pass
406 class WOverviewSessionMinDisplay( WOverviewSessionBase ):
408 def _getBreakItem( self, entry ):
409 return ""
412 class WOverviewSession:
414 def __init__( self, aw, session, date, details="conference" ):
415 self._comp = None
416 if session.canAccess( aw ):
417 self._comp = WOverviewSessionFullDisplay( aw, \
418 session, \
419 date, \
420 details )
421 else:
422 self._comp = WOverviewSessionMinDisplay( aw, \
423 session, \
424 date, \
425 details )
426 def getHTML( self, params ):
427 if not self._comp:
428 return ""
429 return self._comp.getHTML( params )
432 class WOverviewConfBase( wcomponents.WTemplated ):
434 def __init__( self, aw, conference, date, url, icons, details="conference", startTime = None ):
435 self._conf = conference
436 self._url = url
437 self._aw = aw
438 self._details = details
439 self._date = date
440 self._icons = icons
441 self._startTime = startTime
444 def _getChairText( self ):
445 l = []
446 if self._conf.getChairmanText()!="":
447 l.append( self._conf.getChairmanText() )
448 for av in self._conf.getChairList():
449 l.append( "%s"%av.getFullName() )
450 chairs = ""
451 if len(l)>0:
452 chairs = "(%s)"%"; ".join(l)
453 return chairs
455 def _getLocation( self ):
456 loc = ""
457 if self._conf.getLocation() != None:
458 loc = self._conf.getLocation().getName()
459 room = ""
460 if self._conf.getRoom() != None and self._conf.getRoom().getName() != None:
461 room = self._conf.getRoom().getName()
462 url = "javascript:redirectToRoomLoc('" + escape_html(room) + "','" + escape_html(loc) +"')"
463 loc = "%s: "%loc
464 room = """<a href="%s" style="font-size: 0.9em">%s</a>"""%(url, room)
465 if loc != "" or room != "":
466 return "(%s%s)"%(loc, room)
467 else:
468 return ""
470 def _getBreakItem( self, entry ):
471 wc = WOverviewBreak( self._aw, entry )
472 return wc.getHTML( {} )
474 def _getDetails( self ):
475 if self._details == "conference":
476 return ""
477 res = []
478 tz = DisplayTZ(self._aw,useServerTZ=1).getDisplayTZ()
479 for entry in self._conf.getSchedule().getEntriesOnDay( self._date ):
480 if isinstance( entry, schedule.LinkedTimeSchEntry) and \
481 isinstance( entry.getOwner(), conference.Session ) and entry.getOwner().canView(self._aw):
482 wc = WOverviewSession( self._aw, \
483 entry.getOwner(), \
484 self._date, \
485 self._details )
486 res.append( wc.getHTML({}) )
487 elif isinstance( entry, schedule.LinkedTimeSchEntry) and \
488 isinstance( entry.getOwner(), conference.SessionSlot ) and entry.getOwner().canView(self._aw):
489 wc = WOverviewSessionSlot( self._aw, \
490 entry.getOwner(), \
491 self._date, \
492 self._details )
493 res.append( wc.getHTML({}) )
494 elif self._details == "contribution":
495 if isinstance(entry, conference.ContribSchEntry) or \
496 isinstance( entry, schedule.LinkedTimeSchEntry) and isinstance(entry.getOwner(), conference.Contribution) and entry.getOwner().canView(self._aw):
497 wc = WOverviewContribution( self._aw, \
498 entry.getOwner(), \
499 self._date, \
500 self._details )
501 res.append( wc.getHTML( ) )
502 elif isinstance( entry, schedule.BreakTimeSchEntry):
503 res.append( self._getBreakItem( entry ) )
504 return "".join( res )
506 def _getIcon( self ):
507 confid = self._conf.getId()
508 iconHtml = ""
509 for icon in self._icons.keys():
510 if confid in self._icons[icon]:
511 cm=CategoryManager()
512 categ = cm.getById(str(icon))
513 iconHtml += """<img src="%s" width="16" height="16" alt="categ" onmouseover="IndicoUI.Widgets.Generic.tooltip(this, event, '%s')" />""" %(urlHandlers.UHCategoryIcon.getURL(categ), categ.getName())
514 return iconHtml
516 def getVars( self ):
517 vars = wcomponents.WTemplated.getVars( self )
518 tz = DisplayTZ(self._aw,useServerTZ=1).getDisplayTZ()
519 if self._startTime:
520 vars["startTime"] = self._startTime.strftime("%H:%M")
521 else:
522 vars["startTime"] = self._conf.calculateDayStartTime(self._date).strftime("%H:%M")
523 vars["timezone"] = tz
524 vars["title"] = self._conf.getTitle()
525 if self._conf.isProtected():
526 vars["title"] += """&nbsp;<img src=%s style="vertical-align: middle; border: 0;">""" % Config.getInstance().getSystemIconURL("protected")
527 vars["url"] = self._url
528 vars["chairs"] = self._getChairText()
529 vars["location"] = self._getLocation()
530 vars["details"] = self._getDetails()
531 vars["icon"] = self._getIcon()
532 return vars
535 class WOverviewConfFullDisplay( WOverviewConfBase ):
536 pass
538 class WOverviewConfMinDisplay( WOverviewConfBase ):
540 def _getDetails( self ):
541 return ""
543 def _getBreakItem( self, entry ):
544 return ""
547 class WOverviewConferenceItem:
549 def __init__(self, aw, conference, date, displayURL, icons, details="conference", startTime = None):
550 self._comp = None
551 if details=="conference" or conference.canAccess( aw ):
552 self._comp = WOverviewConfFullDisplay( aw, \
553 conference, \
554 date, \
555 displayURL, \
556 icons, \
557 details,
558 startTime )
559 else:
560 self._comp = WOverviewConfMinDisplay( aw, \
561 conference, \
562 date, \
563 displayURL, \
564 icons, \
565 details,
566 startTime )
568 def getHTML( self, params ):
569 if not self._comp:
570 return ""
571 return self._comp.getHTML( params )
574 class WDayOverview(wcomponents.WTemplated):
576 def __init__( self, ow ):
577 self._ow = ow
579 def getVars( self ):
580 vars = wcomponents.WTemplated.getVars( self )
581 prevOW = self._ow.getOverviewPrevPeriod()
582 prevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( prevOW )
583 nextOW = self._ow.getOverviewNextPeriod()
584 nextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nextOW )
585 pprevOW = self._ow.getOverviewPrevBigPeriod()
586 pprevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( pprevOW )
587 nnextOW = self._ow.getOverviewNextBigPeriod()
588 nnextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nnextOW )
589 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>""" % (\
590 pprevsel, \
591 prevsel,\
592 self._ow.getDate().strftime("%A %d %B %Y"), \
593 nextsel,\
594 nnextsel)
595 l = []
596 confs = self._ow.getConferencesWithStartTime()
597 for tuple in confs:
598 conf = tuple[0]
599 startTime = tuple[1]
600 oi = WOverviewConferenceItem( self._ow.getAW(), \
601 conf, \
602 self._ow.getDate(), \
603 vars["displayConfURLGen"]( conf ),\
604 self._ow._cal.getIcons(), \
605 self._ow.getDetailLevel(),
606 startTime )
607 l.append( oi.getHTML( {} ) )
608 if len(confs)==0:
609 l.append( _("There are no conferences on the selected day"))
610 vars["items"] = "".join(l)
611 return vars
613 class WWeekOverview(wcomponents.WTemplated):
615 def __init__( self, ow ):
616 self._ow = ow
618 def getVars( self ):
619 vars = wcomponents.WTemplated.getVars( self )
620 isWeekendFree = True
621 prevOW = self._ow.getOverviewPrevPeriod()
622 prevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( prevOW )
623 nextOW = self._ow.getOverviewNextPeriod()
624 nextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nextOW )
626 startDate = """<a href="%s">&lt;</a>&nbsp;&nbsp;%s""" % (\
627 prevsel,\
628 self._ow.getStartDate().strftime("%A %d %B %Y"))
629 endDate = """%s&nbsp;&nbsp;<a href="%s">&gt;</a>""" %(\
630 self._ow.getEndDate().strftime("%A %d %B %Y"),\
631 nextsel)
632 vars["dates"] = """%s &nbsp;&ndash;&nbsp; %s"""%(startDate, endDate)
634 inc = timedelta(1)
635 sd = self._ow.getStartDate()
636 idx = 0
637 while sd <= self._ow.getEndDate():
638 weekend = sd.weekday() >= 5
639 vars["date%i" % idx] = sd.strftime("%a %d/%m")
640 res = []
641 confs = self._ow.getConferencesWithStartTime(sd)
642 for conf, stTime in confs:
643 if weekend and not conf.hasSomethingOnWeekend(sd.date()):
644 continue
645 wc = WOverviewConferenceItem(self._ow.getAW(), conf, sd, vars["displayConfURLGen"](conf),
646 self._ow._cal.getIcons(), self._ow.getDetailLevel(), stTime)
647 res.append(wc.getHTML({}))
648 if not res:
649 res.append("<tr><td></td></tr>")
650 elif weekend:
651 isWeekendFree = False
652 vars["item%i" % idx] = "".join(res)
653 sd += inc
654 idx += 1
655 vars["isWeekendFree"] = isWeekendFree
656 return vars
659 class WMonthOverview(wcomponents.WTemplated):
661 def __init__( self, ow ):
662 self._ow = ow
663 self._isWeekendFree = True
665 def _getDayCell( self, day ):
666 res = []
667 confs = day.getConferencesWithStartTime()
668 if confs:
669 for tuple in confs:
670 conf = tuple[0]
671 stTime = tuple[1]
672 wc = WOverviewConferenceItem( self._ow.getAW(), \
673 conf, \
674 day.getDate(), \
675 self._displayConfURLGen( conf ),\
676 self._ow._cal.getIcons(), \
677 self._ow.getDetailLevel(),
678 stTime )
679 res.append( wc.getHTML( {} ) )
680 return "".join(res)
682 def _getMonth( self ):
683 dayList = [[]]
684 numWeek=0
685 dl = self._ow.getDayList()
686 for i in range( dl[0].getWeekDay() ):
687 dayList[numWeek].append(None)
688 for day in self._ow.getDayList():
689 dayList[numWeek].append(day)
690 if day.getWeekDay() >= 5:
691 if day.getConferencesWithStartTime():
692 self._isWeekendFree = False
693 if day.getWeekDay() == 6:
694 numWeek +=1
695 dayList.append([])
697 for i in range( 6-dl[-1].getWeekDay() ):
698 dayList[numWeek].append(None)
699 return dayList
702 def getVars( self ):
703 vars = wcomponents.WTemplated.getVars( self )
704 prevOW = self._ow.getOverviewPrevPeriod()
705 prevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( prevOW )
706 nextOW = self._ow.getOverviewNextPeriod()
707 nextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nextOW )
708 pprevOW = self._ow.getOverviewPrevBigPeriod()
709 pprevsel = urlHandlers.UHCategoryOverview.getURLFromOverview( pprevOW )
710 nnextOW = self._ow.getOverviewNextBigPeriod()
711 nnextsel = urlHandlers.UHCategoryOverview.getURLFromOverview( nnextOW )
712 startDate = """<a href="%s">&lt;&lt;</a>&nbsp;&nbsp;<a href="%s">&lt;</a>&nbsp;&nbsp;&nbsp;%s""" % (\
713 pprevsel,\
714 prevsel,\
715 self._ow.getStartDate().strftime("%A %d %B %Y"))
716 endDate = """%s&nbsp;&nbsp;&nbsp;<a href="%s">&gt;</a>&nbsp;&nbsp;<a href="%s">&gt;&gt;</a>""" %(\
717 self._ow.getEndDate().strftime("%A %d %B %Y"),\
718 nextsel,\
719 nnextsel)
720 vars["dates"] = """%s &nbsp;&ndash;&nbsp; %s"""%(startDate, endDate)
722 dayNames = [ _("Monday"), _("Tuesday"), _("Wednesday"), _("Thursday"), _("Friday"), \
723 _("Saturday"), _("Sunday") ]
724 #if calendar.SUNDAY == calendar.firstweekday():
725 # dayNames.remove( "Sunday" )
726 # dayNames.insert( "0", "Sunday" )
727 for name in dayNames:
728 vars["nameDay%i"%dayNames.index(name)] = name
729 self._displayConfURLGen = vars["displayConfURLGen"]
730 vars["month"] = self._getMonth()
731 vars["isWeekendFree"] = self._isWeekendFree
732 vars["getDayCell"] = lambda day: self._getDayCell(day)
733 return vars
736 class WCategoryOverview(wcomponents.WTemplated):
738 def __init__( self, ow, aw ):
739 self._categ = ow.getCategoryList()[0]
740 self._ow = ow
741 self._aw = aw
743 def _getDetailLevelOpts( self ):
744 l = []
745 for dl in self._ow.getAllowedDetailLevels():
746 selected = ""
747 if dl == self._ow.getDetailLevel():
748 selected = "selected"
749 if dl == "conference":
750 dltext = "agenda"
751 else:
752 dltext = dl
753 l.append("""<option value="%s" %s>%s</option>"""%( dl, selected, dltext ))
754 return "".join(l)
756 def _getKey( self, vars):
757 l = []
758 icons = self._ow._cal.getIcons().keys()
759 if len(icons) > 0:
760 for icon in icons:
761 cm= CategoryManager()
762 categ=cm.getById(str(icon))
763 otherOW = self._ow.getOverviewOtherCateg(categ)
764 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/>""" %(
765 vars["categOverviewURLGen"]( otherOW ),
766 categ.getName(),
767 urlHandlers.UHCategoryIcon.getURL(categ),
768 truncateTitle(categ.getName(), 20)))
769 if not a in l:
770 l.append(a)
771 return "". join(l)
773 def getVars( self ):
774 vars = wcomponents.WTemplated.getVars( self )
775 l = self._ow.getLocator()
776 del l["detail"]
777 del l["period"]
778 del l["day"]
779 del l["month"]
780 del l["year"]
782 vars["selDay"] = ""
783 vars["selWeek"] = ""
784 vars["selMonth"] = ""
785 vars["selYear"] = ""
787 vars["detailLevelOpts"] = self._getDetailLevelOpts()
789 if isinstance( self._ow, wcalendar.MonthOverview ):
790 displayOW = WMonthOverview( self._ow )
791 vars["selMonth"] = "selected"
792 elif isinstance( self._ow, wcalendar.WeekOverview ):
793 displayOW = WWeekOverview( self._ow )
794 vars["selWeek"] = "selected"
795 else:
796 displayOW = WDayOverview( self._ow )
797 vars["selDay"] = "selected"
799 p = { "displayConfURLGen": vars["displayConfURLGen"] }
800 vars["overview"] = displayOW.getHTML( p )
802 vars["locator"] = l.getWebForm()
803 vars["key"] = self._getKey(vars)
805 vars["day"] = self._ow.getDate().day
806 vars["month"] = self._ow.getDate().month
807 vars["year"] = self._ow.getDate().year
809 return vars
811 def _getWeekDays(self):
812 """returns a list with the current week days"""
814 year=int(self._ow.getDate().year)
815 month=int(self._ow.getDate().month)
816 day=int(self._ow.getDate().day)
817 daynumber=int(calendar.weekday(year,month,day))
819 date = self._ow.getDate() - timedelta(daynumber)
820 delta = timedelta(1)
821 res = []
822 for i in range(7):
823 res.append((str(date.day)+"-"+str(date.month)+"-"+str(date.year)))
824 date += delta
826 return res
831 def _getNextWeekDays(self):
834 y=int(self._ow.getDate().year)
835 m=int(self._ow.getDate().month)
836 d=int(self._ow.getDate().day)
838 res=[]
840 while i<=6:
842 if (d+i)<=31 and (m==8 or m==1 or m==3 or m==5 or m==7 or m==10):
843 res+=[str(d+i)+"-"+str(m)+"-"+str(y)]
844 if (d+i)<=30 and (m==4 or m==6 or m==9 or m==11):
845 res+=[str(d+i)+'-'+str(m)+'-'+str(y)]
846 if (d+i)<=28 and m==2 and ((y%4!=0) or (y %4 ==0 and y %100==0)):
847 res+=[(str(d+i)+"-"+str(m)+"-"+str(y))]
848 if (d+i)<30 and m==2 and ((y%4==0 and y%100!=0) or y%400==0):
849 res+=[(str(d+i)+"-"+str(m)+"-"+str(y))]
850 i+=1
853 if d<7 and len(res)<7:
854 while j<(7-len(res)):
855 res+=[(str(d+i+j)+"-"+str(m)+"-"+str(y))]
856 j+=1
859 return res
861 def _whichPeriod(self, vars):
862 if vars["selDay"] == "selected":
863 return "day"
864 if vars["selWeek"] == "selected":
865 return "week"
866 if vars["selMonth"] == "selected":
867 return "month"
869 def _getMonthDays(self):
870 year=int(self._ow.getDate().year)
871 month=int(self._ow.getDate().month)
872 res=[]
873 for day in range(1,calendar.monthrange(year,month)[1]+1):
874 res+=[str(day)+'-'+str(month)+'-'+str(year)]
876 return res
878 class WPCategOverview( WPCategoryDisplayBase ):
880 def __init__( self, rh, categ, ow ):
881 WPCategoryDisplayBase.__init__( self, rh, categ )
882 self._ow = ow
883 self._categ = categ
884 self._locTZ = DisplayTZ(self._getAW(),None,useServerTZ=1).getDisplayTZ()
886 def _getTitle(self):
887 return WPCategoryDisplayBase._getTitle(self) + " - " + _("Events Display")
889 def _getHeadContent( self ):
890 # add RSS feed
891 if self._ow.getDate().date() == nowutc().astimezone(timezone(self._locTZ)).date():
892 url = urlHandlers.UHCategOverviewToRSS.getURL(self._categ)
893 return i18nformat("""<link rel="alternate" type="application/rss+xml" title= _("Indico RSS Feed") href="%s">""") % url
894 return ""
896 def _getBody( self, params ):
897 if self._categ.getId() == "0" and type(self._ow) is Overview and self._ow.getDate().date() == nowutc().astimezone(timezone(self._locTZ)).date():
898 path = os.path.join(Config.getInstance().getXMLCacheDir(),"categOverview")
899 currenttime = int(time.mktime(time.strptime((datetime.now()-timedelta(minutes=60)).strftime("%a %b %d %H:%M:%S %Y"))))
900 if os.path.exists(path) and os.path.getmtime(path) > currenttime:
901 fp = file(path, 'rb')
902 cache = fp.read()
903 fp.close()
904 return cache
905 else:
906 wc = WCategoryOverview( self._ow, self._rh.getAW())
907 pars = { "postURL": urlHandlers.UHCategoryOverview.getURL(), \
908 "displayConfURLGen": urlHandlers.UHConferenceDisplay.getURL, \
909 "categOverviewURLGen": urlHandlers.UHCategoryOverview.getURLFromOverview }
910 cache = wc.getHTML( pars )
911 fp = file(path, 'wb')
912 fp.write(cache)
913 fp.close()
914 return cache
915 else:
916 wc = WCategoryOverview( self._ow, self._rh.getAW())
917 pars = { "postURL": urlHandlers.UHCategoryOverview.getURL(), \
918 "displayConfURLGen": urlHandlers.UHConferenceDisplay.getURL, \
919 "categDisplayURL": urlHandlers.UHCategoryDisplay.getURL(self._categ), \
920 "categOverviewURLGen": urlHandlers.UHCategoryOverview.getURLFromOverview, \
921 "categoryTitle": self._categ.getTitle() }
922 return wc.getHTML( pars )
924 def _getNavigationDrawer(self):
925 #link = [{"url": urlHandlers.UHCategoryOverview.getURL(self._target), "title": _("Events overview")}]
926 pars = {"target": self._target, "isModif": False}
927 return wcomponents.WNavigationDrawer( pars, type = "Overview" )
929 class WCategoryMap(wcomponents.WTemplated):
931 def __init__( self, categ ):
932 self._categ = categ
934 def getCategMap( self, categ ):
935 res = []
936 if len(categ.getSubCategoryList()) > 0:
937 res.append("<ul>")
938 for subcat in categ.getSubCategoryList():
939 res.append("<li><a href='%s'>%s</a>"% (urlHandlers.UHCategoryDisplay.getURL(subcat), subcat.getName()))
940 if subcat.hasAnyProtection():
941 res.append("""&nbsp;<span style="font-size: 0.8em; color: gray;">(%s)</span>"""% _("protected"))
942 res.append(self.getCategMap(subcat))
943 res.append("</ul>")
944 return "".join(res)
946 def getVars( self ):
947 vars = wcomponents.WTemplated.getVars( self )
948 vars['categName'] = self._categ.getName()
949 vars["categDisplayURL"] = urlHandlers.UHCategoryDisplay.getURL(self._categ)
950 vars['map'] = self.getCategMap(self._categ)
951 return vars
953 class WPCategoryMap( WPCategoryDisplayBase ):
955 def __init__( self, rh, categ ):
956 WPCategoryDisplayBase.__init__( self, rh, categ )
958 def _getTitle(self):
959 return WPCategoryDisplayBase._getTitle(self) + " - " + _("Category Map")
961 def _getBody( self, params ):
962 wc = WCategoryMap( self._target )
963 pars = {}
964 return wc.getHTML( pars )
966 def _getNavigationDrawer(self):
967 #link = [{"url": urlHandlers.UHCategoryMap.getURL(self._target), "title": _("Category map")}]
968 pars = {"target": self._target, "isModif": False}
969 return wcomponents.WNavigationDrawer( pars, type = "Map" )
971 class WCategoryStatistics(wcomponents.WTemplated):
973 def __init__( self, target, wfReg, stats ):
974 self.__target = target
975 self._wfReg = wfReg
976 self._stats = stats
978 def getHTML( self, aw ):
979 self._aw = aw
980 return wcomponents.WTemplated.getHTML( self )
982 def getVars( self ):
983 vars = wcomponents.WTemplated.getVars( self )
984 vars["name"] = self.__target.getName()
985 vars["img"] = self.__target.getIconURL()
986 vars["categDisplayURL"] = urlHandlers.UHCategoryDisplay.getURL(self.__target)
988 if self._stats != None:
989 stats = []
990 # Number of events:
991 if self._stats["events"]:
992 wcsl=wcomponents.WCategoryStatisticsList( _("Number of events"), self._stats["events"] )
993 stats.append(wcsl.getHTML( self._aw ))
994 # Number of contributions:
995 if self._stats["contributions"] != {}:
996 wcsl=wcomponents.WCategoryStatisticsList( _("Number of contributions"), self._stats["contributions"] )
997 stats.append(wcsl.getHTML( self._aw ))
998 else:
999 stats.append( i18nformat("""<b> _("Number of contributions"): 0</b>"""))
1000 stats.append( i18nformat("""<b> _("Number of resources"): %s</b>""")%self._stats["resources"])
1001 vars["updated"] = self._stats["updated"].strftime("%d %B %Y %H:%M")
1002 else:
1003 stats.append(i18nformat("""<b> _("No statistics for the events").</b>"""))
1004 stats.append(i18nformat("""<b> _("No statistics for the contributions").</b>"""))
1005 stats.append(i18nformat("""<b> _("No statistics for the resources").</b>"""))
1006 vars["updated"] = nowutc().strftime("%d %B %Y %H:%M")
1007 vars["contents"] = "<br><br>".join( stats )
1008 else:
1009 vars["contents"] = _("This category doesn't contain any event. No statistics are available.")
1010 vars["updated"] = nowutc().strftime("%d %B %Y %H:%M")
1011 return vars
1013 class WPCategoryStatistics( WPCategoryDisplayBase ):
1015 def __init__( self, rh, target, wfReg, stats ):
1016 WPCategoryDisplayBase.__init__( self, rh, target )
1017 self._wfReg = wfReg
1018 self._stats = stats
1020 def _getTitle(self):
1021 return WPCategoryDisplayBase._getTitle(self) + " - " + _("Category Statistics")
1023 def _getBody( self, params ):
1024 wcs = WCategoryStatistics( self._target, self._wfReg, self._stats )
1025 return wcs.getHTML( self._getAW() )
1027 def _getNavigationDrawer(self):
1028 #link = [{"url": urlHandlers.UHCategoryStatistics.getURL(self._target), "title": _("Category statistics")}]
1029 pars = {"target": self._target, "isModif": False}
1030 return wcomponents.WNavigationDrawer( pars, type = "Statistics" )
1033 #---------------------------------------------------------------------------
1035 class WConferenceCreation( wcomponents.WTemplated ):
1037 def __init__( self, targetCateg, type="conference", rh = None ):
1038 self._categ = targetCateg
1039 self._type = type
1040 self._rh = rh
1043 def getVars(self):
1044 vars = wcomponents.WTemplated.getVars( self )
1045 navigator = ""
1046 vars["title"] = vars.get("title","")
1047 vars["description"] = vars.get("description","")
1048 vars["keywords"] = vars.get("keywords","")
1049 vars["contactInfo"] = vars.get("contactInfo","")
1050 av=self._rh._getUser()
1051 tz=av.getTimezone()
1052 now = nowutc().astimezone(timezone(tz))
1053 vars["sDay"] = vars.get("sDay",now.day)
1054 vars["sMonth"] = vars.get("sMonth",now.month)
1055 vars["sYear"] = vars.get("sYear",now.year)
1056 vars["sHour"] = vars.get("sHour","8")
1057 vars["sMinute"] = vars.get("sMinute","00")
1058 vars["eDay"] = vars.get("eDay",now.day)
1059 vars["eMonth"] = vars.get("eMonth",now.month)
1060 vars["eYear"] = vars.get("eYear",now.year)
1061 vars["eHour"] = vars.get("eHour","18")
1062 vars["eMinute"] = vars.get("eMinute","00")
1064 vars["sDay_"] = {}
1065 vars["sMonth_"] = {}
1066 vars["sYear_"] = {}
1067 vars["sHour_"] = {}
1068 vars["sMinute_"] = {}
1069 vars["dur_"] = {}
1071 for i in range(0,10):
1072 vars["sDay_"][i] = vars.get("sDay_%s"%i,now.day)
1073 vars["sMonth_"][i] = vars.get("sMonth_%s"%i,now.month)
1074 vars["sYear_"][i] = vars.get("sYear_%s"%i,now.year)
1075 vars["sHour_"][i] = vars.get("sHour_%s"%i,"8")
1076 vars["sMinute_"][i] = vars.get("sMinute_%s"%i,"00")
1077 vars["dur_"][i] = vars.get("dur_%s"%i,"60")
1078 vars["nbDates"] = vars.get("nbDates",1)
1079 seltitle = Config.getInstance().getDefaultTimezone()
1080 if self._categ:
1081 seltitle= self._categ.getTimezone()
1082 vars["timezoneOptions"] = TimezoneRegistry.getShortSelectItemsHTML(seltitle)
1083 vars["locationName"] = vars.get("locationName","")
1084 vars["locationAddress"] = vars.get("locationAddress","")
1085 vars["roomName"] = vars.get("locationRoom","")
1086 #vars["locator"] = self._categ.getLocator().getWebForm()
1087 vars["protection"] = "public"
1088 vars["categ"] = {"id":"", "title":_("-- please, choose a category --")}
1089 if self._categ and not self._categ.hasSubcategories():
1090 if self._categ.isProtected() :
1091 vars["protection"] = "private"
1092 vars["categ"] = {"id":self._categ.getId(), "title":self._categ.getTitle()}
1093 vars["nocategs"] = False
1094 if not CategoryManager().getRoot().hasSubcategories():
1095 vars["nocategs"] = True
1096 rootcateg = CategoryManager().getRoot()
1097 if rootcateg.isProtected():
1098 vars["protection"] = "private"
1099 vars["categ"] = {"id":rootcateg.getId(), "title":rootcateg.getTitle()}
1100 #vars["event_type"] = ""
1101 vars["navigator"] = navigator
1102 vars["orgText"] = ""
1103 if vars.get("orgText","") != "":
1104 vars["orgText"] = vars.get("orgText","")
1105 elif self._rh._getUser():
1106 vars["orgText"] = self._rh._getUser().getStraightFullName()
1107 vars["chairText"] = vars.get("chairText","")
1108 vars["supportEmail"] = vars.get("supportEmail","")
1109 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1110 styles = styleMgr.getExistingStylesForEventType(self._type)
1111 styleoptions = ""
1112 defStyle = ""
1113 if self._categ:
1114 defStyle = self._categ.getDefaultStyle(self._type)
1115 if defStyle == "":
1116 defStyle = styleMgr.getDefaultStyleForEventType(self._type)
1117 for styleId in styles:
1118 if styleId == defStyle:
1119 selected = "selected"
1120 else:
1121 selected = ""
1122 styleoptions += "<option value=\"%s\" %s>%s</option>" % (styleId,selected,styleMgr.getStyleName(styleId))
1123 vars["styleOptions"] = styleoptions
1125 vars["chairpersonDefined"] = vars.get("chairpersonDefined", [])
1127 vars["useRoomBookingModule"] = Config.getInstance().getIsRoomBookingActive()
1129 return vars
1131 #---------------------------------------------------------------------------
1133 class WPConferenceCreationMainData( WPCategoryDisplayBase ):
1135 _userData = ['favorite-user-list', 'favorite-user-ids']
1137 def getJSFiles(self):
1138 return WPCategoryDisplayBase.getJSFiles(self) + \
1139 self._includeJSPackage('Management')
1141 def _getHeader( self ):
1144 wc = wcomponents.WHeader( self._getAW() )
1145 return wc.getHTML( { "subArea": self._getSiteArea(), \
1146 "loginURL": self._escapeChars(str(self.getLoginURL())),\
1147 "logoutURL": self._escapeChars(str(self.getLogoutURL())) } )
1149 def _getNavigationDrawer(self):
1150 if self._target and self._target.isRoot():
1151 return
1152 else:
1153 pars = {"target": self._target, "isModif": False}
1154 return wcomponents.WNavigationDrawer( pars )
1156 def _getWComponent( self ):
1157 return WConferenceCreation( self._target, self._rh._event_type, self._rh )
1159 def _getBody( self, params ):
1160 ## TODO: TO REMOVE?????????
1161 #p = { "categDisplayURLGen": urlHandlers.UHCategoryDisplay.getURL }
1162 wc = self._getWComponent()
1163 params.update({"postURL": urlHandlers.UHConferencePerformCreation.getURL() })
1164 return "%s"%wc.getHTML( params )
1166 class WPCategoryModifBase( WPCategoryBase ):
1168 _userData = ['favorite-user-ids']
1170 def getJSFiles(self):
1171 return WPCategoryBase.getJSFiles(self) + \
1172 self._includeJSPackage('Management')
1174 def _getHeader(self):
1175 wc = wcomponents.WHeader(self._getAW(), currentCategory=self._currentCategory())
1176 return wc.getHTML({
1177 'subArea': self._getSiteArea(),
1178 'loginURL': self._escapeChars(str(self.getLoginURL())),
1179 'logoutURL': self._escapeChars(str(self.getLogoutURL()))
1182 def _getNavigationDrawer(self):
1183 pars = {"target": self._target , "isModif" : True}
1184 return wcomponents.WNavigationDrawer( pars, bgColor = "white" )
1186 def _createSideMenu( self ):
1187 self._sideMenu = wcomponents.ManagementSideMenu()
1189 viewSection = wcomponents.SideMenuSection()
1191 self._viewMenuItem = wcomponents.SideMenuItem(_("View category"),
1192 urlHandlers.UHCategoryDisplay.getURL( self._target ))
1193 viewSection.addItem( self._viewMenuItem)
1195 self._sideMenu.addSection(viewSection)
1198 mainSection = wcomponents.SideMenuSection()
1200 self._generalSettingsMenuItem = wcomponents.SideMenuItem(_("General settings"),
1201 urlHandlers.UHCategoryModification.getURL( self._target ))
1202 mainSection.addItem( self._generalSettingsMenuItem)
1204 self._filesMenuItem = wcomponents.SideMenuItem(_("Files"),
1205 urlHandlers.UHCategModifFiles.getURL(self._target ))
1206 mainSection.addItem( self._filesMenuItem)
1208 self._ACMenuItem = wcomponents.SideMenuItem(_("Protection"),
1209 urlHandlers.UHCategModifAC.getURL( self._target ))
1210 mainSection.addItem( self._ACMenuItem)
1212 self._toolsMenuItem = wcomponents.SideMenuItem(_("Tools"),
1213 urlHandlers.UHCategModifTools.getURL( self._target ))
1214 mainSection.addItem( self._toolsMenuItem)
1216 self._tasksMenuItem = wcomponents.SideMenuItem(_("Tasks"),
1217 urlHandlers.UHCategModifTasks.getURL( self._target ))
1218 mainSection.addItem( self._tasksMenuItem)
1219 if not self._target.tasksAllowed() :
1220 self._tasksMenuItem.setVisible(False)
1222 self.extra_menu_items = {}
1223 for name, item in sorted(values_from_signal(signals.category.management_sidemenu.send(self._target)),
1224 key=lambda x: x[1]._title):
1225 self.extra_menu_items[name] = item
1226 mainSection.addItem(item)
1228 self._sideMenu.addSection(mainSection)
1230 def _createTabCtrl( self ):
1231 pass
1233 def _setActiveTab( self ):
1234 pass
1236 def _setActiveSideMenuItem( self ):
1237 pass
1239 def _getBody( self, params ):
1240 self._createSideMenu()
1241 self._setActiveSideMenuItem()
1243 self._createTabCtrl()
1244 self._setActiveTab()
1246 sideMenu = self._sideMenu.getHTML()
1248 frame = WCategoryModifFrame()
1249 p = { "category": self._target,
1250 "body": self._getPageContent( params ),
1251 "sideMenu": self._sideMenu.getHTML() }
1253 return frame.getHTML( p )
1255 def _getTabContent( self, params ):
1256 return "nothing"
1258 def _getPageContent( self, params ):
1259 return "nothing"
1261 def _getSiteArea(self):
1262 return "ModificationArea"
1265 class WCategoryModifFrame(wcomponents.WTemplated):
1267 def __init__( self ):
1268 pass
1270 def getVars( self ):
1271 vars = wcomponents.WTemplated.getVars( self )
1272 return vars
1274 class WPCategModifMain( WPCategoryModifBase ):
1276 def _setActiveSideMenuItem( self ):
1277 self._generalSettingsMenuItem.setActive()
1280 class WCategModifMain(wcomponents.WTemplated):
1282 def __init__( self, category ):
1283 self._categ = category
1285 def __getSubCategoryItems( self, sl, modifURLGen ):
1286 temp = []
1287 for categ in sl:
1288 id = categ.getId()
1289 selbox = """<select name="newpos%s" onChange="this.form.oldpos.value='%s';this.form.submit();">""" % (sl.index(categ),sl.index(categ))
1290 for i in range (1,len(sl)+1):
1291 if i==sl.index(categ)+1:
1292 selbox += "<option selected value='%s'>%s" % (i-1,i)
1293 else:
1294 selbox += "<option value='%s'>%s" % (i-1,i)
1295 selbox += """
1296 </select>"""
1297 temp.append("""
1298 <tr>
1299 <td width="3%%">
1300 <input type="checkbox" name="selectedCateg" value="%s">
1301 </td>
1302 <td>%s</td>
1303 <td style="padding-left:10px;">
1304 <a href="%s">%s</a>
1305 </td>
1306 </tr>"""%(id, selbox,modifURLGen( categ ), categ.getName().strip() or "[no title]"))
1307 html = i18nformat("""
1308 <input type="hidden" name="oldpos">
1309 <table align="left" width="100%%">
1310 <tr>
1311 <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>
1312 <td></td>
1313 <td class="titleCellFormat" width="100%%" style="padding-left:10px;"> _("Category name")</td>
1314 </tr>
1316 </table>""")%(Config.getInstance().getSystemIconURL("checkAll"), Config.getInstance().getSystemIconURL("uncheckAll"), "".join( temp ))
1317 return html
1319 def __getConferenceItems( self, cl, modifURLGen, modifURLOpen ):
1320 temp = []
1321 for conf in cl:
1322 if conf.isClosed():
1323 textopen = i18nformat(""" <b>[ <a href="%s"> _("re-open event")</a> ]</b>""") % modifURLOpen(conf)
1324 else:
1325 textopen = ""
1326 temp.append("""
1327 <tr>
1328 <td width="3%%">
1329 <input type="checkbox" name="selectedConf" value="%s">
1330 </td>
1331 <td align="center" width="17%%">%s</td>
1332 <td align="center" width="17%%">%s</td>
1333 <td width="100%%"><a href="%s">%s</a>%s</td>
1334 </tr>"""%(conf.getId(), conf.getAdjustedStartDate().date(), conf.getAdjustedEndDate().date(),modifURLGen(conf), conf.getTitle(), textopen))
1335 html = i18nformat("""<table align="left" width="100%%">
1336 <tr>
1337 <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>
1338 <td align="center" width="17%%" class="titleCellFormat" style="border-right:5px solid #FFFFFF; border-bottom: 1px solid #FFFFFF;"> _("Start date")</td>
1339 <td align="center" width="17%%" class="titleCellFormat" style="border-right:5px solid #FFFFFF; border-bottom: 1px solid #FFFFFF;"> _("End date")</td>
1340 <td width="100%%" class="titleCellFormat" style="border-right:5px solid #FFFFFF; border-bottom: 1px solid #FFFFFF;"> _("Conference title")</td>
1341 </tr>
1342 %s</table>""")%(Config.getInstance().getSystemIconURL("checkAll"), Config.getInstance().getSystemIconURL("uncheckAll"), "".join( temp ))
1343 return html
1345 def getVars( self ):
1347 index = Catalog.getIdx('categ_conf_sd').getCategory(self._categ.getId())
1348 vars = wcomponents.WTemplated.getVars( self )
1349 vars["locator"] = self._categ.getLocator().getWebForm()
1350 vars["name"] = self._categ.getName()
1352 vars["description"] = self._categ.getDescription()
1354 if self._categ.getIcon() is not None:
1355 vars["icon"] = """<img src="%s" width="16" height="16" alt="category">"""%urlHandlers.UHCategoryIcon.getURL( self._categ)
1356 else:
1357 vars["icon"] = "None"
1358 vars["dataModifButton"] = ""
1359 if not self._categ.isRoot():
1360 vars["dataModifButton"] = i18nformat("""<input type="submit" class="btn" value="_("modify")">""")
1361 vars["removeItemsURL"] = vars["actionSubCategsURL"]
1362 if not self._categ.getSubCategoryList():
1363 vars['containsEvents'] = True
1364 vars["removeItemsURL"] = vars["actionConferencesURL"]
1365 vars["items"] = self.__getConferenceItems(index.itervalues(), vars["confModifyURLGen"], vars["confModifyURLOpen"])
1366 else:
1367 vars['containsEvents'] = False
1368 vars["items"] = self.__getSubCategoryItems( self._categ.getSubCategoryList(), vars["categModifyURLGen"] )
1369 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1370 vars["defaultMeetingStyle"] = styleMgr.getStyleName(self._categ.getDefaultStyle("meeting"))
1371 vars["defaultLectureStyle"] = styleMgr.getStyleName(self._categ.getDefaultStyle("simple_event"))
1373 ## vars["defaultVisibility"] = self._categ.getVisibility()
1374 vars["defaultTimezone"] = self._categ.getTimezone()
1375 visibility = self._categ.getVisibility()
1376 categpath = self._categ.getCategoryPath()
1377 categpath.reverse()
1378 if visibility > len(categpath):
1379 vars["defaultVisibility"] = _("Everywhere")
1380 elif visibility == 0:
1381 vars["defaultVisibility"] = _("Nowhere")
1382 else:
1383 categId = categpath[visibility-1]
1384 cat = conference.CategoryManager().getById(categId)
1385 vars["defaultVisibility"] = cat.getName()
1387 ###################################################################################################
1388 ## TODO: this code belongs to the TASKS MODULE. We should fix it or remove it.
1389 vars["enablePic"]=quoteattr(str(Config.getInstance().getSystemIconURL( "enabledSection" )))
1390 vars["disablePic"]=quoteattr(str(Config.getInstance().getSystemIconURL( "disabledSection" )))
1391 enabledText = _("Click to disable")
1392 disabledText = _("Click to enable")
1394 url = urlHandlers.UHCategoryTasksOption.getURL( self._categ )
1396 comment = ""
1397 if (self._categ.hasSubcategories()):
1398 icon=vars["disablePic"]
1399 textIcon = disabledText
1400 comment = i18nformat("""<b>&nbsp;&nbsp;[ _("Category contains subcategories - this module cannot be enabled")]</b>""")
1401 url = ""
1402 elif self._categ.tasksAllowed():
1403 icon=vars["enablePic"]
1404 textIcon=enabledText
1405 if len(self._categ.getTaskList()) > 0 :
1406 comment = i18nformat("""<b>&nbsp;&nbsp;[_("Task list is not empty - this module cannot be disabled")]</b>""")
1407 url = ""
1408 else:
1409 icon=vars["disablePic"]
1410 textIcon=disabledText
1411 tasksManagement = """
1412 <tr>
1413 <td>
1414 <a href=%s><img src=%s alt="%s" class="imglink"></a>&nbsp;<a href=%s>%s</a>%s
1415 </td>
1416 </tr>"""%(url,icon,textIcon,url, _("Tasks List"),comment)
1417 vars["tasksManagement"] = tasksManagement
1418 ###################################################################################################
1419 return vars
1422 class WPCategoryModification( WPCategModifMain ):
1424 def _getPageContent( self, params ):
1425 wc = WCategModifMain( self._target )
1426 pars = { \
1427 "dataModificationURL": urlHandlers.UHCategoryDataModif.getURL( self._target ), \
1428 "addSubCategoryURL": urlHandlers.UHCategoryCreation.getURL(self._target),
1429 "addConferenceURL": urlHandlers.UHConferenceCreation.getURL( self._target ), \
1430 "confModifyURLGen": urlHandlers.UHConferenceModification.getURL, \
1431 "confModifyURLOpen": urlHandlers.UHConferenceOpen.getURL, \
1432 "categModifyURLGen": urlHandlers.UHCategoryModification.getURL, \
1433 "actionSubCategsURL": urlHandlers.UHCategoryActionSubCategs.getURL(self._target),
1434 "actionConferencesURL": urlHandlers.UHCategoryActionConferences.getURL(self._target)}
1435 return wc.getHTML( pars )
1438 class WCategoryDataModification(wcomponents.WTemplated):
1440 def __init__( self, category ):
1441 self._categ = category
1443 def _getVisibilityHTML(self):
1444 visibility = self._categ.getVisibility()
1445 topcat = self._categ
1446 level = 0
1447 selected = ""
1448 if visibility == 0:
1449 selected = "selected"
1450 vis = [ i18nformat("""<option value="0" %s> _("Nowhere")</option>""") % selected]
1451 while topcat:
1452 level += 1
1453 selected = ""
1454 if level == visibility:
1455 selected = "selected"
1456 if topcat.getId() != "0":
1457 vis.append("""<option value="%s" %s>%s</option>""" % (level, selected, truncateTitle(topcat.getName(), 70)))
1458 topcat = topcat.getOwner()
1459 selected = ""
1460 if visibility > level:
1461 selected = "selected"
1462 vis.append( i18nformat("""<option value="999" %s> _("Everywhere")</option>""") % selected)
1463 vis.reverse()
1464 return "".join(vis)
1466 def getVars( self ):
1467 vars = wcomponents.WTemplated.getVars( self )
1468 vars["name"] = self._categ.getName()
1469 vars["description"] = self._categ.getDescription()
1470 vars["visibility"] = self._getVisibilityHTML()
1471 vars["timezoneOptions"] = TimezoneRegistry.getShortSelectItemsHTML(self._categ.getTimezone())
1472 if self._categ.getIcon() is not None:
1473 vars["icon"] = """<img src="%s" width="16" height="16" alt="category">"""%urlHandlers.UHCategoryIcon.getURL( self._categ)
1474 else:
1475 vars["icon"] = "None"
1476 for type in [ "simple_event", "meeting" ]:
1477 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1478 styles = styleMgr.getExistingStylesForEventType(type)
1479 styleoptions = ""
1480 for styleId in styles:
1481 defStyle = self._categ.getDefaultStyle(type)
1482 if defStyle == "":
1483 defStyle = styleMgr.getDefaultStyleForEventType(type)
1484 if styleId == defStyle:
1485 selected = "selected"
1486 else:
1487 selected = ""
1488 styleoptions += "<option value=\"%s\" %s>%s</option>" % (styleId,selected,styleMgr.getStyleName(styleId))
1489 vars["%sStyleOptions" % type] = styleoptions
1491 return vars
1494 class WPCategoryDataModification(WPCategModifMain):
1496 def _getPageContent(self, params):
1497 wc = WCategoryDataModification(self._target)
1498 pars = {"postURL": urlHandlers.UHCategoryPerformModification.getURL(self._target)}
1499 return wc.getHTML(pars)
1502 class WCategoryCreation(wcomponents.WTemplated):
1504 def __init__(self, target):
1505 self.__target = target
1507 def getVars(self):
1508 vars = wcomponents.WTemplated.getVars(self)
1509 vars["locator"] = self.__target.getLocator().getWebForm()
1511 for type in ["simple_event", "meeting"]:
1512 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
1513 styles = styleMgr.getExistingStylesForEventType(type)
1514 styleoptions = ""
1516 for styleId in styles:
1517 defStyle = self.__target.getDefaultStyle(type)
1519 if defStyle == "":
1520 defStyle = styleMgr.getDefaultStyleForEventType(type)
1521 if styleId == defStyle:
1522 selected = "selected"
1523 else:
1524 selected = ""
1526 styleoptions += "<option value=\"%s\" %s>%s</option>" % (styleId, selected, styleMgr.getStyleName(styleId))
1527 vars["%sStyleOptions" % type] = styleoptions
1529 default_tz = Config.getInstance().getDefaultTimezone()
1530 vars["timezoneOptions"] = TimezoneRegistry.getShortSelectItemsHTML(default_tz)
1531 vars["categTitle"] = self.__target.getTitle()
1532 if self.__target.isProtected():
1533 vars["categProtection"] = "private"
1534 else:
1535 vars["categProtection"] = "public"
1536 vars["numConferences"] = len(self.__target.conferences)
1538 return vars
1541 class WPCategoryCreation(WPCategModifMain):
1543 def _getPageContent(self, params):
1544 wc = WCategoryCreation(self._target)
1545 pars = {"categDisplayURLGen": urlHandlers.UHCategoryDisplay.getURL, \
1546 "postURL": urlHandlers.UHCategoryPerformCreation.getURL(self._target)}
1547 return wc.getHTML(pars)
1550 class WCategoryDeletion(object):
1552 def __init__(self, categoryList):
1553 self._categList = categoryList
1555 def getHTML(self, actionURL):
1556 categories = []
1558 for categ in self._categList:
1559 categories.append("""<li><i>%s</i></li>""" % categ.getName())
1561 msg = {'challenge': _("Are you sure that you want to delete the following categories?"),
1562 'target': "".join(categories),
1563 'important': True,
1564 'subtext': _("Note that all the existing sub-categories below will also be deleted")
1567 wc = wcomponents.WConfirmation()
1568 categIdList = []
1570 for categ in self._categList:
1571 categIdList.append(categ.getId())
1573 return wc.getHTML(msg, actionURL, {"selectedCateg": categIdList},
1574 confirmButtonCaption=_("Yes"),
1575 cancelButtonCaption=_("No"),
1576 severity='danger')
1579 class WConferenceDeletion(wcomponents.WTemplated):
1580 pass
1583 class WPSubCategoryDeletion(WPCategModifMain):
1585 def _getPageContent(self, params):
1586 selCategs = params["subCategs"]
1587 wc = WCategoryDeletion(selCategs)
1588 return wc.getHTML(urlHandlers.UHCategoryActionSubCategs.getURL(self._target))
1591 class WPConferenceDeletion(WPCategModifMain):
1593 def _getPageContent(self, params):
1594 wc = WConferenceDeletion()
1595 return wc.getHTML({'eventList': params["events"],
1596 'postURL': urlHandlers.UHCategoryActionConferences.getURL(self._target),
1597 'cancelButtonCaption': _("No"),
1598 'confirmButtonCaption': _("Yes")})
1601 class WItemReallocation(wcomponents.WTemplated):
1603 def __init__(self, itemList):
1604 self._itemList = itemList
1606 def getHTML(self, selectTree, params):
1607 self._sTree = selectTree
1608 return wcomponents.WTemplated.getHTML(self, params)
1610 def _getItemDescription(self, item):
1611 return ""
1613 def getVars(self):
1614 vars = wcomponents.WTemplated.getVars( self )
1615 l = []
1616 for item in self._itemList:
1617 l.append("<li><b>%s</b>"%self._getItemDescription(item))
1618 vars["selectedItems"] = "".join(l)
1619 vars["categTree"] = self._sTree.getHTML()
1620 return vars
1623 class WCategoryReallocation( WItemReallocation ):
1625 def _getItemDescription( self, item ):
1626 return item.getName()
1629 class WConferenceReallocation( WItemReallocation ):
1631 def _getItemDescription( self, item ):
1632 return item.getTitle()
1635 class CategSelectTree:
1637 def __init__( self, aw, excludedCat, expandedCat, \
1638 selectURLGen, expandURLGen, movingConference = 0 ):
1639 self._aw = aw
1640 self._excludedCategs = excludedCat
1641 self._expandedCategs = expandedCat
1642 self._selectURLGen = selectURLGen
1643 self._expandURLGen = expandURLGen
1644 self._movingConference = movingConference
1646 def _getItem( self, categ, level=0 ):
1647 if not categ.canAccess( self._aw ):
1648 return ""
1649 html = ""
1650 for i in range(level):
1651 html = "%s&nbsp;&nbsp;&nbsp;"%html
1652 cfg = Config.getInstance()
1653 if categ in self._excludedCategs:
1654 return """%s<img src="%s" border="0" alt=""> %s"""%(html, cfg.getSystemIconURL("collapsd.png"), categ.getName())
1655 if (self._movingConference) and categ.getSubCategoryList():
1656 title = """%s"""%categ.getName()
1657 else:
1658 title = """<a href="%s">%s</a>"""%(self._selectURLGen( categ ), \
1659 categ.getName())
1660 if categ in self._expandedCategs:
1661 ex = copy( self._expandedCategs )
1662 ex.remove( categ )
1663 html = """%s<a href="%s"><img src="%s" border="0" alt=""></a> %s"""%(html, self._expandURLGen( ex ), cfg.getSystemIconURL("exploded.png"), title)
1664 for subcat in categ.getSubCategoryList():
1665 html = "%s<br>%s"%(html, self._getItem(subcat, level+1) )
1666 else:
1667 html = """%s<a href="%s"><img src="%s" border="0" alt=""></a> %s"""%(html, self._expandURLGen( self._expandedCategs+[categ] ), cfg.getSystemIconURL("collapsd.png"), title)
1668 return html
1670 def getHTML( self ):
1671 cm = conference.CategoryManager()
1672 return self._getItem( cm.getRoot() )
1675 class WPCategoryReallocation( WPCategModifMain ):
1677 def _getReAllocateCategsURL( self, destination ):
1678 url = urlHandlers.UHCategoryActionSubCategs.getURL( destination )
1679 selectedCategs = []
1680 for c in self._categs:
1681 selectedCategs.append( c.getId() )
1682 url.addParam( "selectedCateg", selectedCategs )
1683 url.addParam( "confirm", "" )
1684 url.addParam( "reallocate", "" )
1685 return url
1687 def _getCategExpandCategURL( self, expandedCategs ):
1688 selected = []
1689 for c in self._categs:
1690 selected.append( c.getId() )
1691 expanded = []
1692 for c in expandedCategs:
1693 expanded.append( c.getId() )
1694 url = urlHandlers.UHCategoryActionSubCategs.getURL( self._target )
1695 url.addParam( "selectedCateg", selected )
1696 url.addParam( "ex", expanded )
1697 url.addParam( "reallocate", "" )
1698 return url
1700 def _getExpandedCategs( self, params ):
1701 exIdList = params.get("ex", [])
1702 if not isinstance( exIdList, list ):
1703 exIdList = [ exIdList ]
1704 expanded = []
1705 cm = conference.CategoryManager()
1706 for categId in exIdList:
1707 expanded.append( cm.getById( categId ) )
1708 return expanded
1710 def _getPageContent( self, params ):
1711 self._categs = params["subCategs"]
1712 expanded = self._getExpandedCategs( params )
1713 pars = {"cancelURL": urlHandlers.UHCategoryModification.getURL( self._target ) }
1714 tree = CategSelectTree( self._getAW(), self._categs, \
1715 expanded, \
1716 self._getReAllocateCategsURL, \
1717 self._getCategExpandCategURL )
1718 wc = WCategoryReallocation( self._categs )
1719 return wc.getHTML( tree, pars )
1722 class WPConferenceReallocation( WPCategModifMain ):
1724 def _getReAllocateConfsURL( self, destination ):
1725 url = urlHandlers.UHCategoryActionConferences.getURL( destination )
1726 url.addParam( "srcCategId", self._target.getId() )
1727 url.addParam( "selectedConf", self._confIds)
1728 url.addParam( "confirm", "" )
1729 url.addParam( "reallocate", "" )
1730 return url
1732 def _getExpandCategURL( self, expandedCategs ):
1733 expanded = []
1734 for c in expandedCategs:
1735 expanded.append( c.getId() )
1736 url = urlHandlers.UHCategoryActionConferences.getURL( self._target )
1737 url.addParam( "ex", expanded )
1738 url.addParam( "reallocate", "" )
1739 url.addParam( "selectedConf", self._confIds )
1740 return url
1742 def _getExpandedCategs( self, params ):
1743 exIdList = params.get("ex", [])
1744 if not isinstance( exIdList, list ):
1745 exIdList = [ exIdList ]
1746 expanded = []
1747 cm = conference.CategoryManager()
1748 for categId in exIdList:
1749 expanded.append( cm.getById( categId ) )
1750 return expanded
1752 def _getPageContent( self, params ):
1753 self._confs = params["confs"]
1754 self._confIds = []
1755 for c in self._confs:
1756 self._confIds.append( c.getId() )
1757 expanded = self._getExpandedCategs( params )
1758 pars = {"cancelURL": urlHandlers.UHCategoryModification.getURL( self._target ) }
1759 tree = CategSelectTree( self._getAW(), [], \
1760 expanded, \
1761 self._getReAllocateConfsURL, \
1762 self._getExpandCategURL, 1 )
1763 wc = WConferenceReallocation( self._confs )
1764 return wc.getHTML( tree, pars )
1767 class WCategModifAC(wcomponents.WTemplated):
1769 def __init__( self, category ):
1770 self._categ = category
1772 def _getControlUserList(self):
1773 result = fossilize(self._categ.getManagerList())
1774 # get pending users
1775 for email in self._categ.getAccessController().getModificationEmail():
1776 pendingUser = {}
1777 pendingUser["email"] = email
1778 pendingUser["pending"] = True
1779 result.append(pendingUser)
1780 return result
1782 def getVars( self ):
1783 vars = wcomponents.WTemplated.getVars( self )
1785 vars["modifyControlFrame"] = wcomponents.WModificationControlFrame().getHTML(self._categ)
1786 if self._categ.isRoot() :
1787 type = 'Home'
1788 else :
1789 type = 'Category'
1791 vars["accessControlFrame"] = wcomponents.WAccessControlFrame().getHTML(\
1792 self._categ,\
1793 vars["setVisibilityURL"],\
1794 type)
1795 if not self._categ.isProtected():
1796 df = wcomponents.WDomainControlFrame( self._categ )
1797 vars["accessControlFrame"] += "<br>%s"%df.getHTML()
1798 vars["confCreationControlFrame"] = ""
1799 vars["categoryId"] = self._categ.getId()
1800 if not self._categ.getSubCategoryList():
1801 frame = wcomponents.WConfCreationControlFrame( self._categ )
1802 p = { "setStatusURL": vars["setConferenceCreationControlURL"] }
1803 vars["confCreationControlFrame"] = frame.getHTML(p)
1804 vars["managers"] = self._getControlUserList()
1805 return vars
1807 class WPCategModifAC( WPCategoryModifBase ):
1809 def _setActiveSideMenuItem( self ):
1810 self._ACMenuItem.setActive()
1812 def _getPageContent(self, params):
1813 wc = WCategModifAC(self._target)
1814 pars = {
1815 "setVisibilityURL": urlHandlers.UHCategorySetVisibility.getURL(self._target),
1816 "setConferenceCreationControlURL": urlHandlers.UHCategorySetConfCreationControl.getURL(self._target)
1818 return wc.getHTML(pars)
1820 #---------------------------------------------------------------------------------
1822 class WCategModifTools(wcomponents.WTemplated):
1824 def __init__( self, category ):
1825 self._categ = category
1827 def getVars( self ):
1828 vars = wcomponents.WTemplated.getVars( self )
1829 vars["deleteButton"] = ""
1830 vars["id"] = self._categ.getId()
1831 if not self._categ.isRoot():
1832 vars["deleteButton"] = i18nformat("""<input type="submit" class="btn" value="_("delete this category")">""")
1833 return vars
1836 class WPCategModifTools( WPCategoryModifBase ):
1838 def _setActiveSideMenuItem( self ):
1839 self._toolsMenuItem.setActive()
1841 def _getPageContent( self, params ):
1842 wc = WCategModifTools( self._target )
1843 pars = { \
1844 "deleteCategoryURL": urlHandlers.UHCategoryDeletion.getURL(self._target) }
1845 return wc.getHTML( pars )
1848 class WPCategoryDeletion( WPCategModifTools ):
1850 def _getPageContent( self, params ):
1851 wc = WCategoryDeletion( [self._target] )
1852 return wc.getHTML( urlHandlers.UHCategoryDeletion.getURL( self._target ) )
1854 #---------------------------------------------------------------------------------
1856 class WCategModifTasks(wcomponents.WTemplated):
1858 def __init__( self, category ):
1859 self._categ = category
1861 def getVars( self ):
1862 vars = wcomponents.WTemplated.getVars( self )
1863 if self._categ.tasksAllowed() :
1864 vars["tasksAllowed"] = _("Adding tasks is allowed")
1865 else :
1866 vars["tasksAllowed"] = _("Adding tasks IS NOT allowed")
1867 vars["id"] = self._categ.getId()
1868 vars["taskAction"] = urlHandlers.UHCategModifTasksAction.getURL(self._categ)
1869 vars["locator"] = ""
1871 if self._categ.tasksPublic() :
1872 vars["accessVisibility"] = _("PUBLIC")
1873 oppVisibility = _("PRIVATE")
1874 else :
1875 vars["accessVisibility"] = _("PRIVATE")
1876 oppVisibility = _("PUBLIC")
1877 vars["changeAccessVisibility"] = i18nformat("""( _("make it") <input type="submit" class="btn" name="accessVisibility" value="%s">)""")%oppVisibility
1879 if not self._categ.tasksPublic() :
1880 vars["commentVisibility"] = _("PRIVATE")
1881 vars["changeCommentVisibility"] = """"""
1882 else :
1883 if self._categ.tasksCommentPublic() :
1884 vars["commentVisibility"] = _("PUBLIC")
1885 oppVisibility = _("PRIVATE")
1886 else :
1887 vars["commentVisibility"] = _("PRIVATE")
1888 oppVisibility = _("PUBLIC")
1889 vars["changeCommentVisibility"] = i18nformat("""( _("make it") <input type="submit" class="btn" name="commentVisibility" value="%s">)""")%oppVisibility
1892 vars["managerList"] = self._getPersonList("manager")
1893 vars["commentList"] = self._getPersonList("commentator")
1894 vars["accessList"] = self._getPersonList("access")
1896 vars["accessOptions"] = self._getAccessOptions()
1897 vars["commentOptions"] = self._getCommentOptions()
1898 vars["managerOptions"] = self._getManagerOptions()
1901 return vars
1903 def _getAccessOptions(self, names=[]):
1904 html = []
1905 if len(names) == 0 :
1906 html.append("""<option value=""> </option>""")
1907 for event in self._categ.getConferenceList() :
1908 index = 0
1909 for chair in event.getChairList() :
1910 text = """<option value="h%s-%s">%s</option>"""%(event.getId(),index,chair.getFullName())
1911 index = index + 1
1912 if not (chair.getFullName() in names) :
1913 html.append(text)
1914 names.append(chair.getFullName())
1915 index = 0
1916 for manager in event.getManagerList() :
1917 text = """<option value="m%s-%s">%s</option>"""%(event.getId(),index,manager.getFullName())
1918 index = index + 1
1919 if not (manager.getFullName() in names) :
1920 html.append(text)
1921 names.append(manager.getFullName())
1922 index = 0
1923 for participant in event.getParticipation().getParticipantList():
1924 text = """<option value="p%s-%s">%s</option>"""%(event.getId(),index,participant.getFullName())
1925 index = index + 1
1926 if not (participant.getFullName() in names) :
1927 html.append(text)
1928 names.append(participant.getFullName())
1929 return """
1930 """.join(html)
1932 def _getCommentOptions(self, names=[]):
1933 html = []
1934 if len(names) == 0 :
1935 html.append("""<option value=""> </option>""")
1936 index = 0
1937 for a in self._categ.getTasksAccessList() :
1938 text = """<option value="a%s">%s</option>"""%(index,a.getFullName())
1939 index = index + 1
1940 if not (a.getFullName() in names) :
1941 html.append(text)
1942 names.append(a.getFullName())
1943 list = """
1944 """.join(html)
1946 return list + """
1947 """+self._getAccessOptions(names)
1949 def _getManagerOptions(self):
1950 html = []
1951 names = []
1952 html.append("""<option value=""> </option>""")
1953 index = 0
1954 for c in self._categ.getTasksCommentatorList() :
1955 text = """<option value="c%s">%s</option>"""%(index,c.getFullName())
1956 index = index + 1
1957 if not (c.getFullName() in names) :
1958 html.append(text)
1959 names.append(c.getFullName())
1960 list = """
1961 """.join(html)
1963 return list + """
1964 """+self._getCommentOptions(names)
1967 def _getPersonList(self, personType):
1968 html = []
1969 index = 0
1970 if personType == "access" :
1971 personList = self._categ.getTasksAccessList()
1972 elif personType == "manager" :
1973 personList = self._categ.getTasksManagerList()
1974 elif personType == "comentator" :
1975 personList = self._categ.getTasksCommentatorList()
1976 else :
1977 return ""
1979 for a in personList :
1980 line = """
1981 <tr>
1982 <td><input type="checkbox" name="%s" value="%s"></td>
1983 <td>%s</td>
1984 </tr>
1985 """%(personType, index, a.getFullName())
1986 index = index + 1
1987 html.append(line)
1989 list = """
1990 """.join(html)
1991 out = """
1992 <table>
1994 </table>"""%list
1995 return out
1997 class WPCategModifTasks( WPCategoryModifBase ):
1999 def _setActiveSideMenuItem( self ):
2000 self._tasksMenuItem.setActive()
2002 def _getPageContent( self, params ):
2003 wc = WCategModifTasks( self._target )
2004 pars = { \
2005 "deleteCategoryURL": urlHandlers.UHCategoryDeletion.getURL(self._target) }
2007 return wc.getHTML( pars )
2009 class WPCategoryModifExistingMaterials( WPCategoryModifBase ):
2011 _userData = ['favorite-user-list', 'favorite-user-ids']
2013 def getJSFiles(self):
2014 return WPCategoryModifBase.getJSFiles(self) + \
2015 self._includeJSPackage('Management') + \
2016 self._includeJSPackage('MaterialEditor')
2018 def _getPageContent( self, pars ):
2019 wc=wcomponents.WShowExistingMaterial(self._target)
2020 return wc.getHTML( pars )
2022 def _setActiveSideMenuItem( self ):
2023 self._filesMenuItem.setActive()