[IMP] Category list Optimization - first step
[cds-indico.git] / indico / MaKaC / webinterface / wcomponents.py
blob54e87d4ecfc125fb4eaf78770da8421eea139571
1 # -*- coding: utf-8 -*-
2 ##
3 ##
4 ## This file is part of CDS Indico.
5 ## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 CERN.
6 ##
7 ## CDS Indico is free software; you can redistribute it and/or
8 ## modify it under the terms of the GNU General Public License as
9 ## published by the Free Software Foundation; either version 2 of the
10 ## License, or (at your option) any later version.
12 ## CDS Indico is distributed in the hope that it will be useful, but
13 ## WITHOUT ANY WARRANTY; without even the implied warranty of
14 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ## General Public License for more details.
17 ## You should have received a copy of the GNU General Public License
18 ## along with CDS Indico; if not, write to the Free Software Foundation, Inc.,
19 ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21 from MaKaC.plugins import PluginsHolder, OldObservable
23 import os,types,string
24 import itertools
25 from xml.sax.saxutils import escape, quoteattr
26 from copy import copy
27 from datetime import timedelta,datetime, date
28 import exceptions
29 from MaKaC.common.db import DBMgr
30 import MaKaC.conference as conference
31 import MaKaC.user as user
32 import MaKaC.schedule as schedule
33 import MaKaC.common.info as info
34 import MaKaC.domain as domain
35 import MaKaC.webinterface.urlHandlers as urlHandlers
36 import MaKaC.common.Configuration as Configuration
37 from MaKaC import webcast
39 from MaKaC.accessControl import AdminList
40 from MaKaC.errors import UserError
41 from MaKaC.common.url import URL
42 from MaKaC.common import Config
43 from MaKaC.webinterface.common.person_titles import TitlesRegistry
44 from MaKaC.conference import Conference, Category
46 from MaKaC.webinterface.common.timezones import TimezoneRegistry, DisplayTimezoneRegistry
47 import MaKaC.webinterface.common.timezones as convertTime
48 from pytz import timezone
49 from MaKaC.common.timezoneUtils import DisplayTZ, nowutc
50 from MaKaC.webinterface.common import contribFilters as contribFilters
51 from MaKaC.common import filters, utils
52 from MaKaC.errors import MaKaCError
53 import MaKaC.webinterface.displayMgr as displayMgr
54 from MaKaC.common.TemplateExec import TemplateExec, escapeHTMLForJS
55 from MaKaC.common.ContextHelp import ContextHelp
56 from MaKaC.rb_tools import FormMode, overlap
58 from lxml import etree
60 from MaKaC.i18n import _
61 from MaKaC.i18n import langList
63 from MaKaC.common.TemplateExec import truncateTitle
64 from MaKaC.fossils.user import IAvatarFossil
65 from MaKaC.common.fossilize import fossilize
66 from MaKaC.common.contextManager import ContextManager
68 from indico.util.date_time import utc_timestamp
69 from indico.core.index import Catalog
71 import re
73 MIN_PRESENT_EVENTS = 6
74 OPTIMAL_PRESENT_EVENTS = 10
77 class WTemplated(OldObservable):
78 """This class provides a basic implementation of a web component (an
79 object which generates HTML related to a certain feature or
80 functionality) which relies in a template file for generating the
81 HTML it's in charge of.
82 By templating file we mean that there will be a file in the file
83 system (uniquely identified) which will contain HTML code plus some
84 "variables" (dynamic values). The class will take care of opening
85 this file, parsing the HTML and replacing the variables by the
86 corresponding values.
87 """
88 tplId = None
90 @classmethod
91 def forModule(cls, module, *args):
92 tplobj = cls(*args)
93 # HACK :/
94 tplobj._dir = os.path.join(module.__path__[0], 'tpls')
95 return tplobj
97 def __init__( self, tpl_name = None):
98 if tpl_name != None:
99 self.tplId = tpl_name
101 #if ( '_rh' in ','.join( dir( self ) ) ):
102 from MaKaC.webinterface.rh.base import RequestHandlerBase
103 self._rh = RequestHandlerBase._currentRH
105 cfg = Configuration.Config.getInstance()
106 self._dir = cfg.getTPLDir()
108 def _getSpecificTPL(self, dir, tplId, extension="tpl"):
110 Checks if there is a defined set of specific templates (i.e. CERN),
111 and if there is a specific file for this page, for this template set.
112 Returns the file that should be used.
116 if DBMgr.getInstance().isConnected():
117 template = info.HelperMaKaCInfo.getMaKaCInfoInstance().getDefaultTemplateSet()
119 if template != None :
120 specTpl = "%s.%s.%s" % (tplId, template, extension)
122 if os.path.exists(os.path.join(dir,specTpl)):
123 return specTpl
126 return "%s.%s" % (tplId, extension)
128 def _setTPLFile(self):
129 """Sets the TPL (template) file for the object. It will try to get
130 from the configuration if there's a special TPL file for it and
131 if not it will look for a file called as the class name+".tpl"
132 in the configured TPL directory.
134 cfg = Configuration.Config.getInstance()
136 file = cfg.getTPLFile( self.tplId )
138 # because MANY classes skip the constructor...
139 if hasattr(self, '_dir'):
140 tplDir = self._dir
141 else:
142 tplDir = cfg.getTPLDir()
144 if file == "":
145 file = self._getSpecificTPL(tplDir,self.tplId)
146 self.tplFile = os.path.join(tplDir, file)
148 hfile = self._getSpecificTPL(os.path.join(tplDir,'chelp'),
149 self.tplId,
150 extension='wohl')
152 self.helpFile = os.path.join(tplDir,'chelp',hfile)
155 def getVars( self ):
156 """Returns a dictionary containing the TPL variables that will
157 be passed at the TPL formating time. For this class, it will
158 return the configuration user defined variables.
159 Classes inheriting from this one will have to take care of adding
160 their variables to the ones returned by this method.
162 from MaKaC.webinterface.rh.base import RequestHandlerBase
163 self._rh = RequestHandlerBase._currentRH
165 cfg = Configuration.Config.getInstance()
166 vars = cfg.getTPLVars()
168 for paramName in self.__params:
169 vars[ paramName ] = self.__params[ paramName ]
170 if len(vars.get("errorMsg", [])) > 0 :
171 vars["errorMsg"] = WErrorMessage().getHTML(vars)
172 else:
173 vars["errorMsg"] = ""
175 if len(vars.get("infoMsg", [])) > 0 :
176 vars["infoMsg"] = WInfoMessage().getHTML(vars)
177 else :
178 vars["infoMsg"] = ""
180 return vars
182 def getHTML( self, params=None ):
183 """Returns the HTML resulting of formating the text contained in
184 the corresponding TPL file with the variables returned by the
185 getVars method.
186 Params:
187 params -- additional paramters received from the caller
189 from MaKaC.webinterface.rh.base import RequestHandlerBase
190 self._rh = RequestHandlerBase._currentRH
191 if self.tplId == None:
192 self.tplId = self.__class__.__name__[1:]
193 self._setTPLFile()
194 self.__params = {}
195 if params != None:
196 self.__params = params
197 try:
198 fh = open( self.tplFile, "r")
199 text = fh.read()
200 fh.close()
201 except Exception, e:
202 raise MaKaCError( _("Could not open template: %s")%self.tplFile, _("Template"))
204 # include context help info, if it exists
205 helpText = None
206 if os.path.exists(self.helpFile):
207 try:
208 fh = open( self.helpFile, "r")
209 helpText = fh.read()
210 fh.close()
211 except exceptions.IOError:
212 pass
214 vars = self.getVars()
215 vars['__rh__'] = self._rh
216 vars['self'] = self
218 tempHTML = TemplateExec.executeTemplate( text, vars, self.tplId )
220 if self._rh and self._rh._req.is_https():
221 imagesBaseURL = Config.getInstance().getImagesBaseURL()
222 imagesBaseSecureURL = urlHandlers.setSSLPort(Config.getInstance().getImagesBaseSecureURL())
223 baseURL = Config.getInstance().getBaseURL()
224 baseSecureURL = urlHandlers.setSSLPort(Config.getInstance().getBaseSecureURL())
225 tempHTML = tempHTML.replace(imagesBaseURL, imagesBaseSecureURL)
226 tempHTML = tempHTML.replace(escapeHTMLForJS(imagesBaseURL), escapeHTMLForJS(imagesBaseSecureURL))
227 tempHTML = tempHTML.replace(baseURL, baseSecureURL)
228 tempHTML = tempHTML.replace(escapeHTMLForJS(baseURL), escapeHTMLForJS(baseSecureURL))
230 if helpText == None:
231 return tempHTML
232 else:
233 try:
234 return ContextHelp().merge(self.tplId, tempHTML, helpText)
235 except etree.LxmlError, e:
236 if tempHTML.strip() == '':
237 raise MaKaCError(_("Template " + str(self.tplId) + " produced empty output, and it has a .wohl file. Error: " + str(e)))
238 else:
239 raise
242 def htmlText(param):
243 if param:
244 return escape(param)
245 #return " "
246 return ""
247 htmlText = staticmethod( htmlText )
249 def textToHTML(param):
250 if param != "":
251 if param.lower().find("<br>") == -1 and param.lower().find("<p>") == -1 and param.lower().find("<li>") == -1 and param.lower().find("<table") == -1:
252 param=param.replace("\r\n", "<br>")
253 param=param.replace("\n","<br>")
254 return param
255 return "&nbsp;"
256 textToHTML = staticmethod( textToHTML )
258 def _escapeChars(self, text):
259 # Does nothing right now - it used to replace % with %% for the old-style templates
260 return text
262 class WHTMLHeader(WTemplated):
266 def __init__(self, tpl_name = None):
267 WTemplated.__init__(self)
269 def getVars( self ):
270 vars = WTemplated.getVars( self )
272 if DBMgr.getInstance().isConnected():
273 vars['stylesheet'] = Config.getInstance().getCssStylesheetName()
274 else:
275 vars['stylesheet'] = 'Default.css'
276 return vars
279 class WHeader(WTemplated):
280 """Templating web component for generating a common HTML header for
281 the web interface.
283 def __init__(self, aw, locTZ="", isFrontPage=False, currentCategory=None, tpl_name=None):
284 WTemplated.__init__(self, tpl_name=tpl_name)
285 self._currentuser = aw.getUser()
286 self._locTZ = locTZ
287 self._aw = aw
288 self.__isFrontPage = isFrontPage
289 self.__currentCategory = currentCategory
292 Returns the current active timezone.
294 def _getActiveTimezone(self):
295 if self._aw.getSession():
296 tz = self._aw.getSession().getVar("ActiveTimezone")
297 else:
298 tz = info.HelperMaKaCInfo.getMaKaCInfoInstance().getTimezone()
300 return tz
303 Returns timezone string that is show to the user.
305 def _getTimezoneDisplay( self, timezone ):
306 if timezone == 'LOCAL':
307 if self._locTZ:
308 return self._locTZ
309 else:
310 return info.HelperMaKaCInfo.getMaKaCInfoInstance().getTimezone()
311 else:
312 return timezone
314 def getVars( self ):
315 vars = WTemplated.getVars( self )
316 #urlHandlers.UHUserDetails.getURL(self._currentuser)
317 vars["logMeAs"] = ""
318 # TODO: Remove this after CRBS headers are fixed!
319 if self._currentuser:
320 vars["userInfo"] = """<font size="-1"><a class="topbar" href="%s" target="_blank">%s</a> - <a href="%s">logout</a></font>"""%(urlHandlers.UHUserDetails.getURL(self._currentuser), self._currentuser.getFullName(), vars["logoutURL"])
321 vars["userDetails"] = 'class="topbar" href="%s" target="_blank"'%urlHandlers.UHUserDetails.getURL(self._currentuser)
323 if self._currentuser.isAdmin():
324 vars["logMeAs"] = vars["loginAsURL"]
325 else:
326 vars["userInfo"] = """<a href="%s">login</a>"""%(vars["loginURL"])
327 vars["userDetails"] = ""
328 # *****************
330 vars["currentUser"] = self._currentuser
332 imgLogo=Configuration.Config.getInstance().getSystemIconURL( "logoIndico" )
333 imgLogin=Configuration.Config.getInstance().getSystemIconURL( "login" )
335 vars["imgLogo"] = imgLogo
336 vars["imgLogin"] = imgLogin
337 vars["isFrontPage"] = self.__isFrontPage
338 vars["currentCategory"] = self.__currentCategory
340 if self._aw.getSession():
341 selLang = self._aw.getSession().getLang()
342 else:
343 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
344 selLang = minfo.getLang()
346 #language list related
347 languages = {}
348 vars["SelectedLanguageName"] = "Unknown Language";
349 for lang in langList():
350 if selLang.lower() == lang[0].lower():
351 vars["SelectedLanguageName"] = lang[1];
352 languages[lang[0]] = lang[1]
353 vars["Languages"] = languages
355 vars["SelectedLanguage"] = selLang;
357 vars["ActiveTimezone"] = self._getActiveTimezone();
359 Get the timezone for displaying on top of the page.
360 1. If the user has "LOCAL" timezone then show the timezone
361 of the event/category. If that's not possible just show the
362 standard timezone.
363 2. If the user has a custom timezone display that one.
365 vars["ActiveTimezoneDisplay"] = self._getTimezoneDisplay(vars["ActiveTimezone"])
367 if DBMgr.getInstance().isConnected():
368 vars["title"] = info.HelperMaKaCInfo.getMaKaCInfoInstance().getTitle()
369 vars["organization"] = info.HelperMaKaCInfo.getMaKaCInfoInstance().getOrganisation()
370 else:
371 vars["title"] = "Indico"
372 vars["organization"] = ""
375 # Search box, in case search is active
376 if Config.getInstance().getIndicoSearchServer() != '' :
377 categId = 0
378 if self.__currentCategory:
379 categId = self.__currentCategory.getId()
380 vars['searchBox'] = WCategorySearchBox(categId=categId).getHTML()
381 else:
382 vars['searchBox'] = ""
384 # Check if room booking module is active
385 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
386 vars['roomBooking'] = minfo.getRoomBookingModuleActive()
388 #Build a list of items for the administration menu
389 adminList = AdminList.getInstance()
390 adminItemList = []
391 if self._currentuser:
392 if self._currentuser.isAdmin() or not adminList.getList():
393 adminItemList.append({'url': urlHandlers.UHAdminArea.getURL(), 'text': _("Server admin")})
394 if PluginsHolder().hasPluginType("Collaboration"):
395 from MaKaC.webinterface.rh.collaboration import RCCollaborationAdmin, RCCollaborationPluginAdmin
396 from MaKaC.plugins.Collaboration.collaborationTools import CollaborationTools
397 if (self._currentuser.isAdmin() or RCCollaborationAdmin.hasRights(user = self._currentuser) or RCCollaborationPluginAdmin.hasRights(user = self._currentuser, plugins = "any")) and CollaborationTools.anyPluginsAreActive():
398 adminItemList.append({'url': urlHandlers.UHAdminCollaboration.getURL(), 'text': _("Video Services Overview")})
399 if webcast.HelperWebcastManager.getWebcastManagerInstance().isManager(self._currentuser):
400 adminItemList.append({'url': urlHandlers.UHWebcast.getURL(), 'text': _("Webcast Admin")})
403 vars["adminItemList"] = adminItemList
405 return vars
408 class WStaticWebHeader( WTemplated ):
409 """Templating web component for generating the HTML header for
410 the static web interface when generating a DVD.
412 def getVars( self ):
413 vars = WTemplated.getVars( self )
414 return vars
416 class WManagementHeader( WHeader ):
417 """Templating web component for generating the HTML header for
418 the management web interface.
420 pass
422 class WHelpHeader( WHeader ):
423 """Templating web component for generating the HTML header for
424 the help web interface.
426 pass
428 class WRoomBookingHeader( WHeader ):
429 """Templating web component for generating the HTML header for
430 the (standalone) room booking web interface.
432 pass
434 class WConferenceHeader( WHeader ):
435 """Templating web component for generating the HTML header for
436 the conferences' web interface.
439 def __init__(self, aw, conf):
440 self._conf = conf
441 self._aw = aw
442 WHeader.__init__(self, self._aw, tpl_name='EventHeader')
443 tzUtil = DisplayTZ(self._aw,self._conf)
444 self._locTZ = tzUtil.getDisplayTZ()
446 def getVars( self ):
447 vars = WHeader.getVars( self )
448 vars["categurl"] = urlHandlers.UHCategoryDisplay.getURL(self._conf.getOwnerList()[0])
450 vars["conf"] = self._conf;
452 vars["imgLogo"] = Configuration.Config.getInstance().getSystemIconURL( "miniLogo" )
453 vars["MaKaCHomeURL"] = urlHandlers.UHCategoryDisplay.getURL(self._conf.getOwnerList()[0])
455 #moved here from WHeader in order to be able to use DisplayTZ with self._conf (in some pages WHeader has no self._conf).
456 #TODO: Is this needed?
457 #vars["Timezones"] = Config.getInstance().getTimezoneList()
460 # if self._conf.getModifKey() != '':
461 # url = urlHandlers.UHConfEnterModifKey.getURL(self._conf)
462 # url.addParam("redirectURL",urlHandlers.UHConferenceDisplay.getURL(self._conf))
463 # vars["confModif"] = """<a href=%s><img src=%s valign="middle"></a>"""%(quoteattr(str(url)), quoteattr(str(Configuration.Config.getInstance().getSystemIconURL( "modify" ))))
464 # else:
465 # vars["confModif"] = ""
467 # Default values to avoid NameError while executing the template
468 vars["viewoptions"] = []
469 vars["SelectedStyle"] = ""
470 vars["pdfURL"] = ""
471 vars["displayURL"] = ""
473 # Setting the buttons that will be displayed in the header menu
474 vars["showFilterButton"] = False
475 vars["showMoreButton"] = True
476 vars["showExportToICal"] = True
477 vars["showExportToPDF"] = False
478 vars["showDLMaterial"] = False
479 vars["showLayout"] = False
481 vars["usingModifKey"]=False
482 if self._conf.canKeyModify(self._aw):
483 vars["usingModifKey"]=True
484 vars["displayNavigationBar"] = displayMgr.ConfDisplayMgrRegistery().getDisplayMgr(self._conf, False).getDisplayNavigationBar()
485 return vars
487 class WMenuConferenceHeader( WConferenceHeader ):
488 """Templating web component for generating the HTML header for
489 the conferences' web interface with a menu
491 def __init__(self, aw, conf, modifKey=False):
492 self._conf = conf
493 self._modifKey=modifKey
494 self._aw=aw
495 WConferenceHeader.__init__(self, self._aw, conf)
497 def getVars( self ):
498 vars = WConferenceHeader.getVars( self )
499 vars["categurl"] = urlHandlers.UHConferenceDisplay.getURL(self._conf)
500 url = urlHandlers.UHConfEnterModifKey.getURL(self._conf)
501 url.addParam("redirectURL",urlHandlers.UHConferenceOtherViews.getURL(self._conf))
502 vars["confModif"] = _("""<a href=%s> _("manage")</a>""")%quoteattr(str(url))
503 if self._conf.canKeyModify(self._aw):
504 url = urlHandlers.UHConfCloseModifKey.getURL(self._conf)
505 url.addParam("redirectURL",urlHandlers.UHConferenceOtherViews.getURL(self._conf))
506 vars["confModif"] = _("""<a href=%s>_("exit manage")</a>""")%quoteattr(str(url))
507 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
508 stylesheets = styleMgr.getStylesheetListForEventType(vars["type"])
510 # View Menu
511 viewoptions = []
512 if len(stylesheets) != 0:
513 stylesheets.sort()
514 for stylesheet in stylesheets:
515 viewoptions.append({"id": styleMgr.getStylesheetName(stylesheet), "name": stylesheet})
517 # Dates Menu
518 tz = DisplayTZ(self._aw,self._conf,useServerTZ=1).getDisplayTZ()
519 sdate = self._conf.getStartDate().astimezone(timezone(tz))
520 edate = self._conf.getEndDate().astimezone(timezone(tz))
521 dates = []
522 if sdate.strftime("%Y-%m-%d") != edate.strftime("%Y-%m-%d"):
523 selected = ""
524 if vars.has_key("selectedDate"):
525 selectedDate = vars["selectedDate"]
526 if selectedDate == "all" or selectedDate == "":
527 selected = "selected"
528 else:
529 selectedDate = "all"
530 dates = [ _(""" <select name="showDate" onChange="document.forms[0].submit();" style="font-size:8pt;"><option value="all" %s>- - _("all days") - -</option> """)%selected]
531 while sdate.strftime("%Y-%m-%d") <= edate.strftime("%Y-%m-%d"):
532 selected = ""
533 if selectedDate == sdate.strftime("%d-%B-%Y"):
534 selected = "selected"
535 d = sdate.strftime("%d-%B-%Y")
536 dates.append(""" <option value="%s" %s>%s</option> """%(d, selected, d))
537 sdate = sdate + timedelta(days=1)
538 dates.append("</select>")
539 else:
540 dates.append("""<input type="hidden" name="showDate" value="all">""")
541 # Sessions Menu
542 sessions = []
543 if len(self._conf.getSessionList()) != 0:
544 selected = ""
545 if vars.has_key("selectedSession"):
546 selectedSession = vars["selectedSession"]
547 if selectedSession == "all" or selectedSession == "":
548 selected = "selected"
549 else:
550 selectedSession = "all"
551 sessions = [ _(""" <select name="showSession" onChange="document.forms[0].submit();" style="font-size:8pt;"><option value="all" %s>- - _("all sessions") - -</option> """)%selected]
552 for session in self._conf.getSessionList():
553 selected = ""
554 id = session.getId()
555 if id == selectedSession:
556 selected = "selected"
557 sessions.append(""" <option value="%s" %s>%s</option> """%(id, selected, session.getTitle()))
558 sessions.append("</select>")
559 else:
560 sessions.append("""<input type="hidden" name="showSession" value="all">""")
561 # Handle hide/show contributions option
562 hideContributions = None;
563 if len(self._conf.getSessionList()) != 0:
564 if vars.has_key("detailLevel"):
565 if vars["detailLevel"] == "session":
566 hideContributions = "checked"
567 else:
568 hideContributions = ""
569 # Save to session
570 vars["hideContributions"] = hideContributions;
572 if self._conf.getType() == "meeting" and self._conf.getParticipation().isAllowedForApplying() and self._conf.getStartDate() > nowutc():
573 vars["applyForParticipation"] = _("""<a href="%s">_("Apply for participation")</a>""")%urlHandlers.UHConfParticipantsNewPending.getURL(self._conf)
574 else :
575 vars["applyForParticipation"] = ""
576 evaluation = self._conf.getEvaluation()
577 if self._conf.hasEnabledSection("evaluation") and evaluation.isVisible() and evaluation.inEvaluationPeriod() and evaluation.getNbOfQuestions()>0 :
578 vars["evaluation"] = _("""<a href="%s"> _("Evaluation")</a>""")%urlHandlers.UHConfEvaluationDisplay.getURL(self._conf)
579 else :
580 vars["evaluation"] = ""
582 urlCustPrint = urlHandlers.UHConferenceOtherViews.getURL(self._conf)
583 urlCustPrint.addParam("showDate", vars.get("selectedDate", "all"))
584 urlCustPrint.addParam("showSession", vars.get("selectedSession", "all"))
585 urlCustPrint.addParam("fr", "no")
586 urlCustPrint.addParam("view", vars["currentView"])
587 vars["printURL"]=str(urlCustPrint)
589 vars["printIMG"]=quoteattr(str(Configuration.Config.getInstance().getSystemIconURL( "printer" )))
590 urlCustPDF=urlHandlers.UHConfTimeTableCustomizePDF.getURL(self._conf)
591 urlCustPDF.addParam("showDays", vars.get("selectedDate", "all"))
592 urlCustPDF.addParam("showSessions", vars.get("selectedSession", "all"))
593 vars["pdfURL"]=quoteattr(str(urlCustPDF))
594 vars["pdfIMG"]=quoteattr(str(Configuration.Config.getInstance().getSystemIconURL( "pdf" )))
595 urlMatPack=urlHandlers.UHConferenceDisplayMaterialPackage.getURL(self._conf)
596 vars["matPackURL"]=quoteattr(str(urlMatPack))
597 vars["zipIMG"]=quoteattr(str(Configuration.Config.getInstance().getSystemIconURL( "smallzip" )))
599 if Config.getInstance().getIndicoSearchServer() != '' :
600 vars["searchBox"] = WMicroSearchBox(self._conf.getId()).getHTML()
601 vars["searchURL"] = quoteattr(str(Configuration.Config.getInstance().getSystemIconURL( "search" )))
602 else:
603 vars["searchBox"] = ""
605 return vars
607 class WMenuMeetingHeader( WConferenceHeader ):
608 """Templating web component for generating the HTML header for
609 the meetings web interface with a menu
611 def __init__(self, aw, conf, modifKey=False):
612 self._conf = conf
613 self._modifKey=modifKey
614 self._aw=aw
615 WHeader.__init__(self, self._aw, tpl_name='EventHeader')
616 tzUtil = DisplayTZ(self._aw,self._conf)
617 self._locTZ = tzUtil.getDisplayTZ()
620 def getVars( self ):
621 vars = WConferenceHeader.getVars( self )
623 vars["categurl"] = urlHandlers.UHCategoryDisplay.getURL(self._conf.getOwnerList()[0])
624 #vars["confModif"] = _("""<a href=%s> _("manage")</a>""")%quoteattr(str(urlHandlers.UHConfEnterModifKey.getURL(self._conf)))
625 #if self._conf.canKeyModify(self._aw):
626 # vars["confModif"] = _("""<a href=%s> _("exit manage")</a>""")%quoteattr(str(urlHandlers.UHConfCloseModifKey.getURL(self._conf)))
627 #vars["confModif"] += "&nbsp;|&nbsp;"
628 #if not self._conf.canAccess(self._aw) and self._conf.getAccessKey() != "":
629 # vars["confModif"] += _("""<a href=%s>_("full agenda")</a>&nbsp;|&nbsp;""")%(quoteattr(str(urlHandlers.UHConfForceEnterAccessKey.getURL(self._conf))))
630 styleMgr = info.HelperMaKaCInfo.getMaKaCInfoInstance().getStyleManager()
631 stylesheets = styleMgr.getStylesheetListForEventType(vars["type"])
633 viewoptions = []
634 if len(stylesheets) != 0:
635 stylesheets.sort(key=styleMgr.getStylesheetName)
636 for stylesheet in stylesheets:
637 viewoptions.append({"id": stylesheet, "name": styleMgr.getStylesheetName(stylesheet) })
638 vars["viewoptions"] = viewoptions
639 vars["SelectedStyle"] = styleMgr.getStylesheetName(vars["currentView"])
640 vars["displayURL"] = urlHandlers.UHConferenceDisplay.getURL(self._rh._conf)
642 # Setting the buttons that will be displayed in the header menu
643 vars["showFilterButton"] = True
644 vars["showExportToPDF"] = True
645 vars["showDLMaterial"] = True
646 vars["showLayout"] = True
649 # Dates Menu
650 tz = DisplayTZ(self._aw,self._conf,useServerTZ=1).getDisplayTZ()
651 sdate = self._conf.getStartDate().astimezone(timezone(tz))
652 edate = self._conf.getEndDate().astimezone(timezone(tz))
653 dates = []
654 selected = ""
655 if vars.has_key("selectedDate"):
656 selectedDate = vars["selectedDate"]
657 if selectedDate == "all" or selectedDate == "":
658 selected = "selected"
659 else:
660 selectedDate = "all"
661 dates = [ _(""" <option value="all" %s>- - _("all days") - -</option> """)%selected]
662 while sdate.strftime("%Y-%m-%d") <= edate.strftime("%Y-%m-%d"):
663 selected = ""
664 if selectedDate == sdate.strftime("%d-%B-%Y"):
665 selected = "selected"
666 d = sdate.strftime("%d-%B-%Y")
667 dates.append(""" <option value="%s" %s>%s</option> """%(d, selected, d))
668 sdate = sdate + timedelta(days=1)
669 vars["datesMenu"] = "".join(dates);
671 # Sessions Menu
672 sessions = []
673 selected = ""
674 if vars.has_key("selectedSession"):
675 selectedSession = vars["selectedSession"]
676 if selectedSession == "all" or selectedSession == "":
677 selected = "selected"
678 else:
679 selectedSession = "all"
680 sessions = [ _(""" <option value="all" %s>- - _("all sessions") - -</option> """)%selected]
681 for session in self._conf.getSessionList():
682 selected = ""
683 id = session.getId()
684 if id == selectedSession:
685 selected = "selected"
686 title = session.getTitle()
687 if len(title) > 60:
688 title = title[0:40] + "..."
689 sessions.append(""" <option value="%s" %s>%s</option> """%(id, selected, title))
690 vars["sessionsMenu"] = "".join(sessions);
692 # Handle hide/show contributions option
693 hideContributions = None;
694 if len(self._conf.getSessionList()) != 0:
695 if vars.has_key("detailLevel"):
696 if vars["detailLevel"] == "session":
697 hideContributions = "checked"
698 else:
699 hideContributions = ""
700 vars["hideContributions"] = hideContributions;
702 if Config.getInstance().getIndicoSearchServer() != '' :
703 vars["searchBox"] = WCategorySearchBox(optionsClass='meetingHeaderSearchBox').getHTML()
704 else:
705 vars["searchBox"] = ""
707 urlCustPrint = urlHandlers.UHConferenceOtherViews.getURL(self._conf)
708 urlCustPrint.addParam("showDate", vars.get("selectedDate", "all"))
709 urlCustPrint.addParam("showSession", vars.get("selectedSession", "all"))
710 urlCustPrint.addParam("detailLevel", vars.get("detailLevel", "all"))
711 urlCustPrint.addParam("fr", "no")
712 urlCustPrint.addParam("view", vars["currentView"])
713 vars["printURL"]=str(urlCustPrint)
716 urlCustPDF=urlHandlers.UHConfTimeTableCustomizePDF.getURL(self._conf)
717 urlCustPDF.addParam("showDays", vars.get("selectedDate", "all"))
718 urlCustPDF.addParam("showSessions", vars.get("selectedSession", "all"))
719 # Add the view as a parameter to keep track of the current layout
720 # when exporting a pdf
721 urlCustPDF.addParam("view", vars["currentView"])
722 vars["pdfURL"]=str(urlCustPDF)
725 return vars
727 class WMenuSimpleEventHeader( WMenuMeetingHeader ):
728 """Templating web component for generating the HTML header for
729 the simple event' web interface with a menu
732 def getVars( self ):
733 vars = WMenuMeetingHeader.getVars( self )
734 vars["confModif"] = """<a href=%s>manage</a>"""%quoteattr(str(urlHandlers.UHConfEnterModifKey.getURL(self._conf)))
735 if self._conf.canKeyModify(self._aw):
736 vars["confModif"] = """<a href=%s>exit manage</a>"""%quoteattr(str(urlHandlers.UHConfCloseModifKey.getURL(self._conf)))
738 # Setting the buttons that will be displayed in the header menu
739 vars["showFilterButton"] = False
740 vars["showExportToPDF"] = False
742 vars["accessWrapper"] = self._aw
743 return vars
747 class WFooter(WTemplated):
748 """Templating web component for generating a common HTML footer for the
749 web interface.
752 def __init__(self, tpl_name = None, isFrontPage = False):
753 WTemplated.__init__(self, tpl_name)
754 self.__isFrontPage = isFrontPage
756 def getVars( self ):
757 vars = WTemplated.getVars( self )
759 vars["isFrontPage"] = self.__isFrontPage;
761 if not vars.has_key("modificationDate"):
762 vars["modificationDate"] = ""
764 if not vars.has_key("shortURL"):
765 vars["shortURL"] = ""
767 return vars
769 class WNavigationDrawer(WTemplated):
771 def __init__( self, pars, bgColor = None, appendPath = [] , type = None):
772 self._target = pars["target"]
773 self._isModif = pars.get("isModif", False)
774 self._track = pars.get("track", None) #for abstracts viewed inside a track
775 self._bgColor = bgColor
776 self._actionType = type #type of action
779 The appendPath is an array with dictionaries: {"url": x, "title": x}.
780 Each of these links are added in the end of the breadcrumb
782 self._appendPath = appendPath
784 def getVars( self ):
785 vars = WTemplated.getVars( self )
786 vars["target"] = self._target
787 vars["isModif"]= self._isModif
788 vars["track"]= self._track
789 vars["bgColor"] = self._bgColor
790 vars["appendPath"] = self._appendPath
791 vars["actionType"] = self._actionType
792 return vars
794 def getHTML(self, params=None):
795 return WTemplated.getHTML(self, params)
797 class WSimpleNavigationDrawer(WTemplated):
799 def __init__( self, title, handler = None, bgColor = None, **pars ):
800 self._urlHandler = handler
801 self._pars = pars
802 self._title = title
803 self._bgColor = bgColor
805 def getVars( self ):
806 vars = WTemplated.getVars( self )
807 vars["urlHandler"] = self._urlHandler
808 vars["title"] = self._title
809 vars["pars"] = self._pars
810 vars["bgColor"] = self._bgColor
811 return vars
813 def getHTML(self, params=None):
814 return WTemplated.getHTML(self, params)
816 class WBannerModif(WTemplated):
818 def __init__( self, path = [], itemType = "", title = "" ):
819 WTemplated.__init__( self, "BannerModif" )
820 self._path = path
821 self._title = title
822 self._type = itemType
824 def getHTML(self):
825 """ Retrieves the HTML of the banner of the modification interface
826 of the given target event / category / contribution / abstract / etc.
827 'track' argument should be provided for abstracts viewed inside a track.
828 If originUrl and originPageTitle is set then this link his added to the end
829 of the breadcrumb showed in the banner.
832 return WTemplated.getHTML(self, {"type" : self._type, "path": self._path, "title": self._title})
834 class WTimetableBannerModif(WBannerModif):
836 def __init__(self, aw, target):
837 ## PATH
838 # Iterate till conference is reached
839 conf = target.getConference()
840 path = self._getOwnerBasePath(target)
842 # if user has access to top-level timetable
843 if conf.canModify(aw):
844 scheduleModifURL = urlHandlers.UHConfModifSchedule.getURL( conf )
845 else:
846 # otherwise, let them access only the session timetable
847 scheduleModifURL = urlHandlers.UHSessionModifSchedule.getURL( target.getSession() )
849 path.append({"url": scheduleModifURL, "title": _("Timetable")})
850 # TITLE AND TYPE
851 itemType = type(target).__name__
852 title = target.getTitle()
853 WBannerModif.__init__(self, path, itemType, title)
855 def _getOwnerBasePath(self, target):
856 path = []
857 obj = target
858 while obj:
859 obj = obj.getOwner()
860 if type(obj) != Conference and type(obj) != conference.Category:
861 path.append({"url": urlHandlers.UHHelper.getModifUH(type(obj)).getURL(obj),
862 "title": truncateTitle(obj.getTitle(), 30),
863 "type": type(obj).__name__})
864 else:
865 break
866 return path
868 class WListOfPapersToReview(WBannerModif):
870 def __init__(self, target, user ):
871 ## PATH
872 # Iterate till conference is reached
873 conf = target.getConference()
874 if user == "referee":
875 path = [{"url": urlHandlers.UHConfModifListContribToJudge.getURL(conf), "title":_("Contributions list")}]
876 if user == "reviewer":
877 path = [{"url": urlHandlers.UHConfModifListContribToJudgeAsReviewer.getURL(conf), "title":_("Contributions list")}]
878 if user == "editor":
879 path = [{"url": urlHandlers.UHConfModifListContribToJudgeAsEditor.getURL(conf), "title":_("Contributions list")}]
880 # TITLE AND TYPE
881 itemType = type(target).__name__
882 title = target.getTitle()
883 WBannerModif.__init__(self, path, itemType, title)
885 class WContribListBannerModif(WTimetableBannerModif):
887 def __init__(self, target ):
888 ## PATH
889 # Iterate till conference is reached
890 conf = target.getConference()
891 path = self._getOwnerBasePath(target)
893 path.append({"url": urlHandlers.UHConfModifContribList.getURL( conf ), "title": _("Contributions list")})
895 # TITLE AND TYPE
896 itemType = type(target).__name__
897 title = target.getTitle()
898 WBannerModif.__init__(self, path, itemType, title)
901 class WNotifTplBannerModif(WBannerModif):
903 def __init__( self, target ):
904 path = [{"url": urlHandlers.UHAbstractReviewingNotifTpl.getURL(target), "title":_("Notification template list")}]
905 itemType="Notification Template"
906 title=target.getName()
907 WBannerModif.__init__(self, path, itemType, title)
909 class WAbstractBannerModif(WBannerModif):
911 def __init__( self, target ):
912 path = [{"url": urlHandlers.UHConfAbstractManagment.getURL(target), "title":_("Abstracts list")}]
913 itemType="Abstract"
914 title=target.getTitle()
915 WBannerModif.__init__(self, path, itemType, title)
917 class WTrackBannerModif(WBannerModif):
919 def __init__( self, track, abstract=None, isManager = False ):
920 path = []
921 target = track
922 if abstract:
923 path.append({"url": urlHandlers.UHTrackModifAbstracts.getURL(track), "title":_("Abstract list")})
924 if isManager:
925 path.append({"url": urlHandlers.UHConfModifProgram.getURL(track.getConference()), "title":_("Track list")})
926 itemType=type(target).__name__
927 title=target.getTitle()
928 WBannerModif.__init__(self, path, itemType, title)
930 class WCategoryBannerModif(WBannerModif):
932 def __init__( self, target ):
933 itemType="Category"
934 title=target.getTitle()
935 WBannerModif.__init__(self, [], itemType, title)
937 class WRegFormBannerModif(WBannerModif):
939 def __init__( self, registrant ):
940 path=[{"url": urlHandlers.UHConfModifRegistrantList.getURL(registrant.getConference()), "title":_("Registrants list")}]
942 itemType="Registrant"
943 title=registrant.getFullName()
944 WBannerModif.__init__(self, path, itemType, title)
946 class WRegFormSectionBannerModif(WBannerModif):
948 def __init__( self, target, conf ):
949 path=[{"url": urlHandlers.UHConfModifRegForm.getURL(conf), "title":_("Registration form setup")}]
951 itemType="Registration form Section"
952 title=target.getTitle()
953 WBannerModif.__init__(self, path, itemType, title)
955 class WEpaymentBannerModif(WBannerModif):
957 def __init__( self, target, conf ):
958 path=[{"url": urlHandlers.UHConfModifEPayment.getURL(conf), "title":_("Epayment setup")}]
960 itemType="Epayment plugin"
961 title=target.getTitle()
962 WBannerModif.__init__(self, path, itemType, title)
964 class WListingsBannerModif(WBannerModif):
966 def __init__( self, conf, type ):
967 path=[{"url": urlHandlers.UHConfModifListings.getURL(conf), "title":_("All listings")}]
969 itemType= type
970 title=""
971 WBannerModif.__init__(self, path, itemType, title)
973 class WParticipantsBannerModif(WBannerModif):
975 def __init__( self, conf ):
976 path=[{"url": urlHandlers.UHConfModifParticipants.getURL(conf), "title":_("Participants list")}]
978 itemType="Pending participants"
979 title=""
980 WBannerModif.__init__(self, path, itemType, title)
983 class WConfLogsBannerModif(WBannerModif):
985 def __init__( self, conf ):
986 path=[{"url": urlHandlers.UHConfModifLog.getURL(conf), "title":_("Logs")}]
988 itemType="Log item"
989 title=""
990 WBannerModif.__init__(self, path, itemType, title)
992 class WCategModifHeader(WTemplated):
994 def __init__(self, targetConf ):
995 self._conf = targetConf
997 def _getSingleCategHTML( self, categ, URLGen ):
999 return """<a href="%s">%s</a>"""%(URLGen( categ ), categ.getName())
1001 def _getMultipleCategHTML( self, categList, URLGen ):
1002 l = []
1003 for categ in self._conf.getOwnerList():
1004 l.append("""<option value="%s">%s</option>"""%(categ.getId(),\
1005 categ.getName()))
1006 return _("""<form action="%s" method="GET">
1007 <select name="categId">%s</select>
1008 <input type="submit" class="btn" value="_("go")">
1009 </form>""")%(URLGen(), "".join(l))
1011 def getVars( self ):
1013 vars = WTemplated.getVars( self )
1014 #raise "%s"%(type(self._conf))
1015 try:
1016 ol = self._conf.getOwnerList()
1017 except:
1018 ol=self._conf
1019 #raise "%s"%ol
1020 URLGen = vars.get("categDisplayURLGen", urlHandlers.UHCategoryDisplay.getURL )
1022 try:
1023 if len(ol)>1:
1024 vars["categ"] = self._getMultipleCategHTML(ol, URLGen)
1025 else:
1026 vars["categ"] = self._getSingleCategHTML( ol[0], URLGen)
1027 vars["viewImageURL"] = Configuration.Config.getInstance().getSystemIconURL( "view" )
1028 except:
1029 vars["categ"] = self._getSingleCategHTML( ol, URLGen)
1030 vars["viewImageURL"] = Configuration.Config.getInstance().getSystemIconURL( "view" )
1032 return vars
1035 class WCategoryModificationHeader(WTemplated):
1038 def __init__( self, category ):
1039 self._categ = category
1041 def getVars( self ):
1042 vars = WTemplated.getVars( self )
1044 vars["confTitle"] = self._categ.getName()
1045 vars["title"] = self._categ.getName()
1046 vars["catDisplayURL"] = urlHandlers.UHCategoryDisplay.getURL(self._categ)
1047 vars["catModifURL"]= urlHandlers.UHCategoryModification.getURL(self._categ)
1048 vars["titleTabPixels"] = self.getTitleTabPixels()
1049 #vars["intermediateVTabPixels"] = self.getIntermediateVTabPixels()
1050 vars["eventCaption"]= "Category"
1051 return vars
1053 def getIntermediateVTabPixels( self ):
1054 return 0
1056 def getTitleTabPixels( self ):
1057 return 260
1059 class WConfModifHeader(WTemplated):
1061 def __init__( self, conf, aw ):
1062 self._conf = conf
1063 self._aw = aw
1065 def getVars( self ):
1066 vars = WTemplated.getVars( self )
1067 #raise "%s"%vars
1068 try:
1069 vars["creator"] = self._conf.getCreator().getFullName()
1070 except:
1071 vars["creator"] = ""
1072 vars["imgGestionGrey"] = Configuration.Config.getInstance().getSystemIconURL( "gestionGrey" )
1073 vars["confTitle"] = escape(self._conf.getTitle())
1074 if self._conf.canModify( self._aw ):
1075 URLGen = vars.get("confModifURLGen", \
1076 urlHandlers.UHConferenceModification.getURL )
1077 vars["confTitle"] = """<a href=%s>%s</a>"""%(quoteattr( str( URLGen( self._conf ) ) ), escape(self._conf.getTitle()) )
1078 URLGen = vars.get( "confDisplayURLGen", urlHandlers.UHConferenceDisplay.getURL )
1079 vars["confDisplayURL"] = URLGen( self._conf )
1080 vars["titleTabPixels"] = WConferenceModifFrame(self._conf, self._aw).getTitleTabPixels()
1081 try:
1082 type = self._conf.getType()
1083 except:
1084 type = ""
1085 if type == "simple_event":
1086 type = "lecture"
1087 vars["eventCaption"]=type.capitalize()#"Event"
1090 return vars
1093 class WSessionModifHeader(WTemplated):
1095 def __init__( self, session, aw ):
1096 self._session = session
1097 self._aw = aw
1099 def getHTML( self, params ):
1100 conf = self._session.getConference()
1101 confHTML = WConfModifHeader( conf, self._aw ).getHTML( params )
1102 return "%s%s"%(confHTML, WTemplated.getHTML( self, params ) )
1104 def getVars( self ):
1105 vars = WTemplated.getVars( self )
1106 vars["imgGestionGrey"] = Configuration.Config.getInstance().getSystemIconURL( "gestionGrey" )
1107 vars["sessionTitle"] = escape(self._session.getTitle())
1108 vars["sessionDisplayURL"] = vars["sessionDisplayURLGen"](self._session)
1109 vars["sessionModificationURL"] = vars["sessionModifURLGen"](self._session)
1110 return vars
1112 class WBreakModifHeader(WTemplated):
1114 def __init__( self, breakSlot, aw ):
1115 self._break = breakSlot
1116 self._aw = aw
1118 def getHTML( self, params ):
1119 return WTemplated.getHTML( self, params )
1121 def getVars( self ):
1122 vars = WTemplated.getVars( self )
1123 vars["imgGestionGrey"] = Configuration.Config.getInstance().getSystemIconURL( "gestionGrey" )
1124 vars["breakTitle"] = escape(self._break.getTitle())
1125 return vars
1128 class WContribModifHeader(WTemplated):
1130 def __init__( self, contrib, aw):
1131 self._contrib = contrib
1132 self._aw = aw
1134 def getHTML( self, params ):
1135 conf = self._contrib.getConference()
1136 session = self._contrib.getSession()
1137 if session is not None:
1138 HTML = WSessionModifHeader( session, self._aw ).getHTML( params )
1139 else:
1140 HTML = WConfModifHeader( conf, self._aw ).getHTML( params )
1141 return "%s%s"%(HTML, WTemplated.getHTML( self, params ) )
1143 def getVars( self ):
1144 vars = WTemplated.getVars( self )
1145 vars["imgGestionGrey"] = Configuration.Config.getInstance().getSystemIconURL( "gestionGrey" )
1146 vars["title"] = escape(self._contrib.getTitle())
1147 urlGen = vars.get( "contribDisplayURLGen", urlHandlers.UHContributionDisplay.getURL )
1148 vars["contribDisplayURL"] = urlGen(self._contrib)
1149 urlGen = vars.get( "contribModifURLGen", urlHandlers.UHContributionModification.getURL )
1150 vars["contribModificationURL"] = urlGen(self._contrib)
1151 return vars
1154 class WContribModifTool(WTemplated):
1156 def __init__( self, contrib ):
1157 self._contrib = contrib
1159 def getVars( self ):
1160 vars = WTemplated.getVars( self )
1161 vars["deleteIconURL"] = Configuration.Config.getInstance().getSystemIconURL("delete")
1162 vars["moveIconURL"] = Configuration.Config.getInstance().getSystemIconURL("move")
1163 vars["writeIconURL"] = Configuration.Config.getInstance().getSystemIconURL("write_minutes")
1164 return vars
1168 class WContributionDeletion(object):
1170 def __init__( self, contribList ):
1171 self._contribList = contribList
1173 def getHTML( self, actionURL ):
1174 l = []
1175 for contrib in self._contribList:
1176 l.append("""<li><i>%s</i></li>"""%contrib.getTitle())
1177 msg = _("""
1178 <font size="+2"> _("Are you sure that you want to DELETE the following contributions"):<ul>%s</ul>?</font><br>
1179 <table>
1180 <tr><td>
1181 <font color="red"> _("Note that the following changes will result from this deletion"):</font>
1182 <ul>
1183 <li> _("If the contribution is linked to an abstract"):</li>
1184 <ul>
1185 <li> _("The link between the abstract and the contribution will be deleted")</li>
1186 <li> _("The status of the abstract will change to 'submitted'")</li>
1187 <li> _("You'll lose the information about when and who accepted the abstract")</li>
1188 </ul>
1189 <li> _("ALL the existing sub-contributions within the above contribution(s) will also be deleted")</li>
1190 </ul>
1191 </td></tr>
1192 </table>
1193 """)%("".join(l))
1194 wc = WConfirmation()
1195 contribIdList = []
1196 for contrib in self._contribList:
1197 contribIdList.append( contrib.getId() )
1198 return wc.getHTML( msg, actionURL, {"selectedCateg": contribIdList}, \
1199 confirmButtonCaption="Yes", \
1200 cancelButtonCaption="No" )
1202 def delete( self ):
1203 for contrib in self._contribList:
1204 contrib.delete()
1205 return "done"
1208 class WContribModifSC(WTemplated):
1210 def __init__( self, contrib ):
1211 self._contrib = contrib
1212 self._conf = self._contrib.getConference()
1215 def getSubContItems(self,SCModifURL):
1216 temp = []
1217 scList = self._contrib.getSubContributionList()
1218 for sc in scList:
1219 id = sc.getId()
1220 selbox = """<select name="newpos%s" onChange="this.form.oldpos.value='%s';this.form.submit();">""" % (scList.index(sc),scList.index(sc))
1221 for i in range(1,len(scList)+1):
1222 if i== scList.index(sc)+1:
1223 selbox += "<option selected value='%s'>%s" % (i-1,i)
1224 else:
1225 selbox += "<option value='%s'>%s" % (i-1,i)
1226 selbox += """
1227 </select>"""
1228 temp.append("""
1229 <tr>
1230 <td>
1231 <input type="checkbox" name="selSubContribs" value="%s">
1233 &nbsp;<a href="%s">%s</a>
1234 </td>
1235 </tr>"""%(id, selbox,SCModifURL(sc), escape(sc.getTitle())))
1236 html = """
1237 <input type="hidden" name="oldpos">
1238 <table align="center">%s
1239 </table>"""%"".join( temp )
1240 return html
1242 def getVars( self ):
1243 vars = WTemplated.getVars( self )
1244 cfg = Configuration.Config.getInstance()
1245 vars["subContList"] = self.getSubContItems(vars["subContModifURL"])
1246 vars["confId"] = self._contrib.getConference().getId()
1247 vars["contribId"] = self._contrib.getId()
1248 vars["deleteItemsURL"] = vars["moveSubContribURL"]
1250 return vars
1251 ###ness##################################################################################
1252 # def __getSubCategoryItems( self, sl, modifURLGen ):
1253 # temp = []
1254 # for categ in sl:
1255 # id = categ.getId()
1256 # selbox = """<select name="newpos%s" onChange="this.form.oldpos.value='%s';this.form.submit();">""" % (sl.index(categ),sl.index(categ))
1257 # for i in range (1,len(sl)+1):
1258 # if i==sl.index(categ)+1:
1259 # selbox += "<option selected value='%s'>%s" % (i-1,i)
1260 # else:
1261 # selbox += "<option value='%s'>%s" % (i-1,i)
1262 # selbox += """
1263 # </select>"""
1264 # temp.append("""
1265 # <tr>
1266 # <td>
1267 # <input type="checkbox" name="selectedCateg" value="%s">
1268 # %s
1269 # &nbsp;<a href="%s">%s</a>
1270 # </td>
1271 # </tr>"""%(id, selbox,modifURLGen( categ ), categ.getName()))
1272 # html = """
1273 # <input type="hidden" name="oldpos">
1274 # <table align="center">%s
1275 # </table>"""%"".join( temp )
1276 # return html
1277 ##ness##############################################################################
1279 class WMaterialModifHeader(WTemplated):
1281 def __init__( self, material, aw ):
1282 self._mat = material
1283 self._aw = aw
1285 def getHTML( self, params ):
1286 owner = self._mat.getOwner()
1287 if isinstance( owner, conference.Contribution ):
1288 HTML = WContribModifHeader( owner, self._aw ).getHTML( params )
1289 elif isinstance( owner, conference.SubContribution ):
1290 HTML = WSubContribModifHeader( owner, self._aw ).getHTML( params )
1291 elif isinstance( owner, conference.Session ):
1292 HTML = WSessionModifHeader( owner, self._aw ).getHTML( params )
1293 elif isinstance( owner, conference.Conference ):
1294 HTML = WConfModifHeader( owner, self._aw ).getHTML( params )
1295 elif isinstance( owner, conference.Category):
1296 HTML = WCategoryModificationHeader( owner ).getHTML( params )
1297 return "%s%s"%(HTML, WTemplated.getHTML( self, params ))
1299 def getVars( self ):
1300 vars = WTemplated.getVars( self )
1301 vars["imgGestionGrey"] = Configuration.Config.getInstance().getSystemIconURL( "gestionGrey" )
1302 vars["title"] = escape(self._mat.getTitle())
1303 vars["materialDisplayURL"] = vars["materialDisplayURLGen"](self._mat)
1304 vars["materialModificationURL"] = vars["materialModifURLGen"](self._mat)
1305 vars["titleTabPixels"] = WMaterialModifFrame(self._mat, self._aw).getTitleTabPixels()
1306 return vars
1309 class WConferenceModifFrame(WTemplated):
1311 def __init__( self, conference, aw,):
1312 self.__conf = conference
1313 self._aw = aw
1315 def getHTML( self, body, **params ):
1316 params["body"] = body
1317 return WTemplated.getHTML( self, params )
1319 def getVars( self ):
1320 vars = WTemplated.getVars( self )
1322 vars["conf"] = self.__conf
1323 vars["startDate"] = utils.formatDateTime(self.__conf.getAdjustedStartDate(), format="%d %B")
1324 vars["endDate"] = utils.formatDateTime(self.__conf.getAdjustedEndDate(), format="%d %B")
1326 return vars
1328 class WCategoryModifFrame(WTemplated):
1330 def __init__( self, conference):
1331 self.__conf = conference
1334 def getHTML( self, body, **params ):
1335 params["body"] = body
1336 return WTemplated.getHTML( self, params )
1338 def getVars( self ):
1339 vars = WTemplated.getVars( self )
1340 #p = {"categDisplayURLGen": vars["categDisplayURLGen"] }
1341 #vars["context"] = WCategModifHeader(self.__conf).getHTML(p)
1342 vars["creator"] = ""#self.__conf.getCreator().getFullName()
1343 vars["context"] = ""
1344 vars["imgGestionGrey"] = Configuration.Config.getInstance().getSystemIconURL( "gestionGrey" )
1345 vars["categDisplayURL"] = vars["categDisplayURLGen"]( self.__conf )
1346 vars["title"] = escape(self.__conf.getTitle())
1347 vars["titleTabPixels"] = self.getTitleTabPixels()
1348 vars["intermediateVTabPixels"] = self.getIntermediateVTabPixels()
1349 return vars
1352 def getIntermediateVTabPixels( self ):
1353 return 0
1355 def getTitleTabPixels( self ):
1356 return 260
1358 def getCloseHeaderTags( self ):
1359 return ""
1361 class WNotifTPLModifFrame(WTemplated):
1363 def __init__(self, notifTpl, aw):
1364 self._notifTpl = notifTpl
1365 self._aw = aw
1367 def getHTML( self, body, **params ):
1368 params["body"] = body
1369 return WTemplated.getHTML( self, params )
1371 def getVars( self ):
1372 vars = WTemplated.getVars( self )
1373 conf = self._notifTpl.getConference()
1374 vars["context"] = WConfModifHeader( conf, self._aw ).getHTML(vars)
1375 vars["title"] = self._notifTpl.getName()
1376 vars["titleTabPixels"] = self.getTitleTabPixels()
1377 vars["intermediateVTabPixels"] = self.getIntermediateVTabPixels()
1378 vars["closeHeaderTags"] = self.getCloseHeaderTags()
1379 return vars
1381 def getOwnerComponent( self ):
1382 owner = self._notifTpl.getOwner()
1383 wc = WConferenceModifFrame(owner, self._aw)
1384 return wc
1386 def getIntermediateVTabPixels( self ):
1387 wc = self.getOwnerComponent()
1388 return 7 + wc.getIntermediateVTabPixels()
1390 def getTitleTabPixels( self ):
1391 wc = self.getOwnerComponent()
1392 return wc.getTitleTabPixels() - 7
1394 def getCloseHeaderTags( self ):
1395 wc = self.getOwnerComponent()
1396 return "</table></td></tr>" + wc.getCloseHeaderTags()
1399 class WScheduleContributionModifFrame(WTemplated):
1401 def __init__( self, contribution, aw, days, handler=urlHandlers.UHContributionModification):
1402 self._contrib = contribution
1403 self._conf = self._contrib.getConference()
1404 self._aw = aw
1405 self._days = days
1406 self._handler = handler
1408 def getHTML( self, body, **params ):
1410 params["body"] = body
1412 dateList = [d.getDate() for d in self._days]
1414 # Keep contributions that happen in the selected day(s)
1416 # DEBUG
1418 for c in self._conf.getContributionList():
1419 assert(type(c.getStartDate()) == datetime),"Not all dates are present for the contributions!"
1423 l = []
1424 for contrib in self._conf.getContributionList():
1425 if contrib.getStartDate().date() in dateList:
1426 l.append(contrib)
1427 params["contribList"] = l
1428 params["handler"] = self._handler
1430 return WTemplated.getHTML( self, params )
1432 class WContributionModifFrame(WTemplated):
1434 def __init__( self, contribution, aw):
1435 self._contrib = contribution
1436 self._aw = aw
1438 def getHTML( self, body, **params ):
1439 params["body"] = body
1440 return WTemplated.getHTML( self, params )
1442 def getVars( self ):
1443 vars = WTemplated.getVars( self )
1444 vars["target"] = self._contrib
1445 return vars
1448 class WMaterialModifFrame(WTemplated):
1450 def __init__( self, material, aw):
1451 self._material = material
1452 self._aw = aw
1454 def getHTML( self, body, **params ):
1455 params["body"] = body
1456 return WTemplated.getHTML( self, params )
1458 def getVars( self ):
1459 closeHeaderTags = "</table></td></tr>"
1460 vars = WTemplated.getVars( self )
1461 vars["imgGestionGrey"] = Config.getInstance().getSystemIconURL( "gestionGrey" )
1462 owner = self._material.getOwner()
1463 if isinstance(owner, conference.Contribution):
1464 wc = WContribModifHeader( owner, self._aw )
1465 elif isinstance(owner, conference.Session):
1466 wc = WSessionModifHeader( owner, self._aw )
1467 elif isinstance(owner, conference.SubContribution):
1468 wc = WSubContribModifHeader( owner, self._aw )
1469 elif isinstance(owner, conference.Category) :
1470 wc = WCategoryModificationHeader(owner)
1471 else:
1472 wc = WConfModifHeader( owner, self._aw )
1473 vars["context"] = wc.getHTML( vars )
1474 vars["closeHeaderTags"] = self.getCloseHeaderTags()
1475 vars["intermediateVTabPixels"] = self.getIntermediateVTabPixels()
1476 vars["titleTabPixels"] = self.getTitleTabPixels()
1477 vars["title"] = escape(self._material.getTitle())
1478 vars["materialDisplayURL"] = vars["materialDisplayURLGen"]( self._material )
1479 return vars
1481 def getOwnerComponent( self ):
1482 owner = self._material.getOwner()
1483 if isinstance(owner, conference.Contribution):
1484 wc = WContributionModifFrame(owner, self._aw)
1485 elif isinstance(owner, conference.Session):
1486 wc = WSessionModifFrame(owner, self._aw)
1487 elif isinstance(owner, conference.SubContribution):
1488 wc = WSubContributionModifFrame(owner, self._aw)
1490 else:
1491 wc = WConferenceModifFrame(owner, self._aw)
1492 return wc
1494 def getIntermediateVTabPixels( self ):
1495 wc = self.getOwnerComponent()
1496 return 7 + wc.getIntermediateVTabPixels()
1498 def getTitleTabPixels( self ):
1499 wc = self.getOwnerComponent()
1500 return wc.getTitleTabPixels() - 7
1502 def getCloseHeaderTags( self ):
1503 wc = self.getOwnerComponent()
1504 return "</table></td></tr>" + wc.getCloseHeaderTags()
1507 class WResourceModifFrame(WTemplated):
1509 def __init__( self, resource, aw):
1510 self._resource = resource
1511 self._aw = aw
1513 def getHTML( self, body, **params ):
1514 params["body"] = body
1515 return WTemplated.getHTML( self, params )
1517 def getVars( self ):
1518 vars = WTemplated.getVars( self )
1519 wc = WMaterialModifHeader( self._resource.getOwner(), self._aw )
1520 vars["context"] = wc.getHTML( vars )
1521 vars["name"] = self._resource.getName()
1522 vars["intermediateVTabPixels"] = self.getIntermediateVTabPixels()
1523 vars["titleTabPixels"] = self.getTitleTabPixels()
1524 vars["closeHeaderTags"] = self.getCloseHeaderTags()
1525 return vars
1527 def getOwnerComponent( self ):
1528 owner = self._resource.getOwner()
1529 wc = WMaterialModifFrame(owner, self._aw)
1530 return wc
1532 def getIntermediateVTabPixels( self ):
1533 wc = self.getOwnerComponent()
1534 return 7 + wc.getIntermediateVTabPixels()
1536 def getTitleTabPixels( self ):
1537 wc = self.getOwnerComponent()
1538 return wc.getTitleTabPixels() - 7
1540 def getCloseHeaderTags( self ):
1541 wc = self.getOwnerComponent()
1542 return "</table></td></tr>" + wc.getCloseHeaderTags()
1545 class WFileModifFrame( WResourceModifFrame ):
1546 pass
1549 class WLinkModifFrame( WResourceModifFrame ):
1550 pass
1554 class ModifFrameFactory:
1556 def getFrameClass( cls, target ):
1557 if isinstance(target, conference.Conference):
1558 return WConferenceModifFrame
1559 if isinstance( target, conference.Session ):
1560 return WSessionModifFrame
1561 if isinstance( target, conference.Contribution ):
1562 return WContributionModifFrame
1563 if isinstance( target, conference.SubContribution ):
1564 return WSubContributionModifFrame
1565 if isinstance(target, conference.Material):
1566 return WMaterialModifFrame
1567 if isinstance(target, conference.LocalFile):
1568 return WFileModifFrame
1569 if isinstance( target, conference.Link ):
1570 return WLinkModifFrame
1571 return None
1572 getFrameClass = classmethod( getFrameClass )
1574 def getModifFrame( target ):
1575 f = ModifFrameFactory.getFrameClass( target )
1576 if f:
1577 return f( target )
1578 return None
1579 getModifFrame = staticmethod( getModifFrame )
1582 class WSubContributionDisplay:
1584 def __init__(self, aw, subContrib):
1585 self._aw = aw
1586 self._subContrib = subContrib
1588 def getHTML( self, params ):
1589 if self._subContrib.canAccess( self._aw ):
1590 c = WSubContributionDisplayFull( self._aw, self._subContrib)
1591 return c.getHTML( params )
1592 if self._subContrib.canView( self._aw ):
1593 c = WSubContributionDisplayMin( self._aw, self._subContrib)
1594 return c.getHTML( params )
1595 return ""
1597 class WSubContributionDisplayBase(WTemplated):
1599 def __init__(self, aw, subContrib):
1600 self._aw = aw
1601 self._subContrib = subContrib
1603 def __getHTMLRow( self, title, body):
1604 if body.strip() == "":
1605 return ""
1606 str = """
1607 <tr>
1608 <td valign="top" align="right">
1609 <font size="-1" color="#000060">%s:</font>
1610 </td>
1611 <td width="100%%">%s</td>
1612 </tr>"""%(title, body)
1613 return str
1615 def getVars( self ):
1616 vars = WTemplated.getVars( self )
1617 vars["title"] = self._subContrib.getTitle()
1618 vars["description"] = self._subContrib.getDescription()
1619 vars["modifyItem"] = ""
1620 if self._subContrib.canModify( self._aw ):
1621 vars["modifyItem"] = """<a href="%s"><img src="%s" alt="Jump to the modification interface"></a> """%(vars["modifyURL"], Configuration.Config.getInstance().getSystemIconURL( "modify" ) )
1622 l=[]
1623 for speaker in self._subContrib.getSpeakerList():
1624 l.append( """<a href="mailto:%s">%s</a>"""%(speaker.getEmail(), \
1625 speaker.getFullName()))
1626 l.append(self._subContrib.getSpeakerText())
1627 vars["speakers"] = self.__getHTMLRow( _("Presenters"), "<br>".join( l ) )
1628 lm = []
1629 for material in self._subContrib.getAllMaterialList():
1630 lm.append( WMaterialDisplayItem().getHTML( self._aw, material, \
1631 vars["materialURLGen"]( material) ))
1632 vars["material"] = self.__getHTMLRow( "Material", "<br>".join( lm ) )
1633 vars["duration"] = (datetime(1900,1,1)+self._subContrib.getDuration()).strftime("%M'")
1634 if int(self._subContrib.getDuration().seconds/3600)>0:
1635 vars["duration"] = (datetime(1900,1,1)+self._subContrib.getDuration()).strftime("%Hh%M'")
1636 return vars
1639 class WSubContributionDisplayFull(WSubContributionDisplayBase):
1640 pass
1643 class WSubContributionDisplayMin(WSubContributionDisplayBase):
1644 pass
1647 class WMaterialDisplayItem(WTemplated):
1649 def getHTML( self, aw, material, URL="", icon=Configuration.Config.getInstance().getSystemIconURL( "material" ) ):
1650 if material.canView( aw ):
1652 return """<a href=%s>%s</a>"""%(quoteattr( str( URL ) ), WTemplated.htmlText( material.getTitle() ) )
1653 return ""
1656 class WBreakDataModification(WTemplated):
1658 def __init__(self,sch,breakEntry=None,targetDay=None,conf=None):
1659 self._break=breakEntry
1660 if self._break!=None:
1661 self._sch=self._break.getSchedule()
1662 else:
1663 self._sch=sch
1664 self._targetDay=targetDay
1665 self._conf=conf
1667 def getVars( self ):
1668 vars = WTemplated.getVars( self )
1669 defaultDefinePlace = defaultDefineRoom = ""
1670 defaultInheritPlace = defaultInheritRoom = "checked"
1671 locationName, locationAddress, roomName = "", "", ""
1672 if self._break is not None:
1673 wpTitle = _("Break entry data modification")
1674 title=self._break.getTitle()
1675 description=self._break.getDescription()
1676 tz = self._conf.getTimezone()
1677 sDate=convertTime.convertTime(self._break.getStartDate(),self._conf.getTimezone())
1678 day=sDate.day
1679 month=sDate.month
1680 year=sDate.year
1681 sHour=sDate.hour
1682 sMinute=sDate.minute
1683 durHours=int(self._break.getDuration().seconds/3600)
1684 durMinutes=int((self._break.getDuration().seconds%3600)/60)
1685 if self._break.getOwnLocation() is not None:
1686 defaultDefinePlace = "checked"
1687 defaultInheritPlace = ""
1688 locationName = self._break.getLocation().getName()
1689 locationAddress = self._break.getLocation().getAddress()
1690 if self._break.getOwnRoom() is not None:
1691 defaultDefineRoom= "checked"
1692 defaultInheritRoom = ""
1693 roomName = self._break.getRoom().getName()
1694 bgcolor=self._break.getColor()
1695 textcolor=self._break.getTextColor()
1696 textcolortolinks=""
1697 if self._break.isTextColorToLinks():
1698 textcolortolinks="checked=\"checked\""
1699 schOptions= _("""&nbsp;<input type="checkbox" name="moveEntries" value="1"> _("reschedule entries after this time")""")
1700 else:
1701 wpTitle = "Create new break"
1702 title, description = "break", ""
1703 refDate=self._sch.getFirstFreeSlotOnDay(self._targetDay)
1704 day = refDate.day
1705 month = refDate.month
1706 year = refDate.year
1707 sHour = refDate.hour
1708 sMinute = refDate.minute
1709 durHours, durMinutes = 0, 15
1710 bgcolor="#90C0F0"
1711 textcolor="#777777"
1712 schOptions=""
1713 textcolortolinks=False
1714 vars["defaultInheritPlace"] = defaultInheritPlace
1715 vars["defaultDefinePlace"] = defaultDefinePlace
1716 vars["ownerPlace"] = ""
1717 owner = self._sch.getOwner()
1718 vars["ownerType"]="conference"
1719 if isinstance(owner, conference.SessionSlot):
1720 vars["ownerType"]="session"
1721 ownerLocation = owner.getLocation()
1722 if ownerLocation:
1723 vars["ownerPlace"] = ownerLocation.getName()
1724 vars["locationName"] = quoteattr(str(locationName))
1725 vars["locationAddress"] = locationAddress
1726 vars["defaultInheritRoom"] = defaultInheritRoom
1727 vars["defaultDefineRoom"] = defaultDefineRoom
1728 vars["ownerRoom"] = ""
1729 ownerRoom =owner.getRoom()
1730 if ownerRoom:
1731 vars["ownerRoom"] = ownerRoom.getName()
1732 vars["roomName"] = quoteattr(str(roomName))
1734 vars["WPtitle"]=wpTitle
1735 vars["title"]=quoteattr(str(title))
1736 vars["description"]=self.htmlText(description)
1737 vars["sDay"]=str(day)
1738 vars["sMonth"]=str(month)
1739 vars["sYear"]=str(year)
1740 vars["sHour"]=str(sHour)
1741 vars["sMinute"]=str(sMinute)
1742 vars["durationHours"]=quoteattr(str(durHours))
1743 vars["durationMinutes"]=quoteattr(str(durMinutes))
1744 vars["postURL"]=quoteattr(str(vars["postURL"]))
1745 vars["colorChartIcon"]=Config.getInstance().getSystemIconURL("colorchart")
1746 urlbg=urlHandlers.UHSimpleColorChart.getURL()
1747 urlbg.addParam("colorCodeTarget", "backgroundColor")
1748 urlbg.addParam("colorPreviewTarget", "backgroundColorpreview")
1749 vars["bgcolorChartURL"]=urlbg
1750 vars["bgcolor"] = bgcolor
1751 urltext=urlHandlers.UHSimpleColorChart.getURL()
1752 urltext.addParam("colorCodeTarget", "textColor")
1753 urltext.addParam("colorPreviewTarget", "textColorpreview")
1754 vars["textcolorChartURL"]=urltext
1755 vars["textcolor"] = textcolor
1756 vars["textColorToLinks"] = textcolortolinks
1757 vars["calendarIconURL"]=Config.getInstance().getSystemIconURL( "calendar" )
1758 vars["calendarSelectURL"]=urlHandlers.UHSimpleCalendar.getURL()
1759 vars["schOptions"]=schOptions
1760 vars["autoUpdate"]=""
1761 import MaKaC.webinterface.webFactoryRegistry as webFactoryRegistry
1762 wr = webFactoryRegistry.WebFactoryRegistry()
1763 wf = wr.getFactory(self._conf)
1764 if wf != None:
1765 type = wf.getId()
1766 else:
1767 type = "conference"
1768 if type == "conference":
1769 vars["Colors"]=WSessionModEditDataColors().getHTML(vars)
1770 else:
1771 vars["Colors"]=""
1772 vars["conference"] = self._conf
1773 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
1774 vars["useRoomBookingModule"] = minfo.getRoomBookingModuleActive()
1776 vars['rbActive'] = info.HelperMaKaCInfo.getMaKaCInfoInstance().getRoomBookingModuleActive()
1777 return vars
1780 class WMaterialTable( WTemplated ):
1781 # Deprecated - used in old file management scheme
1783 def __init__(self, matOwner, registry = None ):
1784 self._owner = matOwner
1785 self._fr = registry
1787 def _getAdditionalMaterialItems( self ):
1788 l = []
1789 for mat in self._owner.getMaterialList():
1790 l.append("""
1791 <tr>
1792 <td>
1793 <table cellpadding="1" cellspacing="1">
1794 <tr>
1795 <td align="left">
1796 <input type="checkbox" name="deleteMaterial" value="%s">
1797 </td>
1798 <td align="left">
1799 <img src="%s" style="vertical-align:middle" alt="">
1800 </td>
1801 <td align="left">&nbsp;</td>
1802 <td align="left" width="100%%">
1803 <a href="%s">%s</a>
1804 </td>
1805 </tr>
1806 </table>
1807 </td>
1808 </tr>
1809 """%(mat.getId(), Config.getInstance().getSystemIconURL("material"), self._modifyURLGen( mat ), mat.getTitle() ) )
1810 return "".join(l)
1812 def _getSpecialMaterialItems( self ):
1813 if not self._fr:
1814 return ""
1815 l = []
1816 for factory in self._fr.getList():
1817 if factory.canDelete( self._owner ):
1818 icon = ""
1819 if factory.getIconURL():
1820 icon = """<img src="%s" style="vertical-align:middle" alt="">"""%factory.getIconURL()
1821 mat = factory.get( self._owner )
1822 l.append(""" <tr>
1823 <td valing="bottom">
1824 <table cellpadding="1" cellspacing="1">
1825 <tr>
1826 <td align="left">
1827 <input type="checkbox" name="deleteMaterial" value="%s">
1828 </td>
1829 <td align="left">
1831 </td>
1832 <td align="left">&nbsp;</td>
1833 <td align="left" width="100%%">
1834 <a href="%s">%s</a>
1835 </td>
1836 </tr>
1837 </table>
1838 </td>
1839 </tr>
1840 """%(factory.getId(), icon, factory.getModificationURL( mat ), mat.getTitle()))
1841 return "".join(l)
1843 def getHTML( self, addURL, removeURL, modifyURLGen ):
1844 self._modifyURLGen = modifyURLGen
1845 params={"addURL": addURL, "deleteURL": removeURL}
1847 hiddenParams = self._owner.getLocator().getWebForm()
1849 return WTemplated.getHTML( self, params )
1851 def getVars( self ):
1852 vars = WTemplated.getVars( self )
1853 vars["items"] = "%s%s"%(self._getSpecialMaterialItems(), \
1854 self._getAdditionalMaterialItems())
1855 vars["locator"] = self._owner.getLocator().getWebForm()
1856 l = []
1857 if self._fr:
1858 for factory in self._fr.getList():
1859 if factory.canAdd( self._owner ):
1860 l.append("""<option value="%s">%s</option>"""%(\
1861 factory.getId(), factory.getTitle()))
1862 vars["matTypesSelectItems"] = "".join(l)
1863 return vars
1866 class WAccessControlFrame(WTemplated):
1868 def getHTML( self, target, setVisibilityURL, type ):
1869 self.__target = target
1871 params = { "setPrivacyURL": setVisibilityURL,\
1872 "target": target,\
1873 "type": type }
1874 return WTemplated.getHTML( self, params )
1876 def getVars( self ):
1877 vars = WTemplated.getVars( self )
1879 if self.__target.getAccessProtectionLevel() == -1:
1880 vars["privacy"] = "PUBLIC"
1881 vars["statusColor"] = "#128F33"
1882 elif self.__target.isItselfProtected():
1883 vars["privacy"] = "PRIVATE"
1884 vars["statusColor"] = "#B02B2C"
1885 else :
1886 vars["privacy"] = "INHERITING"
1887 vars["statusColor"] = "#444444"
1889 vars["isFullyPublic"] = None
1891 if not isinstance(self.__target, Category) :
1892 vars["isFullyPublic"] = self.__target.isFullyPublic()
1894 if isinstance(self.__target, Category) and self.__target.isRoot():
1895 vars["parentName"] = vars["parentPrivacy"] = vars["parentStatusColor"] = ''
1896 else :
1897 vars["parentName"] = self.__target.getOwner().getTitle()
1899 if self.__target.hasProtectedOwner():
1900 vars["parentPrivacy"] = "PRIVATE"
1901 vars["parentStatusColor"] = "#B02B2C"
1902 else :
1903 vars["parentPrivacy"] = "PUBLIC"
1904 vars["parentStatusColor"] = "#128F33"
1906 vars["locator"] = self.__target.getLocator().getWebForm()
1908 return vars
1911 class WConfAccessControlFrame(WTemplated):
1913 def getHTML( self, target, setVisibilityURL, setAccessKeyURL):
1914 self.__target = target
1915 params = { "target": target,\
1916 "setPrivacyURL": setVisibilityURL,\
1917 "setAccessKeyURL": setAccessKeyURL,\
1918 "type": "Event" }
1919 return WTemplated.getHTML( self, params )
1921 def getVars( self ):
1922 vars = WTemplated.getVars( self )
1924 if self.__target.getAccessProtectionLevel() == -1:
1925 vars["privacy"] = "PUBLIC"
1926 vars["statusColor"] = "#128F33"
1927 elif self.__target.isItselfProtected():
1928 vars["privacy"] = "PRIVATE"
1929 vars["statusColor"] = "#B02B2C"
1930 else :
1931 vars["privacy"] = "INHERITING"
1932 vars["statusColor"] = "#444444"
1934 vars["isFullyPublic"] = self.__target.isFullyPublic()
1935 vars["parentName"] = self.__target.getOwner().getName()
1937 if self.__target.hasProtectedOwner():
1938 vars["parentPrivacy"] = "PRIVATE"
1939 vars["parentStatusColor"] = "#B02B2C"
1940 else :
1941 vars["parentPrivacy"] = "PUBLIC"
1942 vars["parentStatusColor"] = "#128F33"
1944 vars["locator"] = self.__target.getLocator().getWebForm()
1945 vars["accessKey"] = self.__target.getAccessKey()
1947 return vars
1950 class WUserTableItem(WTemplated):
1952 def __init__(self, multi=True):
1953 self._multi = multi
1955 def getHTML( self, user, selected=False, selectable=True, parentPrincipalTableId=None ):
1956 self.__user = user
1957 self._selected = selected
1958 self._selectable = selectable
1959 self._parentPrincipalTableId = parentPrincipalTableId
1960 return WTemplated.getHTML( self, {} )
1962 def getVars( self ):
1963 vars = WTemplated.getVars( self )
1965 vars["ParentPrincipalTableId"] = self._parentPrincipalTableId
1967 vars["avatar"] = fossilize(self.__user, IAvatarFossil)
1969 vars["id"] = self.__user.getId()
1970 vars["email"] = self.__user.getEmail()
1971 vars["fullName"] = self.__user.getFullName()
1973 vars["selectable"] = self._selectable
1974 vars["inputType"] = "checkbox"
1975 selectionText = "checked"
1976 if not self._multi:
1977 vars["inputType"] = "radio"
1978 selectionText = "selected"
1979 vars["selected"] = ""
1980 if self._selected:
1981 vars["selected"] = selectionText
1983 if self._rh._getUser():
1984 vars["currentUserBasket"] = self._rh._getUser().getPersonalInfo().getBasket()
1985 else:
1986 vars["currentUserBasket"] = None
1988 return vars
1990 class WPendingUserTableItem(WTemplated):
1992 def getHTML( self, email, selectable=True ):
1993 self.email = email
1994 self._selectable = selectable
1995 return WTemplated.getHTML( self, {} )
1997 def getVars( self ):
1998 vars = WTemplated.getVars( self )
1999 vars["email"] = self.email
2000 vars["selectable"] = self._selectable
2002 return vars
2004 class WGroupTableItem(WTemplated):
2006 def __init__(self, multi=True):
2007 self._multi = multi
2009 def getHTML( self, group, selected=False, selectable=True ):
2010 self.__group = group
2011 self._selected = selected
2012 self._selectable = selectable
2013 return WTemplated.getHTML( self, {} )
2015 def getVars( self ):
2016 vars = WTemplated.getVars( self )
2017 vars["groupImg"] = Configuration.Config.getInstance().getSystemIconURL("group")
2018 vars["id"] = self.__group.getId()
2019 vars["fullName"] = self.__group.getName()
2020 vars["type"] = "checkbox"
2021 selectionText = "checked"
2022 if not self._multi:
2023 vars["type"] = "radio"
2024 selectionText = "selected"
2025 vars["selected"] = ""
2026 if self._selected:
2027 vars["selected"] = selectionText
2028 vars["selectable"] = self._selectable
2029 return vars
2031 class WGroupNICETableItem(WTemplated):
2033 def __init__(self, multi=True):
2034 self._multi = multi
2036 def getHTML( self, group, selected=False, selectable=True ):
2037 self.__group = group
2038 self._selected = selected
2039 self._selectable = selectable
2040 return WTemplated.getHTML( self, {} )
2042 def getVars( self ):
2043 vars = WTemplated.getVars( self )
2044 vars["id"] = self.__group.getId()
2045 vars["fullName"] = self.__group.getName()
2046 vars["type"] = "checkbox"
2047 selectionText = "checked"
2048 if not self._multi:
2049 vars["type"] = "radio"
2050 selectionText = "selected"
2051 vars["selected"] = ""
2052 if self._selected:
2053 vars["selected"] = selectionText
2054 vars["selectable"] = self._selectable
2055 return vars
2057 class WAuthorTableItem(WTemplated):
2059 def __init__(self, multi=False):
2060 self._multi = multi
2062 def getHTML( self, author, selected=False ):
2063 self.__author = author
2064 self._selected = selected
2065 return WTemplated.getHTML( self, {} )
2067 def getVars( self ):
2068 vars = WTemplated.getVars( self )
2069 vars["id"] = "*author*:%s"%conference.AuthorIndex()._getKey(self.__author)
2070 vars["fullName"] = self.__author.getFullName()
2071 vars["type"] = "checkbox"
2072 selectionText = "checked"
2073 if not self._multi:
2074 vars["type"] = "radio"
2075 selectionText = "selected"
2076 vars["selected"] = ""
2077 if self._selected:
2078 vars["selected"] = selectionText
2079 return vars
2082 class WPrincipalTable(WTemplated):
2084 def __init__(self):
2085 WTemplated.__init__(self)
2086 if not ContextManager.has("principalTableCounter"):
2087 ContextManager.set("principalTableCounter", 0)
2088 self._principalTableId = ContextManager.get("principalTableCounter")
2089 ContextManager.set("principalTableCounter", self._principalTableId + 1)
2091 def getHTML( self, principalList, target, addPrincipalsURL, removePrincipalsURL, pendings=[], selectable=True ):
2092 self.__principalList = principalList
2093 self.__principalList.sort(utils.sortPrincipalsByName)
2094 self.__pendings = pendings
2095 self.__target = target
2096 self.__selectable = selectable;
2097 return WTemplated.getHTML( self, {"addPrincipalsURL": addPrincipalsURL,\
2098 "removePrincipalsURL": removePrincipalsURL } )
2100 def getVars( self ):
2101 vars = WTemplated.getVars( self )
2102 vars["locator"] = ""
2103 if self.__target:
2104 vars["locator"] = self.__target.getLocator().getWebForm()
2105 ul = []
2106 selected = False
2107 if len(self.__principalList) == 1:
2108 selected = True
2109 for principal in self.__principalList:
2110 if isinstance(principal, user.Avatar):
2111 ul.append( WUserTableItem().getHTML( principal, selected, self.__selectable, self._principalTableId ) )
2112 elif isinstance(principal, user.CERNGroup):
2113 ul.append( WGroupNICETableItem().getHTML( principal, selected, self.__selectable ) )
2114 elif isinstance(principal, user.Group):
2115 ul.append( WGroupTableItem().getHTML( principal, selected, self.__selectable ) )
2116 for email in self.__pendings:
2117 ul.append(WPendingUserTableItem().getHTML(email, self.__selectable))
2118 vars["userItems"] = "".join( ul )
2119 return vars
2122 class WModificationControlFrame(WTemplated):
2124 def getHTML( self, target, addManagersURL, removeManagersURL ):
2125 self.__target = target
2126 params = { "addManagersURL": addManagersURL, \
2127 "removeManagersURL": removeManagersURL }
2128 return WTemplated.getHTML( self, params )
2130 def getVars( self ):
2131 vars = WTemplated.getVars( self )
2132 vars["locator"] = self.__target.getLocator().getWebForm()
2133 vars["principalTable"] = WPrincipalTable().getHTML( self.__target.getManagerList(),
2134 self.__target,vars["addManagersURL"],
2135 vars["removeManagersURL"],
2136 pendings=self.__target.getAccessController().getModificationEmail(),
2137 selectable=False)
2139 return vars
2142 class WConfModificationControlFrame(WTemplated):
2144 def getHTML( self, target, addManagersURL, removeManagersURL, setModifKeyURL ):
2145 self.__target = target
2146 params = { "addManagersURL": addManagersURL, \
2147 "removeManagersURL": removeManagersURL, \
2148 "setModifKeyURL": setModifKeyURL,
2149 "target": target }
2150 return WTemplated.getHTML( self, params )
2152 def getVars( self ):
2153 vars = WTemplated.getVars( self )
2154 vars["locator"] = self.__target.getLocator().getWebForm()
2155 vars["principalTable"] = WPrincipalTable().getHTML( self.__target.getManagerList(),
2156 self.__target, vars["addManagersURL"],
2157 vars["removeManagersURL"],
2158 pendings=self.__target.getAccessController().getModificationEmail(),
2159 selectable=False)
2160 vars["modifKey"] = self.__target.getModifKey()
2161 return vars
2163 class WConfRegistrarsControlFrame(WTemplated):
2165 def getHTML(self, target, addRegistrarURL, removeRegistrarURL):
2166 self.__target = target
2167 params = {
2168 "addRegistrarURL": addRegistrarURL,
2169 "removeRegistrarURL": removeRegistrarURL
2171 return WTemplated.getHTML( self, params )
2173 def getVars( self ):
2174 vars = WTemplated.getVars( self )
2175 vars["principalTable"] = WPrincipalTable().getHTML( self.__target.getRegistrarList(), self.__target, vars["addRegistrarURL"], vars["removeRegistrarURL"], selectable=False)
2176 return vars
2179 class WAlarmFrame(WTemplated):
2181 def getHTML( self, target, addAlarmURL, deleteAlarmURL, modifyAlarmURL ):
2182 self.__target = target
2183 self._deleteAlarmURL = deleteAlarmURL
2184 self._modifyAlarmURL = modifyAlarmURL
2185 params = { "addAlarmURL": addAlarmURL, \
2186 "deleteAlarmURL": deleteAlarmURL, \
2187 "modifyAlarmURL": modifyAlarmURL
2189 return WTemplated.getHTML( self, params )
2191 def getVars( self ):
2192 vars = WTemplated.getVars( self )
2193 vars["locator"] = self.__target.getLocator().getWebForm()
2194 dtFormat = "%Y-%m-%d %H:%M"
2196 stri = ""
2197 for al in self.__target.getAlarmList():
2198 confTZ = timezone(self.__target.getTimezone())
2199 dateStart = al.getStartOn().astimezone(confTZ)
2201 addr = ""
2202 if len(al.getToAddrList()) > 0 :
2203 addr = " <br> ".join(al.getToAddrList()) + " <br> "
2204 for user in al.getToUserList():
2205 addr = addr + user.getEmail() + " <br> "
2207 if al.getToAllParticipants() :
2208 addr = "to all participants"
2209 if al.getEndedOn() != None:
2210 sent = " (Sent the %s)" % \
2211 al.getStartedOn().astimezone(confTZ).strftime(dtFormat)
2212 isSent = True
2213 else:
2214 sent = ""
2215 isSent = False
2216 sd = ""
2217 if al.getTimeBefore() is not None:
2218 tb = al.getTimeBefore()
2219 d = tb.days
2220 if d < 0:
2221 sd = dateStart.strftime(dtFormat)
2222 elif d != 0:
2223 sd = "D-%s (%s)" % (d,dateStart.strftime(dtFormat))
2224 else:
2225 sd = "H-%s (%s)" % (tb.seconds/3600,dateStart.strftime(dtFormat))
2226 elif dateStart is not None:
2227 sd = dateStart.strftime(dtFormat)
2228 else:
2229 sd = "not set"
2231 # if the alarm is already assigned to a task
2232 if al.getId():
2233 if isSent:
2234 # if it was sent, show no link
2235 link = '%s' % al.getSubject()
2236 else:
2237 # if it was not yet send, show a link
2238 link = '<a href=\"%s\">%s</a>' % \
2239 (str(self._modifyAlarmURL) + "?" + al.getLocator().getURLForm(), al.getSubject())
2240 delete = '<a href=\"%s\">%s</a>' % (str(self._deleteAlarmURL) + "?" + al.getLocator().getURLForm(), _("Delete"))
2241 else:
2242 link = '%s' % al.getSubject()
2243 delete = ''
2244 stri = stri + _("""<tr> <td nowrap>%s</td> <td width=\"60%%\">%s%s</td> <td nowrap>%s</td> <td align=\"center\">%s</td> </tr>""") % \
2245 (sd, link, sent, addr, delete)
2246 vars["alarms"] = stri
2247 #vars["timezone"] = info.HelperMaKaCInfo.getMaKaCInfoInstance().getTimezone()
2248 vars["timezone"] = self.__target.getTimezone()
2249 return vars
2251 class WConfProtectionToolsFrame(WTemplated):
2253 def __init__( self, target ):
2254 self._target = target
2256 def getVars( self ):
2257 vars = WTemplated.getVars( self )
2258 vars["grantSubmissionToAllSpeakersURL"] = str(urlHandlers.UHConfGrantSubmissionToAllSpeakers.getURL(self._target))
2259 vars["removeAllSubmissionRightsURL"] = str(urlHandlers.UHConfRemoveAllSubmissionRights.getURL(self._target))
2260 vars["grantModificationToAllConvenersURL"] = str(urlHandlers.UHConfGrantModificationToAllConveners.getURL(self._target))
2261 return vars
2263 class WDomainControlFrame(WTemplated):
2265 def __init__( self, target ):
2266 self._target = target
2268 def getHTML(self, addURL, removeURL):
2269 self._addURL = addURL
2270 self._removeURL = removeURL
2271 return WTemplated.getHTML( self )
2273 def getVars( self ):
2274 vars = WTemplated.getVars( self )
2275 l = []
2276 for dom in self._target.getDomainList():
2277 l.append("""<input type="checkbox" name="selectedDomain" value="%s"> %s"""%(dom.getId(), dom.getName()))
2278 vars["domains"] = "<br>".join(l)
2279 l = []
2280 for dom in domain.DomainHolder().getList():
2281 if dom not in self._target.getDomainList():
2282 l.append("""<option value="%s">%s</option>"""%(dom.getId(), dom.getName()))
2283 vars["domainsToAdd"] = "".join(l)
2284 vars["removeURL"] = self._removeURL
2285 vars["addURL"] = self._addURL
2286 vars["locator"] = self._target.getLocator().getWebForm()
2287 return vars
2290 class WMaterialDataModificationBase(WTemplated):
2292 def __init__( self, material ):
2293 self._material = material
2294 self._owner = material.getOwner()
2296 def _setMaterialValues( self, material, materialData ):
2297 material.setTitle( materialData["title"] )
2298 material.setDescription( materialData["description"] )
2299 if "type" in materialData:
2300 material.setType( materialData["type"] )
2302 def _getTypesSelectItems( self, default = "misc" ):
2303 definedTypes = ["misc"]
2304 l = []
2305 for type in definedTypes:
2306 default = ""
2307 if type == default:
2308 default = "default"
2309 l.append("""<option value="%s" %s>%s</option>"""%( type, default, type ))
2310 return "".join( l )
2314 class WMaterialCreation(WMaterialDataModificationBase):
2316 def __init__( self, owner):
2317 self._owner = owner
2320 def getVars( self ):
2321 vars = WMaterialDataModificationBase.getVars( self )
2322 vars["title"] = ""
2323 vars["description"] = ""
2324 vars["types"] = self._getTypesSelectItems()
2325 vars["locator"] = self._owner.getLocator().getWebForm()
2326 return vars
2328 def create( self, materialData ):
2329 m = conference.Material()
2330 self._setMaterialValues( m, materialData )
2331 self._owner.addMaterial( m )
2332 return m
2334 class WInlineContextHelp(WTemplated):
2336 def __init__(self, content):
2337 self._content = content
2339 def getVars( self ):
2340 vars = WTemplated.getVars( self )
2341 vars["helpContent"] = self._content
2342 vars["imgSrc"] = Config.getInstance().getSystemIconURL( "help" )
2343 return vars
2345 #class WPaperDataModification( WMaterialDataModification ):
2346 # pass
2348 #class WMaterialModification( WTemplated ):
2350 # def __init__( self, material ):
2351 # self._material = material
2352 # self.__conf = material.getConference()
2353 # self.__session = material.getSession()
2354 # self.__contrib = material.getContribution()
2356 # def getVars( self ):
2357 # vars = WTemplated.getVars( self )
2358 # vars["locator"] = self._material.getLocator().getWebForm()
2359 # vars["confTitle"] = self.__conf.getTitle()
2360 # vars["sessionTitle"] = ""
2361 # if self.__session != None:
2362 # vars["sessionTitle"] = self.__session.getTitle()
2363 # vars["contributionTitle"] = ""
2364 # if self.__contrib != None:
2365 # vars["contributionTitle"] = self.__contrib.getTitle()
2366 # vars["title"] = self._material.getTitle()
2367 # vars["description"] = self._material.getDescription()
2368 # vars["type"] = self._material.getType()
2369 # l = []
2370 # for res in self._material.getResourceList():
2371 # if res.__class__ is conference.LocalFile:
2372 # l.append( """<li><input type="checkbox" name="removeResources" value="%s"><small>[%s]</small> <b><a href="%s">%s</a></b> (%s) - <small>%s bytes</small></li>"""%(res.getId(), res.getFileType(), vars["modifyFileURLGen"](res), res.getName(), res.getFileName(), strfFileSize( res.getSize() )))
2373 # elif res.__class__ is conference.Link:
2374 # l.append( """<li><input type="checkbox" name="removeResources" value="%s"><b><a href="%s">%s</a></b> (%s)</li>"""%(res.getId(), vars["modifyLinkURLGen"](res), res.getName(), res.getURL()))
2375 # vars["resources"] = "<ol>%s</ol>"%"".join( l )
2376 # vars["accessControlFrame"] = WAccessControlFrame().getHTML(\
2377 # self._material,\
2378 # vars["setVisibilityURL"],\
2379 # vars["addAllowedURL"],\
2380 # vars["removeAllowedURL"] )
2381 # if not self._material.isProtected():
2382 # df = WDomainControlFrame( self._material )
2383 # vars["accessControlFrame"] += "<br>%s"%df.getHTML( \
2384 # vars["addDomainURL"], \
2385 # vars["removeDomainURL"] )
2386 # return vars
2389 #class WResourceSubmission(WTemplated):
2391 # def _setObjects( self, confId, sessionId, contribId, materialId ):
2392 # ch = conference.ConferenceHolder()
2393 # self._conf = ch.getById( confId )
2394 # self._session = self._contrib = self._material = None
2395 # self._matParent = self._conf
2396 # if sessionId != None and sessionId != "":
2397 # self._session = self._conf.getSessionById( sessionId )
2398 # self._matParent = self._session
2399 # if contribId != None and contribId != "":
2400 # self._contrib = self._session.getContributionById( contribId )
2401 # self._matParent = self._contrib
2402 # elif contribId != None and contribId != "":
2403 # self._contrib = self._conf.getContributionById( contribId )
2404 # self._matParent = self._contrib
2405 # if materialId != None and materialId != "":
2406 # self._material = self._matParent.getMaterialById( materialId )
2408 # def getHTML( self, confId, sessionId, contribId, materialId, params ):
2409 # self._setObjects( confId, sessionId, contribId, materialId )
2410 # str = """
2411 # <form action="%s" method="POST" enctype="multipart/form-data">
2412 # <input type="hidden" name="confId" value="%s">
2413 # <input type="hidden" name="sessionId" value="%s">
2414 # <input type="hidden" name="contribId" value="%s">
2415 # <input type="hidden" name="materialId" value="%s">
2416 # %s
2417 # </form>
2418 # """%(params["postURL"], confId, sessionId, contribId, \
2419 # materialId, WTemplated.getHTML( self, params ) )
2420 # return str
2423 #class WFileSubmission(WTemplated):
2425 # def __init__(self, material):
2426 # self.__material = material
2428 # def getHTML( self, params ):
2429 # str = """
2430 # <form action="%s" method="POST" enctype="multipart/form-data">
2431 # %s
2432 # %s
2433 # </form>
2434 # """%(params["postURL"], \
2435 # self.__material.getLocator().getWebForm(),\
2436 # WTemplated.getHTML( self, params ) )
2437 # return str
2439 # def submit( self, params ):
2440 # f = conference.LocalFile()
2441 # f.setName( params["title"] )
2442 # f.setDescription( params["description"] )
2443 # f.setFileName( params["fileName"] )
2444 # f.setFilePath( params["filePath"] )
2445 # self.__material.addResource( f )
2446 # return "[done]"
2449 #class WLinkSubmission(WResourceSubmission):
2451 # def __init__(self, material):
2452 # self.__material = material
2454 # def getHTML( self, params ):
2455 # str = """
2456 # <form action="%s" method="POST" enctype="multipart/form-data">
2457 # %s
2458 # %s
2459 # </form>
2460 # """%(params["postURL"], \
2461 # self.__material.getLocator().getWebForm(),\
2462 # WTemplated.getHTML( self, params ) )
2463 # return str
2465 # def submit( self, params ):
2466 # l = conference.Link()
2467 # l.setName( params["title"] )
2468 # l.setDescription( params["description"] )
2469 # l.setURL( params["url"] )
2470 # self.__material.addResource( l )
2471 # return "[done]"
2474 class WResourceModification(WTemplated):
2476 def __init__( self, resource ):
2477 self._resource = resource
2478 self._conf = resource.getConference()
2479 self._session = resource.getSession()
2480 self._contrib = resource.getContribution()
2481 self._material = resource.getOwner()
2483 def getVars( self ):
2484 vars = WTemplated.getVars( self )
2485 vars["confTitle"] = self._conf.getTitle()
2486 vars["sessionTitle"] = ""
2487 if self._session != None:
2488 vars["sessionTitle"] = self._session.getTitle()
2489 vars["contributionTitle"] = ""
2490 if self._contrib != None:
2491 vars["contributionTitle"] = self._contrib.getTitle()
2492 vars["materialTitle"] = self._material.getTitle()
2493 vars["title"] = self._resource.getName()
2494 vars["description"] = self._resource.getDescription()
2495 vars["accessControlFrame"] = WAccessControlFrame().getHTML(\
2496 self._resource,\
2497 vars["setVisibilityURL"],\
2498 vars["addAllowedURL"],\
2499 vars["removeAllowedURL"],\
2500 vars["setAccessKeyURL"], \
2501 vars["setModifKeyURL"] )
2502 return vars
2505 class WResourceDataModification(WResourceModification):
2507 def getHTML(self, params):
2508 str = """
2509 <form action="%s" method="POST" enctype="multipart/form-data">
2512 </form>
2513 """%(params["postURL"],\
2514 self._resource.getLocator().getWebForm(),\
2515 WTemplated.getHTML( self, params ) )
2516 return str
2518 def getVars( self ):
2519 vars = WTemplated.getVars( self )
2520 vars["title"] = self._resource.getName()
2521 vars["description"] = self._resource.getDescription()
2522 return vars
2525 class WUserRegistration(WTemplated):
2527 def __init__( self, av = None ):
2528 self._avatar = av
2530 def __defineNewUserVars( self, vars={} ):
2531 vars["Wtitle"] = _("Creating a new Indico user")
2532 vars["name"] = quoteattr( vars.get("name","") )
2533 vars["surName"] = quoteattr( vars.get("surName","") )
2534 vars["organisation"] = quoteattr( vars.get("organisation","") )
2535 vars["address"] = vars.get("address","")
2536 vars["email"] = quoteattr( vars.get("email","") )
2537 vars["telephone"] = quoteattr( vars.get("telephone","") )
2538 vars["fax"] = quoteattr( vars.get("fax","") )
2539 vars["login"] = quoteattr( vars.get("login","") )
2540 return vars
2542 def __defineExistingUserVars( self, vars={} ):
2543 u = self._avatar
2544 vars["Wtitle"] = _("Modifying an Indico user")
2545 vars["name"] = quoteattr( u.getName() )
2546 vars["surName"] = quoteattr( u.getSurName() )
2547 vars["title"] = quoteattr( u.getTitle() )
2548 vars["organisation"] = quoteattr( u.getOrganisations()[0] )
2549 vars["address"] = u.getAddresses()[0]
2550 vars["email"] = quoteattr( u.getEmails()[0] )
2551 vars["telephone"] = quoteattr( u.getTelephones()[0] )
2552 vars["fax"] = quoteattr( u.getFaxes()[0] )
2553 return vars
2555 def getVars( self ):
2556 vars = WTemplated.getVars( self )
2557 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
2558 vars["after"] = _("After the submission of your personal data, an email will be sent to you")+".<br>"+ _("You will able to use your account only after you activate it by clicking on the link inside the email.")
2559 if minfo.getModerateAccountCreation():
2560 vars["after"] = _("The site manager has to accept your account creation request. You will be informed of the decision by email.")+"<br>"
2561 vars["postURL"] = quoteattr( str( vars["postURL"] ) )
2562 if not self._avatar:
2563 vars = self.__defineNewUserVars( vars )
2564 vars["locator"] = ""
2565 else:
2566 vars = self.__defineExistingUserVars( vars )
2567 vars["locator"] = self._avatar.getLocator().getWebForm()
2569 #note: there's a reason this line is TitlesRegistry() and not just TitlesRegistry
2570 #methods in TitlesRegistry cannot be classmethods because _items cannot be a class
2571 #attribute because the i18n '_' function doesn't work for class attributes
2572 vars["titleOptions"]=TitlesRegistry().getSelectItemsHTML(vars.get("title",""))
2573 tz = minfo.getTimezone()
2574 if vars.get("defaultTZ","") != "":
2575 tz = vars.get("defaultTZ")
2576 tzmode = "Event Timezone"
2577 if vars.get("displayTZMode","") != "":
2578 tzmode = vars.get("displayTZMode")
2579 vars["timezoneOptions"]=TimezoneRegistry.getShortSelectItemsHTML(tz)
2580 vars["displayTZModeOptions"]=DisplayTimezoneRegistry.getSelectItemsHTML(tzmode)
2581 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
2582 if vars.get("defaultLang","") == "":
2583 vars["defaultLang"] = minfo.getLang()
2584 return vars
2587 class WUserCreated(WTemplated):
2589 def __init__( self, av = None ):
2590 self._avatar = av
2592 def getVars( self ):
2593 vars = WTemplated.getVars( self )
2594 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
2595 vars["however"] = _("However, you will not be able to log into the system until you have activated your new account. To do this please follow the instructions in the mail that we have already sent you")+".<br>"
2596 if minfo.getModerateAccountCreation():
2597 vars["however"] = _("However, you will not be able to log into the system until the site administrator has accepted your account creation request. You will be notified of the decision by email")+".<br>"
2598 vars["signInURL"] = quoteattr( str( vars["signInURL"] ) )
2599 vars["supportAddr"] = info.HelperMaKaCInfo.getMaKaCInfoInstance().getSupportEmail()
2600 return vars
2603 class WUserSendIdentity(WTemplated):
2605 def __init__( self, av = None ):
2606 self._avatar = av
2608 def getVars( self ):
2609 vars = WTemplated.getVars( self )
2610 vars["locator"] = self._avatar.getLocator().getWebForm()
2611 vars["name"] = self._avatar.getName()
2612 vars["surName"] = self._avatar.getSurName()
2613 vars["email"] = self._avatar.getEmail()
2614 vars["org"] = self._avatar.getOrganisation()
2615 vars["title"] = self._avatar.getTitle()
2616 vars["address"] = self._avatar.getAddresses()[0]
2617 vars["contactEmail"] = info.HelperMaKaCInfo.getMaKaCInfoInstance().getSupportEmail()
2618 return vars
2621 class WUserSearchResultsTable( WTemplated ):
2623 def __init__(self, multi=True):
2624 self._multi = multi
2626 def __getItemClass( self, principal ):
2627 if principal.__class__.__name__ == "Avatar":
2628 return WUserTableItem
2629 elif isinstance(principal, user.CERNGroup):
2630 return WGroupNICETableItem
2631 elif isinstance(principal, user.Group):
2632 return WGroupTableItem
2633 elif isinstance(principal,conference.ContributionParticipation):
2634 return WAuthorTableItem
2635 return None
2637 def getHTML( self, resultList ):
2638 self.__resultList = resultList
2639 self.__resultList.sort(utils.sortPrincipalsByName)
2640 return WTemplated.getHTML( self, {} )
2642 def getVars( self ):
2643 vars = WTemplated.getVars( self )
2644 l = []
2645 selected = False
2646 if len(self.__resultList) == 1:
2647 selected = True
2648 for principal in self.__resultList:
2649 l.append( self.__getItemClass(principal)(self._multi).getHTML( principal, selected ) )
2650 if l:
2651 vars["usersFound"] = "".join( l )
2652 else:
2653 vars["usersFound"] = _(""""<br><span class=\"blacktext\">&nbsp;&nbsp;&nbsp; _("No results for this search")</span>""")
2654 vars["nbResults"] = len(self.__resultList)
2655 return vars
2658 class WSignIn(WTemplated):
2660 def getVars( self ):
2661 vars = WTemplated.getVars( self )
2662 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
2663 vars["postURL"] = quoteattr( str( vars.get( "postURL", "" ) ) )
2664 vars["returnURL"] = quoteattr( str( vars.get( "returnURL", "" ) ) )
2665 vars["forgotPasswordURL"] = quoteattr( str( vars.get( "forgotPassordURL", "" ) ) )
2666 vars["login"] = quoteattr( vars.get( "login", "" ) )
2667 vars["msg"] = self.htmlText( vars.get( "msg" ) )
2668 imgIcon=Configuration.Config.getInstance().getSystemIconURL("currentMenuItem")
2669 if Configuration.Config.getInstance().getLoginURL().startswith("https"):
2670 imgIcon=imgIcon.replace("http://", "https://")
2671 imgIcon = urlHandlers.setSSLPort( imgIcon )
2672 vars["itemIcon"] = imgIcon
2673 vars["createAccount"] = ""
2674 if minfo.getAuthorisedAccountCreation():
2675 vars["createAccount"] = _("""_("If you don't have an account, you can create one")<a href="%s"> _("here")</a>
2676 """) % (vars["createAccountURL"])
2677 vars["NiceMsg"]=""
2678 if "Nice" in Configuration.Config.getInstance().getAuthenticatorList():
2679 vars["NiceMsg"]= _("Please note you can use your NICE (CERN) account")
2680 return vars
2682 class WConfirmation(WTemplated):
2684 def getHTML( self, message, postURL, passingArgs, **opts):
2685 params = {}
2686 params["message"] = message
2687 params["postURL"] = postURL
2688 pa = []
2689 for arg in passingArgs.keys():
2690 if not type( passingArgs[arg] ) == types.ListType:
2691 passingArgs[arg] = [passingArgs[arg]]
2692 for value in passingArgs[arg]:
2693 pa.append("""<input type="hidden" name="%s" value="%s">"""%( arg, value ))
2694 params["passingArgs"] = "".join(pa)
2695 params["confirmButtonCaption"]=opts.get("confirmButtonCaption", _("OK"))
2696 params["cancelButtonCaption"]=opts.get("cancelButtonCaption", _("Cancel"))
2697 params["systemIconWarning"] = Configuration.Config.getInstance().getSystemIconURL( "warning" )
2698 return WTemplated.getHTML( self, params )
2700 class WDisplayConfirmation(WTemplated):
2702 def getHTML( self, message, postURL, passingArgs, **opts):
2703 params = {}
2704 params["message"] = message
2705 params["postURL"] = postURL
2706 pa = []
2707 for arg in passingArgs.keys():
2708 if not type( passingArgs[arg] ) == types.ListType:
2709 passingArgs[arg] = [passingArgs[arg]]
2710 for value in passingArgs[arg]:
2711 pa.append("""<input type="hidden" name="%s" value="%s">"""%( arg, value ))
2712 params["passingArgs"] = "".join(pa)
2713 params["confirmButtonCaption"]=opts.get("confirmButtonCaption", _("OK"))
2714 params["cancelButtonCaption"]=opts.get("cancelButtonCaption", _("Cancel"))
2715 params["systemIconWarning"] = Configuration.Config.getInstance().getSystemIconURL( "warning" )
2716 return WTemplated.getHTML( self, params )
2718 class SideMenu(object):
2719 def __init__(self, userStatus=False):
2720 """ Constructor
2721 userStatus: a boolean that is True if the user is logged in, False otherwise
2723 self._sections = []
2724 self._userStatus = userStatus
2726 def addSection(self, section, top=False):
2727 if top:
2728 self._sections.insert(0, section)
2729 else:
2730 self._sections.append(section)
2732 def getSections(self):
2733 return self._sections
2735 class ManagementSideMenu(SideMenu):
2737 def getHTML(self):
2738 return WSideMenu(self, self._userStatus, type="management").getHTML()
2740 class BasicSideMenu(SideMenu):
2742 def getHTML(self):
2743 return WSideMenu(self, self._userStatus, type="basic").getHTML()
2745 class SideMenuSection:
2746 """ class coment
2749 def __init__(self, title=None, active=False, currentPage = None, visible=True):
2750 """ -title is the words that will be displayed int he side menu.
2751 -active is True if ...
2752 -currentPage stores information about in which page we are seeing the Side Menu. For example,
2753 its values can be "category" or "admin".
2755 self._title = title
2756 self._active = active
2757 self._currentPage = currentPage
2758 self._items = []
2759 self._visible = visible
2761 def getTitle(self):
2762 return self._title
2764 def getItems(self):
2765 return self._items
2767 def addItem(self, item):
2768 self._items.append(item)
2769 item.setSection(self)
2771 def isActive(self):
2772 return self._active
2774 def setActive(self, val):
2775 self._active = val
2777 def checkActive(self):
2779 self._active = False
2781 for item in self._items:
2782 if item.isActive():
2783 self._active = True
2784 break
2786 def getCurrentPage(self):
2787 return self._currentPage
2789 def setCurrentPage(self, currentPage):
2790 self._currentPage = currentPage
2792 def isVisible(self):
2793 return self._visible
2795 def setVisible(self, visible):
2796 self._visible = visible
2798 def hasVisibleItems(self):
2799 for item in self._items:
2800 if item.isVisible():
2801 return True
2802 return False
2804 class SideMenuItem:
2806 def __init__(self, title, url, active=False, enabled=True, errorMessage = "msgNoPermissions", visible=True):
2807 """ errorMessage: one of the error messages in SideMenu.wohl
2809 self._title = title
2810 self._url = url
2811 self._active = active
2812 self._enabled = enabled
2813 self._errorMessage = errorMessage
2814 self._visible = visible
2816 def getTitle(self):
2817 return self._title;
2819 def setSection(self, section):
2820 self._section = section
2822 def getURL(self):
2823 return self._url
2825 def setURL(self, url):
2826 self._url = url
2828 def isActive(self):
2829 return self._active
2831 def isEnabled(self):
2832 return self._enabled
2834 def getErrorMessage(self):
2835 return self._errorMessage
2837 def setActive(self, val=True):
2838 self._active = val
2839 self._section.checkActive()
2841 def setEnabled(self, val):
2842 self._enabled = val
2844 def setErrorMessage(self, val):
2845 self._errorMessage = val
2847 def isVisible(self):
2848 return self._visible
2850 def setVisible(self, visible):
2851 self._visible = visible
2853 class WSideMenu(WTemplated):
2855 def __init__(self, menu, loggedIn, type="basic"):
2857 type can be: basic (display interface) or management (management interface).
2859 self._menu = menu
2860 self._type = type
2862 # is the user logged in? used for changing some tooltips
2863 self._loggedIn = loggedIn
2865 def getVars(self):
2866 vars = WTemplated.getVars(self)
2868 vars['menu'] = self._menu
2869 vars['loggedIn'] = self._loggedIn
2870 vars['sideMenuType'] = self._type
2871 return vars
2873 class WebToolBar(object):
2875 def __init__( self, caption="" ):
2876 self.caption = caption
2877 self.items = []
2878 self.currentItem = None
2880 def getCaption( self ):
2881 return self.caption
2883 def addItem( self, newItem ):
2884 if newItem not in self.items:
2885 self.items.append( newItem )
2886 newItem.setOwner( self )
2888 def removeItem( self, item ):
2889 if item in self.items:
2890 if self.isCurrent( item ):
2891 self.setCurrentItem( None )
2892 self.items.remove( item )
2894 def getItemList( self ):
2895 return self.items
2897 def isCurrent( self, item ):
2898 return self.currentItem == item
2900 def setCurrentItem( self, item ):
2901 self.currentItem = item
2903 def isFirstItem( self, item):
2904 return self.items[0] == item
2906 def isLastItem( self, item ):
2907 return self.items[len(self.items)-1] == item
2909 def getHTML( self ):
2910 return WTBDrawer(self).getHTML()
2913 class WTBItem:
2915 def __init__( self, caption, **args):
2916 self.owner = None
2917 self.caption = caption
2918 self.icon = args.get("icon", "")
2919 self.actionURL = args.get("actionURL", "")
2920 self.enabled = args.get("enabled", 1)
2921 self.subItems = []
2923 def getCaption(self):
2924 return self.caption
2926 def getIcon( self ):
2927 return self.icon
2929 def getActionURL( self ):
2930 return self.actionURL
2932 def setActionURL( self, URL ):
2933 self.actionURL = URL
2934 #self.actionURL = URL.strip()
2936 def setCurrent( self ):
2937 self.owner.setCurrentItem( self )
2939 def isCurrent( self ):
2940 return self.owner.isCurrent( self )
2942 def enable( self ):
2943 self.enabled = 1
2945 def disable( self ):
2946 self.enabled = 0
2948 def isEnabled( self ):
2949 return self.enabled
2951 def hasIcon( self ):
2952 return self.icon != ""
2954 def addItem( self, newItem ):
2955 if newItem not in self.subItems:
2956 self.subItems.append( newItem )
2957 newItem.setOwner( self.owner )
2959 def removeItem( self, item ):
2960 if item in self.subItems:
2961 self.subItems.remove( item )
2963 def getItemList( self ):
2964 return self.subItems
2966 def isFirstItem( self, item):
2967 return self.subItems[0] == item
2969 def isLastItem( self, item ):
2970 i = len(self.subItems)-1
2971 while not self.subItems[i].isEnabled():
2972 i -= 1
2973 return self.subItems[i] == item
2975 def setOwner( self, owner ):
2976 self.owner = owner
2977 for item in self.getItemList():
2978 item.setOwner( self.owner )
2981 class WTBSeparator(WTBItem):
2983 def __init__( self ):
2984 WTBItem.__init__(self, "")
2986 def setCurrent( self ):
2987 return
2989 class WTBGroup( WTBItem ):
2991 def __init__( self, caption, **args ):
2992 WTBItem.__init__( self, caption, **args )
2993 self.items= []
2995 def addItem( self, newItem ):
2996 if newItem not in self.items:
2997 self.items.append( newItem )
2998 newItem.setOwner( self.owner )
3000 def removeItem( self, item ):
3001 if item in self.items:
3002 self.items.remove( item )
3004 def getItemList( self ):
3005 return self.items
3007 def isFirstItem( self, item):
3008 return self.items[0] == item
3010 def isLastItem( self, item ):
3011 i = len(self.items)-1
3012 while not self.items[i].isEnabled():
3013 i -= 1
3014 return self.items[i] == item
3016 def setOwner( self, owner ):
3017 self.owner = owner
3018 for item in self.getItemList():
3019 item.setOwner( self.owner )
3021 class WTBSection( WTBItem ):
3023 def __init__( self, caption, **args ):
3024 WTBItem.__init__( self, caption, **args )
3025 self.items= []
3026 self.drawer = None
3028 def addItem( self, newItem ):
3029 if newItem not in self.items:
3030 self.items.append( newItem )
3031 newItem.setOwner( self.owner )
3033 def removeItem( self, item ):
3034 if item in self.items:
3035 self.items.remove( item )
3037 def getItemList( self ):
3038 return self.items
3040 def isFirstItem( self, item):
3041 return self.items[0] == item
3043 def isLastItem( self, item ):
3044 i = len(self.items)-1
3045 while not self.items[i].isEnabled():
3046 i -= 1
3047 return self.items[i] == item
3049 def setOwner( self, owner ):
3050 self.owner = owner
3051 for item in self.getItemList():
3052 item.setOwner( self.owner )
3054 def setDrawer( self, d ):
3055 self.drawer = d(self)
3057 def getDrawer( self ):
3058 return self.drawer
3060 def hasDrawer( self ):
3061 return self.drawer != None
3063 class WTBDrawer:
3064 def __init__( self, toolbar ):
3065 self.toolbar = toolbar
3067 def getHTML( self ):
3068 l = []
3069 for item in self.toolbar.getItemList():
3070 if not item.isEnabled():
3071 continue
3072 if isinstance(item, WTBSection) and item.hasDrawer():
3073 drawer = item.getDrawer()
3074 elif isinstance(item, WTBSection) and not item.hasDrawer():
3075 drawer = WStdSectionDrawer(item)
3076 else:
3077 drawer = WStdTBDrawer(item)
3078 l.append(drawer.getHTML())
3079 return "".join(l)
3081 class WStdTBDrawer(WTemplated):
3083 def __init__( self, item ):
3084 self.item = item
3086 def _getTBItemCaption( self, item):
3087 return """<tr>
3088 <td colspan="2" class="menutitle">%s</td>
3089 </tr>"""%item.getCaption()
3091 def _getTBItemHTML( self, item ):
3092 str = """%s"""%(item.getCaption() )
3093 if item.getActionURL() != "":
3094 str = """<a href="%s">%s</a>"""%(item.getActionURL(), \
3095 item.getCaption())
3096 return str
3098 def _getCurrentIconHTML( self, style ):
3099 return """<td class="%s">&nbsp;<img src="%s"\
3100 style="vertical-align:middle" alt=""></td>"""%(style,\
3101 Configuration.Config.getInstance().getSystemIconURL("arrowLeft"))
3103 def _getIconHTML( self, item, style ):
3104 return """<td class="%s">&nbsp;<img src="%s" alt="" hspace="3" vspace="2">
3105 </td>"""%(style, item.getIcon())
3107 def _getSectionItemsHTML( self, group ):
3108 lg = []
3109 for gItem in section.getItemList():
3110 if not gItem.isEnabled():
3111 continue
3112 style = self._getStyleForItem(gItem, section)
3113 lg.append("""<tr>
3114 <td><table cellspacing="0" cellpadding="0" width="100%%">
3115 <tr>%s<td class="%s" width="100%%">%s</td>
3116 </tr></table></td>
3117 </tr>"""%(self._getCurrentIconForItem(gItem, style),\
3118 style,\
3119 self._getTBItemHTML(gItem)))
3120 return """<table cellspacing="0" cellpadding="0" width="100%%">
3122 </table>"""%("".join(lg))
3124 def _getCurrentIconForItem( self, item, style ):
3125 if item.isCurrent():
3126 return self._getCurrentIconHTML(style)
3127 elif item.hasIcon():
3128 return self._getIconHTML(item, style)
3129 return ""
3131 def _getStyleForItem( self, item, list ):
3132 if item.isCurrent():
3133 return "menuselectedcell"
3134 elif list.isFirstItem(item):
3135 return "menutopcell"
3136 elif item.getItemList():
3137 return "menumiddlecell"
3138 elif list.isLastItem(item):
3139 return "menubottomcell"
3140 else:
3141 return "menumiddlecell"
3142 return ""
3144 def getVars( self ):
3145 vars = WTemplated.getVars( self )
3146 l = []
3148 if self.item != None:
3149 for tbItem in self.item.getItemList():
3150 if not tbItem.isEnabled():
3151 continue
3152 groupItemsHTML = ""
3153 itemHTML = ""
3154 if tbItem.__class__ == WTBSeparator:
3155 itemHTML = ""
3156 elif tbItem.__class__ == WTBSection:
3157 sectionItemsHTML = self._getSectionItemsHTML( tbItem )
3158 l.append(self._getTBItemCaption())
3159 l.append("""<tr><td colspan="2">%s</td>
3160 </tr>"""%(sectionItemsHTML) )
3161 else:
3162 itemHTML = self._getTBItemHTML( tbItem )
3163 style = self._getStyleForItem(tbItem, self.item)
3164 l.append( """<tr><td colspan="2">
3165 <table cellspacing="0" cellpadding="0" width="100%%">
3166 <tr>%s<td class="%s" width="100%%">%s</td></tr></table>
3167 </td></tr>"""%(self._getCurrentIconForItem(tbItem,style),\
3168 style, itemHTML))
3169 vars["items"] = "".join(l)
3170 return vars
3173 class WStdSectionDrawer(WStdTBDrawer):
3175 def __init__( self, item ):
3176 self.section = item
3178 def getVars( self ):
3179 vars = WTemplated.getVars( self )
3180 l = []
3181 l.append(self._getTBItemCaption(self.section))
3182 if self.section != None:
3183 for tbItem in self.section.getItemList():
3184 if not tbItem.isEnabled():
3185 continue
3186 itemHTML = ""
3187 if tbItem.__class__ == WTBSeparator:
3188 itemHTML = ""
3189 else:
3190 itemHTML = self._getTBItemHTML( tbItem )
3191 style = self._getStyleForItem(tbItem, self.section)
3192 l.append( """<tr><td colspan="2">
3193 <table cellspacing="0" cellpadding="0" width="100%%">
3194 <tr>%s<td class="%s" width="100%%">%s</td></tr></table>
3195 </td></tr>"""%(self._getCurrentIconForItem(tbItem,style),\
3196 style, itemHTML))
3197 for subitem in tbItem.getItemList():
3198 if not subitem.isEnabled():
3199 continue
3200 styleSubitem = self._getStyleForItem(subitem, self.section)
3201 if subitem.isCurrent():
3202 subitemHTML = self._getTBItemHTML( subitem )
3203 l.append("""<tr><td colspan="2">
3204 <table cellspacing="0" cellpadding="0" width="100%%">
3205 <tr><td class="%s">&nbsp;&nbsp;&nbsp;&nbsp;</td>%s<td class="%s" width="100%%">\
3206 <span style="font-size:11px">%s</span></td></tr></table></td></tr>"""%(styleSubitem,\
3207 self._getCurrentIconForItem(subitem,styleSubitem),styleSubitem, subitemHTML))
3208 else:
3209 styleSubitem = "menuConfMiddleCell"
3210 if self.section.isLastItem(tbItem) and tbItem.isLastItem(subitem):
3211 styleSubitem = "menuConfBottomCell"
3212 l.append( """<tr><td class="%s" nowrap>&nbsp;&nbsp;&nbsp;<a class="confSubSection" href="%s">\
3213 <img src="%s" alt="">&nbsp;%s</a></td></tr>\
3214 """%(styleSubitem, subitem.getActionURL(), subitem.getIcon(), subitem.getCaption()))
3215 vars["items"] = "".join(l)
3216 return vars
3219 class WAddEventSectionDrawer(WStdSectionDrawer):
3221 def __init__( self, item ):
3222 self.section = item
3224 def _getTBItemHTML( self, item ):
3225 str = """<span class="menuadd">%s</span>"""%(item.getCaption() )
3226 if item.getActionURL() != "":
3227 str = """<a class="menuaddlink" href="%s">%s
3228 </a>"""%(item.getActionURL(), \
3229 item.getCaption())
3230 return str
3232 def _getCurrentIconForItem( self, item, style ):
3233 if item.hasIcon():
3234 return self._getIconHTML(item, style)
3235 return ""
3237 def _getStyleForItem( self):
3238 return "menuadd"
3240 def getVars( self ):
3241 vars = WTemplated.getVars( self )
3242 l = []
3243 l.append(self._getTBItemCaption(self.section))
3244 if self.section != None:
3245 for tbItem in self.section.getItemList():
3246 if not tbItem.isEnabled():
3247 continue
3248 itemHTML = ""
3249 if tbItem.__class__ == WTBSeparator:
3250 itemHTML = ""
3251 else:
3252 itemHTML = self._getTBItemHTML( tbItem )
3253 style = self._getStyleForItem()
3254 l.append( """<tr><td class="%s" colspan="2">
3255 <table cellspacing="0" cellpadding="0" width="100%%">
3256 <tr>%s<td class="%s" width="100%%">%s</td></tr></table>
3257 </td></tr>"""%(WStdSectionDrawer._getStyleForItem(self,tbItem, self.section),self._getCurrentIconForItem(tbItem,style), style, itemHTML))
3258 vars["items"] = "".join(l)
3259 return vars
3262 class WConferenceListEvents(WTemplated):
3264 def __init__( self, items, aw):
3265 self._items = items
3266 self._aw = aw
3268 def getVars( self ):
3269 vars = WTemplated.getVars( self )
3270 vars["items"] = self._items
3271 vars["conferenceDisplayURLGen"] = urlHandlers.UHConferenceDisplay.getURL
3272 vars["aw"] = self._aw
3273 return vars
3275 class WEmptyCategory(WTemplated):
3277 def __init__(self, materialList):
3278 self._materialList = materialList
3280 def getVars(self):
3281 vars = {}
3282 vars["material"] = self._materialList
3283 return vars
3286 class WConferenceList(WTemplated):
3288 def __init__( self, category, wfRegm, showPastEvents ):
3289 self._categ = category
3290 self._showPastEvents = showPastEvents
3292 def getHTML( self, aw, params ):
3293 self._aw = aw
3294 return WTemplated.getHTML( self, params )
3296 def getEventTimeline(self, tz):
3297 index = Catalog.getIdx('categ_conf_sd').getCategory(self._categ.getId())
3298 today = nowutc().astimezone(timezone(tz)).replace(hour=0, minute=0, second=0)
3299 thisMonth = nowutc().astimezone(timezone(tz)).replace(hour=0, minute=0, second=0, day=1)
3300 thisMonthTS = utc_timestamp(thisMonth)
3301 todayTS = utc_timestamp(thisMonth)
3302 tomorrowTS = utc_timestamp(today + timedelta(days=1))
3303 oneMonthTS = utc_timestamp(today - timedelta(days=30))
3304 future = []
3305 present = []
3307 for ts, conf in index.iteritems(thisMonthTS):
3308 if ts < tomorrowTS or len(present) < OPTIMAL_PRESENT_EVENTS:
3309 present.append(conf)
3310 else:
3311 future.append(conf)
3313 if len(present) < MIN_PRESENT_EVENTS:
3314 extraEvents = list(index.itervalues(oneMonthTS, todayTS))
3315 present += extraEvents
3317 if not present:
3318 present = [elem for elem in index[index.maxKey()]]
3320 numPast = self._categ.getNumConferences() - len(present) - len(future)
3321 return present, future, len(future), numPast
3323 def getVars( self ):
3324 vars = WTemplated.getVars( self )
3325 displayTZ = DisplayTZ(self._aw, self._categ, useServerTZ=1).getDisplayTZ()
3326 vars["ActiveTimezone"] = displayTZ
3327 vars["presentItems"], vars["futureItems"], vars["numOfEventsInTheFuture"], vars["numOfEventsInThePast"] = self.getEventTimeline(displayTZ)
3328 vars["categ"] = self._categ
3330 vars["showPastEvents"] = self._showPastEvents
3332 return vars
3335 class WCategoryList(WTemplated):
3337 def __init__( self, categ ):
3338 self._categ = categ
3339 self._list = categ.getSubCategoryList()
3341 def getHTML( self, aw, params ):
3342 self._aw = aw
3343 return WTemplated.getHTML( self, params )
3345 def getVars( self ):
3347 vars = WTemplated.getVars( self )
3348 vars["items"] = self._list
3349 vars["categ"] = self._categ;
3351 return vars
3353 class WCategoryStatisticsListRow(WTemplated):
3355 def __init__( self, year, percent, number ):
3356 self._year = year
3357 self._percent = percent
3358 self._number = number
3360 def getHTML( self, aw ):
3361 self._aw = aw
3362 return WTemplated.getHTML( self )
3364 def getVars( self ):
3365 vars = WTemplated.getVars( self )
3366 vars["year"] = self._year
3367 vars["percent"] = self._percent
3368 vars["percentCompl"] = 100-self._percent
3369 vars["number"] = self._number
3370 return vars
3373 class WCategoryStatisticsList(WTemplated):
3375 def __init__( self, statsName, stats ):
3376 self._stats = stats
3377 self._statsName = statsName
3379 def getHTML( self, aw ):
3380 self._aw = aw
3381 return WTemplated.getHTML( self )
3383 def getVars( self ):
3384 vars = WTemplated.getVars( self )
3385 # Construction of the tables from the dictionary (stats).
3386 # Initialization:
3387 tmp = []
3388 maximum = 0
3389 stats = {}
3390 years = self._stats.keys()
3391 years.sort()
3392 for y in range(years[0], min(datetime.now().year+4,years[-1:][0]+1)):
3393 stats[y] = self._stats.get(y,0)
3394 maximum = max(stats.values())
3395 years = stats.keys()
3396 years.sort()
3397 for y in years:
3398 nb = stats[y]
3399 percent = (nb*100)/maximum
3400 if nb > 0 and percent == 0:
3401 percent = 1
3402 wcslr = WCategoryStatisticsListRow( y, percent, stats[y] )
3403 tmp.append(wcslr.getHTML( self._aw ))
3404 vars["statsName"] = self._statsName
3405 vars["statsRows"] = "".join( tmp )
3406 vars["total"] = sum(stats.values())
3407 return vars
3409 class WConfCreationControlFrame(WTemplated):
3411 def __init__( self, categ ):
3412 self._categ = categ
3414 def getVars( self ):
3415 vars = WTemplated.getVars( self )
3416 vars["locator"] = self._categ.getLocator().getWebForm()
3417 vars["status"] = _("OPENED")
3418 vars["changeStatus"] = _("""( <input type="submit" class="btn" name="RESTRICT" value="_("RESTRICT it")"> )""")
3419 if self._categ.isConferenceCreationRestricted():
3420 vars["status"] = _("RESTRICTED")
3421 vars["changeStatus"] = _("""( <input type="submit" class="btn" name="OPEN" value="_("OPEN it")"> )""")
3422 vars["principalTable"] = WPrincipalTable().getHTML( self._categ.getConferenceCreatorList(), self._categ , vars["addCreatorsURL"], vars["removeCreatorsURL"], selectable=False )
3423 vars["notifyCreationList"] = quoteattr(self._categ.getNotifyCreationList())
3424 vars["setNotifyCreationURL"] = urlHandlers.UHCategorySetNotifyCreation.getURL(self._categ)
3425 return vars
3428 class WWriteMinutes(WTemplated):
3430 def __init__( self, target ):
3431 self._target = target
3433 def getVars( self ):
3434 vars = WTemplated.getVars( self )
3435 minutes = self._target.getMinutes()
3436 vars["text"] = ""
3437 if minutes:
3438 vars["text"] = minutes.getText()
3439 vars["baseURL"]=Config.getInstance().getBaseURL()
3440 vars["imageUploadURL"]=urlHandlers.UHConfModifDisplayAddPageFile.getURL(self._target)
3441 vars["imageBrowserURL"]=urlHandlers.UHConfModifDisplayAddPageFileBrowser.getURL(self._target)
3442 vars["compileButton"] = ""
3443 if isinstance(self._target, conference.Conference):
3444 vars["compileButton"] = """
3445 <input type="submit" class="btn" name="compile" value="compile minutes" onClick= "return confirm('Are you sure you want to compile minutes from all talks in the agenda? This will replace any existing text here.');">"""
3446 return vars
3448 class WMinutesDisplay(WTemplated):
3450 def __init__( self, target ):
3451 self._target = target
3453 def getVars( self ):
3454 vars = WTemplated.getVars( self )
3455 vars["text"] = self.textToHTML(self._target.readBin())
3456 return vars
3458 class TabControl:
3460 def __init__( self, parent=None, child=None ):
3461 self._tabs = []
3462 self._active = None
3463 self._default = None
3464 # Parent element (another tabcontrol),
3465 # in case there is nesting
3466 self._parent = parent
3468 if parent != None:
3469 parent.setChild(self);
3470 self._child = child
3472 def _addTab( self, tab ):
3473 self._tabs.append( tab )
3474 if len( self._tabs ) == 1:
3475 self._default = tab
3476 self._active = tab
3478 def newTab( self, id, caption, url, hidden=False ):
3479 tab = Tab( self, id, caption, url, hidden=hidden )
3480 self._addTab( tab )
3481 return tab
3483 def setDefaultTab( self, tab ):
3484 if tab in self._tabs:
3485 self._default = tab
3487 def getDefaultTab( self ):
3488 return self._default
3490 def setActiveTab( self, tab ):
3491 if tab in self._tabs:
3492 self._active = tab
3494 def getActiveTab( self ):
3495 return self._active
3497 def getTabList( self ):
3498 return self._tabs
3500 def getTabById( self, id ):
3501 for tab in self.getTabList():
3502 if tab.getId() == id:
3503 return tab
3504 return None
3506 def getParent( self ):
3507 # retrieve parent TabControl
3508 return self._parent
3510 def setChild( self, child ):
3511 self._child = child
3513 def getChild( self ):
3514 # retrieve child TabControl
3515 return self._child
3517 def getLevel( self ):
3518 tmp = self.getParent()
3519 level = 0
3520 while tmp:
3521 level += 1
3522 tmp = tmp.getParent()
3523 return level
3525 class Tab:
3527 def __init__( self, owner, id, caption, URL, hidden = False ):
3528 self._owner = owner
3529 self._id = id.strip()
3530 self._caption = caption.strip()
3531 self._url = URL
3532 self._enabled = True
3533 self._subtabControl=None
3534 self._hidden = hidden
3536 def getId( self ):
3537 return self._id
3539 def getCaption( self ):
3540 return self._caption
3542 def setCaption( self, cp):
3543 self._caption = cp
3545 def getURL( self ):
3546 return self._url
3548 def setDefault( self ):
3549 self._owner.setDefaultTab( self )
3551 def isDefault( self ):
3552 return self._owner.getDefaultTab() == self
3554 def isActive( self ):
3555 return self._owner.getActiveTab() == self
3557 def setActive( self ):
3558 self._owner.setActiveTab( self )
3560 def enable( self ):
3561 self._enabled = True
3563 def disable( self ):
3564 self._enabled = False
3566 def setEnabled(self,value):
3567 self._enabled=value
3569 def isEnabled( self ):
3570 return self._enabled
3572 def setHidden(self, value):
3573 self._hidden = value
3575 def isHidden( self ):
3576 return self._hidden
3578 def getSubTabControl(self):
3579 return self._subtabControl
3581 def newSubTab( self, id, caption, url ):
3582 # guarantee that a subtabControl exists
3583 if not self._subtabControl:
3584 self._subtabControl = TabControl(parent=self._owner)
3586 tab=self._subtabControl.newTab( id, caption, url )
3587 return tab
3589 def hasChildren(self):
3590 return self._subtabControl is not None
3593 #class WTrackModifSubTrack( WTemplated ):
3595 # def __init__( self, track ):
3596 # self.__track = track
3597 # self.__conf = track.getConference()
3599 # def getVars( self ):
3600 # vars = WTemplated.getVars(self)
3601 # if len(self.__track.getSubTrackList()) == 0:
3602 # ht = "No sub track defined"
3603 # else:
3604 # ht = "<table width=\"100%%\">\n"
3605 # for subTrack in self.__track.getSubTrackList():
3606 # ht += "<tr bgcolor=\"#AAFFAA\"><td><input type=\"checkbox\" name=\"selSubTracks\" value=\"%s\"></td><td><a href=\"%s\">%s</a></td><td>%s</td></tr>\n"%(subTrack.getId(), vars["dataModificationURLGen"](subTrack) , subTrack.getTitle(), subTrack.getDescription())
3607 # ht += "</table>\n"
3608 # vars["listSubTrack"] = ht
3609 # return vars
3612 #class WSubTrackDataModification(WTemplated):
3614 # def __init__( self, subTrack ):
3615 # self.__subTrack = subTrack
3616 # self.__track = subTrack.getTrack()
3618 # def getVars( self ):
3619 # vars = WTemplated.getVars(self)
3621 # vars["title"] = self.__subTrack.getTitle()
3622 # vars["description"] = self.__subTrack.getDescription()
3624 # vars["locator"] = self.__subTrack.getLocator().getWebForm()
3626 # return vars
3628 #class WCFAModifFrame(WTemplated):
3630 # def __init__( self, conf, aw):
3631 # self.__conf = conf
3632 # self._aw = aw
3634 # def getHTML( self, body, **params):
3635 # params["body"] = body
3636 # return WTemplated.getHTML( self, params )
3638 # def getVars( self ):
3639 # vars = WTemplated.getVars( self )
3641 # vars["context"] = WConfModifHeader( self.__conf, self._aw ).getHTML(vars)
3644 # return vars
3646 #class WCFAModifMain(WTemplated):
3648 # def __init__( self, conf ):
3649 # self.__conf = conf
3651 # def getVars( self ):
3652 # vars = WTemplated.getVars( self )
3653 # abMgr = self.__conf.getAbstractMgr()
3655 # vars["startDate"] = abMgr.getStartSubmissionDate().strftime("%A %d %B %Y")
3656 # vars["endDate"] = abMgr.getEndSubmissionDate().strftime("%A %d %B %Y")
3658 # typeList = ""
3659 # for type in self._conf.getContribTypeList():
3660 # typeList += "<input type=\"checkbox\" name=\"types\" value=\"%s\">%s<br>\n"%(type.getId(), type.getName())
3661 # vars["typeList"] = typeList
3663 # return vars
3665 #class WCFARefereeList(WTemplated):
3667 # def __init__( self, conf ):
3668 # self.__conf = conf
3670 # def getVars( self ):
3671 # vars = WTemplated.getVars(self)
3672 # vars["refereeTable"] = "%s"%WPrincipalTable().getHTML( self.__conf.getAbstractMgr().getRefereeList(), self.__conf, vars["addRefereeURL"], vars["removeRefereeURL"] )
3673 # return vars
3675 class WTabControl( WTemplated ):
3676 _unSelTabCls="Unselected"
3677 _selTabCls="Selected"
3679 def __init__( self, ctrl, accessWrapper, **params ):
3680 self._tabCtrl = ctrl
3681 self._aw = accessWrapper
3683 def _getTabsHTML(self, tabCtrl=None,maxtabs=1):
3684 # TODO: Transport this to the template
3686 if tabCtrl==None:
3687 tabCtrl = self._tabCtrl
3689 html = []
3691 # Which css class prefix to use
3692 tabClassPrefix = ""
3693 isSubTab = False
3695 if tabCtrl.getLevel() % 2 == 0:
3696 tabClassPrefix = "tab"
3697 else:
3698 tabClassPrefix = "subTab"
3699 isSubTab = True
3701 activeTopLevelTab = None
3702 for i in range(0, len(tabCtrl.getTabList())):
3703 tab = tabCtrl.getTabList()[i]
3705 if not tab.isEnabled() or tab.isHidden():
3706 continue
3707 cls=self.__class__._unSelTabCls
3709 # Don't add the right border if in sub level and if last elemnt
3710 borderRight = ""
3711 if i == len(tabCtrl.getTabList()) -1 and isSubTab:
3712 borderRight = """ style="border-right: 0;" """
3714 caption = """<a href="%s"%s>%s</a>"""%(tab.getURL(), borderRight, \
3715 tab.getCaption().replace(" ","&nbsp;") )
3717 if tab.isActive():
3718 self._activeTab = activeTopLevelTab = tab
3719 cls=self.__class__._selTabCls
3721 if tab.getSubTabControl():
3722 self._getTabsHTML(tab.getSubTabControl(), maxtabs)
3724 html.append("""<li class="%s%s" onclick="window.location = '%s'" onmouseout="this.style.backgroundPosition = '0 -30px';" onmouseover="this.style.backgroundPosition = '0 0';">%s</li>"""%(tabClassPrefix, cls, tab.getURL(), caption))
3725 if html!=[]:
3726 gradientDiv = ""
3727 if not activeTopLevelTab.hasChildren():
3728 gradientDiv = """<div class="tabGradient"><div class="tabBorderGradient" style="float: left;"></div><div class="tabBorderGradient" style="float: right;"></div></div>"""
3730 cssClass = ""
3731 if tabCtrl.getLevel() == 0:
3732 cssClass = """ class="tabListContainer" """
3733 html.insert(0, """<div %s><ul id="tabList" class="%sList">""" %(cssClass, tabClassPrefix))
3734 html.append("""</ul>%s</div>""" % gradientDiv)
3736 self._tabsBars.append("".join(html))
3738 return True
3740 return False
3742 def _getTabs( self):
3743 self._tabsBars=[]
3745 self._getTabsHTML(tabCtrl=self._tabCtrl, maxtabs=len(self._tabCtrl.getTabList())+1)
3746 self._tabsBars.reverse()
3747 return "".join(self._tabsBars)
3749 def getHTML( self, body ):
3750 self._body = body
3751 return WTemplated.getHTML( self )
3753 def getVars( self ):
3754 vars = WTemplated.getVars( self )
3755 vars["cs"] = len(self._tabCtrl.getTabList())+1
3756 vars["body"] = self._body
3757 vars["tabItems"] = self._getTabs()
3759 return vars
3761 #class WAbstractFilterCtrl( WTemplated ):
3763 # def __init__(self, conf, filter, sorter):
3764 # self._filter = filter
3765 # self._conf = conf
3766 # self._sorter = sorter
3768 # def getVars( self ):
3769 # vars = WTemplated.getVars(self)
3770 # abMgr = self._conf.getAbstractMgr()
3772 # trackFilter = "<option value=\"\">No filter</option>\n"
3773 # for track in self._conf.getTrackList():
3774 # selected = ""
3775 # if track.getId() == self._filter["track"]:
3776 # selected = "selected"
3777 # trackFilter += "<option value=\"%s\" %s>%s</option>\n"%(track.getId(), selected, track.getTitle())
3778 # vars["trackFilter"] = trackFilter
3780 # typeFilter = "<option value=\"\">No filter</option>\n"
3781 # for type in self._conf.getContribTypeList():
3782 # selected = ""
3783 # if type.getId() == self._filter["type"]:
3784 # selected = "selected"
3785 # typeFilter += "<option value=\"%s\" %s>%s</option>\n"%(type.getId(), selected, type)
3786 # vars["typeFilter"] = typeFilter
3788 # statusFilter = "<option value=\"\">No filter</option>\n"
3789 # for name in StatusName().getNameList():
3790 # selected = ""
3791 # if name == self._filter["status"]:
3792 # selected = "selected"
3793 # statusFilter += "<option value=\"%s\" %s>%s</option>\n"%(name, selected, name)
3794 # vars["statusFilter"] = statusFilter
3796 # fDay = "<option value=\"\"> </option>\n"
3797 # for i in range(1,32):
3798 # selected = ""
3799 # if self._filter["fromDate"] != None:
3800 # if i == self._filter["fromDate"].day:
3801 # selected = "selected"
3802 # fDay += "<option value=\"%s\" %s>%s</option>\n"%(i, selected, i)
3803 # vars["fDay"] = fDay
3805 # fMonth = "<option value=\"\"> </option>\n"
3806 # month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
3807 # for i in range(1,13):
3808 # selected = ""
3809 # if self._filter["fromDate"] != None:
3810 # if i == self._filter["fromDate"].month:
3811 # selected = "selected"
3812 # fMonth += "<option value=\"%s\" %s>%s</option>\n"%(i, selected, month[i-1])
3813 # vars["fMonth"] = fMonth
3815 # fYear = "<option value=\"\"> </option>\n"
3816 # for i in range(2000,2011):
3817 # selected = ""
3818 # if self._filter["fromDate"] != None:
3819 # if i == self._filter["fromDate"].year:
3820 # selected = "selected"
3821 # fYear += "<option value=\"%s\" %s>%s</option>\n"%(i, selected, i)
3822 # vars["fYear"] = fYear
3826 # tDay = "<option value=\"\"> </option>\n"
3827 # for i in range(1,32):
3828 # selected = ""
3829 # if self._filter["toDate"] != None:
3830 # if i == self._filter["toDate"].day:
3831 # selected = "selected"
3832 # tDay += "<option value=\"%s\" %s>%s</option>\n"%(i, selected, i)
3833 # vars["tDay"] = tDay
3835 # tMonth = "<option value=\"\"> </option>\n"
3836 # for i in range(1,13):
3837 # selected = ""
3838 # if self._filter["toDate"] != None:
3839 # if i == self._filter["toDate"].month:
3840 # selected = "selected"
3841 # tMonth += "<option value=\"%s\" %s>%s</option>\n"%(i, selected, month[i-1])
3842 # vars["tMonth"] = tMonth
3844 # tYear = "<option value=\"\"> </option>\n"
3845 # for i in range(2000,2011):
3846 # selected = ""
3847 # if self._filter["toDate"] != None:
3848 # if i == self._filter["toDate"].year:
3849 # selected = "selected"
3850 # tYear += "<option value=\"%s\" %s>%s</option>\n"%(i, selected, i)
3851 # vars["tYear"] = tYear
3855 # #sortList = ["title", "type", "modification date"]
3856 # selected = ""
3857 # if self._sorter["field"] == "title":
3858 # selected = "selected"
3859 # sortBy = "<option value=\"title\" %s>Title</option>\n"%selected
3860 # selected = ""
3861 # if self._sorter["field"] == "type":
3862 # selected = "selected"
3863 # sortBy += "<option value=\"type\" %s>Type</option>\n"%selected
3864 # selected = ""
3865 # if self._sorter["field"] == "modification date":
3866 # selected = "selected"
3867 # sortBy += "<option value=\"modification date\" %s>Modification date</option>\n"%selected
3868 # selected = ""
3869 # if self._sorter["field"] == "status":
3870 # selected = "selected"
3871 # sortBy += "<option value=\"status\" %s>Status</option>\n"%selected
3872 # selected = ""
3874 # if self._sorter["direction"] == "desc":
3875 # vars["ascChecked"] = ""
3876 # vars["descChecked"] = "checked"
3877 # else:
3878 # vars["ascChecked"] = "checked"
3879 # vars["descChecked"] = ""
3881 # vars["sortBy"] = sortBy
3884 # return vars
3886 #class WSubTrackCreation( WTemplated ):
3888 # def __init__( self, track ):
3889 # self.__track = track
3891 # def getVars( self ):
3892 # vars = WTemplated.getVars(self)
3893 # vars["title"], vars["description"] = "", ""
3894 # vars["locator"] = self.__track.getLocator().getWebForm()
3895 # return vars
3897 #class WSetLogo( WTemplated ):
3899 # def __init__( self, conference ):
3900 # self.__conf = conference
3902 # def getVars( self ):
3903 # vars = WTemplated.getVars( self )
3904 # vars["confTitle"] = self.__conf.getTitle()
3906 # return vars
3908 class WSelectionBox(WTemplated):
3910 def getVars(self):
3911 vars=WTemplated.getVars(self)
3912 if not vars.has_key("description"):
3913 vars["description"]=""
3914 if not vars.has_key("options"):
3915 vars["options"]=""
3916 if not vars.has_key("table_width"):
3917 vars["table_width"]=""
3918 return vars
3920 class WSelectionBoxAuthors:
3922 def getHTML(self):
3923 wc=WSelectionBox()
3925 "description": _("Please make your selection if you want to add the submitter/s directly to any of the following roles:"),\
3926 "options": _("""<input type="radio" name="submitterRole" value="primaryAuthor"> _("Primary author")<br>
3927 <input type="radio" name="submitterRole" value="coAuthor"> _("Co-author")<br><hr>
3928 <input type="checkbox" name="submitterRole" value="speaker"> _("Speaker")
3929 """)
3931 return wc.getHTML(p)
3933 class WMSelectionBoxAuthors:
3935 def getHTML(self):
3936 wc=WSelectionBox()
3938 "description": _("Please make your selection if you want to add the submitter/s directly to:"),\
3939 "options": _("""<input type="checkbox" name="submitterRole" value="speaker"> _("Speaker")
3940 """), \
3941 "table_width": "180px" \
3943 return wc.getHTML(p)
3945 class WSelectionBoxSubmitter:
3947 def getHTML(self):
3948 wc=WSelectionBox()
3950 "description": _(""" _("Please check the box if you want to add them as submitters"):<br><br><i><font color=\"black\"><b> _("Note"): </b></font> _("If this person is not already a user they will be sent an email asking them to create an account. After their registration the user will automatically be given submission rights").</i><br>"""),\
3951 "options": _("""<input type="checkbox" name="submissionControl" value="speaker" checked> _("Add as submitter")
3952 """)
3954 return wc.getHTML(p)
3956 class WSelectionBoxConveners:
3958 def getHTML(self):
3959 wc=WSelectionBox()
3961 "description": _("Please make your selection if you want to add the result/s directly to the role of session Convener:"),\
3962 "options": _("""<input type="checkbox" name="userRole" value="convener"> _("Add as convener")
3963 """)
3965 return wc.getHTML(p)
3967 class WSelectionBoxConvToManagerCoordinator:
3969 def getHTML(self):
3970 wc=WSelectionBox()
3972 "description": _(""" _("Please check the box if you want to add them as managers/coordinators"):"""),\
3973 "options": _("""<input type="checkbox" name="managerControl"> _("Add as session manager")<br>
3974 <input type="checkbox" name="coordinatorControl"> _("Add as session coordinator")
3975 """)
3977 return wc.getHTML(p)
3980 class WSelectionBoxCloneLecture :
3982 def getHTML(self):
3983 wc=WSelectionBox()
3985 "description": _("Please check the boxes indicating which elements of the lecture you want to clone"),\
3986 "options": _("""<input type="checkbox" name="cloneDetails" id="cloneDetails" checked="1" disabled="1" value="1"> _("Event details")
3987 <input type="checkbox" name="cloneMaterials" id="cloneMaterials" value="1" > _("Attached materials")
3988 <input type="checkbox" name="cloneAccess" id="cloneAccess" value="1" > _("Access and management privileges")
3989 """)
3991 return wc.getHTML(p)
3994 class WUserSelection(WTemplated):
3997 def __init__( self, searchURL, multi=True, addTo=0, forceWithoutExtAuth=False):
3998 self._title = _("Search for users")
3999 self._searchURL = searchURL
4000 self._forceWithoutExtAuth = forceWithoutExtAuth
4001 self._multi = multi # for multiple selection
4002 #addTo=0: do not show any selection box.
4003 #addTo=1: show selection box to add submitter as primary author, coauthor or speaker.
4004 #addTo=2: show selection box to add primary author, coauthor or speaker as submitter.
4005 #addTo=3: show selection box to add session managers as session conveners
4006 #addTo=4: show selection box to add submitter as speaker. This is just for meetings
4007 #addTo=5: show selection box to add submitter and/or manager rights for convener.
4008 self._addTo=addTo
4010 def _performSearch( self, criteria, exact=0 ):
4011 ah = user.AvatarHolder()
4012 res = ah.match(criteria, exact=exact, forceWithoutExtAuth=self._forceWithoutExtAuth)
4013 return res
4015 def setTitle( self, newTitle ):
4016 self._title = newTitle.strip()
4018 def _getPassingParams( self, params ):
4019 l = []
4020 for p in params.keys():
4021 if p in ["firstname", "surname", "organisation", "email", "groupname","exact","searchExt", 'selectedPrincipals']:
4022 continue
4023 l.append( """<input type="hidden" name="%s" value="%s">\n"""%(p, \
4024 params[p] ) )
4025 return "\n".join( l )
4027 def _filterParams( self, params ):
4028 pars = copy( params )
4029 self._action = "show"
4030 if pars.has_key("action"):
4031 self._action = pars["action"].strip()
4032 del pars["action"]
4033 return pars
4035 def _create( self, params ):
4036 pass
4037 #a = user.Avatar()
4038 #a.setName( params["firstname"] )
4039 #a.setSurName( params["surname"] )
4040 #a.setEmail( params["email"] )
4041 #a.setOrganisation( params["organisation"] )
4042 #user.AvatarHolder().add( a )
4044 def _normaliseListParam( self, param ):
4045 if not isinstance(param, list):
4046 return [ param ]
4047 return param
4049 def getHTML( self, params ):
4050 self._cancelURL = params.get("addURL","")
4051 pars = self._filterParams( params )
4052 self._passingParams = self._getPassingParams( pars )
4053 self._msg = ""
4054 if self._action == _("create"):
4055 try:
4056 self._create( pars )
4057 except UserError,e:
4058 self._msg = str(e)#"User not created. The email address is already used."
4059 self._action = _("search")
4060 return WTemplated.getHTML( self, pars )
4062 def getVars( self ):
4063 vars = WTemplated.getVars( self )
4064 vars["usericon"]=quoteattr(str(Config.getInstance().getSystemIconURL("user" )))
4065 vars["firstName"] = vars.get("firstname", "")
4066 vars["surName"] = vars.get("surname", "")
4067 vars["email"] = vars.get("email", "")
4068 vars["organisation"] = vars.get("organisation", "")
4069 if "WPtitle" not in vars or vars["WPtitle"].strip() == "":
4070 vars["WPtitle"] = self._title
4071 vars["params"] = self._passingParams
4072 vars["addURL"] = urlHandlers.UHUserSearchCreateExternalUser.getURL()
4073 #vars["createURL"] = urlHandlers.UHUserSearchCreateExternalUser.getURL()
4074 vars["postURL"] = self._searchURL
4075 vars["cancelURL"] = self._cancelURL
4076 vars["searchResultsTable"] = ""
4077 res=[]
4079 if self._action == _("search").strip():
4080 criteria = { "name": vars["firstName"], \
4081 "surName": vars["surName"], \
4082 "email" : vars["email"], \
4083 "organisation": vars["organisation"] \
4085 if vars.has_key("groupname"):
4086 criteria["groupname"] = vars["groupname"]
4087 exact = 0
4088 if vars.get("exact",0) != 0:
4089 exact = 1
4090 res = self._performSearch( criteria, exact=exact )
4091 vars["searchResultsTable"] = WUserSearchResultsTable(self._multi).getHTML( res )
4092 vars["msg"] = ""
4093 if self._msg:
4094 vars["msg"] = """<tr>
4095 <td bgcolor="white" colspan="3" align="center">
4096 <font color="red">%s</font>
4097 </td>
4098 </tr>"""%self._msg
4099 sb=""
4100 if res!=[]:
4101 if self._addTo==1:
4102 sb=WSelectionBoxAuthors().getHTML()
4103 elif self._addTo==2:
4104 sb=WSelectionBoxSubmitter().getHTML()
4105 elif self._addTo==3:
4106 sb=WSelectionBoxConveners().getHTML()
4107 elif self._addTo==4:
4108 sb=WMSelectionBoxAuthors().getHTML()
4109 elif self._addTo==5:
4110 sb=WSelectionBoxConvToManagerCoordinator().getHTML()
4111 vars["selectionBox"]=sb
4112 vars["searchOptions"]=""
4113 authenticators = Config.getInstance().getAuthenticatorList()
4114 searchList = self._normaliseListParam(vars.get("searchExt",""))
4115 for auth in authenticators:
4116 if auth.lower() != "local":
4117 selected = ""
4118 if auth in searchList:
4119 selected = "checked"
4120 vars["searchOptions"]+= _("""<input type="checkbox" name="searchExt" value="%s" %s> _("search %s database")<br>""") % (auth, selected, auth.upper())
4121 selected = ""
4122 if vars.get("exact","") != "":
4123 selected = "checked"
4124 vars["searchOptions"]+= _("""<input type="checkbox" name="exact" value="1" %s> _("exact match")<br>""") % selected
4125 return vars
4127 class WAuthorSearch(WUserSelection):
4129 def __init__(self, conf, searchURL, multi=True, addTo=0, forceWithoutExtAuth=False):
4130 _title = _("Search Users and Authors")
4131 WUserSelection.__init__(self, searchURL, multi, addTo, forceWithoutExtAuth=forceWithoutExtAuth)
4132 self._conf = conf
4135 def _performSearch( self, criteria, exact=0 ):
4136 #this should go in the PrincipalHolder match method
4137 ah = user.AvatarHolder()
4138 resUsers = ah.match(criteria, exact=exact, forceWithoutExtAuth=self._forceWithoutExtAuth)
4139 auths = self._conf.getAuthorIndex()
4140 resAuths = auths.match(criteria, exact=exact)
4141 #crear una lista y devolver el resultado
4142 l = []
4143 emails = []
4144 for usr in resUsers:
4145 l.append(usr)
4146 emails.append(usr.getEmail())
4147 for author in resAuths :
4148 if author.getEmail() not in emails:
4149 l.append(author)
4150 return l
4152 class WPrincipalSelection(WUserSelection):
4155 def _performSearch( self, criteria, exact=0 ):
4156 #this should go in the PrincipalHolder match method
4157 _title = _("Search for users and groups")
4158 ah = user.AvatarHolder()
4159 resUsers = ah.match(criteria,exact=exact,forceWithoutExtAuth=self._forceWithoutExtAuth)
4160 resGroups = [ group for group in user.GroupHolder().match(criteria, forceWithoutExtAuth=self._forceWithoutExtAuth) if not group.isObsolete()]
4161 l = []
4162 for item in resUsers:
4163 l.append(item)
4164 for item in resGroups:
4165 l.append(item)
4166 return l
4168 def getVars( self ):
4169 vars=WUserSelection.getVars(self)
4170 vars["usericon"]=quoteattr(str(Config.getInstance().getSystemIconURL("user" )))
4171 vars["groupicon"]=quoteattr(str(Config.getInstance().getSystemIconURL("group" )))
4172 vars["groupNICEicon"]=quoteattr(str(Config.getInstance().getSystemIconURL("groupNICE" )))
4173 vars["groupname"] = vars.get("groupname", "")
4174 return vars
4177 class WComplexSelection(WUserSelection):
4180 def __init__(self, target, searchAction, addTo = 0, forceWithoutExtAuth=False):
4181 _title = _("Search for users")
4182 WUserSelection.__init__(self, searchAction, addTo = addTo, forceWithoutExtAuth=forceWithoutExtAuth)
4183 try:
4184 self._conf = target.getConference()
4185 except:
4186 self._conf = None
4187 self._target = target
4189 def _performSearch( self, criteria, exact=0 ):
4190 #this should go in the PrincipalHolder match method
4191 ah = user.AvatarHolder()
4192 resUsers = ah.match(criteria, exact=exact, forceWithoutExtAuth=self._forceWithoutExtAuth)
4193 try:
4194 auths = self._conf.getAuthorIndex()
4195 resAuths = auths.match(criteria, exact=exact)
4196 except:
4197 resAuths = []
4198 l = []
4199 emails = []
4200 for usr in resUsers:
4201 l.append(usr)
4202 emails.append(usr.getEmail())
4203 for author in resAuths :
4204 if author.getEmail() not in emails:
4205 l.append(author)
4206 return l
4208 def getVars(self):
4209 vars = WUserSelection.getVars( self )
4210 vars["usericon"]=quoteattr(str(Config.getInstance().getSystemIconURL("user" )))
4211 return vars
4213 class WCategoryComplexSelection(WComplexSelection):
4216 def __init__(self, category, searchAction, forceWithoutExtAuth=False):
4217 WComplexSelection.__init__(self, None, searchAction,forceWithoutExtAuth=forceWithoutExtAuth)
4218 self._category = category
4220 def _performSearch( self, criteria, exact=0 ):
4221 #this should go in the PrincipalHolder match method
4222 ah = user.AvatarHolder()
4223 resUsers = ah.match(criteria, exact=exact, forceWithoutExtAuth=self._forceWithoutExtAuth)
4224 return resUsers
4227 class WNewPerson(WTemplated):
4229 def getVars( self ):
4230 vars = WTemplated.getVars( self )
4231 options = [" ", _("Mr."), _("Ms."), _("Dr."), _("Prof.")]
4232 titles = []
4233 titleValue = vars.get("titleValue", " ")
4235 for o in options :
4236 selected = ""
4237 if titleValue == o :
4238 selected = "selected"
4239 text = """<option value="%s" %s>%s</option>"""%(o, selected, o)
4240 titles.append(text)
4241 vars["titles"] = """
4242 """.join(titles)
4244 if vars.get("disabledTitle", False) :
4245 vars["titles"] = """<input type="hidden" name="title" value="%s"></input>%s"""%(titleValue,titleValue)
4246 else :
4247 vars["titles"] = """
4248 <select name="title">
4250 </select>
4251 """%vars["titles"]
4253 if vars.get("disabledSurName", False) :
4254 vars["surName"] = """<input type="hidden" name="surName" value="%s"></input>%s"""%(vars["surNameValue"],vars["surNameValue"])
4255 else :
4256 vars["surName"] = """<input type="text" size="50" name="surName" value="%s" >"""%vars["surNameValue"]
4258 if vars.get("disabledName", False) :
4259 vars["name"] = """<input type="hidden" name="name" value="%s"></input>%s"""%(vars["nameValue"],vars["nameValue"])
4260 else :
4261 vars["name"] = """<input type="text" size="50" name="name" value="%s" >"""%vars["nameValue"]
4263 if vars.get("disabledAffiliation", False) :
4264 vars["affiliation"] = """<input type="hidden" name="affiliation" value="%s"></input>%s"""%(vars["affiliationValue"],vars["affiliationValue"])
4265 else :
4266 vars["affiliation"] = """<input type="text" size="50" name="affiliation" value="%s" >"""%vars["affiliationValue"]
4268 if vars.get("disabledEmail", False) :
4269 vars["email"] = """<input type="hidden" name="email" value="%s"></input>%s"""%(vars["emailValue"],vars["emailValue"])
4270 else :
4271 js=""
4272 if not vars.get("disabledRole", True) and vars["roleDescription"] == "Submitter":
4273 js="""onkeyup="if (!this.form.submissionControl.checked || this.value.length != 0) {this.form.warning_email.type='hidden';}else{this.form.warning_email.type='text';}">
4274 <input type="text" size="50" value="Warning: if email is empty, submission rights will not be given" style="border: 0px none ; color: red;" id="warning_email"/"""
4275 vars["email"] = """<input type="text" size="50" name="email" value="%s" %s>"""%(vars["emailValue"],js)
4276 if vars.get("disabledAddress", False) :
4277 vars["address"] = """<input type="hidden" name="address" value="%s"></input>%s"""%(vars["addressValue"],vars["addressValue"])
4278 else :
4279 vars["address"] = """<textarea name="address" rows="5" cols="38">%s</textarea>"""%vars["addressValue"]
4281 if vars.get("disabledPhone", False) :
4282 vars["phone"] = """<input type="hidden" name="phone" value="%s"></input>%s"""%(vars["phoneValue"],vars["phoneValue"])
4283 else :
4284 vars["phone"] = """<input type="text" size="50" name="phone" value="%s" >"""%vars["phoneValue"]
4286 if vars.get("disabledPhone", False) :
4287 vars["phone"] = """<input type="hidden" name="phone" value="%s"></input>%s"""%(vars["phoneValue"],vars["phoneValue"])
4288 else :
4289 vars["phone"] = """<input type="text" size="50" name="phone" value="%s" >"""%vars["phoneValue"]
4291 if vars.get("disabledFax", False) :
4292 vars["fax"] = """<input type="hidden" name="fax" value="%s"></input>%s"""%(vars["faxValue"],vars["faxValue"])
4293 else :
4294 vars["fax"] = """<input type="text" size="50" name="fax" value="%s" >"""%vars["faxValue"]
4295 if vars.get("disabledRole", True) :
4296 vars["role"] = ""
4297 else :
4298 vars["role"] = """
4299 <tr>
4300 <td nowrap class="titleCellTD"><span class="titleCellFormat">%s</span></td>
4301 <td bgcolor="white" width="100%%" valign="top" class="blacktext">%s</td>
4302 </tr>"""%(vars["roleDescription"], vars["roleValue"])
4304 if vars.get("disabledNotice", True) :
4305 vars["notice"] = ""
4306 else :
4307 vars["notice"] = """
4308 <tr>
4309 <td nowrap class="titleCellTD"></td>
4310 <td bgcolor="white" width="100%%" valign="top" class="blacktext">%s</td>
4311 </tr>"""%vars["noticeValue"]
4313 if vars.get("msg","")!="":
4314 vars["msg"]= _("""<table bgcolor="gray"><tr><td bgcolor="white">
4315 <font size="+1" color="red"><b> _("You must enter a valid email address.")</b></font>
4317 </td></tr></table>""")
4318 #raise vars["msg"]
4319 else: vars["msg"]=""
4320 return vars
4323 class WAddPersonModule(WTemplated):
4325 def __addBasketPeople(self, peopleList):
4327 user = self._rh._getUser()
4329 # add extra options if the user is logged in
4330 if user:
4331 basket = user.getPersonalInfo().getBasket().getUsers()
4333 peopleList += """<option value=""></option>"""
4335 for userId in basket:
4336 peopleList += """<option class="favoriteItem" value="%s">%s</option>"""%(userId,basket[userId].getStraightFullName())
4338 return peopleList
4339 # just add nothing if the user is not logged in
4340 else:
4341 return ""
4343 def __init__(self,personType, displayName=""):
4344 self._personType = personType
4345 self._displayName = displayName
4347 def getVars( self ):
4348 vars = WTemplated.getVars( self )
4349 if self._personType is None or self._personType == "" :
4350 raise MaKaCError( _("'personType' must be set to use the Add Person Module"))
4351 return
4353 if self._displayName != "":
4354 vars["personName"] = self._displayName
4355 else:
4356 vars["personName"] = string.capwords("%s"%self._personType)
4358 # Add people from the users basket
4359 vars["personOptions"] = self.__addBasketPeople("")
4361 vars["personOptions"] += vars["%sOptions"%self._personType]
4363 vars["personChosen"] = "%sChosen"%self._personType
4365 vars["personDefined"] = vars["%sDefined"%self._personType]
4367 if vars["personOptions"] == """<option value=""> </option>""":
4368 vars["disabledAdd"] = "disabled"
4369 else:
4370 vars["disabledAdd"] = ""
4372 vars["personType"] = self._personType
4374 if vars.get("submission",None) is not None :
4375 vars["submissionButtons"] = _("""
4376 <tr>
4377 <td colspan="4"><input type="submit" class="btn" value="_("Grant submission")" onClick="setAction(this.form,'Grant submission');"></td>
4378 </tr>
4379 <tr>
4380 <td colspan="4"><input type="submit" class="btn" value="_("Withdraw submission")" onClick="setAction(this.form,'Withdraw submission');"></td>
4381 </tr>""")
4382 else :
4383 vars["submissionButtons"] = ""
4384 return vars
4387 class WAccountAlreadyActivated(WTemplated):
4389 def __init__(self, av):
4390 self._av = av
4392 def getVars( self ):
4393 vars = WTemplated.getVars( self )
4394 return vars
4397 class WAccountActivated(WTemplated):
4399 def __init__(self, av):
4400 self._av = av
4402 def getVars( self ):
4403 vars = WTemplated.getVars( self )
4404 return vars
4407 class WAccountDisabled(WTemplated):
4409 def __init__(self, av):
4410 self._av = av
4412 def getVars( self ):
4413 vars = WTemplated.getVars( self )
4414 return vars
4417 class WUnactivatedAccount(WTemplated):
4419 def __init__(self, av):
4420 self._av = av
4422 def getVars( self ):
4423 vars = WTemplated.getVars( self )
4424 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
4425 vars["moderated"]=minfo.getModerateAccountCreation()
4426 return vars
4429 class WAbstractModIntCommentEdit(WTemplated):
4431 def __init__(self,comment):
4432 self._comment=comment
4434 def getVars(self):
4435 vars=WTemplated.getVars(self)
4436 vars["content"]=self.htmlText(self._comment.getContent())
4437 return vars
4440 class WAbstractModNewIntComment(WTemplated):
4442 def __init__(self,aw,abstract):
4443 self._aw=aw
4444 self._abstract=abstract
4446 def getVars(self):
4447 vars=WTemplated.getVars(self)
4448 return vars
4451 class WSessionModifComm(WTemplated):
4452 def __init__(self, aw,session):
4453 self._aw = aw
4454 self._session = session
4455 self._conf = session.getConference()
4457 def _getHTML(self,editCommentsURLGen):
4458 try:
4459 comment =self._session.getComments()
4460 if comment=="":
4461 comment= _("No Session Comment Entered")
4462 except:
4463 comment = _("No Session Comment Entered")
4464 self._session.setComments("")
4466 modifButton=""
4467 if self._conf.canModify(self._aw):
4469 modifButton = _("""<form action=%s method="POST">
4470 <td align="center">
4471 <input type="submit" class="btn" value="_("modify")">
4472 </td>
4473 </form>
4474 """)%quoteattr(str(editCommentsURLGen(self._session)))
4475 return ( _("""
4476 <table width="50%%" align="center" style="border-left: 1px solid #777777">
4477 <tr>
4478 <td class="groupTitle"> _("Session comment")</td>
4479 </tr>
4480 <tr>
4481 <td>
4483 </td>
4484 </tr>
4485 <tr>
4487 </tr>
4488 </table> """)%(comment,modifButton))
4490 def getVars(self):
4491 vars=WTemplated.getVars(self)
4492 vars["comment"]=self._getHTML(vars["editCommentsURLGen"])
4493 return vars
4497 class WSessionModifCommEdit(WTemplated):
4499 def __init__(self,comment):
4500 self._comment=comment
4502 def getVars(self):
4503 vars=WTemplated.getVars(self)
4504 vars["comment"]=self.htmlText(self._comment)
4505 return vars
4507 class WAbstractModIntComments(WTemplated):
4509 def __init__(self,aw,abstract):
4510 self._aw=aw
4511 self._abstract=abstract
4513 def _getCommentsHTML(self,commentEditURLGen,commentRemURLGen):
4514 res=[]
4515 commentList = self._abstract.getIntCommentList()
4516 for c in commentList:
4517 mailtoSubject="[Indico] Abstract %s: %s"%(self._abstract.getId(), self._abstract.getTitle())
4518 mailtoURL=URL("mailto:%s"%c.getResponsible().getEmail())
4519 mailtoURL.addParam("subject", mailtoSubject)
4520 responsible="""<a href=%s>%s</a>"""%(quoteattr(str(mailtoURL)),self.htmlText(c.getResponsible().getFullName()))
4521 date=self.htmlText(c.getCreationDate().strftime("%Y-%m-%d %H:%M"))
4522 buttonMod,buttonRem="",""
4523 if self._aw.getUser()==c.getResponsible():
4524 buttonMod= _("""
4525 <form action=%s method="POST">
4526 <td valign="bottom">
4527 <input type="submit" class="btn" value="_("modify")">
4528 </td>
4529 </form>
4530 """)%quoteattr(str(commentEditURLGen(c)))
4531 buttonRem= _("""
4532 <form action=%s method="POST">
4533 <td valign="bottom">
4534 <input type="submit" class="btn" value="_("remove")">
4535 </td>
4536 </form>
4537 """)%quoteattr(str(commentRemURLGen(c)))
4538 res.append("""
4539 <tr>
4540 <td bgcolor="white" style="border-top:1px solid #777777;border-bottom:1px solid #777777;">
4541 <table>
4542 <tr>
4543 <td width="100%%">%s on %s</td>
4544 </tr>
4545 <tr>
4546 <td>%s</td>
4549 </tr>
4550 </table>
4551 </td>
4552 </tr>"""%(responsible,date,c.getContent(),buttonMod,buttonRem))
4553 if res == []:
4554 res.append( _("""<tr><td align=\"center\" style=\"color:black\"><br>--_("no internal comments")--<br><br></td></tr>"""))
4555 return "".join(res)
4557 def getVars(self):
4558 vars=WTemplated.getVars(self)
4559 vars["comments"]=self._getCommentsHTML(vars["commentEditURLGen"],vars["commentRemURLGen"])
4560 vars["newCommentURL"]=quoteattr(str(vars["newCommentURL"]))
4561 return vars
4564 class WAbstractModMarkAsDup(WTemplated):
4566 def __init__(self,abstract):
4567 self._abstract=abstract
4569 def _getErrorHTML(self,msg):
4570 if msg.strip()=="":
4571 return ""
4572 return """
4573 <tr>
4574 <td align="center" colspan="2">
4575 <table align="center" valign="middle" style="padding:10px; border:1px solid #5294CC; background:#F6F6F6">
4576 <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
4577 <tr>
4578 <td>&nbsp;</td>
4579 <td><font color="red">%s</font></td>
4580 <td>&nbsp;</td>
4581 </tr>
4582 <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
4583 </table>
4584 </td>
4585 </tr>
4586 """%self.htmlText(msg)
4588 def getVars(self):
4589 vars=WTemplated.getVars(self)
4590 vars["duplicateURL"]=quoteattr(str(vars["duplicateURL"]))
4591 vars["cancelURL"]=quoteattr(str(vars["cancelURL"]))
4592 vars["error"]=self._getErrorHTML(vars.get("errorMsg",""))
4593 return vars
4596 class WAbstractModUnMarkAsDup(WTemplated):
4598 def __init__(self,abstract):
4599 self._abstract=abstract
4602 def getVars(self):
4603 vars=WTemplated.getVars(self)
4604 vars["unduplicateURL"]=quoteattr(str(vars["unduplicateURL"]))
4605 vars["cancelURL"]=quoteattr(str(vars["cancelURL"]))
4606 return vars
4609 class WConfModAbstractEditData(WTemplated):
4611 def __init__(self,conference,abstractData):
4612 self._ad=abstractData
4613 self._conf=conference
4615 #def _getTitleItemsHTML(self,selected=""):
4616 # titles=["", "Mr.", "Mrs.", "Miss.", "Prof.", "Dr."]
4617 # res=[]
4618 # for t in titles:
4619 # sel=""
4620 # if t==selected:
4621 # sel=" selected"
4622 # res.append("""<option value=%s%s>%s</option>"""%(quoteattr(t),sel,self.htmlText(t)))
4623 # return "".join(res)
4625 def _getContribTypeItemsHTML(self):
4626 res=[ _("""<option value="">--_("not specified")--</option>""")]
4627 for cType in self._conf.getContribTypeList():
4628 selected=""
4629 if cType.getId()==self._ad.getContribTypeId():
4630 selected=" selected"
4631 res.append("""<option value=%s%s>%s</option>"""%(quoteattr(cType.getId()),selected,self.htmlText(cType.getName())))
4632 return "".join(res)
4634 def _getPrimaryAuthorsHTML(self):
4635 res=[]
4636 for author in self._ad.getPrimaryAuthorList():
4637 spk_checked=""
4638 if author.isSpeaker():
4639 spk_checked=" checked"
4640 tmp= _("""
4641 <tr>
4642 <td style="border-top:1px solid #777777; border-left:1px solid #777777">
4643 <table align="center">
4644 <tr>
4645 <td>
4646 <input type="submit" class="btn" name="upPA_%s" style="cursor:pointer; background-image : url(%s);background-repeat : no-repeat;background-color : transparent;border:0px" value="">
4647 </td>
4648 </tr>
4649 <tr>
4650 <td>
4651 <input type="submit" class="btn" name="downPA_%s" style="cursor:pointer; background-image : url(%s);background-repeat : no-repeat;background-color : transparent;border:0px" value="">
4652 </td>
4653 </tr>
4654 </table>
4655 </td>
4656 <td style="border-top:1px solid #777777;" width="100%%">
4657 <input type="checkbox" name="sel_prim_author" value=%s>
4658 <input type="hidden" name="auth_prim_id" value=%s>
4659 </td>
4660 <td style="border-top:1px solid #777777;" width="100%%">
4661 <table width="95%%" cellpadding="0" cellspacing="0">
4662 <tr>
4663 <td nowrap>
4664 _("Title") <select name="auth_prim_title">%s</select>
4665 </td>
4666 </tr>
4667 <tr>
4668 <td nowrap>
4669 _("Family name") <input type="text" size="40" name="auth_prim_family_name" value=%s>
4670 _("First name") <input type="text" size="30" name="auth_prim_first_name" value=%s>
4671 </td>
4672 </tr>
4673 <tr>
4674 <td nowrap>
4675 _("Affiliation") <input type="text" size="40" name="auth_prim_affiliation" value=%s>
4676 _("Email") <input type="text" size="39" name="auth_prim_email" value=%s>
4677 </td>
4678 </tr>
4679 <tr>
4680 <td nowrap>
4681 _("Phone") <input type="text" size="14" name="auth_prim_phone" value=%s>
4682 </td>
4683 </tr>
4684 </table>
4685 </td>
4686 <td style="border-top:1px solid #777777;" valign="middle">
4687 <input type="checkbox" name="auth_prim_speaker" value=%s%s> _("presenter")
4688 </td>
4689 </tr>
4690 <tr><td colspan="3">&nbsp;</td></tr>
4691 """)%(author.getId(),\
4692 Config.getInstance().getSystemIconURL("upArrow" ), \
4693 author.getId(), \
4694 Config.getInstance().getSystemIconURL( "downArrow" ), \
4695 quoteattr(str(author.getId())),\
4696 quoteattr(str(author.getId())),\
4697 TitlesRegistry().getSelectItemsHTML(author.getTitle()), \
4698 quoteattr(author.getFamilyName()),\
4699 quoteattr(author.getFirstName()), \
4700 quoteattr(author.getAffiliation()), \
4701 quoteattr(author.getEmail()), \
4702 quoteattr(author.getPhone()),\
4703 quoteattr(str(author.getId())), spk_checked)
4704 res.append(tmp)
4705 return "".join(res)
4707 def _getCoAuthorsHTML(self):
4708 res=[]
4709 for author in self._ad.getCoAuthorList():
4710 spk_checked=""
4711 if author.isSpeaker():
4712 spk_checked=" checked"
4713 tmp= _("""
4714 <tr>
4715 <td style="border-top:1px solid #777777; border-left:1px solid #777777">
4716 <table align="center">
4717 <tr>
4718 <td>
4719 <input type="submit" class="btn" name="upCA_%s" style="cursor:pointer; background-image : url(%s);background-repeat : no-repeat;background-color : transparent;border:0px" value="">
4720 </td>
4721 </tr>
4722 <tr>
4723 <td>
4724 <input type="submit" class="btn" name="downCA_%s" style="cursor:pointer; background-image : url(%s);background-repeat : no-repeat;background-color : transparent;border:0px" value="">
4725 </td>
4726 </tr>
4727 </table>
4728 </td>
4729 <td style="border-top:1px solid #777777">
4730 <input type="checkbox" name="sel_co_author" value=%s>
4731 <input type="hidden" name="auth_co_id" value=%s>
4732 </td>
4733 <td style="border-top:1px solid #777777;">
4734 <table color="gray">
4735 <tr>
4736 <td nowrap>
4737 _("Title") <select name="auth_co_title">%s</select>
4738 </td>
4739 </tr>
4740 <tr>
4741 <td nowrap>
4742 _("Family name") <input type="text" size="40" name="auth_co_family_name" value=%s>
4743 _("First name") <input type="text" size="30" name="auth_co_first_name" value=%s>
4744 </td>
4745 </tr>
4746 <tr>
4747 <td nowrap>
4748 _("Affiliation") <input type="text" size="40" name="auth_co_affiliation" value=%s>
4749 _("Email") <input type="text" size="39" name="auth_co_email" value=%s>
4750 </td>
4751 </tr>
4752 <tr>
4753 <td nowrap>
4754 _("Phone") <input type="text" size="14" name="auth_co_phone" value=%s>
4755 </td>
4756 </tr>
4757 </table>
4758 </td>
4759 <td style="border-top:1px solid #777777;" valign="middle">
4760 <input type="checkbox" name="auth_co_speaker" value=%s%s> _("presenter")
4761 </td>
4762 </tr>
4763 <tr><td colspan="3">&nbsp;</td></tr>
4764 """)%(author.getId(),\
4765 Config.getInstance().getSystemIconURL( "upArrow" ), \
4766 author.getId(),\
4767 Config.getInstance().getSystemIconURL( "downArrow" ), \
4768 quoteattr(str(author.getId())),\
4769 quoteattr(str(author.getId())),\
4770 TitlesRegistry().getSelectItemsHTML(author.getTitle()), \
4771 quoteattr(author.getFamilyName()),\
4772 quoteattr(author.getFirstName()), \
4773 quoteattr(author.getAffiliation()), \
4774 quoteattr(author.getEmail()), \
4775 quoteattr(author.getPhone()),\
4776 quoteattr(str(author.getId())), spk_checked)
4777 res.append(tmp)
4778 return "".join(res)
4780 def _getAdditionalFieldsHTML(self, ad):
4781 html = ""
4782 abfm = self._conf.getAbstractMgr().getAbstractFieldsMgr()
4783 for f in abfm.getFields():
4784 id = f.getId()
4785 value = ad.getOtherFieldValue(id)
4786 if not f.isActive():
4787 html += """<input type="hidden" name="%s" value=%s>""" % (id,quoteattr(value))
4788 else:
4789 caption = f.getName()
4790 maxLength = int(f.getMaxLength())
4791 isMandatory = f.isMandatory()
4792 if isMandatory:
4793 mandatoryText = """<font color="red">*</font>"""
4794 else:
4795 mandatoryText = ""
4796 nbRows = 10
4797 if maxLength > 0:
4798 nbRows = int(int(maxLength)/85) + 1
4799 maxLengthJS = """<small><br><input name="maxchars%s" size="4" value="%s" disabled> char. remain</small>""" % (id.replace(" ", "_"),maxLength)
4800 maxLengthText = """ onkeyup="if (this.value.length > %s) {this.value = this.value.slice(0, %s);}; this.form.maxchars%s.value = %s - this.value.length;" onchange="if (this.value.length > %s) {this.value = this.value.slice(0, %s);}" """ % (maxLength,maxLength,id.replace(" ", "_"),maxLength,maxLength,maxLength)
4801 else:
4802 maxLengthJS = maxLengthText = ""
4803 html+= _("""
4804 <tr>
4805 <td align="right" valign="top" class="titleCellTD">
4806 <span class="titleCellFormat">
4807 %s%s%s
4808 </span>
4809 </td>
4810 <td valign="top">
4811 <textarea name="%s" cols="85" rows="%s" %s>%s</textarea>
4812 </td>
4813 </tr>
4814 """) % ( mandatoryText, caption, maxLengthJS, id, nbRows, maxLengthText, value )
4815 return html
4817 def getVars(self):
4818 vars=WTemplated.getVars(self)
4819 vars["postURL"]=quoteattr(str(vars["postURL"]))
4820 vars["title"]=quoteattr(str(self._ad.getTitle()))
4821 vars["additionalFields"]=self._getAdditionalFieldsHTML(self._ad)
4822 vars["contribTypeItems"]=self._getContribTypeItemsHTML()
4823 vars["primaryAuthors"]=self._getPrimaryAuthorsHTML()
4824 vars["coAuthors"]=self._getCoAuthorsHTML()
4825 return vars
4828 class WScheduleAddContributions(WTemplated):
4830 def __init__(self,selectList,targetDay=None):
4831 self._contribList=selectList
4832 self._targetDay=targetDay
4834 def _getContribListHTML(self):
4835 res=[]
4836 contribList=filters.SimpleFilter(None,contribFilters.SortingCriteria(["number"])).apply(self._contribList)
4837 for contrib in self._contribList:
4838 typeCaption=""
4839 if contrib.getType() is not None:
4840 typeCaption=contrib.getType().getName()
4841 l=[]
4842 for spk in contrib.getSpeakerList():
4843 l.append("""%s"""%(self.htmlText(spk.getFullName())))
4844 spksCaption="<br>".join(l)
4845 res.append("""
4846 <tr>
4847 <td valign="top">
4848 <input type="checkbox" name="manSelContribs" value=%s>
4849 </td>
4850 <td valign="top">%s</td>
4851 <td valign="top">[%s]</td>
4852 <td valign="top"><i>%s</i></td>
4853 <td valign="top">%s</td>
4854 </tr>
4855 """%(quoteattr(str(contrib.getId())),
4856 self.htmlText(contrib.getId()),
4857 self.htmlText(typeCaption),
4858 self.htmlText(contrib.getTitle()),
4859 spksCaption))
4860 return "".join(res)
4863 def getVars(self):
4864 vars=WTemplated.getVars(self)
4865 vars["contribs"]="".join(self._getContribListHTML())
4866 vars["targetDay"]=""
4867 if self._targetDay is not None:
4868 vars["targetDay"]="""<input type="hidden" name="targetDay" value=%s>"""%(quoteattr(str(self._targetDay.strftime("%Y-%m-%d"))))
4869 return vars
4872 class WSchEditContrib(WTemplated):
4874 def __init__(self,contrib):
4875 self._contrib=contrib
4877 def getVars(self):
4878 vars=WTemplated.getVars(self)
4879 vars["postURL"]=quoteattr(str(vars["postURL"]))
4880 vars["title"]=self.htmlText(self._contrib.getTitle())
4881 confTZ = self._contrib.getConference().getTimezone()
4882 sDate=self._contrib.getStartDate().astimezone(timezone(confTZ))
4883 vars["sYear"]=quoteattr(str(sDate.year))
4884 vars["sMonth"]=quoteattr(str(sDate.month))
4885 vars["sDay"]=quoteattr(str(sDate.day))
4886 vars["sHour"]=quoteattr(str(sDate.hour))
4887 vars["sMinute"]=quoteattr(str(sDate.minute))
4888 vars["durHours"]=quoteattr(str(int(self._contrib.getDuration().seconds/3600)))
4889 vars["durMins"]=quoteattr(str(int((self._contrib.getDuration().seconds%3600)/60)))
4890 defaultDefinePlace=defaultDefineRoom=""
4891 defaultInheritPlace=defaultInheritRoom="checked"
4892 locationName,locationAddress,roomName="","",""
4893 if self._contrib.getOwnLocation():
4894 defaultDefinePlace,defaultInheritPlace="checked",""
4895 locationName=self._contrib.getLocation().getName()
4896 locationAddress=self._contrib.getLocation().getAddress()
4897 if self._contrib.getOwnRoom():
4898 defaultDefineRoom,defaultInheritRoom="checked",""
4899 roomName=self._contrib.getRoom().getName()
4900 vars["defaultInheritPlace"]=defaultInheritPlace
4901 vars["defaultDefinePlace"]=defaultDefinePlace
4902 vars["confPlace"]=""
4903 confLocation=self._contrib.getOwner().getLocation()
4904 if self._contrib.isScheduled():
4905 confLocation=self._contrib.getSchEntry().getSchedule().getOwner().getLocation()
4906 if confLocation:
4907 vars["confPlace"]=confLocation.getName()
4908 vars["locationName"]=locationName
4909 vars["locationAddress"]=locationAddress
4910 vars["defaultInheritRoom"]=defaultInheritRoom
4911 vars["defaultDefineRoom"]=defaultDefineRoom
4912 vars["confRoom"]=""
4913 confRoom=self._contrib.getOwner().getRoom()
4914 if self._contrib.isScheduled():
4915 confRoom=self._contrib.getSchEntry().getSchedule().getOwner().getRoom()
4916 if confRoom:
4917 vars["confRoom"]=confRoom.getName()
4918 vars["roomName"]=quoteattr(roomName)
4919 vars["parentType"]="conference"
4920 if self._contrib.getSession() is not None:
4921 vars["parentType"]="session"
4922 if self._contrib.isScheduled():
4923 vars["parentType"]="session slot"
4924 vars["boardNumber"]=quoteattr(str(self._contrib.getBoardNumber()))
4925 vars["autoUpdate"] = ""
4926 return vars
4929 class WConfModParticipEdit(WTemplated):
4931 def __init__(self,title="",part=None):
4932 self._part=part
4933 self._ctitle=title
4935 def getVars(self):
4936 vars=WTemplated.getVars(self)
4937 vars["postURL"]=quoteattr(str(vars["postURL"]))
4938 vars["caption"]=self.htmlText(self._ctitle)
4939 title,firstName,familyName="","",""
4940 affiliation,email,address,phone,fax="","","","",""
4941 if self._part is not None:
4942 title=self._part.getTitle()
4943 firstName=self._part.getFirstName()
4944 familyName=self._part.getFamilyName()
4945 affiliation=self._part.getAffiliation()
4946 email=self._part.getEmail()
4947 address=self._part.getAddress()
4948 phone=self._part.getPhone()
4949 fax=self._part.getFax()
4950 vars["titles"]=TitlesRegistry().getSelectItemsHTML(title)
4951 vars["surName"]=quoteattr(familyName)
4952 vars["name"]=quoteattr(firstName)
4953 vars["affiliation"]=quoteattr(affiliation)
4954 vars["email"]=quoteattr(email)
4955 vars["address"]=address
4956 vars["phone"]=quoteattr(phone)
4957 vars["fax"]=quoteattr(fax)
4958 if not vars.has_key("addToManagersList"):
4959 vars["addToManagersList"]=""
4960 return vars
4962 class WSessionModEditDataCode(WTemplated):
4964 def __init__(self):
4965 pass
4967 def getVars( self ):
4968 vars=WTemplated.getVars(self)
4969 vars["code"]=quoteattr(str(vars.get("code","")))
4970 return vars
4972 class WSessionModEditDataType(WTemplated):
4974 def __init__(self):
4975 pass
4977 def getVars( self ):
4978 vars=WTemplated.getVars(self)
4979 l=[]
4980 currentTTType=vars.get("tt_type",conference.SlotSchTypeFactory.getDefaultId())
4981 for i in conference.SlotSchTypeFactory.getIdList():
4982 sel=""
4983 if i==currentTTType:
4984 sel=" selected"
4985 l.append("""<option value=%s%s>%s</option>"""%(quoteattr(str(i)),
4986 sel,self.htmlText(i)))
4987 vars["tt_types"]="".join(l)
4988 return vars
4990 class WSessionModEditDataColors(WTemplated):
4992 def __init__(self):
4993 pass
4995 def getVars( self ):
4996 vars=WTemplated.getVars(self)
4997 return vars
4999 class WSessionModEditData(WTemplated):
5001 def __init__(self,targetConf,aw,pageTitle="",targetDay=None):
5002 self._conf=targetConf
5003 self._title=pageTitle
5004 self._targetDay=targetDay
5005 self._aw = aw
5007 def _getErrorHTML(self,l):
5008 if len(l)>0:
5009 return """
5010 <tr>
5011 <td colspan="2" align="center">
5012 <br>
5013 <table bgcolor="red" cellpadding="6">
5014 <tr>
5015 <td bgcolor="white" style="color: red">%s</td>
5016 </tr>
5017 </table>
5018 <br>
5019 </td>
5020 </tr>
5021 """%"<br>".join(l)
5022 else:
5023 return ""
5025 def getVars( self ):
5026 vars=WTemplated.getVars(self)
5027 vars["conference"] = self._conf
5028 vars["eventId"] = "s" + vars["sessionId"]
5029 minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
5030 vars["useRoomBookingModule"] = minfo.getRoomBookingModuleActive()
5031 vars["calendarIconURL"]=Config.getInstance().getSystemIconURL( "calendar" )
5032 vars["calendarSelectURL"]=urlHandlers.UHSimpleCalendar.getURL()
5033 vars["pageTitle"]=self.htmlText(self._title)
5034 vars["errors"]=self._getErrorHTML(vars.get("errors",[]))
5035 vars["postURL"]=quoteattr(str(vars["postURL"]))
5036 vars["title"]=quoteattr(str(vars.get("title","")))
5037 vars["description"]=self.htmlText(vars.get("description",""))
5038 if self._targetDay == None:
5039 sessionId = vars["sessionId"]
5040 session = self._conf.getSessionById(sessionId)
5041 refDate = session.getAdjustedStartDate()
5042 else:
5043 refDate=self._conf.getSchedule().getFirstFreeSlotOnDay(self._targetDay)
5044 endDate = None
5045 if refDate.hour == 23:
5046 refDate = refDate - timedelta(minutes=refDate.minute)
5047 endDate = refDate + timedelta(minutes=59)
5048 vars["sDay"]=str(vars.get("sDay",refDate.day))
5049 vars["sMonth"]=str(vars.get("sMonth",refDate.month))
5050 vars["sYear"]=str(vars.get("sYear",refDate.year))
5051 vars["sHour"]=str(vars.get("sHour",refDate.hour))
5052 vars["sMinute"]=str(vars.get("sMinute",refDate.minute))
5053 if not endDate:
5054 endDate=refDate+timedelta(hours=1)
5055 vars["eDay"]=str(vars.get("eDay",endDate.day))
5056 vars["eMonth"]=str(vars.get("eMonth",endDate.month))
5057 vars["eYear"]=str(vars.get("eYear",endDate.year))
5058 vars["eHour"]=str(vars.get("eHour",endDate.hour))
5059 vars["eMinute"]=str(vars.get("eMinute",endDate.minute))
5060 vars["durHour"]=quoteattr(str(vars.get("durHour",0)))
5061 vars["durMin"]=quoteattr(str(vars.get("durMin",20)))
5062 vars["defaultInheritPlace"]="checked"
5063 vars["defaultDefinePlace"]=""
5065 if vars.get("convenerDefined",None) is None :
5066 sessionId = vars["sessionId"]
5067 session = self._conf.getSessionById(sessionId)
5068 html = []
5069 for convener in session.getConvenerList() :
5070 text = """
5071 <tr>
5072 <td width="5%%"><input type="checkbox" name="%ss" value="%s"></td>
5073 <td>&nbsp;%s</td>
5074 </tr>"""%("convener",convener.getId(),convener.getFullName())
5075 html.append(text)
5076 vars["definedConveners"] = """
5077 """.join(html)
5078 if vars.get("locationAction","")=="define":
5079 vars["defaultInheritPlace"]=""
5080 vars["defaultDefinePlace"]="checked"
5081 vars["confPlace"]=""
5082 confLocation=self._conf.getConference().getLocation()
5083 if confLocation:
5084 vars["confPlace"]=self.htmlText(confLocation.getName())
5085 vars["locationName"]=quoteattr(str(vars.get("locationName","")))
5086 vars["locationAddress"]=self.htmlText(vars.get("locationAddress",""))
5087 vars["defaultInheritRoom"]=""
5088 vars["defaultDefineRoom"]=""
5089 vars["defaultExistRoom"]=""
5090 if vars.get("roomAction","")=="inherit":
5091 vars["defaultInheritRoom"]="checked"
5092 roomName = ""
5093 elif vars.get("roomAction","")=="define":
5094 vars["defaultDefineRoom"]="checked"
5095 roomName = vars.get( "bookedRoomName" ) or vars.get("roomName","")
5096 elif vars.get("roomAction","")=="exist":
5097 vars["defaultExistRoom"]="checked"
5098 roomName = vars.get("exists", "") or vars.get("roomName","")
5099 else:
5100 vars["defaultInheritRoom"]="checked"
5101 roomName = ""
5104 vars["confRoom"]=""
5105 rx=[]
5106 roomsexist = self._conf.getRoomList()
5107 roomsexist.sort()
5108 for room in roomsexist:
5109 sel=""
5110 if room==roomName:
5111 sel="selected=\"selected\""
5112 rx.append("""<option value=%s %s>%s</option>"""%(quoteattr(str(room)),
5113 sel,self.htmlText(room)))
5114 vars ["roomsexist"] = "".join(rx)
5115 confRoom=self._conf.getConference().getRoom()
5116 if confRoom:
5117 vars["confRoom"]=self.htmlText(confRoom.getName())
5118 vars["roomName"]=quoteattr(str(roomName))
5120 vars["autoUpdate"]=""
5121 if not self._conf.getEnableSessionSlots():
5122 vars["disabled"] = "disabled"
5123 else:
5124 vars["disabled"] = ""
5125 if self._title.find("Ed") != -1 and self._conf.getEnableSessionSlots():
5126 vars["adjustSlots"]= _("""<input type="checkbox" name="slmove" value="1"> _("Also move timetable entries")""")
5127 else:
5128 vars["adjustSlots"]="""<input type="hidden" name="slmove" value="1">"""
5129 import MaKaC.webinterface.webFactoryRegistry as webFactoryRegistry
5130 wr = webFactoryRegistry.WebFactoryRegistry()
5131 wf = wr.getFactory(self._conf)
5132 if wf != None:
5133 type = wf.getId()
5134 else:
5135 type = "conference"
5136 if type == "conference":
5137 vars["Type"]=WSessionModEditDataType().getHTML(vars)
5138 vars["Colors"]=WSessionModEditDataColors().getHTML(vars)
5139 vars["code"]=WSessionModEditDataCode().getHTML(vars)
5140 else:
5141 vars["Type"]=""
5142 vars["Colors"]=""
5143 vars["code"]=""
5144 return vars
5146 #--------------------------------------------------------------------------------------
5148 class WConfModMoveContribsToSessionConfirmation(WTemplated):
5150 def __init__(self,conf,contribIdList=[],targetSession=None):
5151 self._conf=conf
5152 self._contribIdList=contribIdList
5153 self._targetSession=targetSession
5155 def _getWarningsHTML(self):
5156 wl=[]
5157 for id in self._contribIdList:
5158 contrib=self._conf.getContributionById(id)
5159 if contrib is None:
5160 continue
5161 spkList=[]
5162 for spk in contrib.getSpeakerList():
5163 spkList.append(self.htmlText(spk.getFullName()))
5164 spkCaption=""
5165 if len(spkList)>0:
5166 spkCaption=" by %s"%"; ".join(spkList)
5167 if (contrib.getSession() is not None and \
5168 contrib.getSession()!=self._targetSession):
5169 scheduled=""
5170 if contrib.isScheduled():
5171 scheduled= _(""" _("and scheduled") (%s)""")%self.htmlText(contrib.getStartDate().strftime("%Y-%b-%d %H:%M"))
5172 wl.append( _("""
5173 <li>%s-<i>%s</i>%s: is <font color="red"> _("already in session") <b>%s</b>%s</font></li>
5174 """)%(self.htmlText(contrib.getId()),
5175 self.htmlText(contrib.getTitle()),
5176 spkCaption,
5177 self.htmlText(contrib.getSession().getTitle()),
5178 scheduled))
5179 if (contrib.getSession() is None and \
5180 self._targetSession is not None and \
5181 contrib.isScheduled()):
5182 wl.append( _("""
5183 <li>%s-<i>%s</i>%s: is <font color="red"> _("scheduled") (%s)</font></li>
5184 """)%(self.htmlText(contrib.getId()),
5185 self.htmlText(contrib.getTitle()),
5186 spkCaption,
5187 self.htmlText(contrib.getStartDate().strftime("%Y-%b-%d %H:%M"))))
5188 return "<ul>%s</ul>"%"".join(wl)
5190 def getVars(self):
5191 vars=WTemplated.getVars(self)
5192 vars["postURL"]=quoteattr(str(vars["postURL"]))
5193 vars["systemIconWarning"]=Config.getInstance().getSystemIconURL("warning")
5194 vars["contribIdList"]=", ".join(self._contribIdList)
5195 vars["targetSession"]="--none--"
5196 if self._targetSession is not None:
5197 vars["targetSession"]=self.htmlText("%s"%self._targetSession.getTitle())
5198 vars["warnings"]=self._getWarningsHTML()
5199 vars["targetSessionId"]=quoteattr("--none--")
5200 if self._targetSession is not None:
5201 vars["targetSessionId"]=quoteattr(str(self._targetSession.getId()))
5202 l=[]
5203 for id in self._contribIdList:
5204 l.append("""<input type="hidden" name="contributions" value=%s">"""%quoteattr(str(id)))
5205 vars["contributions"]="\n".join(l)
5206 return vars
5209 class WConfTBDrawer:
5211 def __init__(self,tb):
5212 self._tb=tb
5214 def getHTML(self):
5215 if self._tb is None:
5216 return ""
5217 res=[]
5218 for item in self._tb.getItemList():
5219 if not item.isEnabled():
5220 continue
5221 res.append("""
5222 <td align="right" nowrap><a href=%s><img src=%s alt=%s></a></td>
5223 """%(quoteattr(str(item.getActionURL())),
5224 quoteattr(str(item.getIcon())),
5225 quoteattr(item.getCaption())))
5226 if res != []:
5227 return """
5228 <table cellpadding="0" cellspacing="1">
5229 <tr>
5231 </tr>
5232 </table>
5233 """%("".join(res))
5234 return ""
5236 class WErrorMessage :
5238 def getHTML( self, vars ):
5240 if vars.get("errorMsg", None) is None :
5241 return ""
5242 if type(vars["errorMsg"]) != list:
5243 vars["errorMsg"]=[vars["errorMsg"]]
5244 for i in range(0,len(vars["errorMsg"])) :
5245 vars["errorMsg"][i] = """<span style="color: red;">"""+vars["errorMsg"][i]+"""</span>"""
5247 errorMsg = """
5248 """.join(vars["errorMsg"])
5250 html = """
5251 <div class="errorMsgBox">
5253 </div>
5254 """%errorMsg
5256 return html
5258 class WInfoMessage :
5260 def getHTML( self, vars ):
5261 if vars.get("infoMsg", None) is None :
5262 return ""
5263 if type(vars["infoMsg"]) != list:
5264 vars["infoMsg"]=[vars["infoMsg"]]
5265 for i in range(0,len(vars["infoMsg"])) :
5266 vars["infoMsg"][i] = """<span style="color: green;">"""+vars["infoMsg"][i]+"""</span>"""
5268 infoMsg = """
5269 """.join(vars["infoMsg"])
5271 html = """
5272 <div class="errorMsgBox">
5274 </div>
5275 """%infoMsg
5277 return html
5279 class WConfTickerTapeDrawer(WTemplated):
5281 def __init__(self,conf, tz=None):
5282 self._conf=conf
5283 self._tz = tz
5284 dm = displayMgr.ConfDisplayMgrRegistery().getDisplayMgr(self._conf, False)
5285 self._tickerTape = dm.getTickerTape()
5287 def getNowHappeningHTML( self, params=None ):
5288 if not self._tickerTape.isActive():
5289 return None
5291 html = WTemplated.getHTML( self, params )
5293 if html == "":
5294 return None
5296 return html
5298 def getSimpleText( self ):
5299 if not self._tickerTape.isSimpleTextEnabled() or \
5300 self._tickerTape.getText().strip() == "":
5301 return None
5303 return self._tickerTape.getText()
5305 def getVars(self):
5306 vars = WTemplated.getVars( self )
5308 vars["nowHappeningArray"] = None
5309 if self._tickerTape.isNowHappeningEnabled():
5310 vars["nowHappeningArray"] = self._getNowHappening()
5312 return vars
5314 def _getNowHappening( self ):
5315 # This will contain a string formated for use in the template
5316 # javascripts
5317 nowHappeningArray = None
5319 # currently happening:
5320 n = nowutc()
5321 entries = self._conf.getSchedule().getEntriesOnDate(n)
5322 entryCaptions = []
5323 for entry in entries:
5324 if isinstance(entry, schedule.LinkedTimeSchEntry) and \
5325 isinstance(entry.getOwner(), conference.SessionSlot):
5326 ss=entry.getOwner()
5327 ssEntries=ss.getSchedule().getEntriesOnDate(n)
5328 if isinstance(ss.getSchedule(), conference.PosterSlotSchedule):
5329 ssEntries=ss.getSchedule().getEntries()
5330 for ssEntry in ssEntries:
5331 title=ssEntry.getTitle()
5332 if isinstance(ssEntry.getOwner(), conference.Contribution):
5333 title="""<a href=%s>%s</a>"""%( \
5334 quoteattr(str(urlHandlers.UHContributionDisplay.getURL(ssEntry.getOwner()))), title)
5335 else:
5336 title="""<a href=%s>%s</a>"""%( \
5337 quoteattr(str(urlHandlers.UHSessionDisplay.getURL(ssEntry.getOwner()))), title)
5338 if ssEntry.getOwnRoom() is not None:
5339 if self._conf.getRoom() is None or \
5340 ssEntry.getOwnRoom().getName().strip().lower() != self._conf.getRoom().getName().strip().lower():
5341 title="%s (%s)"%(title, ssEntry.getOwnRoom().getName().strip())
5342 entryCaptions.append("%s <em>%s-%s</em>" %(title,
5343 entry.getAdjustedStartDate(self._tz).strftime("%H:%M"), \
5344 entry.getAdjustedEndDate(self._tz).strftime("%H:%M")))
5345 else:
5346 title=entry.getTitle()
5347 if isinstance(entry.getOwner(), conference.Contribution):
5348 title="""<a href=%s>%s</a>"""%(quoteattr(str(urlHandlers.UHContributionDisplay.getURL(entry.getOwner()))), title)
5349 else:
5350 url=urlHandlers.UHConferenceTimeTable.getURL(self._conf)
5351 url.addParam("showDate",entry.getStartDate().strftime("%d-%B-%Y"))
5352 title="""<a href=%s>%s</a>"""%(quoteattr(str(url)), title)
5353 if entry.getOwnRoom() is not None:
5354 if self._conf.getRoom() is None or \
5355 entry.getOwnRoom().getName().strip().lower() != self._conf.getRoom().getName().strip().lower():
5356 title="%s (%s)"%(title, entry.getOwnRoom().getName().strip())
5357 entryCaptions.append("%s <em>%s-%s</em>" %(title,
5358 entry.getAdjustedStartDate(self._tz).strftime("%H:%M"), \
5359 entry.getAdjustedEndDate(self._tz).strftime("%H:%M")))
5360 if entryCaptions!=[]:
5361 nowHappeningArray = """['%s']""" %("', '".join(entryCaptions))
5363 return nowHappeningArray
5365 class WSubmitMaterialLink(WTemplated):
5367 def __init__(self, filenb, availMF):
5368 self._filenb=filenb
5369 self._availMF=availMF
5371 def getVars(self):
5372 vars=WTemplated.getVars(self)
5373 vars["itemNumber"]=self._filenb
5374 vars["materialTypeSelectFieldName"]="LinkType%s"%self._filenb
5375 vars["materialTypeInputFieldName"]="LinkTypeFT%s"%self._filenb
5376 vars["urlFieldName"]="link%s"%self._filenb
5377 l=[ _("""<option value="notype">--_("Select a type")--</option>""")]
5378 selMatType=vars.get("LinkType%s" % self._filenb,"")
5379 for mf in self._availMF:
5380 try:
5381 id = mf.getId()
5382 title = mf.getTitle()
5383 except:
5384 id = mf
5385 title = mf.capitalize()
5386 selected=""
5387 if id==selMatType:
5388 selected=" selected"
5389 l.append("""<option value=%s%s>%s</option>"""%(\
5390 quoteattr(str(id)),selected,
5391 self.htmlText(title)))
5392 vars["matTypeItems"]="".join(l)
5393 if vars.get("LinkTypeFT%s" % self._filenb, "") != "":
5394 vars["materialTypeInputFieldValue"] = vars.get("LinkTypeFT%s" % self._filenb, "")
5395 else:
5396 vars["materialTypeInputFieldValue"] = ""
5397 if vars.get("link%s" % self._filenb, "") != "":
5398 vars["linkValue"] = vars.get("link%s" % self._filenb, "")
5399 else:
5400 vars["linkValue"] = ""
5401 return vars
5403 class WSubmitMaterialFile(WTemplated):
5405 def __init__(self, filenb, availMF):
5406 self._filenb=filenb
5407 self._availMF=availMF
5409 def getVars(self):
5410 vars=WTemplated.getVars(self)
5411 vars["itemNumber"]=self._filenb
5412 vars["materialTypeSelectFieldName"]="FileType%s"%self._filenb
5413 vars["materialTypeInputFieldName"]="FileTypeFT%s"%self._filenb
5414 vars["fileFieldName"]="file%s"%self._filenb
5415 l=[ _("""<option value="notype">--_("Select a type")--</option>""")]
5416 selMatType=vars.get("FileType%s" % self._filenb,"")
5417 for mf in self._availMF:
5418 try:
5419 id = mf.getId()
5420 title = mf.getTitle()
5421 except:
5422 id = mf
5423 title = mf.capitalize()
5424 selected=""
5425 if id==selMatType:
5426 selected=" selected"
5427 l.append("""<option value=%s%s>%s</option>"""%(\
5428 quoteattr(str(id)),selected,
5429 self.htmlText(title)))
5430 vars["matTypeItems"]="".join(l)
5431 if vars.get("FileTypeFT%s" % self._filenb, "") != "":
5432 vars["materialTypeInputFieldValue"] = vars.get("FileTypeFT%s" % self._filenb, "")
5433 else:
5434 vars["materialTypeInputFieldValue"] = ""
5435 if vars.get("FileNewName%s" % self._filenb, "") != "":
5436 vars["fileName"] = vars.get("FileNewName%s" % self._filenb)
5437 else:
5438 vars["fileName"] = ""
5439 vars["fileNewName"] = "FileNewName%s" % self._filenb
5440 return vars
5442 class WMaterialListFile(WTemplated):
5444 def __init__(self, target):
5445 self._target=target
5447 def getVars(self):
5448 vars=WTemplated.getVars(self)
5449 try:
5450 name=self._target.getFileName()
5451 except:
5452 name=self._target.getURL()
5453 vars["fileName"]=name
5454 if self._target.getName()!="" and name!=self._target.getName():
5455 vars["fileName"]+=" (%s)" % self._target.getName()
5456 vars["fileActions"] = ""
5457 if isinstance(self._target, conference.Link):
5458 if vars["resourcesLinkModifHandler"]:
5459 vars["fileActions"] += """<a href="%s"><img src="%s" alt="Edit" style="margin-left: 5px; vertical-align:middle" /></a>"""%(vars["resourcesLinkModifHandler"].getURL(self._target), Config.getInstance().getSystemIconURL("file_edit"))
5460 if vars["resourcesLinkProtectHandler"]:
5461 vars["fileActions"] += """<a href="%s"><img src="%s" alt="Protect" style="margin-left: 5px; vertical-align:middle" /></a>"""%(vars["resourcesLinkProtectHandler"].getURL(self._target), Config.getInstance().getSystemIconURL("file_protect"))
5462 elif isinstance(self._target, conference.LocalFile):
5463 if vars["resourcesFileModifHandler"]:
5464 vars["fileActions"] += """<a href="%s"><img src="%s" alt="Edit" style="margin-left: 5px; vertical-align:middle" /></a>"""%(vars["resourcesFileModifHandler"].getURL(self._target), Config.getInstance().getSystemIconURL("file_edit"))
5465 if vars["resourcesFileProtectHandler"]:
5466 vars["fileActions"] += """<a href="%s"><img alt="Protected" src="%s" style="margin-left: 5px; vertical-align:middle"/></a>"""%(vars["resourcesFileProtectHandler"].getURL(self._target), Config.getInstance().getSystemIconURL("file_protect"))
5467 vars["deleteIconURL"]=Configuration.Config.getInstance().getSystemIconURL("smallDelete")
5468 vars["delName"]="delete-%s-%s"% (self._target.getOwner().getId(),self._target.getId())
5469 try:
5470 vars["fileInfo"]="[%s bytes - %s]" % (self._target.getSize(),self._target.getCreationDate().strftime("%d.%m.%Y %H:%M:%S"))
5471 except:
5472 vars["fileInfo"]="[link]"
5473 if self._target.isProtected():
5474 vars["fileActions"] += """<img src="%s" alt="Protected" style="vertical-align: middle; border: 0;">""" % Config.getInstance().getSystemIconURL("protected")
5475 if isinstance(self._target, conference.Link):
5476 vars["fileAccessURL"]=quoteattr(str(self._target.getURL()))
5477 else:
5478 vars["fileAccessURL"]=quoteattr(str(urlHandlers.UHFileAccess.getURL(self._target)))
5479 return vars
5481 class WMaterialListItem(WTemplated):
5483 def __init__(self, target, returnURL=""):
5484 self._target=target
5485 self._returnURL = returnURL.strip('"')
5487 def getVars(self):
5488 vars=WTemplated.getVars(self)
5489 deleteURL = None
5490 mf = None
5491 from MaKaC.webinterface.materialFactories import ConfMFRegistry,SessionMFRegistry,ContribMFRegistry
5492 if isinstance(self._target.getOwner(),conference.Conference):
5493 mf=ConfMFRegistry().get(self._target)
5494 deleteURL = urlHandlers.UHConferenceRemoveMaterials.getURL(self._target)
5495 elif isinstance(self._target.getOwner(),conference.Session):
5496 mf=SessionMFRegistry().get(self._target)
5497 deleteURL = urlHandlers.UHSessionRemoveMaterials.getURL(self._target)
5498 elif isinstance(self._target.getOwner(),conference.Contribution):
5499 mf=ContribMFRegistry().get(self._target)
5500 contrib=self._target.getOwner()
5501 deleteURL = urlHandlers.UHContributionRemoveMaterials.getURL(self._target)
5502 elif isinstance(self._target.getOwner(),conference.SubContribution):
5503 mf=ContribMFRegistry().get(self._target)
5504 deleteURL = urlHandlers.UHSubContributionRemoveMaterials.getURL(self._target)
5505 elif isinstance(self._target.getOwner(),conference.Category):
5506 deleteURL = urlHandlers.UHCategoryRemoveMaterial.getURL(self._target)
5507 if deleteURL:
5508 deleteURL.addParam("returnURL",self._returnURL)
5509 vars["materialName"] = self._target.getTitle()
5510 vars["materialActions"] = ""
5511 vars["materialActions"] += """<a href="%s" onClick="return confirm('Are you sure you want to delete all files of this type?');"><img src="%s" alt="Delete" style="margin-left: 5px; vertical-align:middle;"></a>""" % (str(deleteURL),Config.getInstance().getSystemIconURL("smallDelete"))
5512 if vars["materialModifHandler"]:
5513 vars["materialActions"] += """<a href="%s"><img src="%s" alt="Edit" style="margin-left: 5px; vertical-align:middle;"></a>""" % (urlHandlers.UHMaterialModification.getURL(self._target),Config.getInstance().getSystemIconURL("file_edit"))
5514 if vars["materialProtectHandler"]:
5515 vars["materialActions"] += """<a href="%s"><img src="%s" alt="Protect" style="margin-left: 5px; vertical-align:middle;" /></a>""" % (vars["materialProtectHandler"].getURL(self._target),Config.getInstance().getSystemIconURL("file_protect"))
5516 if self._target.isProtected():
5517 vars["materialActions"] += """<img src="%s" alt="Protected" style="margin-left: 5px; vertical-align: middle; border: 0;" />""" % Config.getInstance().getSystemIconURL("protected")
5518 vars["fileList"]=""
5519 for resource in self._target.getResourceList():
5520 vars["fileList"] += WMaterialListFile(resource).getHTML(vars)
5521 if mf is None:
5522 vars["materialIcon"]=quoteattr(str(Config.getInstance().getSystemIconURL("material")))
5523 else:
5524 vars["materialIcon"]=quoteattr(str(mf.getIconURL()))
5525 return vars
5528 class WShowExistingMaterial(WTemplated):
5530 def __init__(self,target, mode='display', showTitle=True):
5532 mode should be 'display' or 'management'
5534 self._target=target
5535 self._mode = mode
5536 self._showTitle = showTitle
5539 def getVars(self):
5540 vars=WTemplated.getVars(self)
5542 # yes, this may look a bit redundant, but materialRegistry isn't
5543 # bound to a particular target
5544 materialRegistry = self._target.getMaterialRegistry()
5545 vars["materialList"] = materialRegistry.getMaterialList(self._target)
5548 if self._showTitle:
5549 vars["existingMaterialsTitle"] = """ <div class="groupTitle" id="title">%s</div>""" % _("Existing material")
5550 else:
5551 vars["existingMaterialsTitle"] = " "
5552 vars["materialModifHandler"] = vars.get("materialModifHandler", None)
5553 vars["materialProtectHandler"] = vars.get("materialProtectHandler", None)
5554 vars["resourcesFileModifHandler"] = vars.get("resourcesFileModifHandler", None)
5555 vars["resourcesFileProtectHandler"] = vars.get("resourcesFileProtectHandler", None)
5556 vars["resourcesLinkModifHandler"] = vars.get("resourcesLinkModifHandler", None)
5557 vars["resourcesLinkProtectHandler"] = vars.get("resourcesLinkProtectHandler", None)
5558 vars['mode'] = self._mode
5560 return vars
5562 class WShowExistingReviewingMaterial(WTemplated):
5564 def __init__(self,target,showTitle=True, showSendButton=False):
5565 self._target=target
5566 self._showTitle=showTitle
5567 self._showSendButton = showSendButton
5570 def getVars(self):
5571 vars=WTemplated.getVars(self)
5573 if self._showTitle:
5574 vars["existingMaterialsTitle"] = """ <div class="groupTitle" id="title">%s</div>""" % _("Existing Reviewing material")
5575 else:
5576 vars["existingMaterialsTitle"] = " "
5577 vars["materialModifHandler"] = vars.get("materialModifHandler", None)
5578 vars["materialProtectHandler"] = vars.get("materialProtectHandler", None)
5579 vars["resourcesFileModifHandler"] = vars.get("resourcesFileModifHandler", None)
5580 vars["resourcesFileProtectHandler"] = vars.get("resourcesFileProtectHandler", None)
5581 vars["resourcesLinkModifHandler"] = vars.get("resourcesLinkModifHandler", None)
5582 vars["resourcesLinkProtectHandler"] = vars.get("resourcesLinkProtectHandler", None)
5583 # This var shows you if you are requesting the template from the contribution display (True)
5584 # or from the paper reviewing tab in the contribution (False), as consequence you will have (or not)
5585 # the "send" button
5586 vars["showSendButton"] = self._showSendButton
5588 return vars
5590 class WAddNewMaterial(WTemplated):
5592 def __init__(self,target,availMF):
5593 self._target=target
5594 self._availMF=availMF
5596 def _getErrorHTML(self,errorList):
5597 if len(errorList)==0:
5598 return ""
5599 return """
5600 <tr>
5601 <td>&nbsp;</td>
5602 </tr>
5603 <tr>
5604 <td colspan="2" align="center">
5605 <table bgcolor="red">
5606 <tr>
5607 <td bgcolor="white">
5608 <font color="red">%s</font>
5609 </td>
5610 </tr>
5611 </table>
5612 </td>
5613 </tr>
5614 <tr>
5615 <td>&nbsp;</td>
5616 </tr>
5617 """%("<br>".join(errorList))
5619 def _getTargetName(self):
5620 if isinstance(self._target, conference.Contribution):
5621 return "Contribution"
5622 elif isinstance(self._target, conference.SubContribution):
5623 return "Subcontribution"
5624 elif isinstance(self._target, conference.Conference):
5625 return "Event"
5626 return ""
5628 def getVars(self):
5629 vars=WTemplated.getVars(self)
5630 nbFiles=int(vars.get("nbFiles",1))
5631 nbLinks=int(vars.get("nbLinks",1))
5632 vars["targetName"]=self._getTargetName()
5633 vars["targetId"]=self.htmlText(self._target.getId())
5634 vars["targetTitle"]=self.htmlText(self._target.getTitle())
5636 vars["selectNumberOfFiles"] = ""
5637 for i in range(1,10):
5638 if i == nbFiles:
5639 vars["selectNumberOfFiles"] += "<option selected>%s" % i
5640 else:
5641 vars["selectNumberOfFiles"] += "<option>%s" % i
5642 vars["fileSubmitForms"] = ""
5643 for i in range(1,nbFiles+1):
5644 vars["fileSubmitForms"] += WSubmitMaterialFile(i,self._availMF).getHTML(vars)
5645 vars["selectNumberOfLinks"] = ""
5646 for i in range(1,10):
5647 if i == nbLinks:
5648 vars["selectNumberOfLinks"] += "<option selected>%s" % i
5649 else:
5650 vars["selectNumberOfLinks"] += "<option>%s" % i
5651 vars["linkSubmitForms"] = ""
5652 for i in range(1,nbLinks+1):
5653 vars["linkSubmitForms"] += WSubmitMaterialLink(i,self._availMF).getHTML(vars)
5654 vars["conversion"]=""
5655 if Configuration.Config.getInstance().hasFileConverter():
5656 vars["conversion"]="""
5657 <tr>
5658 <td class="titleCellTD"><span class="titleCellFormat">To PDF</span></td>
5659 <td><input type="checkbox" name="topdf" checked="checked">Automatic conversion to pdf (when applicable)? (PPT, DOC)</td>
5660 </tr>
5662 vars["errors"]=self._getErrorHTML(vars.get("errorList",[]))
5663 if vars["cancel"]:
5664 vars["CancelButton"] = """<input type="submit" name="CANCEL" value="cancel" class="btn">"""
5665 else:
5666 vars["CancelButton"] = ""
5667 return vars
5669 class WSubmitMaterial(WTemplated):
5671 def __init__(self,target,availMF):
5672 self._target=target
5673 self._availMF=availMF
5675 def _getErrorHTML(self,errorList):
5676 if len(errorList)==0:
5677 return ""
5678 return """
5679 <tr>
5680 <td>&nbsp;</td>
5681 </tr>
5682 <tr>
5683 <td colspan="2" align="center">
5684 <table bgcolor="red">
5685 <tr>
5686 <td bgcolor="white">
5687 <font color="red">%s</font>
5688 </td>
5689 </tr>
5690 </table>
5691 </td>
5692 </tr>
5693 <tr>
5694 <td>&nbsp;</td>
5695 </tr>
5696 """%("<br>".join(errorList))
5698 def _getTargetName(self):
5699 if isinstance(self._target, conference.Contribution):
5700 return "Contribution"
5701 elif isinstance(self._target, conference.SubContribution):
5702 return "Subcontribution"
5703 elif isinstance(self._target, conference.Conference):
5704 return "Event"
5705 return ""
5707 def getVars(self):
5708 vars=WTemplated.getVars(self)
5709 nbFiles=int(vars.get("nbFiles",1))
5710 nbLinks=int(vars.get("nbLinks",1))
5711 vars["targetName"]=self._getTargetName()
5712 vars["targetId"]=self.htmlText(self._target.getId())
5713 vars["targetTitle"]=self.htmlText(self._target.getTitle())
5714 vars["materialModifHandler"] = vars.get("materialModifHandler", None)
5715 vars["materialProtectHandler"] = vars.get("materialProtectHandler", None)
5716 vars["resourcesFileModifHandler"] = vars.get("resourcesFileModifHandler", None)
5717 vars["resourcesFileProtectHandler"] = vars.get("resourcesFileProtectHandler", None)
5718 vars["resourcesLinkModifHandler"] = vars.get("resourcesLinkModifHandler", None)
5719 vars["resourcesLinkProtectHandler"] = vars.get("resourcesLinkProtectHandler", None)
5720 vars["iconProtected"] = Config.getInstance().getSystemIconURL("protected")
5721 vars["iconDelete"] = Config.getInstance().getSystemIconURL("smallDelete")
5722 vars["iconKey"] = ""
5723 if vars["materialModifHandler"] or vars["resourcesFileModifHandler"] or vars["resourcesLinkModifHandler"]:
5724 vars["iconKey"] += _("""&nbsp;<img src=%s style="vertical-align:middle; margin: 1px;"> _("edit")""") % Config.getInstance().getSystemIconURL("file_edit")
5725 if vars["materialProtectHandler"] or vars["resourcesFileProtectHandler"] or vars["resourcesLinkProtectHandler"]:
5726 vars["iconKey"] += _("""&nbsp;<img src=%s style="vertical-align:middle; margin: 1px;"> _("protect")""") % Config.getInstance().getSystemIconURL("file_protect")
5727 vars["materialList"] = "<table>"
5728 materialList = self._target.getAllMaterialList()
5729 for material in materialList:
5730 vars["materialList"] += WMaterialListItem(material,vars["postURL"]).getHTML(vars)
5731 vars["materialList"] += "</table>"
5732 vars["selectNumberOfFiles"] = ""
5733 for i in range(1,10):
5734 if i == nbFiles:
5735 vars["selectNumberOfFiles"] += "<option selected>%s" % i
5736 else:
5737 vars["selectNumberOfFiles"] += "<option>%s" % i
5738 vars["fileSubmitForms"] = ""
5739 for i in range(1,nbFiles+1):
5740 vars["fileSubmitForms"] += WSubmitMaterialFile(i,self._availMF).getHTML(vars)
5741 vars["selectNumberOfLinks"] = ""
5742 for i in range(1,10):
5743 if i == nbLinks:
5744 vars["selectNumberOfLinks"] += "<option selected>%s" % i
5745 else:
5746 vars["selectNumberOfLinks"] += "<option>%s" % i
5747 vars["linkSubmitForms"] = ""
5748 for i in range(1,nbLinks+1):
5749 vars["linkSubmitForms"] += WSubmitMaterialLink(i,self._availMF).getHTML(vars)
5750 vars["conversion"]=""
5751 if Configuration.Config.getInstance().hasFileConverter():
5752 vars["conversion"]= _("""
5753 <tr>
5754 <td nowrap class="titleCellTD"><span class="titleCellFormat">To PDF</span></td>
5755 <td align="left"><input type="checkbox" name="topdf" checked="checked"> _("Automatic conversion to pdf (when applicable)? (PPT, DOC)")</td>
5756 </tr>
5757 """)
5758 vars["errors"]=self._getErrorHTML(vars.get("errorList",[]))
5759 if vars["cancel"]:
5760 vars["CancelButton"] = _("""<input type="submit" name="CANCEL" value="_("cancel")" class="btn">""")
5761 else:
5762 vars["CancelButton"] = ""
5763 return vars
5766 class WSchRelocateTime(WTemplated):
5768 def getVars(self):
5769 vars = WTemplated.getVars(self)
5770 return vars
5773 class WSchRelocate(WTemplated):
5775 def __init__(self, entry):
5776 self._entry=entry
5777 if isinstance(self._entry, conference.Contribution):
5778 self._conf = self._entry.getConference()
5779 else:
5780 # entry is a break
5781 self._conf = self._entry.getSchedule().getOwner().getConference()
5783 def _getTargetPlaceHTML(self):
5784 html=[]
5785 html.append( _("""
5786 <tr><td><input type="radio" name="targetId" value="conf"></td><td colspan="3" width="100%%"><b> _("Top timetable (within no session)")</b></td></tr>
5787 <tr><td colspan="4"><hr></td></tr>
5788 """))
5789 sessionList=self._conf.getSessionList()
5790 sessionList.sort(conference.Session._cmpTitle)
5791 for session in sessionList:
5792 if len(session.getSlotList())==1:
5793 html.append("""
5794 <tr><td><input type="radio" name="targetId" value="%s:%s"></td><td colspan="3" style="background-color:%s;color:%s" width="100%%">&nbsp;%s&nbsp;<b>%s</b></td></tr>
5795 """%(session.getId(), session.getSlotList()[0].getId(), session.getColor(), session.getTextColor(), session.getStartDate().strftime("%d-%m-%Y"),session.getTitle()) )
5796 else:
5797 html.append("""
5798 <tr><td></td><td colspan="3" style="background-color:%s;" width="100%%">
5799 <table>
5800 <tr><td colspan="2" width="100%%" style="color:%s"><b>%s:</b></td></tr>
5801 """%(session.getColor(), session.getTextColor(), session.getTitle()) )
5802 for slotEntry in session.getSchedule().getEntries():
5803 slot=slotEntry.getOwner()
5804 html.append("""
5805 <tr><td><input type="radio" name="targetId" value="%s:%s"></td><td width="100%%" style="color:%s">%s <small>(%s %s-%s)</small></td></tr>
5806 """%(session.getId(), slot.getId(), session.getTextColor(), slot.getTitle() or "[slot %s]"%slot.getId(), slot.getAdjustedStartDate().strftime("%d-%m-%Y"),\
5807 slot.getAdjustedStartDate().strftime("%H:%M"), slot.getAdjustedEndDate().strftime("%H:%M")) )
5808 html.append("</table></td></tr>")
5809 return "".join(html)
5812 def getVars(self):
5813 vars = WTemplated.getVars(self)
5814 if isinstance(self._entry, conference.Contribution):
5815 vars["entryType"]="Contribution"
5816 else:
5817 vars["entryType"]=""
5818 vars["entryTitle"]=self._entry.getTitle()
5819 vars["targetPlace"]=self._getTargetPlaceHTML()
5820 vars["autoUpdate"]=""
5821 return vars
5823 class WReportNumbersTable(WTemplated):
5825 def __init__(self, target, type="event"):
5826 self._target=target
5827 self._type=type
5829 def _getCurrentItems(self):
5830 html=[]
5831 rns = self._target.getReportNumberHolder().listReportNumbers()
5832 id = 0
5834 reportCodes = []
5836 for rn in rns:
5837 key = rn[0]
5838 number = rn[1]
5839 name=key
5840 if key in Configuration.Config.getInstance().getReportNumberSystems().keys():
5841 name=Configuration.Config.getInstance().getReportNumberSystems()[key]["name"]
5842 reportCodes.append((id, number, name))
5843 id+=1
5844 return reportCodes
5846 def _getSystems(self):
5847 html=[]
5848 rnsystems=Configuration.Config.getInstance().getReportNumberSystems()
5849 keys=rnsystems.keys()
5850 keys.sort()
5851 for system in keys:
5852 html.append("""
5853 <option value="%s">%s</option>
5854 """%(system, rnsystems[system]["name"] ) )
5855 return "".join(html)
5857 def getVars(self):
5858 vars = WTemplated.getVars(self)
5859 if self._type == "event":
5860 vars["deleteURL"]=quoteattr(str(urlHandlers.UHConfModifReportNumberRemove.getURL(self._target)))
5861 vars["addURL"]=quoteattr(str(urlHandlers.UHConfModifReportNumberEdit.getURL(self._target)))
5862 elif self._type == "contribution":
5863 vars["deleteURL"]=quoteattr(str(urlHandlers.UHContributionReportNumberRemove.getURL(self._target)))
5864 vars["addURL"]=quoteattr(str(urlHandlers.UHContributionReportNumberEdit.getURL(self._target)))
5865 else:
5866 vars["deleteURL"]=quoteattr(str(urlHandlers.UHSubContributionReportNumberRemove.getURL(self._target)))
5867 vars["addURL"]=quoteattr(str(urlHandlers.UHSubContributionReportNumberEdit.getURL(self._target)))
5868 vars["items"]=self._getCurrentItems()
5869 vars["repTypesSelectItems"]=self._getSystems()
5870 return vars
5872 class WModifReportNumberEdit(WTemplated):
5874 def __init__(self, target, rns, type="event"):
5875 self._target=target
5876 self._rnSystem=rns
5877 self._type=type
5879 def getVars(self):
5880 vars=WTemplated.getVars(self)
5881 vars["reportNumber"]=""
5882 vars["reportNumberSystem"]=self._rnSystem
5883 name=self._rnSystem
5884 if self._rnSystem in Config.getInstance().getReportNumberSystems().keys():
5885 name=Config.getInstance().getReportNumberSystems()[self._rnSystem]["name"]
5886 vars["system"]=name
5887 if self._type == "event":
5888 vars["postURL"]=quoteattr(str(urlHandlers.UHConfModifReportNumberPerformEdit.getURL(self._target)))
5889 elif self._type == "contribution":
5890 vars["postURL"]=quoteattr(str(urlHandlers.UHContributionReportNumberPerformEdit.getURL(self._target)))
5891 else:
5892 vars["postURL"]=quoteattr(str(urlHandlers.UHSubContributionReportNumberPerformEdit.getURL(self._target)))
5893 return vars
5896 # ============================================================================
5897 # === ROOM BOOKING RELATED ===================================================
5898 # ============================================================================
5899 # 1. Freestanding
5900 # 2. In the context of an event
5902 from MaKaC.rb_reservation import ReservationBase, Collision, RepeatabilityEnum
5903 from MaKaC.rb_factory import Factory
5904 from MaKaC.rb_tools import iterdays
5905 from calendar import day_name
5906 from MaKaC.rb_location import Location, CrossLocationFactory
5908 class Bar:
5910 Keeps data necessary for graphical bar on calendar.
5912 PREBOOKED, PRECONCURRENT, UNAVAILABLE, CANDIDATE, PRECONFLICT, CONFLICT = xrange( 0, 6 )
5913 # I know this names are not wisely choosed; it's due to unexpected additions
5914 # without refactoring
5915 # UNAVAILABLE : represents confirmed reservation (bright-red)
5916 # CANDIDATE: represents new reservation (green)
5917 # CONFLICT: overlap between candidate and confirmed resv. (dark red)
5918 # PREBOOKED: represents pre-reservation (yellow)
5919 # PRECONFLICT: represents conflict with pre-reservation (orange)
5920 # PRECONCURRENT: conflicting pre-reservations
5922 def __init__( self, c, barType ):
5923 self.startDT = c.startDT
5924 self.endDT = c.endDT
5925 self.forReservation = c.withReservation
5926 self.type = barType
5928 def __cmp__( self, obj ):
5929 return cmp( self.type, obj.type )
5931 class RoomBars:
5932 room = None
5933 bars = []
5934 def __init__( self, room, bars ):
5935 self.room = room
5936 self.bars = bars
5937 def __cmp__( self, obj ):
5938 return cmp( self.room, obj.room )
5940 # ============================================================================
5941 # == FREESTANDING ==== (Room Booking Related) ================================
5942 # ============================================================================
5944 class WRoomBookingWelcome( WTemplated ):
5946 def __init__(self):
5947 self.__adminList = AdminList.getInstance()
5949 def getVars( self ):
5950 vars = WTemplated.getVars( self )
5951 return vars
5953 class WRoomBookingRoomSelectList( WTemplated ):
5955 def __init__( self, rh ):
5956 self._rh = rh
5958 def getVars( self ):
5959 vars = WTemplated.getVars( self )
5961 vars['roomList'] = self._rh._roomList
5962 vars['locationRoom'] = self._rh._locationRoom
5964 return vars
5966 class WRoomBookingRoomSelectList4SubEvents( WTemplated ):
5968 def __init__( self, rh ):
5969 self._rh = rh
5971 def getVars( self ):
5972 vars = WTemplated.getVars( self )
5974 vars['roomList'] = self._rh._roomList
5975 vars['locationRoom'] = self._rh._locationRoom
5977 return vars
5979 # ============================================================================
5980 # == EVENT CONTEXT ==== (Room Booking Related) ===============================
5981 # ============================================================================
5984 # 0. Choosing an "event" (conference / session / contribution)...
5986 class WRoomBookingChooseEvent( WTemplated ):
5988 def __init__( self, rh ):
5989 self._rh = rh
5991 def getVars( self ):
5992 vars = WTemplated.getVars( self )
5994 vars["conference"] = self._rh._conf
5995 vars["contributions"] = list( [ c for c in self._rh._conf.getContributionList() if c.getStartDate() ] )
5997 return vars
5999 # 1. Searching
6001 class WRoomBookingSearch4Rooms( WTemplated ):
6003 def __init__( self, rh, standalone = False ):
6004 self._standalone = standalone
6005 self._rh = rh
6007 def getVars( self ):
6008 vars = WTemplated.getVars( self )
6010 websession = self._rh._websession
6012 vars["standalone"] = self._standalone
6014 vars["Location"] = Location
6015 vars["rooms"] = self._rh._rooms
6016 vars["possibleEquipment"] = self._rh._equipment
6017 vars["forNewBooking"] = self._rh._forNewBooking
6018 vars["eventRoomName"] = self._rh._eventRoomName
6020 vars["preview"] = False
6022 vars["startDT"] = websession.getVar( "defaultStartDT" )
6023 vars["endDT"] = websession.getVar( "defaultEndDT" )
6024 vars["startT"] = websession.getVar( "defaultStartDT" ).time().strftime( "%H:%M" )
6025 vars["endT"] = websession.getVar( "defaultEndDT" ).time().strftime( "%H:%M" )
6026 vars["repeatability"] = websession.getVar( "defaultRepeatability" )
6028 if self._standalone:
6029 # URLs for standalone room booking
6030 vars["roomBookingRoomListURL"] = urlHandlers.UHRoomBookingRoomList.getURL( None )
6031 vars["detailsUH"] = urlHandlers.UHRoomBookingRoomDetails
6032 vars["bookingFormUH"] = urlHandlers.UHRoomBookingBookingForm
6033 else:
6034 # URLs for room booking in the event context
6035 vars["roomBookingRoomListURL"] = urlHandlers.UHConfModifRoomBookingRoomList.getURL( self._rh._conf )
6036 vars["detailsUH"] = urlHandlers.UHConfModifRoomBookingRoomDetails
6037 vars["bookingFormUH"] = urlHandlers.UHConfModifRoomBookingBookingForm
6039 return vars
6041 class WRoomBookingSearch4Bookings( WTemplated ):
6043 def __init__( self, rh ):
6044 self._rh = rh
6046 def getVars( self ):
6047 vars = WTemplated.getVars( self )
6049 vars["today"] = datetime.now()
6050 vars["weekLater"] = datetime.now() + timedelta( 7 )
6051 vars["Location"] = Location
6052 vars["rooms"] = self._rh._rooms
6053 vars["repeatability"] = None
6055 vars["roomBookingBookingListURL"] = urlHandlers.UHRoomBookingBookingList.getURL( None )
6057 return vars
6059 class WRoomBookingMapOfRooms(WTemplated):
6061 def __init__(self, **params):
6062 if params is not None:
6063 self._params = params
6064 else:
6065 self._params = {}
6066 WTemplated.__init__(self)
6068 def getVars(self):
6069 vars = WTemplated.getVars(self)
6070 vars["mapOfRoomsWidgetURL"] = urlHandlers.UHRoomBookingMapOfRoomsWidget.getURL(None, **self._params)
6072 return vars
6074 class WRoomBookingMapOfRoomsWidget(WTemplated):
6076 def __init__(self, aspects, buildings, defaultLocation, forVideoConference, roomID):
6077 self._aspects = aspects
6078 self._buildings = buildings
6079 self._defaultLocation = defaultLocation
6080 self._forVideoConference = forVideoConference
6081 self._roomID = roomID
6083 def getVars(self):
6084 vars = WTemplated.getVars(self)
6085 websession = self._rh._websession
6087 vars["aspects"] = self._aspects
6088 vars["buildings"] = self._buildings
6089 vars["defaultLocation"] = self._defaultLocation
6090 vars["forVideoConference"] = self._forVideoConference
6091 vars["roomID"] = self._roomID
6093 vars["roomBookingRoomListURL"] = urlHandlers.UHRoomBookingRoomList.getURL( None )
6094 vars["startDT"] = websession.getVar( "defaultStartDT" )
6095 vars["endDT"] = websession.getVar( "defaultEndDT" )
6096 vars["startT"] = websession.getVar( "defaultStartDT" ).time().strftime( "%H:%M" )
6097 vars["endT"] = websession.getVar( "defaultEndDT" ).time().strftime( "%H:%M" )
6098 vars["repeatability"] = websession.getVar( "defaultRepeatability" )
6100 return vars
6102 # 2. List of...
6104 class WRoomBookingRoomList( WTemplated ):
6106 def __init__( self, rh, standalone = False ):
6107 self._rh = rh
6108 self._standalone = standalone
6109 self._title = None
6110 try: self._title = self._rh._title;
6111 except: pass
6113 def getVars( self ):
6114 vars=WTemplated.getVars( self )
6116 vars["rooms"] = self._rh._rooms
6117 vars["mapAvailable"] = self._rh._mapAvailable
6118 #vars["roomPhotoUH"] = urlHandlers.UHSendRoomPhoto
6119 vars["standalone"] = self._standalone
6120 vars["title"] = self._title
6122 if self._standalone:
6123 vars["detailsUH"] = urlHandlers.UHRoomBookingRoomDetails
6124 vars["bookingFormUH"] = urlHandlers.UHRoomBookingBookingForm
6125 else:
6126 vars["conference"] = self._rh._conf
6127 vars["detailsUH"] = urlHandlers.UHConfModifRoomBookingRoomDetails
6128 vars["bookingFormUH"] = urlHandlers.UHConfModifRoomBookingBookingForm
6130 return vars
6132 class WRoomBookingList( WTemplated ):
6134 def __init__( self, rh, standalone = False ):
6135 self._standalone = standalone
6136 self._rh = rh
6137 if not standalone:
6138 self._conf = rh._conf
6140 def getVars( self ):
6141 vars=WTemplated.getVars( self )
6143 vars["reservations"] = self._rh._resvs
6144 vars["standalone"] = self._standalone
6145 dm = datetime.now() - timedelta( 1 )
6146 vars["yesterday"] = dm #datetime( dm.year, dm.month, dm.day, 0, 0, 1 )
6148 if self._standalone:
6149 vars["bookingDetailsUH"] = urlHandlers.UHRoomBookingBookingDetails
6150 else:
6151 vars["conference"] = self._conf
6152 vars["bookingDetailsUH"] = urlHandlers.UHConfModifRoomBookingDetails
6154 return vars
6156 class WRoomBookingBookingList( WTemplated ): # Standalone version
6158 def __init__( self, rh ):
6159 self._rh = rh
6160 self._title = None
6161 try: self._title = self._rh._title;
6162 except: pass
6164 def _isOn(self, boolVal):
6165 if boolVal:
6166 return "on"
6167 else:
6168 return ""
6170 def getVars( self ):
6171 vars = WTemplated.getVars( self )
6172 rh = self._rh
6174 vars["reservations"] = rh._resvs
6176 #vars["smallPhotoUH"] = urlHandlers.UHSendRoomPhoto
6177 vars["bookingDetailsUH"] = urlHandlers.UHRoomBookingBookingDetails
6178 vars["withPhoto"] = False
6179 vars["title"] = self._title
6180 vars["showRejectAllButton"] = rh._showRejectAllButton
6182 vars["prebookingsRejected"] = rh._prebookingsRejected
6183 vars["subtitle"] = rh._subtitle
6184 vars["description"] = rh._description
6185 yesterday = datetime.now() - timedelta( 1 )
6186 vars["yesterday"] = yesterday #datetime( dm.year, dm.month, dm.day, 0, 0, 1 )
6188 overload = ( len( rh._resvs ) > 300 ) or self._rh._overload
6190 ed = None
6191 sd = rh._resvEx.startDT.date()
6192 if rh._resvEx.endDT:
6193 ed = rh._resvEx.endDT.date()
6195 # autoCriteria - dates are calculated based on the next reservation
6196 if rh._autoCriteria:
6197 tmp = ReservationBase.findSoonest( rh._resvs, afterDT = yesterday )
6198 if tmp:
6199 tmp = tmp.getNextRepeating( afterDT = yesterday )
6200 if tmp and tmp.startDT.date() > sd:
6201 sd = tmp.startDT
6202 if not ed:
6203 # one month of time span
6204 ed = sd + timedelta( 30 )
6206 # set the calendar dates as calculated
6207 calendarStartDT = datetime( sd.year, sd.month, sd.day, 0, 0, 1 )
6208 calendarEndDT = datetime( ed.year, ed.month, ed.day, 23, 59 )
6210 from MaKaC.rb_tools import formatDate
6212 if calendarStartDT.date() == calendarEndDT.date():
6213 vars["periodName"] = "day"
6214 vars["verbosePeriod"] = formatDate(calendarStartDT)
6215 else:
6216 vars["periodName"] = "period"
6217 vars["verbosePeriod"] = "%s -> %s" % ( formatDate(calendarStartDT), formatDate(calendarEndDT) )
6218 vars["startD"] = formatDate(calendarStartDT)
6219 vars["endD"] = formatDate(calendarEndDT)
6221 # Data for previous/next URLs (it's about periods, not paging)
6222 newParams4Previous = rh._reqParams.copy()
6223 newParams4Next = rh._reqParams.copy()
6224 if rh._reqParams.has_key( 'autoCriteria' ):
6225 del newParams4Previous['autoCriteria']
6226 del newParams4Next['autoCriteria']
6227 if rh._reqParams.has_key( 'day' ):
6228 del newParams4Previous['day']
6229 del newParams4Next['day']
6232 startD = calendarStartDT.date()
6233 endD = calendarEndDT.date()
6235 if endD != startD:
6236 period = endD - startD
6238 prevStartD = startD - period
6239 prevEndD = startD - timedelta(1)
6241 nextStartD = endD + timedelta(1)
6242 nextEndD = endD + period
6243 else:
6244 prevStartD = prevEndD = startD - timedelta(1)
6245 nextStartD = nextEndD = endD + timedelta(1)
6247 newParams4Previous['sDay'] = prevStartD.day
6248 newParams4Previous['sMonth'] = prevStartD.month
6249 newParams4Previous['sYear'] = prevStartD.year
6250 newParams4Previous['eDay'] = prevEndD.day
6251 newParams4Previous['eMonth'] = prevEndD.month
6252 newParams4Previous['eYear'] = prevEndD.year
6254 newParams4Next['sDay'] = nextStartD.day
6255 newParams4Next['sMonth'] = nextStartD.month
6256 newParams4Next['sYear'] = nextStartD.year
6257 newParams4Next['eDay'] = nextEndD.day
6258 newParams4Next['eMonth'] = nextEndD.month
6259 newParams4Next['eYear'] = nextEndD.year
6261 #Number of the RoomBookingBookingListPrevNext templates used in the code.
6262 #Variable increments when new template is put.
6263 vars["prevNextNo"] = 0
6264 vars["withPrevNext"] = True
6265 vars["prevURL"] = urlHandlers.UHRoomBookingBookingList.getURL( newParams = newParams4Previous )
6266 vars["nextURL"] = urlHandlers.UHRoomBookingBookingList.getURL( newParams = newParams4Next )
6268 # empty days are shown for "User bookings" and "User pre-bookings"
6269 # and for the calendar as well
6270 # but not for the booking search
6271 showEmptyDays = ( self._rh._ofMyRooms or \
6272 (not self._rh._ofMyRooms and not self._rh._onlyMy) ) and \
6273 not self._rh._search
6274 showEmptyRooms = showEmptyDays
6277 # Calendar related stuff ==========
6279 bars = []
6280 collisionsOfResvs = []
6282 # there's at least one reservation
6283 if len( rh._resvs ) > 0 and not overload:
6286 # Prepare the list of Collisions
6287 # (collision is just a helper object, it's not the best notion here)
6289 for r in rh._resvs:
6290 for p in r.splitToPeriods(endDT=calendarEndDT, startDT=calendarStartDT):
6291 if p.startDT >= calendarStartDT and p.endDT <= calendarEndDT:
6292 collisionsOfResvs.append( Collision( ( p.startDT, p.endDT ), r ) )
6294 if len( collisionsOfResvs ) > 500:
6295 overload = True
6296 else:
6298 # Translate collisions to Bars
6299 for c in collisionsOfResvs:
6300 if c.withReservation.isConfirmed:
6301 bars.append( Bar( c, Bar.UNAVAILABLE ) )
6302 else:
6303 bars.append( Bar( c, Bar.PREBOOKED ) )
6305 bars = barsList2Dictionary( bars )
6306 bars = addOverlappingPrebookings( bars )
6307 bars = sortBarsByImportance( bars, calendarStartDT, calendarEndDT )
6309 rooms = []
6310 for r in rh._resvs:
6311 rooms.append(r.room)
6313 #rooms = {}
6314 #for r in rh._resvs:
6315 # rooms[r.room] = None
6316 #rooms = rooms.keys()
6318 #CrossLocationQueries.getRooms( location = self.location )
6319 if not self._rh._onlyMy:
6320 rooms = self._rh._rooms
6322 bars = introduceRooms( rooms, bars, calendarStartDT, calendarEndDT, showEmptyDays = showEmptyDays, showEmptyRooms = showEmptyRooms )
6324 vars["Bar"] = Bar
6326 self.__sortUsingCriterion(rh._order, collisionsOfResvs)
6328 # we want to display every room, with or without reservation
6329 elif not overload:
6330 # initialize collision bars
6331 bars = {}
6332 bars = sortBarsByImportance( bars, calendarStartDT, calendarEndDT )
6334 # insert rooms
6335 if not self._rh._onlyMy:
6336 rooms = self._rh._rooms
6337 else:
6338 rooms = []
6340 bars = introduceRooms( rooms, bars, calendarStartDT, calendarEndDT, showEmptyDays = showEmptyDays, showEmptyRooms = showEmptyRooms )
6343 vars["unrolledReservations"] = collisionsOfResvs
6344 vars["bars"] = bars
6345 vars["calendarStartDT"] = calendarStartDT
6346 vars["calendarEndDT"] = calendarEndDT
6347 vars["iterdays"] = iterdays
6348 vars['overload'] = overload
6349 vars["manyRooms"] = not self._rh._rooms or len(self._rh._rooms) > 1
6350 if not vars["manyRooms"]:
6351 vars["room"] = self._rh._rooms[0]
6352 vars["withConflicts"] = False
6353 bars = []
6354 for c in collisionsOfResvs:
6355 if c.withReservation.isConfirmed:
6356 bars.append( Bar( c, Bar.UNAVAILABLE ) )
6357 else:
6358 bars.append( Bar( c, Bar.PREBOOKED ) )
6359 bars = barsList2Dictionary( bars )
6360 bars = addOverlappingPrebookings( bars )
6361 bars = sortBarsByImportance( bars, calendarStartDT, calendarEndDT )
6362 vars["bars"] = bars
6364 return vars
6367 def __sortUsingCriterion(self, order, uresvs):
6369 if order == "" or order =="room":
6370 # standard sorting order (by room, and then date)
6371 uresvs.sort(lambda r1,r2: cmp(r1.withReservation.room.name,r2.withReservation.room.name))
6372 else:
6373 if order == 'date':
6374 uresvs.sort(lambda r1, r2: cmp(r1.startDT, r2.startDT))
6375 elif order == 'reason':
6376 uresvs.sort(lambda r1, r2: cmp(r1.withReservation.reason.lower(), r2.withReservation.reason.lower()))
6377 elif order == 'for':
6378 uresvs.sort(lambda r1, r2: cmp(r1.withReservation.bookedForName.lower(), r2.withReservation.bookedForName.lower()))
6379 elif order == 'hours':
6380 uresvs.sort(lambda r1, r2: cmp(r1.startDT.time(), r2.startDT.time()))
6383 # 3. Details of...
6385 def barsList2Dictionary( bars ):
6387 Converts:
6388 list of bars => dictionary of bars, key = datetime, value = list of bars
6390 h = {}
6391 for bar in bars:
6392 d = bar.startDT.date()
6393 if h.has_key( d ):
6394 h[d].append( bar )
6395 else:
6396 h[d] = [bar]
6397 return h
6399 def addOverlappingPrebookings( bars ):
6401 Adds bars representing overlapping pre-bookings.
6402 Returns new bars dictionary.
6405 # For each day
6406 for dt in bars.keys():
6407 dayBars = bars[dt]
6409 # For each (prebooked) bar i
6410 for i in xrange( 0, len( dayBars ) ):
6411 bar = dayBars[i]
6412 if bar.type == Bar.PREBOOKED:
6414 # For each (prebooked) bar j
6415 for j in xrange( i+1, len( dayBars ) ):
6416 collCand = dayBars[j]
6417 if collCand.type == Bar.PREBOOKED:
6419 # If there is an overlap, add PRECONCURRENT bar
6420 over = overlap( bar.startDT, bar.endDT, collCand.startDT, collCand.endDT )
6421 if over and bar.forReservation.room == collCand.forReservation.room:
6422 collision = Collision( over, collCand.forReservation )
6423 dayBars.append( Bar( collision, Bar.PRECONCURRENT ) )
6425 bars[dt] = dayBars # With added concurrent prebooking bars
6427 return bars
6429 def sortBarsByImportance( bars, calendarStartDT, calendarEndDT ):
6431 Moves conflict bars to the end of the list,
6432 so they will be drawn last and therefore be visible.
6434 Returns sorted bars.
6436 for dt in bars.keys():
6437 dayBars = bars[dt]
6438 dayBars.sort()
6439 bars[dt] = dayBars
6441 for day in iterdays( calendarStartDT, calendarEndDT ):
6442 if not bars.has_key( day.date() ):
6443 bars[day.date()] = []
6445 return bars
6447 def getRoomBarsList( rooms ):
6448 roomBarsList = []
6449 if rooms is None:
6450 rooms=[]
6451 for room in rooms:
6452 roomBarsList.append( RoomBars( room, [] ) )
6453 roomBarsList.sort()
6454 return roomBarsList
6456 def introduceRooms( rooms, dayBarsDic, calendarStartDT, calendarEndDT, showEmptyDays=True, showEmptyRooms=True ):
6457 # Input:
6458 # dayBarsDic is a dictionary date => [bar1, bar2, bar3, ...]
6460 # Output:
6461 # newDayBarsDic is a dictionary date => [roomBars1, roomBars2, roomBars3, ...],
6462 # where roomBars is object JSON:{ room: RoomBase, bars: [bar1, bar2, bar3, ...] }
6463 import copy
6464 cleanRoomBarsList = getRoomBarsList( rooms )
6465 newDayBarsDic = {}
6467 s = ""
6468 for day in iterdays( calendarStartDT, calendarEndDT ):
6469 dayBars = dayBarsDic[day.date()]
6470 roomBarsDic = {}
6471 for bar in dayBars:
6472 room = bar.forReservation.room
6473 if not roomBarsDic.has_key( room ):
6474 roomBarsDic[room] = []
6475 # Bars order should be preserved
6476 roomBarsDic[room].append( bar )
6478 if showEmptyRooms:
6479 dayRoomBarsList = getRoomBarsList( rooms ) #copy.copy( cleanRoomBarsList )
6481 for roomBar in dayRoomBarsList:
6482 roomBar.bars = roomBarsDic.get( roomBar.room, [] )
6483 else:
6484 dayRoomBarsList = []
6485 for room in roomBarsDic.keys():
6486 dayRoomBarsList.append(RoomBars(room,roomBarsDic[room]))
6488 if showEmptyDays or len(dayBars) > 0:
6489 newDayBarsDic[day.date()] = dayRoomBarsList
6491 return newDayBarsDic
6494 class WRoomBookingRoomStats( WTemplated ):
6496 def __init__( self, rh, standalone = False ):
6497 self._rh = rh
6498 self._standalone = standalone
6500 def getVars( self ):
6501 vars = WTemplated.getVars( self )
6502 vars["room"] = self._rh._room
6503 vars["standalone"] = self._standalone
6504 vars["period"] = self._rh._period
6505 vars["kpiAverageOccupation"] = str( int( round( self._rh._kpiAverageOccupation * 100 ) ) ) + "%"
6506 # Bookings
6507 vars["kbiTotalBookings"] = self._rh._totalBookings
6508 # Next 9 KPIs
6509 vars["stats"] = self._rh._booking_stats
6510 vars["statsURL"] = urlHandlers.UHRoomBookingRoomStats.getURL()
6511 return vars
6514 class WRoomBookingRoomDetails( WTemplated ):
6516 def __init__( self, rh, standalone = False ):
6517 self._rh = rh
6518 self._standalone = standalone
6520 def getVars( self ):
6521 vars = WTemplated.getVars( self )
6522 vars["room"] = self._rh._room
6523 goodFactory = Location.parse( self._rh._room.locationName ).factory
6524 attributes = goodFactory.getCustomAttributesManager().getAttributes( location = self._rh._room.locationName )
6525 vars["attrs"] = {}
6526 for attribute in attributes:
6527 if not attribute.get("hidden",False) or self._rh._getUser().isAdmin():
6528 vars["attrs"][attribute['name']] = self._rh._room.customAtts.get(attribute['name'],"")
6529 if attribute['name'] == 'notification email' :
6530 vars["attrs"][attribute['name']] = vars["attrs"][attribute['name']].replace(',', ', ')
6531 vars["config"] = Config.getInstance()
6532 #vars["roomPhoto"] = urlHandlers.UHSendRoomPhoto.getURL( self._rh._room.photoId, small = False )
6533 vars["standalone"] = self._standalone
6534 vars["actionSucceeded"] = self._rh._afterActionSucceeded
6535 vars["deletionFailed"] = self._rh._afterDeletionFailed
6537 vars["roomStatsUH"] = urlHandlers.UHRoomBookingRoomStats
6539 if self._standalone:
6540 vars["bookingFormUH"] = urlHandlers.UHRoomBookingBookingForm
6541 vars["modifyRoomUH"] = urlHandlers.UHRoomBookingRoomForm
6542 vars["deleteRoomUH"] = urlHandlers.UHRoomBookingDeleteRoom
6543 vars["bookingDetailsUH"] = urlHandlers.UHRoomBookingBookingDetails
6544 else:
6545 vars["bookingDetailsUH"] = urlHandlers.UHConfModifRoomBookingDetails
6546 vars["conference"] = self._rh._conf
6547 vars["bookingFormUH"] = urlHandlers.UHConfModifRoomBookingBookingForm
6548 vars["modifyRoomUH"] = urlHandlers.UHRoomBookingRoomForm
6549 vars["deleteRoomUH"] = urlHandlers.UHRoomBookingDeleteRoom
6551 # Calendar range: 3 months
6552 if self._rh._searchingStartDT and self._rh._searchingEndDT:
6553 sd = self._rh._searchingStartDT
6554 calendarStartDT = datetime( sd.year, sd.month, sd.day, 0, 0, 1 )
6555 ed = self._rh._searchingEndDT
6556 calendarEndDT = datetime( ed.year, ed.month, ed.day, 23, 59 )
6557 else:
6558 now = datetime.now()
6559 calendarStartDT = datetime( now.year, now.month, now.day, 0, 0, 1 )
6560 calendarEndDT = calendarStartDT + timedelta( 3 * 31, 50, 0, 0, 59, 23 )
6562 # Example resv. to ask for other reservations
6563 resvEx = CrossLocationFactory.newReservation( location = self._rh._room.locationName )
6564 resvEx.startDT = calendarStartDT
6565 resvEx.endDT = calendarEndDT
6566 resvEx.repeatability = RepeatabilityEnum.daily
6567 resvEx.room = self._rh._room
6568 resvEx.isConfirmed = None # to include not also confirmed
6570 # Bars: Existing reservations
6571 collisionsOfResvs = resvEx.getCollisions()
6573 bars = []
6574 for c in collisionsOfResvs:
6575 if c.withReservation.isConfirmed:
6576 bars.append( Bar( c, Bar.UNAVAILABLE ) )
6577 else:
6578 bars.append( Bar( c, Bar.PREBOOKED ) )
6580 bars = barsList2Dictionary( bars )
6581 bars = addOverlappingPrebookings( bars )
6582 bars = sortBarsByImportance( bars, calendarStartDT, calendarEndDT )
6584 # Set owner for all
6585 if not self._standalone:
6586 for dt in bars.iterkeys():
6587 for bar in bars[dt]:
6588 bar.forReservation.setOwner( self._rh._conf )
6590 vars["calendarStartDT"] = calendarStartDT
6591 vars["calendarEndDT"] = calendarEndDT
6592 vars["bars"] = bars
6593 vars["iterdays"] = iterdays
6594 vars["day_name"] = day_name
6595 vars["Bar"] = Bar
6596 vars["withConflicts"] = False
6598 return vars
6600 class WRoomBookingDetails( WTemplated ):
6602 def __init__(self, rh, conference = None):
6603 self._rh = rh
6604 self._resv = rh._resv
6605 self._conf = conference
6606 self._standalone = (conference is None)
6608 def getVars( self ):
6609 vars=WTemplated.getVars( self )
6610 vars["standalone"] = self._standalone
6611 vars["reservation"] = self._resv
6612 vars["config"] = Config.getInstance()
6613 #vars["smallPhotoUH"] = urlHandlers.UHSendRoomPhoto
6614 #vars["roomPhotoUH"] = urlHandlers.UHSendRoomPhoto
6615 vars["actionSucceeded"] = self._rh._afterActionSucceeded
6616 if self._rh._afterActionSucceeded:
6617 vars["title"] = self._rh._title
6618 vars["description"] = self._rh._description
6620 if self._standalone:
6621 vars["roomDetailsUH"] = urlHandlers.UHRoomBookingRoomDetails
6622 vars["modifyBookingUH"] = urlHandlers.UHRoomBookingBookingForm
6623 vars["cloneURL"] = urlHandlers.UHRoomBookingCloneBooking.getURL(self._resv)
6624 else:
6625 vars["roomDetailsUH"] = urlHandlers.UHConfModifRoomBookingRoomDetails
6626 vars["modifyBookingUH"] = urlHandlers.UHConfModifRoomBookingBookingForm
6627 vars["cloneURL"] = urlHandlers.UHConfModifRoomBookingCloneBooking.getURL(self._resv, self._conf)
6629 vars["bookMessage"] = "Book"
6630 if not self._resv.isConfirmed:
6631 vars["bookMessage"] = "PRE-Book"
6633 return vars
6635 # 4. Booking Form
6637 class WRoomBookingBookingForm( WTemplated ):
6639 def __init__( self, rh, standalone = False ):
6640 self._rh = rh
6641 self._candResv = rh._candResv
6642 self._standalone = standalone
6644 def getVars( self ):
6645 vars = WTemplated.getVars( self )
6647 vars["standalone"] = self._standalone
6648 vars["config"] = Config.getInstance()
6649 vars["bookingFormURL"] = str(urlHandlers.UHRoomBookingBookingForm.getURL())
6651 if self._standalone:
6652 vars["conf"] = None
6653 vars["saveBookingUH"] = urlHandlers.UHRoomBookingSaveBooking
6654 vars["roomDetailsUH"] = urlHandlers.UHRoomBookingRoomDetails
6655 vars["calendarPreviewUH"] = urlHandlers.UHRoomBookingBookingForm
6656 else:
6657 vars["conf"] = self._rh._conf
6658 vars["saveBookingUH"] = urlHandlers.UHConfModifRoomBookingSaveBooking
6659 vars["roomDetailsUH"] = urlHandlers.UHConfModifRoomBookingRoomDetails
6660 vars["calendarPreviewUH"] = urlHandlers.UHConfModifRoomBookingBookingForm
6662 vars["candResv"] = self._candResv
6663 vars["startDT"] = self._candResv.startDT
6664 vars["endDT"] = self._candResv.endDT
6665 vars["startT"] = '%02d:%02d' % (self._candResv.startDT.hour, self._candResv.startDT.minute )
6666 vars["endT"] = '%02d:%02d' % (self._candResv.endDT.hour, self._candResv.endDT.minute )
6668 vars["showErrors"] = self._rh._showErrors
6669 vars["errors"] = self._rh._errors
6670 vars["thereAreConflicts"] = self._rh._thereAreConflicts
6671 vars["skipConflicting"] = self._rh._skipConflicting
6673 if self._rh._formMode == FormMode.MODIF:
6674 vars["allowPast"] = "true"
6675 else:
6676 vars["allowPast"] = "false"
6677 vars["formMode"] = self._rh._formMode
6678 vars["FormMode"] = FormMode
6680 # [Book] or [PRE-Book] ?
6681 bookingMessage = "Book"
6682 room = self._candResv.room
6683 user = self._rh._getUser()
6684 if room.canPrebook( user ) and not room.canBook( user ):
6685 bookingMessage = "PRE-Book"
6686 vars["bookingMessage"] = bookingMessage
6688 if self._rh._formMode != FormMode.MODIF:
6689 bText = bookingMessage
6690 else:
6691 bText = "Save"
6693 vars["roomBookingRoomCalendar"] = WRoomBookingRoomCalendar( self._rh, self._standalone, buttonText=bText).getHTML( {} )
6695 return vars
6697 class WRoomBookingConfirmBooking( WRoomBookingBookingForm ):
6699 def getVars( self ):
6700 vars = WTemplated.getVars( self )
6702 vars["candResv"] = self._candResv
6704 vars["standalone"] = self._standalone
6705 vars["formMode"] = self._rh._formMode
6706 vars["FormMode"] = FormMode
6707 vars["collisions"] = self._rh._collisions
6709 # If we are here, we are either in booking mode and trying to overwrite PRE-Bookings...
6710 bookingMessage = "Book"
6711 bookingMessageOther = "PRE-Book"
6712 vars["rejectOthers"] = True
6713 room = self._candResv.room
6714 user = self._rh._getUser()
6715 if room.canPrebook( user ) and not room.canBook( user ):
6716 # ...or we are in PRE-booking mode and conflicting with another PRE-Booking
6717 bookingMessage = "PRE-Book"
6718 bookingMessageOther = "PRE-Book"
6719 vars["rejectOthers"] = False
6720 vars["bookingMessage"] = bookingMessage
6721 vars["bookingMessageOther"] = bookingMessageOther
6723 if self._standalone:
6724 vars["conf"] = None
6725 vars["saveBookingUH"] = urlHandlers.UHRoomBookingSaveBooking
6726 vars["roomDetailsUH"] = urlHandlers.UHRoomBookingRoomDetails
6727 else:
6728 vars["conf"] = self._rh._conf
6729 vars["saveBookingUH"] = urlHandlers.UHConfModifRoomBookingSaveBooking
6730 vars["roomDetailsUH"] = urlHandlers.UHConfModifRoomBookingRoomDetails
6731 return vars
6733 class WRoomBookingRoomForm( WTemplated ):
6735 def __init__( self, rh ):
6736 self._rh = rh
6738 def getVars( self ):
6739 vars = WTemplated.getVars( self )
6741 candRoom = self._rh._candRoom
6742 goodFactory = Location.parse( candRoom.locationName ).factory
6744 vars["Location"] = Location
6745 vars["room"] = candRoom
6746 vars["largePhotoPath"] = None
6747 vars["smallPhotoPath"] = None
6748 vars["config"] = Config.getInstance()
6749 vars["possibleEquipment"] = goodFactory.getEquipmentManager().getPossibleEquipment( location = candRoom.locationName )
6751 vars["showErrors"] = self._rh._showErrors
6752 vars["errors"] = self._rh._errors
6754 vars["insert"] = ( candRoom.id == None )
6755 vars["attrs"] = goodFactory.getCustomAttributesManager().getAttributes( location = candRoom.locationName )
6756 resp = candRoom.getResponsible()
6757 if resp:
6758 vars["responsibleName"] = resp.getFullName()
6759 else:
6760 vars["responsibleName"] = ""
6762 nbd = candRoom.getNonBookableDates()
6763 if len(nbd) == 0:
6764 from MaKaC.plugins.RoomBooking.default.room import NonBookableDate
6765 nbd = [NonBookableDate(None, None)]
6766 vars["nonBookableDates"] = nbd
6768 return vars
6771 class WRoomBookingRoomCalendar( WTemplated ):
6773 def __init__( self, rh, standalone = False, buttonText ='' ):
6774 self._rh = rh
6775 self._candResv = rh._candResv
6776 self._standalone = standalone
6777 self._buttonText = buttonText
6779 def getVars( self ):
6780 vars = WTemplated.getVars( self )
6782 candResv = self._candResv
6783 room = candResv.room
6785 if self._standalone:
6786 vars["bookingDetailsUH"] = urlHandlers.UHRoomBookingBookingDetails
6787 else:
6788 vars["bookingDetailsUH"] = urlHandlers.UHConfModifRoomBookingDetails
6790 # Calendar range
6791 now = datetime.now()
6792 if candResv != None: #.startDT != None and candResv.endDT != None:
6793 calendarStartDT = datetime( candResv.startDT.year, candResv.startDT.month, candResv.startDT.day, 0, 0, 1 ) # Potential performance problem
6794 calendarEndDT = datetime( candResv.endDT.year, candResv.endDT.month, candResv.endDT.day, 23, 59 ) # with very long reservation periods
6795 else:
6796 calendarStartDT = datetime( now.year, now.month, now.day, 0, 0, 1 )
6797 calendarEndDT = calendarStartDT + timedelta( 3 * 31, 50, 0, 0, 59, 23 )
6799 # example resv. to ask for other reservations
6800 resvEx = CrossLocationFactory.newReservation( location = room.locationName )
6801 resvEx.startDT = calendarStartDT
6802 resvEx.endDT = calendarEndDT
6803 resvEx.repeatability = RepeatabilityEnum.daily
6804 resvEx.room = room
6805 resvEx.isConfirmed = None # To include both confirmed and not confirmed
6807 # Bars: Existing reservations
6808 collisionsOfResvs = resvEx.getCollisions()
6809 bars = []
6810 for c in collisionsOfResvs:
6811 if c.withReservation.isConfirmed:
6812 bars.append( Bar( c, Bar.UNAVAILABLE ) )
6813 else:
6814 bars.append( Bar( c, Bar.PREBOOKED ) )
6816 # Bars: Candidate reservation
6817 periodsOfCandResv = candResv.splitToPeriods()
6818 for p in periodsOfCandResv:
6819 bars.append( Bar( Collision( (p.startDT, p.endDT), candResv ), Bar.CANDIDATE ) )
6821 # Bars: Conflicts all vs candidate
6822 candResvIsConfirmed = candResv.isConfirmed;
6823 candResv.isConfirmed = None
6824 allCollisions = candResv.getCollisions()
6825 candResv.isConfirmed = candResvIsConfirmed
6826 if candResv.id:
6827 # Exclude candidate vs self pseudo-conflicts (Booking modification)
6828 allCollisions = filter( lambda c: c.withReservation.id != candResv.id, allCollisions )
6829 collisions = [] # only with confirmed resvs
6830 for c in allCollisions:
6831 if c.withReservation.isConfirmed:
6832 bars.append( Bar( c, Bar.CONFLICT ) )
6833 collisions.append( c )
6834 else:
6835 bars.append( Bar( c, Bar.PRECONFLICT ) )
6837 if not candResv.isRejected and not candResv.isCancelled:
6838 vars["thereAreConflicts"] = len( collisions ) > 0
6839 else:
6840 vars["thereAreConflicts"] = False
6841 vars["conflictsNumber"] = len( collisions )
6843 bars = barsList2Dictionary( bars )
6844 bars = addOverlappingPrebookings( bars )
6845 bars = sortBarsByImportance( bars, calendarStartDT, calendarEndDT )
6847 if not self._standalone:
6848 for dt in bars.iterkeys():
6849 for bar in bars[dt]:
6850 bar.forReservation.setOwner( self._rh._conf )
6852 vars["calendarStartDT"] = calendarStartDT
6853 vars["calendarEndDT"] = calendarEndDT
6854 vars["bars"] = bars
6855 vars["iterdays"] = iterdays
6856 vars["day_name"] = day_name
6857 vars["Bar"] = Bar
6858 vars["room"] = room
6859 vars["buttonText"] = self._buttonText
6861 vars["withConflicts"] = True
6863 return vars
6866 class WRoomBookingStatement( WTemplated ):
6868 def __init__( self, rh ):
6869 self._rh = rh
6871 def getVars( self ):
6872 vars = WTemplated.getVars( self )
6873 vars['title'] = self._rh._title
6874 vars['description'] = self._rh._description
6875 return vars
6877 class WRoomBookingAdmin( WTemplated ):
6879 def __init__( self, rh ):
6880 self._rh = rh
6882 def getVars( self ):
6883 vars = WTemplated.getVars( self )
6884 vars["Location"] = Location
6885 return vars
6888 class WRoomBookingAdminLocation( WTemplated ):
6890 def __init__( self, rh, location ):
6891 self._rh = rh
6892 self._location = location
6894 def getVars( self ):
6895 vars = WTemplated.getVars( self )
6896 vars["location"] = self._location
6897 vars["possibleEquipment"] = self._location.factory.getEquipmentManager().getPossibleEquipment(location = self._location.friendlyName)
6898 vars["AttsManager"] = self._location.factory.getCustomAttributesManager()
6900 # Rooms
6901 rooms = self._location.factory.newRoom().getRooms(location = self._location.friendlyName)
6902 rooms.sort(key = lambda r: r.getFullName())
6904 vars["Rooms"] = rooms
6906 rh = self._rh
6908 vars["withKPI"] = rh._withKPI
6910 if rh._withKPI:
6911 vars["kpiAverageOccupation"] = str( int( round( rh._kpiAverageOccupation * 100 ) ) ) + "%"
6913 vars["kpiTotalRooms"] = rh._kpiTotalRooms
6914 vars["kpiActiveRooms"] = rh._kpiActiveRooms
6915 vars["kpiReservableRooms"] = rh._kpiReservableRooms
6917 vars["kpiReservableCapacity"] = rh._kpiReservableCapacity
6918 vars["kpiReservableSurface"] = rh._kpiReservableSurface
6920 # Bookings
6922 vars["kbiTotalBookings"] = rh._totalBookings
6924 # Next 9 KPIs
6925 vars["stats"] = rh._booking_stats
6927 return vars
6929 class WBaseSearchBox(WTemplated):
6931 def __init__(self, template='SearchBox', targetId=0):
6932 # overload the template
6933 WTemplated.__init__(self,template)
6934 self._targetId = targetId
6936 def getVars(self):
6937 vars = WTemplated.getVars( self )
6938 vars["searchAction"] = urlHandlers.UHSearch.getURL();
6939 vars['targetId'] = self._targetId
6940 vars['searchImg'] = imgLogo=Configuration.Config.getInstance().getSystemIconURL( "search" )
6941 vars['categId'] = 0
6942 return vars
6944 class WMiniSearchBox(WBaseSearchBox):
6946 def __init__(self, confId):
6947 WBaseSearchBox.__init__(self, template='MiniSearchBox',targetId = confId)
6949 def getVars(self):
6950 vars = WBaseSearchBox.getVars( self )
6951 return vars
6953 class WMicroSearchBox(WBaseSearchBox):
6955 def __init__(self, confId):
6956 WBaseSearchBox.__init__(self, template='MicroSearchBox',targetId = confId)
6957 self._confId = confId
6959 def getVars(self):
6960 vars = WBaseSearchBox.getVars( self )
6961 vars["innerBox"] = WMiniSearchBox(self._confId).getHTML().replace('"', '\\"').replace("'", "\\'").replace("\n"," ")
6962 vars["closeIcon"] = quoteattr(str(Configuration.Config.getInstance().getSystemIconURL("remove")));
6963 return vars
6965 class WCategorySearchBox(WBaseSearchBox):
6967 def __init__(self, categId = 0, optionsClass='arrowExpandIcon'):
6968 WBaseSearchBox.__init__(self, targetId = categId)
6969 self._categId = categId
6970 self._moreOptionsClass = optionsClass
6972 def getVars(self):
6973 vars = WBaseSearchBox.getVars( self )
6974 vars["categId"] = self._categId
6975 vars['moreOptionsClass'] = self._moreOptionsClass
6976 return vars
6978 class WRootSearchBox(WBaseSearchBox):
6980 def __init__(self):
6981 # overload the template
6982 WBaseSearchBox.__init__(self,'RootSearchBox')
6984 def getVars(self):
6985 vars = WBaseSearchBox.getVars( self )
6986 vars["innerBox"] = WBaseSearchBox().getHTML()
6987 return vars
6989 class WUtils:
6990 """A interface for creating easily some HTML elements..."""
6992 def createImg(cls, imgId, imgInfo="", imgText="", **attributes):
6993 """ returns an HTML image with optional text on the right.
6994 Params:
6995 imgId -- ID of the picture (see /code/MaKaC/common/MaCaKConfig.py ->SystemIcons).
6996 ImgInfo -- optional information text about the link.
6997 imgText -- optional text which will be displayed on the right of the pic.
6998 attributes -- [dictionary] attributes for <img> (e.g. border="" name="" ...).
7000 attr = utils.dictionaryToString(attributes)
7001 return """<img src="%s" alt="%s" %s /> %s"""%(Config.getInstance().getSystemIconURL(imgId),imgInfo,attr,imgText)
7002 createImg = classmethod(createImg)
7004 def createImgButton(cls, url, imgId, imgInfo="", imgText="", **attributes):
7005 """ returns an HTML image link with optional text on the right.
7006 Params:
7007 url -- link of target.
7008 imgId -- ID of the picture (see /code/MaKaC/common/MaCaKConfig.py ->SystemIcons).
7009 ImgInfo -- optional information text about the link.
7010 imgText -- optional text which will be displayed on the right of the pic.
7011 attributes -- [dictionary] attributes for <a> (e.g. onclick="" onchange="" ...).
7013 attr = utils.dictionaryToString(attributes)
7014 return """<a href="%s" %s>
7015 <img src="%s" alt="%s" /> %s
7016 </a>"""%(url, attr, Config.getInstance().getSystemIconURL(imgId), imgInfo, imgText)
7017 createImgButton = classmethod(createImgButton)
7019 def createChangingImgButton(cls, url, imgID, imgOverId, imgInfo="", imgText="", **attributes):
7020 """ returns a changing HTML image link
7021 (i.e. the image changes depending on mouseOver/mouseOut)
7022 with optional text on the right.
7024 Params:
7025 url -- link of target.
7026 imgID -- ID of the basic picture (see /code/MaKaC/common/MaCaKConfig.py ->SystemIcons).
7027 imgOverId -- ID of the picture appearing with onMouseOver.
7028 ImgInfo -- optional information text about the link.
7029 imgText -- optional text which will be displayed on the right of the pic.
7030 attributes -- [dictionary] attributes for <a> (e.g. onclick="" onchange="" ...).
7032 attr = utils.dictionaryToString(attributes)
7033 iconUrl = Config.getInstance().getSystemIconURL(imgID)
7034 iconOverUrl = Config.getInstance().getSystemIconURL(imgOverId)
7035 return """<a href="%s" %s>
7036 <img src="%s" alt="%s" onmouseover="javascript:this.src='%s'" onMouseOut="javascript:this.src='%s'"/> %s
7037 </a>"""%(url, attr, iconUrl, imgInfo, iconOverUrl, iconUrl, imgText)
7038 createChangingImgButton = classmethod(createChangingImgButton)
7040 def createTextarea(cls, content="", **attributes):
7041 """ returns an HTML textarea with optional text.
7042 Params:
7043 content -- optional text which will be displayed in the textarea.
7044 attributes -- [dictionary] attributes for <input> (e.g. name="" type="" ...).
7046 #check
7047 if content==None: content=""
7048 #attributes to string...
7049 attr = utils.dictionaryToString(attributes)
7050 #return HTML string
7051 return """<textarea rows="5" cols="15" %s>%s</textarea>"""%(attr,content)
7052 createTextarea = classmethod(createTextarea)
7054 def createInput(cls, text="", **attributes):
7055 """ returns an HTML input with optional text.
7056 Params:
7057 text -- optional text which will be displayed on the right of the input.
7058 attributes -- [dictionary] attributes for <input> (e.g. name="" type="" ...).
7060 #check
7061 if text==None: text=""
7062 #attributes to string...
7063 attr = utils.dictionaryToString(attributes)
7064 #return HTML string
7065 return """<input %s/>%s"""%(attr,text)
7066 createInput = classmethod(createInput)
7068 def createSelect(cls, emptyOption, options, selected="", **attributes):
7069 """ returns an HTML select field.
7070 Params:
7071 emptyOption -- [bool] if True, add a selectionable empty option in the select.
7072 options -- list of the options.
7073 selected -- (optional) the selected option.
7074 attributes -- [dictionary] attributes for <select> (e.g. name="" onchange="" ...).
7076 #attributes to string...
7077 attr = utils.dictionaryToString(attributes)
7078 #with empty option?
7079 if emptyOption==True:
7080 optionsHTML="<option></option>"
7081 else:
7082 optionsHTML=""
7083 #treating options...
7084 for option in options:
7085 if option!=None and option!="":
7086 if str(option)==str(selected):
7087 optionsHTML += """<option selected>%s</option>"""%(option)
7088 else:
7089 optionsHTML += "<option>%s</option>"%(option)
7090 return """<select %s>%s</select>"""%(attr,optionsHTML)
7091 createSelect = classmethod(createSelect)
7093 def appendNewLine(cls, htmlContent):
7094 """ appends a new line <br/> to the given html element.
7095 Params:
7096 htmlContent -- [str] html element
7098 return str(htmlContent) + "<br/>"
7099 appendNewLine = classmethod(appendNewLine)
7101 class WBeautifulHTMLList(WTemplated):
7103 def __init__(self, listObject, classNames, level):
7104 """ classNames: a dictionary such as {'UlClassName' : 'optionList'}. See the getVars for more class names.
7106 WTemplated.__init__(self)
7107 self.__listObject = listObject
7108 self.__classNames = classNames
7109 self.__level = level
7111 def getVars(self):
7112 vars = WTemplated.getVars( self )
7113 vars["ListObject"] = self.__listObject
7114 vars["UlClassName"] = self.__classNames.get("UlClassName", "")
7115 vars["LiClassName"] = self.__classNames.get("LiClassName", "")
7116 vars["DivClassName"] = self.__classNames.get("DivClassName", "")
7117 vars["Level"] = self.__level
7118 return vars
7120 class WBeautifulHTMLDict(WTemplated):
7122 def __init__(self, dictObject, classNames, level):
7123 """ classNames: a dictionary such as {'UlClassName' : 'optionList'}. See the getVars for more class names.
7125 WTemplated.__init__(self)
7126 self.__dictObject = dictObject
7127 self.__classNames = classNames
7128 self.__level = level
7130 def getVars(self):
7131 vars = WTemplated.getVars( self )
7132 vars["DictObject"] = self.__dictObject
7133 vars["UlClassName"] = self.__classNames.get("UlClassName", "")
7134 vars["LiClassName"] = self.__classNames.get("LiClassName", "")
7135 vars["DivClassName"] = self.__classNames.get("DivClassName", "")
7136 vars["KeyClassName"] = self.__classNames.get("KeyClassName", "")
7137 vars["Level"] = self.__level
7138 return vars
7141 class WFilterCriteria(WTemplated):
7143 Draws the options for a filter criteria object
7144 This means rendering the actual table that contains
7145 all the HTML for the several criteria
7148 def __init__(self, options, filterCrit, extraInfo=""):
7149 WTemplated.__init__(self, tpl_name = "FilterCriteria")
7150 self._filterCrit = filterCrit
7151 self._options = options
7152 self._extraInfo = extraInfo
7154 def _drawFieldOptions(self, formName, form):
7155 raise Exception("Method WFilterCriteria._drawFieldOptions must be overwritten")
7157 def getVars(self):
7159 vars = WTemplated.getVars( self )
7161 vars["extra"] = self._extraInfo
7163 vars["content"] = list((name, self._drawFieldOptions(name, form))
7164 for (name, form) in self._options)
7165 return vars
7167 class WDateField(WTemplated):
7169 def __init__(self, caption, name, date, format, isDisabled=False, isMandatory=False):
7170 self._withTime = format.find('%H') >= 0
7171 self._caption = caption
7172 self._name = name
7173 self._format = format
7174 self._isMandatory = isMandatory
7175 self._date = date
7176 self._isDisabled = isDisabled
7178 def getVars(self):
7179 vars = WTemplated.getVars(self)
7180 vars['name'] = self._name
7181 vars['caption'] = self._caption
7182 vars['date'] = self._date
7183 if self._date:
7184 vars['dateDisplay'] = datetime.strftime(self._date, self._format)
7185 else:
7186 vars['dateDisplay'] = ''
7187 vars['isDisabled'] = self._isDisabled
7188 vars['withTime'] = self._withTime
7189 vars['isMandatory'] = self._isMandatory
7190 vars['format'] = self._format
7191 return vars