source: indico/indico/MaKaC/webinterface/pages/sessions.py @ 10a79e

hello-world-walkthroughipv6v0.98-seriesv0.98.2v0.98.3v0.99v1.0v1.1
Last change on this file since 10a79e was 10a79e, checked in by Jose Benito <jose.benito.gonzalez@…>, 17 months ago

[IMP] Coordination control in sessions

  • Adapted JS class implemented for the modification control management in sessions.
  • Adapted AJAX services implemented for the modification control management in sessions as well.
  • Implemented functionality to add/remove conveners from the coordination control list
  • Deleted all code not used anymore for this functionality
  • Property mode set to 100644
File size: 124.9 KB
Line 
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.
11##
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.
16##
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.
20
21from xml.sax.saxutils import quoteattr, escape
22from datetime import datetime,timedelta
23
24import MaKaC.webinterface.wcomponents as wcomponents
25import MaKaC.webinterface.urlHandlers as urlHandlers
26import MaKaC.webinterface.materialFactories as materialFactories
27import MaKaC.webinterface.navigation as navigation
28import MaKaC.schedule as schedule
29import MaKaC.conference as conference
30import MaKaC.webinterface.linking as linking
31from MaKaC.webinterface.pages.conferences import WScheduleContribution, WPConferenceBase, WPConfModifScheduleGraphic, WPConferenceDefaultDisplayBase, WContribParticipantList, WContributionCreation, WContributionSchCreation, WPModScheduleNewContribBase, WPConferenceModifBase
32from MaKaC.common import Config, info
33from MaKaC.errors import MaKaCError
34import MaKaC.webinterface.timetable as timetable
35from MaKaC.webinterface.common.contribStatusWrapper import ContribStatusList
36import MaKaC.common.filters as filters
37import MaKaC.webinterface.common.contribFilters as contribFilters
38from MaKaC.webinterface.common.person_titles import TitlesRegistry
39from MaKaC.webinterface.pages import main
40from MaKaC.common.utils import isStringHTML
41from MaKaC import user
42from MaKaC.i18n import _
43from indico.util.i18n import i18nformat
44
45from pytz import timezone
46from MaKaC.common.timezoneUtils import DisplayTZ
47from indico.util import json
48import pytz
49import copy
50import MaKaC.webinterface.common.timezones as convertTime
51import MaKaC.common.timezoneUtils as timezoneUtils
52from MaKaC.common.fossilize import fossilize
53from MaKaC.fossils.conference import IConferenceEventInfoFossil, ISessionFossil
54
55
56class WPSessionBase( WPConferenceBase ):
57
58    def __init__( self, rh, session):
59        self._session = session
60        WPConferenceBase.__init__( self, rh, self._session.getConference() )
61
62
63class WPSessionDisplayBase( WPSessionBase ):
64    pass
65
66class WPSessionDefaultDisplayBase( WPConferenceDefaultDisplayBase, WPSessionDisplayBase ):
67
68    def __init__( self, rh, session ):
69        WPSessionDisplayBase.__init__( self, rh, session )
70
71class WContributionDisplayItemBase(wcomponents.WTemplated):
72
73    def __init__(self,aw,contrib):
74        self._contrib=contrib
75        self._aw=aw
76
77    def getVars( self ):
78        vars=wcomponents.WTemplated.getVars( self )
79        tz = DisplayTZ(self._aw,self._contrib.getConference()).getDisplayTZ()
80        vars["id"]=self.htmlText(self._contrib.getId())
81        vars["title"]=self.htmlText(self._contrib.getTitle())
82        cType=""
83        if self._contrib.getType() is not None:
84            cType=self.htmlText(self._contrib.getType().getName())
85        vars["type"]=self.htmlText(cType)
86        vars["startDate"]="&nbsp;"
87        if self._contrib.isScheduled():
88            vars["startDate"]=self._contrib.getAdjustedStartDate(tz).strftime("%Y-%b-%d %H:%M")
89        vars["duration"] = "&nbsp;"
90        if self._contrib.getDuration() is not None:
91            if (datetime(1900,1,1)+self._contrib.getDuration()).minute>0:
92                vars["duration"]="%s"%(datetime(1900,1,1)+self._contrib.getDuration()).strftime("%M'")
93            if (datetime(1900,1,1)+self._contrib.getDuration()).hour>0:
94                vars["duration"]="%s"%(datetime(1900,1,1)+self._contrib.getDuration()).strftime("%Hh%M'")
95        lspk = []
96        for speaker in self._contrib.getSpeakerList():
97            lspk.append(self.htmlText(speaker.getFullName()))
98        vars["speakers"] = "<br>".join( lspk )
99        if vars["speakers"]=="":
100            vars["speakers"]="&nbsp;"
101        vars["displayURL"]=quoteattr(str(urlHandlers.UHContributionDisplay.getURL(self._contrib)))
102        vars["boardNumber"]=self.htmlText(self._contrib.getBoardNumber())
103        return vars
104
105
106class WContributionDisplayItemFull(WContributionDisplayItemBase):
107    pass
108
109
110class WContributionDisplayItemMin(WContributionDisplayItemBase):
111    pass
112
113
114class WContributionDisplayItem:
115
116    def __init__( self, aw, contrib ):
117        self._contribution = contrib
118        self._aw = aw
119
120    def getHTML( self, params={} ):
121        if self._contribution.canAccess( self._aw ):
122            c = WContributionDisplayItemFull( self._aw, self._contribution )
123            return c.getHTML( params )
124        if self._contribution.canView( self._aw ):
125            c = WContributionDisplayItemMin( self._aw, self._contribution )
126            return c.getHTML( params )
127        return ""
128
129
130class WContributionDisplayPosterItemFull(WContributionDisplayItemBase):
131    pass
132
133
134class WContributionDisplayPosterItemMin(WContributionDisplayItemBase):
135    pass
136
137
138class WContributionDisplayPosterItem:
139
140    def __init__( self, aw, contrib ):
141        self._contribution = contrib
142        self._aw = aw
143
144    def getHTML( self, params={} ):
145        if self._contribution.canAccess( self._aw ):
146            c = WContributionDisplayPosterItemFull( self._aw, self._contribution )
147            return c.getHTML( params )
148        if self._contribution.canView( self._aw ):
149            c = WContributionDisplayPosterItemMin( self._aw, self._contribution )
150            return c.getHTML( params )
151        return ""
152
153
154class _NoWitdhdrawFF(filters.FilterField):
155    _id="no_withdrawn"
156
157    def __init__(self):
158        pass
159
160    def satisfies(self,contrib):
161        return not isinstance(contrib.getCurrentStatus(),conference.ContribStatusWithdrawn)
162
163
164class _NoWithdrawnFilterCriteria(filters.FilterCriteria):
165
166    def __init__(self,conf):
167        self._fields={"no_withdrawn":_NoWitdhdrawFF()}
168
169
170class WSessionDisplayBase(wcomponents.WTemplated):
171
172    def __init__(self,aw,session,activeTab="time_table",sortingCrit=None):
173        self._aw=aw
174        self._session=session
175        self._activeTab=activeTab
176        self._sortingCrit=sortingCrit
177        self._tz = timezoneUtils.DisplayTZ(self._aw,self._session.getConference()).getDisplayTZ()
178
179    def _getHTMLRow(self,title,body):
180        str = """
181                <tr>
182                    <td nowrap class="displayField" valign="top"><b>%s:</b></td>
183                    <td>%s</td>
184                </tr>"""%(title,body)
185        if body.strip() == "":
186            return ""
187        return str
188
189    def _createTabCtrl( self ):
190        self._tabCtrl=wcomponents.TabControl()
191        url=urlHandlers.UHSessionDisplay.getURL(self._session)
192        url.addParam("tab","contribs")
193        self._tabContribs=self._tabCtrl.newTab("contribs", \
194                                                _("Contribution List"),str(url))
195        url.addParam("tab","time_table")
196        self._tabTimeTable=self._tabCtrl.newTab("time_table", \
197                                                _("Time Table"),str(url))
198        if self._session.getScheduleType()=="poster":
199            self._tabTimeTable.setEnabled(False)
200            self._tabCtrl.getTabById("contribs").setActive()
201        else:
202            self._tabTimeTable.setEnabled(True)
203            tab=self._tabCtrl.getTabById(self._activeTab)
204            if tab is None:
205                tab=self._tabCtrl.getTabById("time_table")
206            tab.setActive()
207
208    def _getURL(self,sortByField):
209        url=urlHandlers.UHSessionDisplay.getURL(self._session)
210        url.addParam("tab",self._activeTab)
211        url.addParam("sortBy",sortByField)
212        return url
213
214    def _getContribListHTML(self):
215        cl = []
216        if self._sortingCrit is None:
217            self._sortingCrit=contribFilters.SortingCriteria(["number"])
218        fc=_NoWithdrawnFilterCriteria(self._session.getConference())
219        f=filters.SimpleFilter(fc,self._sortingCrit)
220        for contrib in f.apply(self._session.getContributionList()):
221            wc=WContributionDisplayItem(self._aw,contrib)
222            html=wc.getHTML()
223            cl.append("""<tr><td valign="top">%s</td></tr>"""%html)
224        idHTML="""id <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
225        if self._sortingCrit.getField().getId()!="number":
226            idHTML="""<a href=%s>id</a>"""%quoteattr(str(self._getURL("number")))
227        dateHTML="""date <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
228        if self._sortingCrit.getField().getId()!="date":
229            dateHTML="""<a href=%s>date</a>"""%quoteattr(str(self._getURL("date")))
230        typeHTML="""type <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
231        if self._sortingCrit.getField().getId()!="type":
232            typeHTML="""<a href=%s>type</a>"""%quoteattr(str(self._getURL("type")))
233        spkHTML="""presenters <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
234        if self._sortingCrit.getField().getId()!="speaker":
235            spkHTML="""<a href=%s>presenters</a>"""%quoteattr(str(self._getURL("speaker")))
236        return """
237            <table cellspacing="0" cellpadding="5" width="100%%">
238                <tr>
239                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
240                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
241                    <td class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">dur.</td>
242                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
243                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">title</td>
244                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
245                </tr>
246                %s
247            </table>"""%(idHTML,dateHTML,typeHTML,spkHTML,"".join(cl))
248
249    def _getPosterContribListHTML(self):
250        cl = []
251        if self._sortingCrit is None:
252            self._sortingCrit=contribFilters.SortingCriteria(["number"])
253        fc=_NoWithdrawnFilterCriteria(self._session.getConference())
254        f=filters.SimpleFilter(fc,self._sortingCrit)
255        for contrib in f.apply(self._session.getContributionList()):
256            wc=WContributionDisplayPosterItem(self._aw,contrib)
257            html=wc.getHTML()
258            cl.append("""<tr><td valign="top">%s</td></tr>"""%html)
259        idHTML="""id <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
260        if self._sortingCrit.getField().getId()!="number":
261            idHTML="""<a href=%s>id</a>"""%quoteattr(str(self._getURL("number")))
262        #dateHTML="""date <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
263        #if self._sortingCrit.getField().getId()!="date":
264        #    dateHTML="""<a href=%s>date</a>"""%quoteattr(str(self._getURL("date")))
265        typeHTML="""type <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
266        if self._sortingCrit.getField().getId()!="type":
267            typeHTML="""<a href=%s>type</a>"""%quoteattr(str(self._getURL("type")))
268        spkHTML="""presenters <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
269        if self._sortingCrit.getField().getId()!="speaker":
270            spkHTML="""<a href=%s>presenters</a>"""%quoteattr(str(self._getURL("speaker")))
271        boardNumHTML="""board # <img src=%s border="0" alt="down">"""%quoteattr(str(Config.getInstance().getSystemIconURL("downArrow")))
272        if self._sortingCrit.getField().getId()!="board_number":
273            boardNumHTML="""<a href=%s>board #</a>"""%quoteattr(str(self._getURL("board_number")))
274        return """
275            <table cellspacing="0" cellpadding="5" width="100%%">
276                <tr>
277                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
278                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
279                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">title</td>
280                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
281                    <td nowrap class="titleCellFormat" style="border-bottom: 1px solid #5294CC; padding-right:10px;border-right:5px solid #FFFFFF">%s</td>
282                </tr>
283                %s
284            </table>"""%(idHTML,typeHTML,spkHTML,boardNumHTML,"".join(cl))
285
286    def _getColor(self,entry):
287        bgcolor = "white"
288        if isinstance(entry,schedule.LinkedTimeSchEntry):
289            if isinstance(entry.getOwner(),conference.Contribution):
290                bgcolor = entry.getOwner().getSession().getColor()
291        elif isinstance(entry,schedule.BreakTimeSchEntry):
292            bgcolor = entry.getColor()
293        return bgcolor
294
295    def _getMaterialHTML(self, contrib):
296        lm=[]
297        paper=contrib.getPaper()
298        if paper is not None:
299            lm.append("""<a href=%s><img src=%s border="0" alt="paper"><small> %s</small></a>"""%(
300                quoteattr(str(urlHandlers.UHMaterialDisplay.getURL(paper))),
301                quoteattr(str(Config.getInstance().getSystemIconURL( "smallPaper" ))),
302                self.htmlText("paper")))
303        slides=contrib.getSlides()
304        if slides is not None:
305            lm.append("""<a href=%s><img src=%s border="0" alt="slides"><small> %s</small></a>"""%(
306                quoteattr(str(urlHandlers.UHMaterialDisplay.getURL(slides))),
307                quoteattr(str(Config.getInstance().getSystemIconURL( "smallSlides" ))),
308                self.htmlText("slides")))
309        proceedings=None
310        for mat in contrib.getMaterialList():
311            if mat.getTitle().lower() == "proceedings":
312                proceedings=mat
313                break
314        if proceedings is not None:
315            lm.append("""<a href=%s><small> %s</small></a>"""%(
316                quoteattr(str(urlHandlers.UHMaterialDisplay.getURL(proceedings))),
317                self.htmlText("proceedings")))
318        video=contrib.getVideo()
319        if video is None:
320            for mat in contrib.getMaterialList():
321               if mat.getTitle().lower().find("video") != -1:
322                   video = mat
323        if video is not None:
324            lm.append("""<a href=%s><img src=%s border="0" alt="video"><small> %s</small></a>"""%(
325                quoteattr(str(urlHandlers.UHMaterialDisplay.getURL(video))),
326                quoteattr(str(Config.getInstance().getSystemIconURL( "smallVideo" ))),
327                self.htmlText("video")))
328        return ", ".join(lm)
329
330    def _getContributionHTML(self,contrib):
331        URL=urlHandlers.UHContributionDisplay.getURL(contrib)
332        room = ""
333        if contrib.getRoom() != None:
334            room = "%s: "%contrib.getRoom().getName()
335        speakerList = []
336        for spk in contrib.getSpeakerList():
337            spkcapt=spk.getDirectFullName()
338            if spk.getAffiliation().strip() != "":
339                spkcapt="%s (%s)"%(spkcapt, spk.getAffiliation())
340            speakerList.append(spkcapt)
341        speakers =""
342        if speakerList != []:
343            speakers = i18nformat("""<br><small> _("by") %s</small>""")%"; ".join(speakerList)
344        linkColor=""
345        if contrib.getSession().isTextColorToLinks():
346            linkColor="color:%s"%contrib.getSession().getTextColor()
347        return """<table width="100%%">
348                        <tr>
349                            <td width="100%%" align="center" style="color:%s">
350                                [%s] <a href="%s" style="%s">%s</a>%s<br><small>(%s%s - %s)</small>
351                            </td>
352                            <td align="right" valign="top" nowrap style="color:%s">
353                                %s
354                            </td>
355                        </tr>
356                    </table>"""%(
357                contrib.getSession().getTextColor(),contrib.getId(),URL,\
358                linkColor, contrib.getTitle(),speakers,room,
359                contrib.getAdjustedStartDate(self._tz).strftime("%H:%M"),
360                contrib.getAdjustedEndDate(self._tz).strftime("%H:%M"),
361                contrib.getSession().getTextColor(),
362                self._getMaterialHTML(contrib))
363
364    def _getBreakHTML(self,breakEntry):
365        return """
366                <font color="%s">%s<br><small>(%s - %s)</small></font>
367                """%(\
368                    breakEntry.getTextColor(),\
369                    self.htmlText(breakEntry.getTitle()),\
370                    self.htmlText(breakEntry.getAdjustedStartDate(self._tz).strftime("%H:%M")),\
371                    self.htmlText(breakEntry.getAdjustedEndDate(self._tz).strftime("%H:%M")))
372
373    def _getSchEntries(self):
374        res=[]
375        for slot in self._session.getSlotList():
376            for entry in slot.getSchedule().getEntries():
377                res.append(entry)
378        return res
379
380    def _getEntryHTML(self,entry):
381        if isinstance(entry,schedule.LinkedTimeSchEntry):
382            if isinstance(entry.getOwner(),conference.Contribution):
383                return self._getContributionHTML(entry.getOwner())
384        elif isinstance(entry,schedule.BreakTimeSchEntry):
385            return self._getBreakHTML(entry)
386
387    def _getTimeTableHTML(self):
388
389        ttdata = json.dumps(schedule.ScheduleToJson.process(self._session.getSchedule(), self._tz,
390                                                                           None, days = None, mgmtMode = False))
391
392        eventInfo = fossilize(self._session.getConference(), IConferenceEventInfoFossil, tz=self._tz)
393        eventInfo['timetableSession'] = fossilize(self._session, ISessionFossil, tz=self._tz)
394        eventInfo = json.dumps(eventInfo)
395
396        return """
397            <div id="timetableDiv" style="position: relative;">
398
399            <div class="timetablePreLoading" style="width: 700px; height: 300px;">
400                <div class="text" style="padding-top: 200px;">&nbsp;&nbsp;&nbsp;%s</div>
401            </div>
402
403            <div class="clearfix"></div>
404
405            <script type="text/javascript">
406                var ttdata = %s;
407                var eventInfo = %s;
408
409                var historyBroker = new BrowserHistoryBroker();
410                var timetable = new SessionDisplayTimeTable(ttdata, eventInfo, 710, $E('timetableDiv'), historyBroker);
411
412                IndicoUI.executeOnLoad(function(){
413
414                  $E('timetableDiv').set(timetable.draw());
415                  timetable.postDraw();
416
417                });
418            </script>
419        """ %(_("Building timetable..."),
420              str(ttdata),
421              eventInfo)
422
423    def _getContribsHTML(self):
424        self._createTabCtrl()
425        if self._tabContribs.isActive():
426            if self._session.getScheduleType()=="poster":
427                html=self._getPosterContribListHTML()
428            else:
429                html=self._getContribListHTML()
430        else:
431            html=self._getTimeTableHTML()
432        return wcomponents.WTabControl(self._tabCtrl, self._aw).getHTML(html)
433
434    def getVars(self):
435        vars=wcomponents.WTemplated.getVars( self )
436
437        vars["title"]=self.htmlText(self._session.getTitle())
438
439        if self._session.getDescription():
440            desc = self._session.getDescription().strip()
441        else:
442            desc = ""
443
444        if desc!="":
445            vars["description"]="""
446                <tr>
447                    <td colspan="2"><table width="100%%" cellpadding="0" cellspacing="0" class="tablepre"><tr><td><pre>%s</pre></td></tr></table></td>
448                </tr>
449                                """%desc
450        else:
451            vars["description"]=""
452
453        tzUtil = timezoneUtils.DisplayTZ(self._aw,self._session.getOwner())
454        tz = tzUtil.getDisplayTZ()
455        sDate=self._session.getAdjustedStartDate(tz)
456        eDate=self._session.getAdjustedEndDate(tz)
457        if sDate.strftime("%d%b%Y")==eDate.strftime("%d%b%Y"):
458            vars["dateInterval"]=sDate.strftime("%A %d %B %Y %H:%M")
459        else:
460            vars["dateInterval"]= i18nformat(""" _("from") %s  _("to") %s""")%(
461                sDate.strftime("%A %d %B %Y %H:%M"),
462                eDate.strftime("%A %d %B %Y %H:%M"))
463        vars["location"]=""
464        loc=self._session.getLocation()
465        if loc is not None and loc.getName().strip()!="":
466            vars["location"]="""<i>%s</i>"""%self.htmlText(loc.getName())
467            if loc.getAddress() is not None and loc.getAddress().strip()!="":
468                vars["location"]="""%s<pre>%s</pre>"""%(vars["location"],
469                                                        loc.getAddress())
470        room = self._session.getRoom()
471        if room is not None:
472            roomLink=linking.RoomLinker().getHTMLLink(room,loc)
473            vars["location"]= i18nformat("""%s<br><small> _("Room"):</small> %s""")%(vars["location"],
474                                                            roomLink)
475        vars["location"]=self._getHTMLRow( _("Place"), vars["location"])
476        sessionConvs=[]
477        for convener in self._session.getConvenerList():
478            sessionConvs.append("""<a href="mailto:%s">%s</a>"""%(convener.getEmail(),
479                                        self.htmlText(convener.getFullName())))
480        slotConvsHTML=""
481        for entry in self._session.getSchedule().getEntries():
482            slot=entry.getOwner()
483            l=[]
484            for convener in slot.getOwnConvenerList():
485                l.append("""<a href="mailto:%s">%s</a>"""%(convener.getEmail(),
486                                        self.htmlText(convener.getFullName())))
487            if len(l)>0:
488                slotConvsHTML+="""
489                    <tr>
490                        <td valign="top">%s (<small>%s-%s</small>):</td>
491                        <td>%s</td>
492                    </tr>
493                      """%(self.htmlText(slot.getTitle()),
494                      slot.getAdjustedStartDate().strftime("%d-%b-%y %H:%M"),
495                      slot.getAdjustedEndDate().strftime("%d-%b-%y %H:%M"),
496                      "; ".join(l))
497        convs=""
498        if len(sessionConvs)>0 or slotConvsHTML.strip()!="":
499            convs="""
500                <table>
501                    <tr>
502                        <td valign="top" colspan="2">%s</td>
503                    </tr>
504                    %s
505                </table>"""%("<br>".join(sessionConvs),slotConvsHTML)
506        vars["conveners"]=self._getHTMLRow( _("Conveners"),convs)
507        lm = []
508        for material in self._session.getAllMaterialList():
509            url=urlHandlers.UHMaterialDisplay.getURL(material)
510            lm.append(wcomponents.WMaterialDisplayItem().getHTML(self._aw,material,url))
511        vars["material"] = self._getHTMLRow( _("Material"), "<br>".join( lm ) )
512        vars["contribs"]= ""
513        if self._session.getContributionList() != []:
514            vars["contribs"]=self._getContribsHTML()
515        vars["PDFIcon"]=quoteattr(str(Config.getInstance().getSystemIconURL("print")))
516        url=urlHandlers.UHConfTimeTablePDF.getURL(self._session.getConference())
517        url.addParam("showSessions",self._session.getId())
518        if self._session.getScheduleType()=="poster":
519            if self._sortingCrit is not None and \
520                    self._sortingCrit.getField() is not None:
521                url.addParam("sortBy",self._sortingCrit.getField().getId())
522        vars["PDFURL"]=quoteattr(str(url))
523
524        return vars
525
526
527# TODO: These classes are actually the same, no?  (Pedro)
528
529class WSessionDisplayFull(WSessionDisplayBase):
530    pass
531
532
533class WSessionDisplayMin(WSessionDisplayBase):
534    pass
535
536
537class WSessionDisplay:
538
539    def __init__(self,aw,session):
540        self._aw = aw
541        self._session = session
542
543    def getHTML(self,params={}):
544        if self._session.canAccess( self._aw ):
545            c=WSessionDisplayFull(self._aw,self._session,params["activeTab"],
546                    params.get("sortingCrit",None))
547            return c.getHTML( params )
548        if self._session.canView( self._aw ):
549            c = WSessionDisplayMin(self._aw,self._session,params["activeTab"],
550                    params.get("sortingCrit",None))
551            return c.getHTML( params )
552        return ""
553
554
555class WPSessionDisplay( WPSessionDefaultDisplayBase ):
556    navigationEntry = navigation.NESessionDisplay
557
558    def _getBody(self,params):
559        wc=WSessionDisplay(self._getAW(),self._session)
560        return wc.getHTML({"activeTab":params["activeTab"],
561                            "sortingCrit":params.get("sortingCrit",None)})
562
563    def _defineToolBar(self):
564        edit=wcomponents.WTBItem( _("manage this session"),
565            icon=Config.getInstance().getSystemIconURL("modify"),
566            actionURL=urlHandlers.UHSessionModification.getURL(self._session),
567            enabled=self._session.canModify(self._getAW()) or \
568                    self._session.canCoordinate(self._getAW()))
569        url=urlHandlers.UHConfTimeTablePDF.getURL(self._session.getConference())
570        url.addParam("showSessions",self._session.getId())
571        pdf=wcomponents.WTBItem( _("get PDF of this session"),
572            icon=Config.getInstance().getSystemIconURL("pdf"),
573            actionURL=url)
574        ical=wcomponents.WTBItem( _("get ICal of this session"),
575            icon=Config.getInstance().getSystemIconURL("ical"),
576            actionURL=urlHandlers.UHSessionToiCal.getURL(self._session))
577        self._toolBar.addItem(edit)
578        self._toolBar.addItem(pdf)
579        self._toolBar.addItem(ical)
580
581    def getJSFiles(self):
582        return WPSessionDefaultDisplayBase.getJSFiles(self) + \
583               self._includeJSPackage('Timetable')
584
585class WPSessionModifBase( WPConferenceModifBase ):
586
587    def __init__(self, rh, session):
588        WPConferenceModifBase.__init__(self, rh, session.getConference())
589        self._session = session
590
591    def _setActiveSideMenuItem( self ):
592        self._timetableMenuItem.setActive()
593
594    def _createTabCtrl( self ):
595        type = self._session.getConference().getType()
596        self._tabCtrl = wcomponents.TabControl()
597        self._tabMain = self._tabCtrl.newTab( "main", _("Main"), \
598                urlHandlers.UHSessionModification.getURL( self._session ) )
599        self._tabContribs=self._tabCtrl.newTab( "contribs", _("Contributions"), \
600                urlHandlers.UHSessionModContribList.getURL(self._session) )
601        self._tabTimetable=self._tabCtrl.newTab( "sessionTimetable", _("Session timetable"), \
602                urlHandlers.UHSessionModifSchedule.getURL(self._session) )
603        self._tabComm = self._tabCtrl.newTab( "comment", _("Comment"), \
604                urlHandlers.UHSessionModifComm.getURL( self._session ) )
605        self._tabMaterials = self._tabCtrl.newTab( "materials", _("Files"), \
606                urlHandlers.UHSessionModifMaterials.getURL( self._session ) )
607        self._tabAC = self._tabCtrl.newTab( "ac", _("Protection"), \
608                urlHandlers.UHSessionModifAC.getURL( self._session ) )
609
610        canModify=self._session.canModify(self._getAW())
611        self._tabAC.setEnabled(canModify)
612        self._tabTools = self._tabCtrl.newTab( "tools", _("Tools"), \
613                urlHandlers.UHSessionModifTools.getURL( self._session ) )
614        self._tabTools.setEnabled(canModify)
615        self._setActiveTab()
616        self._setupTabCtrl()
617        if type != "conference":
618            self._tabContribs.disable()
619
620    def _setActiveTab( self ):
621        pass
622
623    def _setupTabCtrl(self):
624        pass
625
626    def _getNavigationDrawer(self):
627        pars = {"target": self._session, "isModif": True }
628        return wcomponents.WNavigationDrawer( pars, bgColor="white" )
629
630    def _getPageContent( self, params ):
631        self._createTabCtrl()
632
633        banner = wcomponents.WTimetableBannerModif(self._getAW(), self._session).getHTML()
634        body = wcomponents.WTabControl( self._tabCtrl, self._getAW() ).getHTML( self._getTabContent( params ) )
635        return banner + body
636
637
638class WSessionModifClosed(wcomponents.WTemplated):
639
640    def __init__(self):
641        pass
642
643    def getVars(self):
644        vars = wcomponents.WTemplated.getVars(self)
645        vars["closedIconURL"] = Config.getInstance().getSystemIconURL("closed")
646        return vars
647
648class WSessionModifMainType(wcomponents.WTemplated):
649
650    def __init__(self):
651        pass
652
653    def getVars( self ):
654        vars=wcomponents.WTemplated.getVars(self)
655        l=[]
656        currentTTType=vars.get("tt_type",conference.SlotSchTypeFactory.getDefaultId())
657        for i in conference.SlotSchTypeFactory.getIdList():
658            sel=""
659            if i==currentTTType:
660                sel=" selected"
661            l.append("""<option value=%s%s>%s</option>"""%(quoteattr(str(i)),
662                        sel,self.htmlText(i)))
663        vars["tt_types"]="".join(l)
664        return vars
665
666class WSessionModifMainCode(wcomponents.WTemplated):
667
668    def __init__(self):
669        pass
670
671    def getVars( self ):
672        vars=wcomponents.WTemplated.getVars(self)
673        vars["code"]=str(vars.get("code",""))
674        return vars
675
676class WSessionModifMainColors(wcomponents.WTemplated):
677
678    def __init__(self):
679        pass
680
681    def getVars(self):
682        vars = wcomponents.WTemplated.getVars(self)
683        return vars
684
685class WSessionModifMain(wcomponents.WTemplated):
686
687    def __init__( self, session, mfRegistry ):
688        self._session = session
689        self._mfr = mfRegistry
690
691    def _getConvenersHTML(self):
692        res=[]
693        for conv in self._session.getConvenerList():
694            url=urlHandlers.UHSessionModConvenerEdit.getURL(conv)
695            res.append("""
696                <input type="checkbox" name="selConv" value=%s> <a href=%s>%s</a>
697                """%(quoteattr(str(conv.getId())),\
698                    quoteattr(str(url)), \
699                    self.htmlText(conv.getFullName())))
700        return "<br>".join(res)
701
702    def getVars( self ):
703        vars = wcomponents.WTemplated.getVars( self )
704        vars["addMaterialURL"]=urlHandlers.UHSessionAddMaterial.getURL(self._session)
705        vars["removeMaterialsURL"]=urlHandlers.UHSessionRemoveMaterials.getURL()
706
707        newConvenerURL = urlHandlers.UHSessionDataModificationNewConvenerCreate.getURL(self._session)
708        vars["newConvenerURL"] = newConvenerURL
709        searchConvenerURL = urlHandlers.UHSessionDataModificationNewConvenerSearch.getURL(self._session)
710        vars["searchConvenerURL"] = searchConvenerURL
711        vars["remConvenersURL"]=quoteattr(str(urlHandlers.UHSessionModConvenersRem.getURL(self._session)))
712        vars["dataModificationURL"]=quoteattr(str(urlHandlers.UHSessionDataModification.getURL(self._session)))
713        vars["code"]=self.htmlText(self._session.getCode())
714        vars["title"]=self._session.getTitle()
715        if isStringHTML(self._session.getDescription()):
716            vars["description"] = self._session.getDescription()
717        else:
718            vars["description"] = """<table class="tablepre"><tr><td><pre>%s</pre></td></tr></table>""" % self._session.getDescription()
719        vars["place"]=""
720        place=self._session.getLocation()
721        if place is not None:
722            vars["place"] = "%s<br><pre>%s</pre>"%(\
723                                            self.htmlText(place.getName()),
724                                            self.htmlText(place.getAddress()))
725        room=self._session.getRoom()
726        if room is not None:
727            vars["place"]+="<i>Room:</i> %s"%self.htmlText(room.getName())
728        vars["startDate"],vars["endDate"],vars["duration"]="","",""
729        if self._session.getAdjustedStartDate() is not None:
730            tz = self._session.getTimezone()
731            vars["startDate"]=self.htmlText(self._session.getAdjustedStartDate().strftime("%A %d %B %Y %H:%M"))
732            vars["endDate"]=self.htmlText(self._session.getAdjustedEndDate().strftime("%A %d %B %Y %H:%M"))
733        vars["conveners"]=self._getConvenersHTML()
734        vars["bgcolor"] = self._session.getColor()
735        vars["textcolor"] = self._session.getTextColor()
736        vars["entryDuration"]=self.htmlText((datetime(1900,1,1)+self._session.getContribDuration()).strftime("%Hh%M'"))
737        vars["tt_type"]=self.htmlText(self._session.getScheduleType())
738        type = self._session.getConference().getType()
739        if type == "conference":
740            vars["Type"]=WSessionModifMainType().getHTML(vars)
741            vars["Colors"]=WSessionModifMainColors().getHTML(vars)
742            vars["Code"]=WSessionModifMainCode().getHTML(vars)
743            vars["Rowspan"]=7
744        else:
745            vars["Type"]=""
746            vars["Colors"]=""
747            vars["Code"]=""
748            vars["Rowspan"]=4
749        return vars
750
751
752class WPSessionModification( WPSessionModifBase ):
753
754    def _getTabContent( self, params ):
755        comp=WSessionModifMain(self._session,materialFactories.SessionMFRegistry())
756        return comp.getHTML()
757
758class WPSessionModificationClosed( WPSessionModifBase ):
759
760    def _createTabCtrl( self ):
761        self._tabCtrl = wcomponents.TabControl()
762        self._tabMain = self._tabCtrl.newTab( "main",_("Main"), "")
763        self._setActiveTab()
764
765    def _getTabContent( self, params ):
766        comp=WSessionModifClosed()
767        return comp.getHTML()
768
769#------------------------------------------------------------------------------------
770
771class WPSessionDataModification(WPSessionModification):
772
773    def _getTabContent(self,params):
774        title="Edit session data"
775        p=wcomponents.WSessionModEditData(self._session.getConference(),self._getAW(),title)
776        params["postURL"]=urlHandlers.UHSessionDataModification.getURL(self._session)
777        params["colorChartIcon"]=Config.getInstance().getSystemIconURL("colorchart")
778        urlbg=urlHandlers.UHSimpleColorChart.getURL()
779        urlbg.addParam("colorCodeTarget", "backgroundColor")
780        urlbg.addParam("colorPreviewTarget", "backgroundColorpreview")
781        params["bgcolorChartURL"]=urlbg
782        params["bgcolor"] = self._session.getColor()
783        urltext=urlHandlers.UHSimpleColorChart.getURL()
784        urltext.addParam("colorCodeTarget", "textColor")
785        urltext.addParam("colorPreviewTarget", "textColorpreview")
786        params["textcolorChartURL"]=urltext
787        params["textcolor"] = self._session.getTextColor()
788        params["textColorToLinks"]=""
789        if self._session.isTextColorToLinks():
790            params["textColorToLinks"]="checked=\"checked\""
791
792        #wconvener = wcomponents.WAddPersonModule("convener")
793        #params["convenerDefined"] = self._getDefinedDisplayList("convener")
794        #params["convenerOptions"] = ""
795        #params["convener"] = wconvener.getHTML(params)
796        params["convener"] = ""
797        return p.getHTML(params)
798
799    def _getDefinedDisplayList(self, typeName):
800         list = self._session.getConvenerList()
801         if list is None :
802             return ""
803         html = []
804         counter = 0
805         for person in list :
806             text = """
807                 <tr>
808                     <td width="5%%"><input type="checkbox" name="%ss" value="%s"></td>
809                     <td>&nbsp;%s</td>
810                 </tr>"""%(typeName,counter,person.getFullName())
811             html.append(text)
812             counter = counter + 1
813         return """
814             """.join(html)
815
816#---------------------------------------------------------------------------
817
818class WPSessionDataModificationConvenerSelect( WPSessionModifBase):
819
820    #def _setActiveTab( self ):
821    #    self._tabContribList.setActive()
822
823    def _getTabContent( self, params ):
824        searchAction = str(self._rh.getCurrentURL())
825        newButtonAction = params["newButtonAction"]
826        searchExt = params.get("searchExt","")
827        if searchExt != "":
828            searchLocal = False
829        else:
830            searchLocal = True
831        p = wcomponents.WComplexSelection(self._conf,searchAction, addTo = 5, forceWithoutExtAuth=searchLocal)
832        return p.getHTML(params)
833
834#---------------------------------------------------------------------------
835
836class WPSessionDataModificationConvenerNew(WPSessionModifBase):
837
838    #def _setActiveTab( self ):
839    #    self._tabContribList.setActive()
840
841    def _getTabContent( self, params ):
842        p = wcomponents.WNewPerson()
843
844        if params.get("formTitle",None) is None :
845            params["formTitle"] =_("Define new convener")
846        if params.get("titleValue",None) is None :
847            params["titleValue"] = ""
848        if params.get("surNameValue",None) is None :
849            params["surNameValue"] = ""
850        if params.get("nameValue",None) is None :
851            params["nameValue"] = ""
852        if params.get("emailValue",None) is None :
853            params["emailValue"] = ""
854        if params.get("addressValue",None) is None :
855            params["addressValue"] = ""
856        if params.get("affiliationValue",None) is None :
857            params["affiliationValue"] = ""
858        if params.get("phoneValue",None) is None :
859            params["phoneValue"] = ""
860        if params.get("faxValue",None) is None :
861            params["faxValue"] = ""
862
863
864        params["disabledRole"] = False
865        params["roleDescription"] = i18nformat(""" _("Coordinator")<br> _("Manager")""")
866        if params.has_key("submissionControlValue") :
867            params["roleValue"] = i18nformat(""" <input type="checkbox" name="coordinatorControl" checked> _("Give coordinator rights to the convener").<br>
868                                      <input type="checkbox" name="managerControl" checked> _("Give management rights to the convener").""")
869        else:
870            params["roleValue"] = i18nformat(""" <input type="checkbox" name="coordinatorControl"> _("Give coordinator rights to the convener").<br>
871                                      <input type="checkbox" name="managerControl"> _("Give management rights to the convener").""")
872        params["disabledNotice"] = True
873        params["noticeValue"] = i18nformat("""<i><font color="black"><b> _("Note"): </b></font> _("If this person does not already have
874         an Indico account, he or she will be sent an email asking to create an account. After the account creation the
875         user will automatically be given coordinator rights").</i>""")
876
877
878        if params.get("formAction",None) is None :
879            formAction = urlHandlers.UHSessionDataModificationPersonAdd.getURL(self._conf)
880            formAction.addParam("sessionId",self._session.getId())
881            formAction.addParam("orgin","new")
882            formAction.addParam("typeName","convener")
883            params["formAction"] = formAction
884
885        return p.getHTML(params)
886
887#---------------------------------------------------------------------------
888
889class WPModEditDataConfirmation(WPSessionModification):
890
891    def _getTabContent(self,params):
892        wc=wcomponents.WConfirmation()
893        msg= _("""You have selected to CHANGE THIS SESSION SCHEDULE TYPE from %s to %s, if you continue any contribution scheduled within any slot of the current session will be unscheduled, are you sure you want to continue?""")%(self._session.getScheduleType(),params["tt_type"])
894        url=urlHandlers.UHSessionDataModification.getURL(self._session)
895        return wc.getHTML(msg,url,params)
896
897
898class WPModConvenerNew(WPSessionModification):
899
900    def _getTabContent(self,params):
901        caption= _("Adding a new convener")
902        wc=wcomponents.WConfModParticipEdit(title=caption)
903        params["postURL"]=urlHandlers.UHSessionModConvenerNew.getURL(self._session)
904        params["addToManagersList"]= i18nformat("""
905                                    <tr>
906                                        <td nowrap class="titleCellTD">
907                                            <span class="titleCellFormat"> _("Specific rights")</span>
908                                        </td>
909                                        <td bgcolor="white" width="100%%" valign="top" class="blacktext">
910                                            <input type="radio" name="specialRights" value="none" checked> _("Do not give specific rights").<br>
911                                            <input type="radio" name="specialRights" value="manager"> _("Give session manager rights to the convener").<br>
912                                            <input type="radio" name="specialRights" value="coordinator"> _("Give session coordinator rights to the convener").<br><br><i><font color="black"><b> _("Note"): </b></font> _("If this person does not already have an Indico account, he or she will be sent an email asking to create an account. After the account creation the user will automatically be given the specific rights").</i>
913                                        </td>
914                                    </tr>
915                                    """)
916        return wc.getHTML( params )
917
918
919
920class WPModConvenerEdit(WPSessionModification):
921
922##    def _getTabContent(self,params):
923##        caption="Edit convener data"
924##        conv=params["convener"]
925##        wc=wcomponents.WConfModParticipEdit(part=conv,title=caption)
926##        params["postURL"]=urlHandlers.UHSessionModConvenerEdit.getURL(conv)
927##        params["addToManagersList"]=""
928##        return wc.getHTML(params)
929
930    def _getTabContent(self,params):
931        p = wcomponents.WNewPerson()
932        conv = params["convener"]
933        params["formTitle"] =  _("Define new convener")
934        params["titleValue"] = conv.getTitle()
935        params["surNameValue"] = conv.getFamilyName()
936        params["nameValue"] = conv.getFirstName()
937        params["emailValue"] = conv.getEmail()
938        params["addressValue"] = conv.getAddress()
939        params["affiliationValue"] = conv.getAffiliation()
940        params["phoneValue"] = conv.getPhone()
941        params["faxValue"] = conv.getFax()
942
943        params["disabledRole"] = False
944        params["roleDescription"] =  i18nformat(""" _("Coordinator")<br> _("Manager")""")
945        session = conv.getSession()
946        av = user.AvatarHolder().match({"email":conv.getEmail()})
947        params["disabledNotice"] = True
948        coordValue =  i18nformat("""<input type="checkbox" name="coordinatorControl"> _("Give coordinator rights to the convener").""")
949        if (av and av[0] in session.getCoordinatorList()) or conv.getEmail() in session.getCoordinatorEmailList():
950            coordValue = _("""The convener is already a coordinator""")
951        else:
952            params["disabledNotice"] = False
953
954        managerValue =  i18nformat("""<input type="checkbox" name="managerControl"> _("Give management rights to the convener").""")
955        if (av and av[0] in session.getManagerList() ) or conv.getEmail() in session.getAccessController().getModificationEmail():
956            managerValue = _("""The convener is already a manager""")
957        else:
958            params["disabledNotice"] = False
959
960        params["roleValue"] = """ %s<br>
961                                  %s"""%(coordValue, managerValue)
962
963        params["noticeValue"] =  i18nformat("""<i><font color="black"><b> _("Note"): </b></font> _("If this person does not already have
964         an Indico account, he or she will be sent an email asking to create an account. After the account creation the
965         user will automatically be given coordinator/manager rights").</i>""")
966
967        formAction = urlHandlers.UHSessionModConvenerEdit.getURL(conv)
968        formAction.addParam("orgin","new")
969        formAction.addParam("typeName","convener")
970        params["formAction"] = formAction
971
972        return p.getHTML(params)
973
974
975
976class WPSessionAddMaterial( WPSessionModification ):
977
978    def __init__( self, rh, session, mf ):
979        WPSessionModification.__init__( self, rh, session )
980        self._mf = mf
981
982    def _getTabContent( self, params ):
983        if self._mf:
984            comp = self._mf.getCreationWC( self._session )
985        else:
986            comp = wcomponents.WMaterialCreation( self._session )
987        pars = { "postURL": urlHandlers.UHSessionPerformAddMaterial.getURL() }
988        return comp.getHTML( pars )
989
990
991class WSessionModPlainTTDay(wcomponents.WTemplated):
992
993    def __init__(self,aw,day,session):
994        self._aw=aw
995        self._day=day
996        self._session=session
997
998    def _getContribHTML(self,contrib):
999        duration=(datetime(1900,1,1)+contrib.getDuration()).strftime("%Hh%M'")
1000        speakers=[]
1001        for spk in contrib.getSpeakerList():
1002            speakers.append(self.htmlText("%s"%spk.getFullName()))
1003        url=urlHandlers.UHContributionModification.getURL(contrib)
1004        urlEdit=urlHandlers.UHSessionModSchEditContrib.getURL(contrib)
1005        editIconURL=Config.getInstance().getSystemIconURL("modify")
1006        return """
1007            <tr>
1008                <td valign="top" nowrap><input type="checkbox" name="schEntryId" value=%s></td>
1009                <td valign="top" nowrap>%s</td>
1010                <td valign="top" nowrap>(%s)</td>
1011                <td valign="top" nowrap><a href=%s><img src=%s border="0" alt=""></a></td>
1012                <td width="100%%" valign="top">
1013                    <table width="100%%" cellpadding="0" cellspacing="0">
1014                        <tr>
1015                            <td width="100%%" valign="top">
1016                                [%s] <a href=%s>%s</a>
1017                            </td>
1018                            <td nowrap align="right" valign="top">
1019                                %s
1020                            </td>
1021                        </tr cellpadding="0" cellspacing="0">
1022                    </table>
1023                </td>
1024            </tr>
1025            <tr>
1026                <td colspan="5" nowrap valign="top" style="border-top: 1px solid">&nbsp;</td>
1027            </tr>
1028                """%( contrib.getSchEntry().getId(),
1029                        contrib.getAdjustedStartDate().strftime("%H:%M"),
1030                        duration,quoteattr(str(urlEdit)),
1031                        quoteattr(str(editIconURL)),
1032                        self.htmlText(contrib.getId()),
1033                        quoteattr(str(url)),
1034                        self.htmlText(contrib.getTitle()),
1035                        "<br>".join(speakers))
1036
1037    def _getBreakHTML(self,breakEntry):
1038        duration=(datetime(1900,1,1)+breakEntry.getDuration()).strftime("%Hh%M")
1039        url=urlHandlers.UHSessionModifyBreak.getURL(breakEntry)
1040        urlEdit=urlHandlers.UHSessionModifyBreak.getURL(breakEntry)
1041        editIconURL=Config.getInstance().getSystemIconURL("modify")
1042        return """
1043            <tr>
1044                <td valign="top" nowrap><input type="checkbox" name="schEntryId" value=%s></td>
1045                <td valign="top" nowrap>%s</td>
1046                <td valign="top" nowrap>(%s)</td>
1047                <td valign="top" nowrap><a href=%s><img src=%s border="0" alt=""></a></td>
1048                <td width="100%%" valign="top" align="center">
1049                    <a href=%s>%s</a>
1050                </td>
1051            </tr>
1052            <tr>
1053                <td colspan="5" nowrap valign="top" style="border-top: 1px solid">&nbsp;</td>
1054            </tr>
1055                """%(breakEntry.getId(),
1056                        breakEntry.getAdjustedStartDate().strftime("%H:%M"),
1057                        duration,quoteattr(str(urlEdit)),
1058                        quoteattr(str(editIconURL)),
1059                        quoteattr(str(url)),
1060                        self.htmlText(breakEntry.getTitle()))
1061
1062    def _getSlotHTML(self,slot):
1063        caption = ""
1064        if slot.getRoom() is not None:
1065            caption=slot.getRoom().getName()
1066        if slot.getTitle().strip() != "":
1067            caption = "%s (%s)"%(self.htmlText(slot.getTitle()),self.htmlText(caption))
1068        duration=""
1069        if (datetime(1900,1,1)+slot.getDuration()).minute>0:
1070            duration="%s'"%(datetime(1900,1,1)+slot.getDuration()).minute
1071        if (datetime(1900,1,1)+slot.getDuration()).hour>0:
1072            duration="%sh%s"%((datetime(1900,1,1)+slot.getDuration()).hour,duration)
1073        if duration!="":
1074            duration="(%s)"%duration
1075        entries=[]
1076        at=timedelta(0,0,0)
1077        for entry in slot.getSchedule().getEntries():
1078            if isinstance(entry,schedule.LinkedTimeSchEntry) and \
1079                    isinstance(entry.getOwner(),conference.Contribution):
1080                entries.append(self._getContribHTML(entry.getOwner()))
1081            elif isinstance(entry,schedule.BreakTimeSchEntry):
1082                entries.append(self._getBreakHTML(entry))
1083            at+=entry.getDuration()
1084        addContribURL=urlHandlers.UHSessionModScheduleAddContrib.getURL(slot)
1085
1086        orginURL = urlHandlers.UHSessionModifSchedule.getURL(self._session.getOwner())
1087        orginURL.addParam("sessionId", self._session.getId())
1088        newContribURL = urlHandlers.UHConfModScheduleNewContrib.getURL(self._session.getOwner())
1089        newContribURL.addParam("sessionId", self._session.getId())
1090        newContribURL.addParam("slotId", slot.getId())
1091        newContribURL.addParam("orginURL",orginURL)
1092
1093        addBreakURL=urlHandlers.UHSessionAddBreak.getURL(slot)
1094        delSlotURL=urlHandlers.UHSessionModSlotRem.getURL(slot)
1095        editSlotURL=urlHandlers.UHSessionModSlotEdit.getURL(slot)
1096        delContribsURL=urlHandlers.UHSessionDelSchItems.getURL(slot)
1097        urlCompSlot = urlHandlers.UHSessionModSlotCalc.getURL(slot)
1098        if slot.getContribDuration() is None or slot.getContribDuration()==timedelta(0):
1099            ded=slot.getSession().getContribDuration()
1100        else:
1101            ded=slot.getContribDuration()
1102        nat=slot.getDuration()-at
1103        numEntries=len(entries)
1104        ree=0
1105        if ded!=0 and ded.seconds != 0:
1106            ree=int(nat.seconds/ded.seconds)
1107        linkColor=""
1108        if self._session.isTextColorToLinks():
1109            linkColor="color:%s"%self._session.getTextColor()
1110        editSlotLink,delSlotLink="",""
1111        if self._session.canModify(self._aw) or self._session.canCoordinate(self._aw, "unrestrictedSessionTT"):
1112            editSlotLink="""<input type="submit" value="delete" onClick="self.location.href='%s';return false;" class="smallbtn">"""%str(delSlotURL)
1113            delSlotLink="""<input type="submit" value="edit" onClick="self.location.href='%s';return false;" class="smallbtn">"""%str(editSlotURL)
1114
1115        convs=""
1116        l=[]
1117        if slot.getConvenerList() == []:
1118            for conv in self._session.getConvenerList():
1119                l.append("""%s"""%(self.htmlText(conv.getFullName())))
1120        else:
1121            for conv in slot.getConvenerList():
1122                l.append("""%s"""%(self.htmlText(conv.getFullName())))
1123        if len(l)>0:
1124            convs="Conveners: %s"%"; ".join(l)
1125        return  i18nformat("""
1126            <a name="slot%s"/>
1127            <table width="90%%" align="center" border="0"
1128                                        style="border-left: 1px solid #777777">
1129                <tr>
1130                    <td class="groupTitle" style="background: %s">
1131                        <table>
1132                            <tr>
1133                                <td nowrap class="groupTitle" style="background:%s;color: %s">
1134                                    %s-%s %s
1135                                </td>
1136                                <td width="100%%" align="center" class="groupTitle" style="background:%s;color: %s">
1137                                    %s
1138                                </td>
1139                                <td align="right" nowrap style="letter-spacing: 0px">
1140                                    <input type="submit" value="_("add contribution")" onClick="self.location.href='%s';return false;" class="smallbtn">
1141                                    <input type="submit" value="_("new contribution")" onClick="self.location.href='%s';return false;" class="smallbtn">
1142                                    <input type="submit" value="_("new break")" onClick="self.location.href='%s';return false;" class="smallbtn">
1143                                    %s %s
1144                                    <input type="submit" value="_("reschedule")" onClick="self.location.href='%s';return false;" class="smallbtn">
1145                                </td>
1146                            </tr>
1147                            <tr>
1148                                <td colspan="3" style="letter-spacing: 0px;background:%s;color:%s">
1149                                    <small>%s</small>
1150                                </td>
1151                            </tr>
1152                            <tr>
1153                                <td colspan="3" style="letter-spacing: 0px; color:%s">
1154                                    <small>NAT:%s - AT:%s - #E:%s - DED:%s - #REE:%s</small>
1155                                </td>
1156                            </tr>
1157                        </table>
1158                    </td>
1159                </tr>
1160                <form action=%s method="POST">
1161                <tr>
1162                    <td>
1163                        <table width="100%%" align="center">
1164                            %s
1165                        </table>
1166                    </td>
1167                </tr>
1168                <tr>
1169                    <td>
1170                        <table>
1171                            <tr>
1172                                <td><input type="submit" class="btn" value="_("remove selected")"></td>
1173                            </tr>
1174                        </table>
1175                    </td>
1176                </tr>
1177                </form>
1178            </table>
1179                """)%( slot.getId(),self._session.getColor(), self._session.getColor(), self._session.getTextColor(), \
1180                        slot.getAdjustedStartDate().strftime("%H:%M"), \
1181                        slot.getAdjustedEndDate().strftime("%H:%M"), \
1182                        duration,self._session.getColor(),self._session.getTextColor(),caption, \
1183                        str(addContribURL), \
1184                        str(newContribURL), \
1185                        str(addBreakURL), \
1186                        editSlotLink,delSlotLink, \
1187                        quoteattr(str(urlCompSlot)), linkColor, \
1188                        self._session.getTextColor(), convs,self._session.getTextColor(), \
1189                        (datetime(1900,1,1)+nat).strftime("%Hh%M'"),(datetime(1900,1,1)+at).strftime("%Hh%M'"), \
1190                        numEntries,(datetime(1900,1,1)+ded).strftime("%Hh%M'"), \
1191                        ree, \
1192                        quoteattr(str(delContribsURL)), \
1193                        "".join(entries))
1194
1195    def getVars(self):
1196        vars=wcomponents.WTemplated.getVars(self)
1197        vars["day"]=self._day.strftime("%A, %d %B %Y")
1198        tz = self._session.getTimezone()
1199        sDate=timezone(tz).localize(datetime(self._day.year,self._day.month,self._day.day,0,0))
1200        eDate=timezone(tz).localize(datetime(self._day.year,self._day.month,self._day.day,23,59))
1201        res=[]
1202        for slotEntry in self._session.getSchedule().getEntries():
1203            if slotEntry.getAdjustedStartDate()>eDate:
1204                break
1205            if slotEntry.getAdjustedEndDate()>=sDate and \
1206                                slotEntry.getAdjustedStartDate()<=eDate:
1207                res.append(self._getSlotHTML(slotEntry.getOwner()))
1208        vars["slots"]="<br>".join(res)
1209        urlNewSlot=urlHandlers.UHSessionModSlotNew.getURL(self._session)
1210        urlNewSlot.addParam("slotDate",self._day.strftime("%d-%m-%Y"))
1211        vars["newSlotURL"]=quoteattr(str(urlNewSlot))
1212        vars["newSlotBtn"]="&nbsp;"
1213        if self._session.canModify(self._aw) or self._session.canCoordinate(self._aw, "unrestrictedSessionTT"):
1214            if self._session.getConference().getEnableSessionSlots() :
1215                vars["newSlotBtn"]= i18nformat("""<input type="submit" class="btn" value="_("new slot")">""")
1216        vars["fitToInnerSlots"] = "&nbsp;"
1217        if self._session.getConference().getEnableSessionSlots() :
1218            vars["fitToInnerSlots"] = i18nformat("""<input type="submit" class="btn" value="_("fit to inner slots")">""")
1219        vars["start_date"] = self._session.getAdjustedStartDate().strftime("%a %d %b %Y %H:%M")
1220        vars["end_date"] = self._session.getAdjustedEndDate().strftime("%a %d %b %Y %H:%M")
1221        vars["editURL"] = quoteattr(str(urlHandlers.UHSessionModFit.getURL(self._session)))
1222        return vars
1223
1224
1225class WSessionModPosterTTDay(wcomponents.WTemplated):
1226
1227    def __init__(self,aw,day,session):
1228        self._aw=aw
1229        self._day=day
1230        self._session=session
1231
1232    def _getContribHTML(self,contrib):
1233        #duration=(datetime(1900,1,1)+contrib.getDuration()).strftime("%Hh%M'")
1234        speakers=[]
1235        for spk in contrib.getSpeakerList():
1236            speakers.append(self.htmlText("%s"%spk.getFullName()))
1237        url=urlHandlers.UHContributionModification.getURL(contrib)
1238        urlEdit=urlHandlers.UHSessionModSchEditContrib.getURL(contrib)
1239        editIconURL=Config.getInstance().getSystemIconURL("modify")
1240        return """
1241            <tr>
1242                <td valign="top" nowrap><input type="checkbox" name="schEntryId" value=%s></td>
1243                <td valign="top" nowrap>%s</td>
1244                <td valign="top" nowrap><a href=%s><img src=%s border="0" alt=""></a></td>
1245                <td width="100%%" valign="top">
1246                    <table width="100%%" cellpadding="0" cellspacing="0">
1247                        <tr>
1248                            <td width="100%%" valign="top">
1249                                [%s] <a href=%s>%s</a>
1250                            </td>
1251                            <td nowrap align="right" valign="top">
1252                                %s
1253                            </td>
1254                        </tr cellpadding="0" cellspacing="0">
1255                    </table>
1256                </td>
1257            </tr>
1258            <tr>
1259                <td colspan="5" nowrap valign="top" style="border-top: 1px solid">&nbsp;</td>
1260            </tr>
1261                """%( contrib.getSchEntry().getId(),
1262                        self.htmlText(contrib.getBoardNumber()),
1263                        quoteattr(str(urlEdit)),
1264                        quoteattr(str(editIconURL)),
1265                        self.htmlText(contrib.getId()),
1266                        quoteattr(str(url)),
1267                        self.htmlText(contrib.getTitle()),
1268                        "<br>".join(speakers))
1269
1270    def _getSlotHTML(self,slot):
1271        caption = ""
1272        if slot.getRoom() is not None:
1273            caption=slot.getRoom().getName()
1274        if slot.getTitle().strip() != "":
1275            caption = "%s (%s)"%(self.htmlText(slot.getTitle()),self.htmlText(caption))
1276        duration=""
1277        if (datetime(1900,1,1)+slot.getDuration()).minute>0:
1278            duration="%s'"%(datetime(1900,1,1)+slot.getDuration()).minute
1279        if (datetime(1900,1,1)+slot.getDuration()).hour>0:
1280            duration="%sh%s"%((datetime(1900,1,1)+slot.getDuration()).hour,duration)
1281        if duration!="":
1282            duration="(%s)"%duration
1283        entries=[]
1284        for entry in slot.getSchedule().getEntries():
1285            if isinstance(entry,schedule.LinkedTimeSchEntry) and \
1286                    isinstance(entry.getOwner(),conference.Contribution):
1287                entries.append(self._getContribHTML(entry.getOwner()))
1288        addContribURL=urlHandlers.UHSessionModScheduleAddContrib.getURL(slot)
1289
1290        orginURL = urlHandlers.UHSessionModifSchedule.getURL(self._session.getOwner())
1291        orginURL.addParam("sessionId", self._session.getId())
1292        newContribURL = urlHandlers.UHConfModScheduleNewContrib.getURL(self._session.getOwner())
1293        newContribURL.addParam("sessionId", self._session.getId())
1294        newContribURL.addParam("slotId", slot.getId())
1295        newContribURL.addParam("orginURL",orginURL)
1296
1297        delSlotURL=urlHandlers.UHSessionModSlotRem.getURL(slot)
1298        editSlotURL=urlHandlers.UHSessionModSlotEdit.getURL(slot)
1299        delContribsURL=urlHandlers.UHSessionDelSchItems.getURL(slot)
1300        numEntries=len(entries)
1301        linkColor=""
1302        if self._session.isTextColorToLinks():
1303            linkColor="color:%s"%self._session.getTextColor()
1304        editSlotLink,delSlotLink="",""
1305        if self._session.canModify(self._aw) or self._session.canCoordinate(self._aw, "unrestrictedSessionTT"):
1306            editSlotLink="""<input type="submit" value="delete" onClick="self.location.href='%s';return false;" class="smallbtn">"""%str(delSlotURL)
1307            delSlotLink="""<input type="submit" value="edit" onClick="self.location.href='%s';return false;" class="smallbtn">"""%str(editSlotURL)
1308        convs=""
1309        l=[]
1310        if slot.getConvenerList() == []:
1311            for conv in slot.getSession().getConvenerList():
1312                l.append("""%s"""%(self.htmlText(conv.getFullName())))
1313        else:
1314            for conv in slot.getConvenerList():
1315                l.append("""%s"""%(self.htmlText(conv.getFullName())))
1316        if len(l)>0:
1317            convs="""<span style="letter-spacing: 0px">Conveners: %s</span>"""%"; ".join(l)
1318        return  i18nformat("""
1319            <a name="slot%s"/>
1320            <table width="90%%" align="center" border="0"
1321                                        style="border-left: 1px solid #777777">
1322                <tr>
1323                    <td class="groupTitle" style="background-color: %s">
1324                        <table>
1325                            <tr>
1326                                <td nowrap class="groupTitle" style="background-color: %s; color: %s">
1327                                    %s-%s %s
1328                                </td>
1329                                <td width="100%%" align="center" class="groupTitle" style="background-color: %s; color: %s">
1330                                    %s
1331                                </td>
1332                                <td align="right" nowrap style="letter-spacing: 0px">
1333                                    <input type="submit" value="_("add contribution")" onClick="self.location.href='%s';return false;" class="smallbtn">
1334                                    <input type="submit" value="_("new contribution")" onClick="self.location.href='%s';return false;" class="smallbtn">
1335                                    %s %s
1336                                </td>
1337                            </tr>
1338                            <tr>
1339                                <td colspan="3" style="color:%s">%s</td>
1340                            </tr>
1341                            <tr>
1342                                <td colspan="3" style="color:%s">%s  _("entries")</td>
1343                            </tr>
1344                        </table>
1345                    </td>
1346                </tr>
1347                <form action=%s method="POST">
1348                <tr>
1349                    <td>
1350                        <table width="100%%" align="center">
1351                            %s
1352                        </table>
1353                    </td>
1354                </tr>
1355                <tr>
1356                    <td>
1357                        <table>
1358                            <tr>
1359                                <td><input type="submit" class="btn" value="_("remove selected")"></td>
1360                            </tr>
1361                        </table>
1362                    </td>
1363                </tr>
1364                </form>
1365            </table>
1366                """)%( slot.getId(),slot.getSession().getColor(), slot.getSession().getColor(),slot.getSession().getTextColor(), slot.getAdjustedStartDate().strftime("%H:%M"),
1367                        slot.getAdjustedEndDate().strftime("%H:%M"),
1368                        duration,slot.getSession().getColor(),slot.getSession().getTextColor(),caption,
1369                        str(addContribURL),
1370                       str(newContribURL),
1371                        editSlotLink,delSlotLink,slot.getSession().getTextColor(),convs,slot.getSession().getTextColor(),numEntries,
1372                        quoteattr(str(delContribsURL)),
1373                        "".join(entries))
1374
1375    def getVars(self):
1376        vars=wcomponents.WTemplated.getVars(self)
1377        vars["day"]=self._day.strftime("%A, %d %B %Y")
1378        tz = self._session.getTimezone()
1379        sDate=timezone(tz).localize(datetime(self._day.year,self._day.month,self._day.day,0,0))
1380        eDate=timezone(tz).localize(datetime(self._day.year,self._day.month,self._day.day,23,59))
1381        res=[]
1382        for slotEntry in self._session.getSchedule().getEntries():
1383            if slotEntry.getAdjustedStartDate()>eDate:
1384                break
1385            if slotEntry.getAdjustedEndDate()>=sDate and \
1386                                slotEntry.getAdjustedStartDate()<=eDate:
1387                res.append(self._getSlotHTML(slotEntry.getOwner()))
1388        vars["slots"]="<br>".join(res)
1389        urlNewSlot=urlHandlers.UHSessionModSlotNew.getURL(self._session)
1390        urlNewSlot.addParam("slotDate",self._day.strftime("%d-%m-%Y"))
1391        vars["newSlotURL"]=quoteattr(str(urlNewSlot))
1392        vars["newSlotBtn"]=""
1393        if self._session.canModify(self._aw) or self._session.canCoordinate(self._aw, "unrestrictedSessionTT"):
1394            vars["newSlotBtn"]= i18nformat("""<input type="submit" class="btn" value="_("new slot")">""")
1395        return vars
1396
1397
1398class WPSessionModifSchedule( WPSessionModifBase, WPConfModifScheduleGraphic  ):
1399
1400    _userData = ['favorite-user-list']
1401
1402    def __init__( self, rh, session):
1403        WPSessionModifBase.__init__(self, rh, session)
1404        WPConfModifScheduleGraphic.__init__( self, rh, session.getConference() )
1405        self._session = session
1406
1407    def _setActiveTab(self):
1408        self._tabTimetable.setActive()
1409
1410    def getJSFiles(self):
1411        return WPConfModifScheduleGraphic.getJSFiles(self)
1412
1413    def _generateTimetable(self):
1414
1415        tz = self._conf.getTimezone()
1416        timeTable = timetable.TimeTable(self._session.getSchedule(), tz)
1417        sDate,eDate=self._session.getAdjustedStartDate(tz),self._session.getAdjustedEndDate(tz)
1418        timeTable.setStartDate(sDate)
1419        timeTable.setEndDate(eDate)
1420#        timeTable.setStartDayTime(7,0)
1421#        timeTable.setEndDayTime(21,59)
1422
1423        timeTable.mapEntryList(self._session.getSchedule().getEntries())
1424        return timeTable
1425
1426    def _getSchedule(self):
1427        return WSessionModifSchedule(self._session)
1428
1429    def _getTabContent( self, params ):
1430        return self._getTTPage(params)
1431
1432class WSessionModifSchedule(wcomponents.WTemplated):
1433
1434    def __init__(self, session, **params):
1435        wcomponents.WTemplated.__init__(self, **params)
1436        self._session = session
1437
1438    def getVars( self ):
1439        vars=wcomponents.WTemplated.getVars(self)
1440        tz = self._session.getTimezone()
1441        vars["timezone"]= tz
1442
1443        vars['ttdata'] = json.dumps(schedule.ScheduleToJson.process(self._session.getSchedule(), tz,
1444                                                                           None, days = None, mgmtMode = True))
1445
1446        eventInfo = fossilize(self._session.getConference(), IConferenceEventInfoFossil, tz=tz)
1447        eventInfo['timetableSession'] = fossilize(self._session, ISessionFossil, tz=tz)
1448        eventInfo['isCFAEnabled'] = self._session.getConference().getAbstractMgr().isActive()
1449        vars['eventInfo'] = json.dumps(eventInfo)
1450
1451        return vars
1452
1453class ContainerIndexItem:
1454
1455    def __init__(self, container, day):
1456        self._overlap = container.getMaxOverlap(day)
1457        self._startPosition = -1
1458        self._entryList = []
1459        for i in range(0,self._overlap):
1460            self._entryList.append(None)
1461
1462    def setStartPosition(self, counter):
1463        self._startPosition = counter
1464
1465    def getStartPosition(self):
1466        return self._startPosition
1467
1468    def setEntryList(self, newEntryList):
1469        # -- Remove the ones which are not in the new entry list
1470        i = 0
1471        for entry in self._entryList:
1472            if entry not in newEntryList:
1473                self._entryList[i] = None
1474            i += 1
1475        # -- Add the new ones to the new entry list
1476        for newEntry in newEntryList:
1477            if newEntry not in self._entryList:
1478                i = 0
1479                for entry in self._entryList:
1480                    if entry == None:
1481                        self._entryList[i] = newEntry
1482                        break
1483                    i += 1
1484
1485    def getEntryIndex(self, i):
1486        return self._startPosition + i
1487
1488    def getEntryByPosition(self, i):
1489        if i >= 0 and i < len(self._entryList):
1490            return self._entryList[i]
1491        return 0
1492
1493    def getOverlap(self):
1494        return self._overlap
1495
1496class ContainerIndex:
1497
1498    def __init__(self, containerIndex = {}, day = None, hasOverlap = False):
1499        self._containerIndex = containerIndex
1500        self._day = day
1501        self._rowsCounter = 0
1502        self._hasOverlap = hasOverlap
1503
1504    def initialization(self, day, hasOverlap = False):
1505        self._containerIndex={}
1506        self._day = day
1507        self._rowsCounter = 0
1508        self._hasOverlap = hasOverlap
1509
1510    def hasOverlap(self):
1511        return self._hasOverlap
1512
1513    def setHasOverlap(self, hasOverlap):
1514        self._hasOverlap = hasOverlap
1515
1516    def addContainer(self, container):
1517        if not self._containerIndex.has_key(container):
1518            item = ContainerIndexItem(container, self._day)
1519            item.setStartPosition(self._rowsCounter)
1520            if self.hasOverlap():
1521                self._rowsCounter += item.getOverlap()
1522            self._containerIndex[container] = item
1523
1524    def setContainerEntries(self, container, entryList):
1525        if self._containerIndex.has_key(container):
1526            self._containerIndex[container].setEntryList(entryList)
1527
1528    def getEntryIndex(self, container, i):
1529        if self._containerIndex.has_key(container):
1530            contItem = self._containerIndex[container]
1531            return contItem.getEntryIndex(i)
1532        return 0
1533
1534    def getEntryByPosition(self, container, i):
1535        if self._containerIndex.has_key(container):
1536            contItem = self._containerIndex[container]
1537            return contItem.getEntryByPosition(i)
1538        return 0
1539
1540    def getMaxOverlap(self, container):
1541        if self._containerIndex.has_key(container):
1542            contItem = self._containerIndex[container]
1543            return contItem.getOverlap()
1544        return 0
1545
1546    def getStartPosition(self, container):
1547        if self._containerIndex.has_key(container):
1548            contItem = self._containerIndex[container]
1549            return contItem.getStartPosition()
1550        return 0
1551
1552
1553class WPSessionModifyBreak( WPSessionModifSchedule ):
1554
1555    def __init__(self,rh,conf,schBreak):
1556        WPSessionModifSchedule.__init__(self,rh,conf)
1557        self._break=schBreak
1558
1559    def _getScheduleContent(self,params):
1560        sch=self._conf.getSchedule()
1561        wc=wcomponents.WBreakDataModification(sch,self._break,conf=self._conf)
1562        pars = { "postURL": urlHandlers.UHSessionPerformModifyBreak.getURL(self._break) }
1563        params["body"] = wc.getHTML( pars )
1564        return wcomponents.WBreakModifHeader( self._break, self._getAW() ).getHTML( params )
1565
1566
1567
1568class WPModSchEditContrib(WPSessionModifSchedule):
1569
1570    def __init__(self,rh,contrib):
1571        WPSessionModifSchedule.__init__(self,rh,contrib.getSession())
1572        self._contrib=contrib
1573
1574    def _getTabContent(self,params):
1575        if self._contrib.getSession().getScheduleType() == "poster":
1576            wc=WSessionModContribListEditContrib(self._contrib)
1577        else:
1578            wc=wcomponents.WSchEditContrib(self._contrib)
1579        pars={"postURL":urlHandlers.UHSessionModSchEditContrib.getURL(self._contrib)}
1580        return wc.getHTML(pars)
1581
1582class WSessionAddSlot(wcomponents.WTemplated):
1583
1584    def __init__(self, slotData , conf, errors=[]):
1585        self._session = slotData.getSession()
1586        self._slotData = slotData
1587        self._errors=errors
1588        self._conf = conf
1589
1590    def _getConvenersHTML(self):
1591        res=[]
1592        for conv in self._slotData.getConvenerList():
1593            tmp= i18nformat("""
1594                    <tr>
1595                        <td style="border-top:1px solid #777777;border-left:1px solid #777777;" width="100%%">
1596                            <input type="checkbox" name="sel_conv" value=%s>
1597                            <input type="hidden" name="conv_id" value=%s>
1598                        </td>
1599                        <td style="border-top:1px solid #777777;padding-top:2px" width="100%%">
1600                            <table border="0" width="95%%" cellpadding="0" cellspacing="0">
1601                                <tr>
1602                                    <td>&nbsp;</td>
1603                                </tr>
1604                                <tr>
1605                                    <td nowrap>
1606                                         _("Title") <select name="conv_title">%s</select>
1607                                    </td>
1608                                </tr>
1609                                <tr>
1610                                    <td nowrap>
1611                                         _("Family name") <input type="text" size="40" name="conv_family_name" value=%s>
1612                                         _("First name") <input type="text" size="30" name="conv_first_name" value=%s>
1613                                    </td>
1614                                </tr>
1615                                <tr>
1616                                    <td nowrap>
1617                                         _("Affiliation") <input type="text" size="40" name="conv_affiliation" value=%s>
1618                                        _("Email") <input type="text" size="39" name="conv_email" value=%s>
1619                                    </td>
1620                                </tr>
1621                            </table>
1622                        </td>
1623                    </tr>
1624                    <tr><td colspan="3">&nbsp;</td></tr>
1625                """)%(quoteattr(str(conv.getId())),\
1626                    quoteattr(str(conv.getId())),\
1627                    TitlesRegistry.getSelectItemsHTML(conv.getTitle()), \
1628                    quoteattr(conv.getFamilyName()),\
1629                    quoteattr(conv.getFirstName()), \
1630                    quoteattr(conv.getAffiliation()), \
1631                    quoteattr(conv.getEmail()) )
1632            res.append(tmp)
1633        return "".join(res)
1634
1635    def _getErrorHTML( self, msgList ):
1636        if not msgList:
1637            return ""
1638        return """
1639            <table align="center" cellspacing="0" cellpadding="0">
1640                <tr>
1641                    <td>
1642                        <table align="center" valign="middle" style="padding:10px; border:1px solid #5294CC; background:#F6F6F6">
1643                            <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
1644                            <tr>
1645                                <td>&nbsp;</td>
1646                                <td><font color="red">%s</font></td>
1647                                <td>&nbsp;</td>
1648                            </tr>
1649                            <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
1650                        </table>
1651                    </td>
1652                </tr>
1653            </table>
1654                """%"<br>".join( msgList )
1655
1656
1657    def getVars(self):
1658        vars = wcomponents.WTemplated.getVars(self)
1659        vars["calendarIconURL"]=Config.getInstance().getSystemIconURL( "calendar" )
1660        vars["calendarSelectURL"]=urlHandlers.UHSimpleCalendar.getURL()
1661        defaultDefinePlace = defaultDefineRoom = ""
1662        defaultInheritPlace = defaultInheritRoom = "checked"
1663        locationName, locationAddress, roomName,defaultExistRoom = "", "", "",""
1664        slotSd = self._slotData.getStartDate()
1665        slotEd = self._slotData.getEndDate()
1666        vars["title"]=self._slotData.getTitle()
1667        vars["sDay"] = slotSd.day
1668        vars["sMonth"] = slotSd.month
1669        vars["sYear"] = slotSd.year
1670        vars["sHour"] = slotSd.hour
1671        vars["sMinute"] = slotSd.minute
1672        vars["eDay"] = slotEd.day
1673        vars["eMonth"] = slotEd.month
1674        vars["eYear"] = slotEd.year
1675        vars["eHour"] = slotEd.hour
1676        vars["eMinute"] = slotEd.minute
1677        vars["contribDurHours"] = ""
1678        vars["contribDurMins"] = ""
1679        if self._slotData.getContribDuration() != None:
1680            vars["contribDurHours"] = (datetime(1900,1,1)+self._slotData.getContribDuration()).hour
1681            vars["contribDurMins"] = (datetime(1900,1,1)+self._slotData.getContribDuration()).minute
1682        if self._slotData.getLocationName() !="":
1683            defaultDefinePlace = "checked"
1684            defaultInheritPlace = ""
1685            locationName = self._slotData.getLocationName()
1686            locationAddress = self._slotData.getLocationAddress()
1687        if self._slotData.getRoomName() != "":
1688            defaultDefineRoom= "checked"
1689            defaultInheritRoom = ""
1690            defaultExistRoom = ""
1691            roomName = self._slotData.getRoomName()
1692        vars["defaultInheritPlace"] = defaultInheritPlace
1693        vars["defaultDefinePlace"] = defaultDefinePlace
1694        vars["sesPlace"] = ""
1695        sesLocation = self._slotData.getSession().getLocation()
1696        if sesLocation:
1697            vars["sesPlace"] = sesLocation.getName()
1698        vars["locationName"] = locationName
1699        vars["locationAddress"] = locationAddress
1700        vars["defaultInheritRoom"] = defaultInheritRoom
1701        vars["defaultDefineRoom"] = defaultDefineRoom
1702        vars["defaultExistRoom"]= defaultExistRoom
1703        vars["sesRoom"] = ""
1704        sesRoom = self._slotData.getSession().getRoom()
1705        if sesRoom:
1706            vars["sesRoom"] = sesRoom.getName()
1707        vars["roomName"] = roomName
1708        vars["conveners"]=self._getConvenersHTML()
1709        vars["postURL"]=quoteattr(str(urlHandlers.UHSessionModSlotNew.getURL(self._session)))
1710        vars["errors"]=self._getErrorHTML(self._errors)
1711        rx=[]
1712        roomsexist = self._conf.getRoomList()
1713        roomsexist.sort()
1714        for room in roomsexist:
1715            sel=""
1716            rx.append("""<option value=%s%s>%s</option>"""%(quoteattr(str(room)),
1717                        sel,self.htmlText(room)))
1718        vars ["roomsexist"] = "".join(rx)
1719        vars["autoUpdate"]=""
1720        return vars
1721
1722
1723class WPModSlotNew(WPSessionModifSchedule):
1724
1725    def __init__(self, rh, slotData, errors=[] ):
1726        WPSessionModifSchedule.__init__(self, rh, slotData.getSession())
1727        self._slotData = slotData
1728        self._errors=errors
1729
1730
1731    def _getTabContent( self, params ):
1732        wc=WSessionAddSlot(self._slotData, self._conf, self._errors)
1733        return wc.getHTML()
1734
1735class WSlotModifMainData(wcomponents.WTemplated):
1736
1737    def __init__(self, slot, conf, errors=[]):
1738        self._slotData = slot
1739        self._errors=errors
1740        self._conf = conf
1741
1742    def _getConvenersHTML(self):
1743        res=[]
1744        for conv in self._slotData.getConvenerList():
1745            tmp= i18nformat("""
1746                    <tr>
1747                        <td style="border-top:1px solid #777777;border-left:1px solid #777777;" width="100%%">
1748                            <input type="checkbox" name="sel_conv" value=%s>
1749                            <input type="hidden" name="conv_id" value=%s>
1750                        </td>
1751                        <td style="border-top:1px solid #777777;padding-top:2px" width="100%%">
1752                            <table border="0" width="95%%" cellpadding="0" cellspacing="0">
1753                                <tr>
1754                                    <td>&nbsp;</td>
1755                                </tr>
1756                                <tr>
1757                                    <td nowrap>
1758                                         _("Title") <select name="conv_title">%s</select>
1759                                    </td>
1760                                </tr>
1761                                <tr>
1762                                    <td nowrap>
1763                                         _("Family name") <input type="text" size="40" name="conv_family_name" value=%s>
1764                                         _("First name") <input type="text" size="30" name="conv_first_name" value=%s>
1765                                    </td>
1766                                </tr>
1767                                <tr>
1768                                    <td nowrap>
1769                                         _("Affiliation") <input type="text" size="40" name="conv_affiliation" value=%s>
1770                                         _("Email") <input type="text" size="39" name="conv_email" value=%s>
1771                                    </td>
1772                                </tr>
1773                            </table>
1774                        </td>
1775                    </tr>
1776                    <tr><td colspan="3">&nbsp;</td></tr>
1777                """)%(quoteattr(str(conv.getId())),\
1778                    quoteattr(str(conv.getId())),\
1779                    TitlesRegistry.getSelectItemsHTML(conv.getTitle()), \
1780                    quoteattr(conv.getFamilyName()),\
1781                    quoteattr(conv.getFirstName()), \
1782                    quoteattr(conv.getAffiliation()), \
1783                    quoteattr(conv.getEmail()) )
1784            res.append(tmp)
1785        return "".join(res)
1786
1787    def _getErrorHTML( self, msgList ):
1788        if not msgList:
1789            return ""
1790        return """
1791            <table align="center" cellspacing="0" cellpadding="0">
1792                <tr>
1793                    <td>
1794                        <table align="center" valign="middle" style="padding:10px; border:1px solid #5294CC; background:#F6F6F6">
1795                            <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
1796                            <tr>
1797                                <td>&nbsp;</td>
1798                                <td><font color="red">%s</font></td>
1799                                <td>&nbsp;</td>
1800                            </tr>
1801                            <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
1802                        </table>
1803                    </td>
1804                </tr>
1805            </table>
1806                """%"<br>".join( msgList )
1807
1808    def getVars(self):
1809        vars = wcomponents.WTemplated.getVars(self)
1810        vars["calendarIconURL"]=Config.getInstance().getSystemIconURL( "calendar" )
1811        vars["calendarSelectURL"]=urlHandlers.UHSimpleCalendar.getURL()
1812        defaultDefinePlace = defaultDefineRoom = ""
1813        defaultInheritPlace = defaultInheritRoom = "checked"
1814        locationName, locationAddress, roomName, defaultExistRoom = "", "", "",""
1815        vars["conference"] = self._conf
1816        vars["session"] = self._slotData.getSession()
1817        minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance()
1818        vars["useRoomBookingModule"] = minfo.getRoomBookingModuleActive()
1819        vars["title"]=self._slotData.getTitle()
1820        sd = self._slotData.getAdjustedStartDate()
1821        ed = self._slotData.getAdjustedEndDate()
1822        vars["sDay"] = sd.day
1823        vars["sMonth"] = sd.month
1824        vars["sYear"] = sd.year
1825        vars["sHour"] = sd.hour
1826        vars["sMinute"] = sd.minute
1827        vars["eDay"] = ed.day
1828        vars["eMonth"] = ed.month
1829        vars["eYear"] = ed.year
1830        vars["eHour"] = ed.hour
1831        vars["eMinute"] = ed.minute
1832        vars["contribDurHours"] = ""
1833        vars["contribDurMins"] = ""
1834        if self._slotData.getContribDuration() != None:
1835            vars["contribDurHours"] = (datetime(1900,1,1)+self._slotData.getContribDuration()).hour
1836            vars["contribDurMins"] = (datetime(1900,1,1)+self._slotData.getContribDuration()).minute
1837        if self._slotData.getLocationName() !="":
1838            defaultDefinePlace = "checked"
1839            defaultInheritPlace = ""
1840            locationName = self._slotData.getLocationName()
1841            locationAddress = self._slotData.getLocationAddress()
1842        if self._slotData.getRoomName() != "":
1843            defaultDefineRoom= "checked"
1844            defaultInheritRoom = ""
1845            defaultExistRoom = ""
1846            roomName = self._slotData.getRoomName()
1847        vars["defaultInheritPlace"] = defaultInheritPlace
1848        vars["defaultDefinePlace"] = defaultDefinePlace
1849        vars["sesPlace"] = ""
1850        sesLocation = self._slotData.getSession().getLocation()
1851        if sesLocation:
1852            vars["sesPlace"] = sesLocation.getName()
1853        vars["locationName"] = locationName
1854        vars["locationAddress"] = locationAddress
1855        vars["defaultInheritRoom"] = defaultInheritRoom
1856        vars["defaultDefineRoom"] = defaultDefineRoom
1857        vars["defaultExistRoom"] = defaultExistRoom
1858        vars["sesRoom"] = ""
1859        sesRoom = self._slotData.getSession().getRoom()
1860        if sesRoom:
1861            vars["sesRoom"] = sesRoom.getName()
1862        vars["roomName"] = roomName
1863        rx=[]
1864        roomsexist = self._conf.getRoomList()
1865        roomsexist.sort()
1866        for room in roomsexist:
1867            rx.append("""<option value=%s>%s</option>"""%(quoteattr(str(room)),
1868                        self.htmlText(room)))
1869        vars ["roomsexist"] = "".join(rx)
1870        vars["conveners"]=self._getConvenersHTML()
1871        vars["errors"]=self._getErrorHTML(self._errors)
1872        vars["locator"] = ""
1873        slot = self._slotData.getSession().getSlotById(self._slotData.getId())
1874        vars["locator"] = slot.getLocator().getWebForm()
1875        vars["postURL"]=quoteattr(str(urlHandlers.UHSessionModSlotEdit.getURL(slot)))
1876        vars["autoUpdate"]=""
1877        return vars
1878
1879
1880class WPModSlotEdit(WPConferenceModifBase):
1881
1882    def __init__(self,rh, slot, errors=[]):
1883        WPConferenceModifBase.__init__(self,rh,slot.getSession().getConference())
1884        self._slotData=slot
1885        self._errors=errors
1886
1887    def _setActiveSideMenuItem(self):
1888        self._timetableMenuItem.setActive()
1889
1890    def _getPageContent( self, params ):
1891        wc=WSlotModifMainData(self._slotData,self._conf,self._errors)
1892        return wc.getHTML()
1893
1894class WSchModifRecalculate(wcomponents.WTemplated):
1895
1896    def __init__(self, entry):
1897        self._entry = entry
1898
1899    def getVars(self):
1900        vars = wcomponents.WTemplated.getVars(self)
1901        vars["entryType"]="slot"
1902        vars["title"]=""
1903        if self._entry.getTitle().strip() != "":
1904            vars["title"]= i18nformat("""
1905                            <tr>
1906                                <td nowrap class="titleCellTD"><span class="titleCellFormat"> _("Title")</span></td>
1907                                <td bgcolor="white" width="100%%">&nbsp;%s</td>
1908                            </tr>
1909                            """)%self._entry.getTitle()
1910        return vars
1911
1912class WPModSlotCalc(WPConferenceModifBase):
1913
1914    def __init__(self,rh, slot):
1915        WPConferenceModifBase.__init__(self,rh,slot.getSession().getConference())
1916        self._slot=slot
1917
1918    def _setActiveSideMenuItem(self):
1919        self._timetableMenuItem.setActive()
1920
1921    def _getPageContent( self, params ):
1922        wc=WSchModifRecalculate(self._slot)
1923        p={"postURL":quoteattr(str(urlHandlers.UHSessionModSlotCalc.getURL(self._slot)))}
1924        return wc.getHTML(p)
1925
1926class WPModSlotRemConfirmation(WPSessionModifSchedule):
1927
1928    def __init__(self,rh,slot):
1929        WPSessionModifSchedule.__init__(self,rh,slot.getSession())
1930        self._slot=slot
1931
1932    def _getTabContent(self,params):
1933        wc=wcomponents.WConfirmation()
1934        slotCaption="on %s %s-%s"%(
1935            self._slot.getAdjustedStartDate().strftime("%A %d %B %Y"),
1936            self._slot.getAdjustedStartDate().strftime("%H:%M"),
1937            self._slot.getAdjustedEndDate().strftime("%H:%M"))
1938        if self._slot.getTitle()!="":
1939            slotCaption=""" "%s" (%s) """%(self._slot.getTitle(),slotCaption)
1940
1941        msg= _("""Are you sure you want to delete the slot %s
1942        (note that any contribution scheduled
1943        inside will be unscheduled)?""")%(slotCaption)
1944        url=urlHandlers.UHSessionModSlotRem.getURL(self._slot)
1945        return wc.getHTML(msg,url,{})
1946
1947
1948class WPModScheduleAddContrib(WPSessionModifSchedule):
1949
1950    def _getTabContent( self, params ):
1951        target=self._session
1952        if params.get("slot",None) is not None:
1953            target=params["slot"]
1954        l=[]
1955        for contrib in self._session.getContributionList():
1956            if contrib.isScheduled() or isinstance(contrib.getCurrentStatus(),conference.ContribStatusWithdrawn):
1957                continue
1958            l.append(contrib)
1959        p=wcomponents.WScheduleAddContributions(l)
1960        pars={"postURL":urlHandlers.UHSessionModScheduleAddContrib.getURL(target)}
1961        return p.getHTML(pars)
1962
1963class WPModScheduleNewContrib(WPModScheduleNewContribBase, WPSessionModifSchedule):
1964
1965    def __init__(self, rh, ses, targetDay):
1966        WPSessionModifSchedule.__init__(self, rh, ses)
1967        WPModScheduleNewContribBase.__init__(self, targetDay)
1968
1969class WSessionModifSchContribCreation(WContributionCreation):
1970
1971    def __init__(self, slot):
1972        WContributionCreation.__init__(self, slot.getConference())
1973        self._slot = slot
1974
1975    def getVars(self):
1976        vars=WContributionCreation.getVars(self)
1977        if self._slot is not None:
1978            d=self._slot.getSchedule().calculateDayEndDate(self._slot.getAdjustedStartDate())
1979            vars["day"]=d.day
1980            vars["month"]=d.month
1981            vars["year"]=d.year
1982            vars["sHour"]=d.hour
1983            vars["sMinute"]=d.minute
1984            vars["durationHours"],vars["durationMinutes"]="0","20"
1985            vars["poster"]=""
1986            if self._slot.getSession().getScheduleType() == "poster":
1987                vars["poster"]="disabled"
1988        return vars
1989
1990
1991class WPSessionAddBreak(WPSessionModifSchedule):
1992
1993    def __init__(self,rh,slot):
1994        WPSessionModifSchedule.__init__(self,rh,slot.getSession())
1995        self._slot=slot
1996
1997    def _getTabContent( self, params ):
1998        s = self._slot.getSchedule()
1999        day = self._slot.getAdjustedStartDate()
2000        p=wcomponents.WBreakDataModification(self._slot.getSchedule(),conf=self._slot.getConference(),targetDay=day)
2001        pars = {"postURL":urlHandlers.UHSessionAddBreak.getURL(self._slot)}
2002        return p.getHTML(pars)
2003
2004
2005
2006class WSessionModifAC(wcomponents.WTemplated):
2007
2008    def __init__(self,session):
2009        self._session=session
2010
2011    def getVars(self):
2012        vars=wcomponents.WTemplated.getVars(self)
2013        wc=wcomponents.WAccessControlFrame()
2014        vars["accessControlFrame"]=wc.getHTML(self._session,\
2015                                urlHandlers.UHSessionSetVisibility.getURL(),
2016                                "Session")
2017        if not self._session.isProtected():
2018            df=wcomponents.WDomainControlFrame(self._session)
2019            vars["accessControlFrame"] += "<br>%s"%df.getHTML( \
2020                                    urlHandlers.UHSessionAddDomains.getURL(),\
2021                                    urlHandlers.UHSessionRemoveDomains.getURL())
2022        wc=wcomponents.WModificationControlFrame()
2023        vars["modifyControlFrame"] = wc.getHTML(self._session)
2024
2025        vars["confId"] = self._session.getConference().getId()
2026        vars["sessionId"] = self._session.getId()
2027        return vars
2028
2029
2030class WPSessionModifAC( WPSessionModifBase ):
2031
2032    def _setActiveTab( self ):
2033        self._tabAC.setActive()
2034
2035    def _getTabContent( self, params ):
2036        comp=WSessionModifAC(self._session)
2037        return comp.getHTML()
2038
2039
2040class WPSessionSelectAllowed( WPSessionModifAC ):
2041
2042    def _getTabContent( self, params ):
2043        searchExt = params.get("searchExt","")
2044        if searchExt != "":
2045            searchLocal = False
2046        else:
2047            searchLocal = True
2048        wc = wcomponents.WPrincipalSelection( urlHandlers.UHSessionSelectAllowed.getURL(),forceWithoutExtAuth=searchLocal )
2049        params["addURL"] = urlHandlers.UHSessionAddAllowed.getURL()
2050        return wc.getHTML( params )
2051
2052
2053class WSessionModifTools(wcomponents.WTemplated):
2054
2055    def __init__( self, session ):
2056        self.__session = session
2057
2058    def getVars( self ):
2059        vars = wcomponents.WTemplated.getVars( self )
2060        vars["deleteIconURL"] = Config.getInstance().getSystemIconURL("delete")
2061        vars["writeIconURL"] = Config.getInstance().getSystemIconURL("write_minutes")
2062        vars["closeIconURL"] = Config.getInstance().getSystemIconURL("closeIcon")
2063        vars["closeURL"] = urlHandlers.UHSessionClose.getURL(self.__session)
2064        return vars
2065
2066
2067class WPSessionModifComm( WPSessionModifBase ):
2068
2069    def _setActiveTab( self ):
2070        self._tabComm.setActive()
2071
2072    def _getTabContent( self, params ):
2073        wc = wcomponents.WSessionModifComm( self._getAW(),self._session )
2074        pars = {
2075                "editCommentsURLGen":urlHandlers.UHSessionModifCommEdit.getURL
2076               }
2077        return wc.getHTML( pars )
2078
2079
2080class WPSessionCommEdit( WPSessionModifBase ):
2081
2082    def _setActiveTab( self ):
2083        self._tabComm.setActive()
2084
2085    def _getTabContent(self,params):
2086        self._comment = self._session.getComments()
2087        wc = wcomponents.WSessionModifCommEdit(self._comment)
2088        p={"postURL":urlHandlers.UHSessionModifCommEdit.getURL(self._session)}
2089        return wc.getHTML(p)
2090
2091
2092
2093class WPSessionModifTools( WPSessionModifBase ):
2094
2095    def _setActiveTab( self ):
2096        self._tabTools.setActive()
2097
2098    def _getTabContent( self, params ):
2099        comp = WSessionModifTools( self._session )
2100        pars = {
2101"deleteSessionURL": urlHandlers.UHSessionDeletion.getURL( self._session ) \
2102               }
2103        return comp.getHTML( pars )
2104
2105
2106class WPSessionDeletion( WPSessionModifTools ):
2107
2108    def _getTabContent( self, params ):
2109        msg = i18nformat("""
2110        <font size="+2">_("Are you sure that you want to DELETE the session '%s'")?</font><br>(_("Note that if you delete the
2111session, all the items below it will also be deleted"))
2112              """)%(self._session.getTitle())
2113        wc = wcomponents.WConfirmation()
2114        return wc.getHTML( msg, \
2115                        urlHandlers.UHSessionDeletion.getURL( self._session ), \
2116                        {}, \
2117                        confirmButtonCaption= _("Yes"), cancelButtonCaption= _("No") )
2118
2119class WSessionModContribList(wcomponents.WTemplated):
2120
2121    def __init__(self,session,filter,sorting,order, aw):
2122        self._session=session
2123        self._conf=self._session.getConference()
2124        self._filterCrit=filter
2125        self._sortingCrit=sorting
2126        self._order = order
2127        self._totaldur =timedelta(0)
2128        self._aw=aw
2129
2130    def _getURL( self ):
2131        #builds the URL to the contribution list page
2132        #   preserving the current filter and sorting status
2133        url = urlHandlers.UHSessionModContribList.getURL(self._session)
2134        if self._filterCrit.getField("type"):
2135            l=[]
2136            for t in self._filterCrit.getField("type").getValues():
2137                if t!="":
2138                    l.append(t)
2139            url.addParam("types",l)
2140            if self._filterCrit.getField("type").getShowNoValue():
2141                url.addParam("typeShowNoValue","1")
2142
2143        if self._filterCrit.getField("track"):
2144            url.addParam("tracks",self._filterCrit.getField("track").getValues())
2145            if self._filterCrit.getField("track").getShowNoValue():
2146                url.addParam("trackShowNoValue","1")
2147
2148        if self._filterCrit.getField("status"):
2149            url.addParam("status",self._filterCrit.getField("status").getValues())
2150
2151        if self._filterCrit.getField("material"):
2152            url.addParam("material",self._filterCrit.getField("material").getValues())
2153
2154        if self._sortingCrit.getField():
2155            url.addParam("sortBy",self._sortingCrit.getField().getId())
2156            url.addParam("order","down")
2157        url.addParam("OK","1")
2158        return url
2159
2160    def _getMaterialsHTML(self, contrib, matUrlHandler):
2161        materials=[]
2162        if contrib.getPaper() is not None:
2163            url=matUrlHandler.getURL(contrib.getPaper())
2164            iconHTML="""<img border="0" src=%s alt="paper">"""%quoteattr(str(materialFactories.PaperFactory.getIconURL()))
2165            if len(contrib.getPaper().getResourceList())>0:
2166                r=contrib.getPaper().getResourceList()[0]
2167                if isinstance(r,conference.Link):
2168                    iconHTML="""<a href=%s>%s</a>"""%(quoteattr(str(r.getURL())),iconHTML)
2169                elif isinstance(r,conference.LocalFile):
2170                    iconHTML="""<a href=%s>%s</a>"""%(quoteattr(str(urlHandlers.UHFileAccess.getURL(r))),iconHTML)
2171            materials.append("""%s<a href=%s>%s</a>"""%(iconHTML,quoteattr(str(url)),self.htmlText(materialFactories.PaperFactory.getTitle().lower())))
2172        if contrib.getSlides() is not None:
2173            url=matUrlHandler.getURL(contrib.getSlides())
2174            iconHTML="""<img border="0" src=%s alt="slides">"""%quoteattr(str(materialFactories.SlidesFactory.getIconURL()))
2175            if len(contrib.getSlides().getResourceList())>0:
2176                r=contrib.getSlides().getResourceList()[0]
2177                if isinstance(r,conference.Link):
2178                    iconHTML="""<a href=%s>%s</a>"""%(quoteattr(str(r.getURL())),iconHTML)
2179                elif isinstance(r,conference.LocalFile):
2180                    iconHTML="""<a href=%s>%s</a>"""%(quoteattr(str(urlHandlers.UHFileAccess.getURL(r))),iconHTML)
2181            materials.append("""%s<a href=%s>%s</a>"""%(iconHTML,quoteattr(str(url)),self.htmlText(materialFactories.SlidesFactory.getTitle().lower())))
2182        if contrib.getPoster() is not None:
2183            url=matUrlHandler.getURL(contrib.getPoster())
2184            iconHTML="""<img border="0" src=%s alt="slides">"""%quoteattr(str(materialFactories.PosterFactory.getIconURL()))
2185            if len(contrib.getPoster().getResourceList())>0:
2186                r=contrib.getPoster().getResourceList()[0]
2187                if isinstance(r,conference.Link):
2188                    iconHTML="""<a href=%s>%s</a>"""%(quoteattr(str(r.getURL())),iconHTML)
2189                elif isinstance(r,conference.LocalFile):
2190                    iconHTML="""<a href=%s>%s</a>"""%(quoteattr(str(urlHandlers.UHFileAccess.getURL(r))),iconHTML)
2191            materials.append("""%s<a href=%s>%s</a>"""%(iconHTML,quoteattr(str(url)),self.htmlText(materialFactories.PosterFactory.getTitle().lower())))
2192        video=contrib.getVideo()
2193        if video is not None:
2194            materials.append("""<a href=%s><img src=%s border="0" alt="video"> %s</a>"""%(
2195                quoteattr(str(matUrlHandler.getURL(video))),
2196                quoteattr(str(materialFactories.VideoFactory.getIconURL())),
2197                self.htmlText(materialFactories.VideoFactory.getTitle())))
2198        minutes=contrib.getMinutes()
2199        if minutes is not None:
2200            materials.append("""<a href=%s><img src=%s border="0" alt="minutes"> %s</a>"""%(
2201                quoteattr(str(matUrlHandler.getURL(minutes))),
2202                quoteattr(str(materialFactories.MinutesFactory.getIconURL())),
2203                self.htmlText(materialFactories.MinutesFactory.getTitle())))
2204        iconURL=quoteattr(str(Config.getInstance().getSystemIconURL("material")))
2205        for material in contrib.getMaterialList():
2206            url=matUrlHandler.getURL(material)
2207            materials.append("""<a href=%s><img src=%s border="0" alt=""> %s</a>"""%(
2208                quoteattr(str(url)),iconURL,self.htmlText(material.getTitle())))
2209        return "<br>".join(materials)
2210
2211    def _getContribHTML(self,contrib):
2212        sdate = ""
2213        if contrib.getAdjustedStartDate() is not None:
2214            sdate=contrib.getAdjustedStartDate().strftime("%Y-%b-%d %H:%M" )
2215        title = """<a href=%s>%s</a>"""%( quoteattr( str( urlHandlers.UHContributionModification.getURL( contrib ) ) ), self.htmlText( contrib.getTitle() ))
2216        strdur = ""
2217        if contrib.getDuration() is not None and contrib.getDuration().seconds != 0:
2218            strdur = (datetime(1900,1,1)+ contrib.getDuration()).strftime("%Hh%M'")
2219            dur = contrib.getDuration()
2220            self._totaldur = self._totaldur + dur
2221        l = []
2222        for spk in contrib.getSpeakerList():
2223            l.append( self.htmlText( spk.getFullName() ) )
2224        speaker = "<br>".join( l )
2225        track = ""
2226        if contrib.getTrack():
2227            track = self.htmlText( contrib.getTrack().getCode() )
2228        cType=""
2229        if contrib.getType() is not None:
2230            cType=contrib.getType().getName()
2231        status=ContribStatusList().getCode(contrib.getCurrentStatus().__class__)
2232        if self._session.canCoordinate(self._aw,"modifContribs") or self._session.canModify(self._aw):
2233            matUrlHandler=urlHandlers.UHMaterialModification
2234        else:
2235            matUrlHandler=urlHandlers.UHMaterialDisplay
2236        html = """
2237            <tr>
2238                <td><input type="checkbox" name="contributions" value=%s></td>
2239                <td valign="top" class="abstractLeftDataCell" nowrap>%s</td>
2240                <td valign="top" nowrap class="abstractDataCell">%s</td>
2241                <td valign="top" class="abstractDataCell">%s</td>
2242                <td valign="top" class="abstractDataCell">%s</td>
2243                <td valign="top" class="abstractDataCell">%s</td>
2244                <td valign="top" class="abstractDataCell">%s</td>
2245                <td valign="top" class="abstractDataCell">%s</td>
2246                <td valign="top" class="abstractDataCell">%s</td>
2247                <td valign="top" class="abstractDataCell">%s</td>
2248            </tr>
2249                """%(quoteattr(str(contrib.getId())),\
2250                    self.htmlText(contrib.getId()),sdate or "&nbsp;",\
2251                    strdur or "&nbsp;",cType or "&nbsp;",title or "&nbsp;", speaker or "&nbsp;",\
2252                    track or "&nbsp;",status or "&nbsp;", self._getMaterialsHTML(contrib,matUrlHandler) or "&nbsp;")
2253        return html
2254
2255    def _getTypeItemsHTML(self):
2256        checked=""
2257        if self._filterCrit.getField("type").getShowNoValue():
2258            checked=" checked"
2259        res=[ i18nformat("""<input type="checkbox" name="typeShowNoValue" value="--none--"%s>--_("not specified")--""")%checked]
2260        for t in self._conf.getContribTypeList():
2261            checked=""
2262            if t.getId() in self._filterCrit.getField("type").getValues():
2263                checked=" checked"
2264            res.append("""<input type="checkbox" name="types" value=%s%s> %s"""%(quoteattr(str(t.getId())),checked,self.htmlText(t.getName())))
2265        return "<br>".join(res)
2266
2267    def _getTrackItemsHTML(self):
2268        checked=""
2269        if self._filterCrit.getField("track").getShowNoValue():
2270            checked=" checked"
2271        res=[ i18nformat("""<input type="checkbox" name="trackShowNoValue" value="--none--"%s>--_("not specified")--""")%checked]
2272        for t in self._conf.getTrackList():
2273            checked=""
2274            if t.getId() in self._filterCrit.getField("track").getValues():
2275                checked=" checked"
2276            res.append("""<input type="checkbox" name="tracks" value=%s%s> (%s) %s"""%(quoteattr(str(t.getId())),checked,self.htmlText(t.getCode()),self.htmlText(t.getTitle())))
2277        return "<br>".join(res)
2278
2279    def _getStatusItemsHTML(self):
2280        res=[]
2281        for st in ContribStatusList().getList():
2282            id=ContribStatusList().getId(st)
2283            checked=""
2284            if id in self._filterCrit.getField("status").getValues():
2285                checked=" checked"
2286            code=ContribStatusList().getCode(st)
2287            caption=ContribStatusList().getCaption(st)
2288            res.append("""<input type="checkbox" name="status" value=%s%s> (%s) %s"""%(quoteattr(str(id)),checked,self.htmlText(code),self.htmlText(caption)))
2289        return "<br>".join(res)
2290
2291    def _getMaterialItemsHTML(self):
2292        res=[]
2293        pf,sf=materialFactories.PaperFactory(),materialFactories.SlidesFactory()
2294        for (id,caption) in [(pf.getId(),pf.getTitle()),\
2295                        (sf.getId(),sf.getTitle()),\
2296                        ("--other--", _("other")),("--none--", i18nformat("""--_("no material")--"""))]:
2297            checked=""
2298            if id in self._filterCrit.getField("material").getValues():
2299                checked=" checked"
2300            res.append("""<input type="checkbox" name="material" value=%s%s> %s"""%(quoteattr(str(id)),checked,self.htmlText(caption)))
2301        return "<br>".join(res)
2302
2303    def getVars( self ):
2304        vars = wcomponents.WTemplated.getVars( self )
2305        vars["quickAccessURL"]=quoteattr(str(urlHandlers.UHSessionModContribQuickAccess.getURL(self._session)))
2306        vars["filterPostURL"]=quoteattr(str(urlHandlers.UHSessionModContribList.getURL(self._session)))
2307        vars["types"]=self._getTypeItemsHTML()
2308        vars["tracks"]=self._getTrackItemsHTML()
2309        vars["status"]=self._getStatusItemsHTML()
2310        vars["materials"]=self._getMaterialItemsHTML()
2311        vars["authSearch"]=""
2312        authField=self._filterCrit.getField("author")
2313        if authField is not None:
2314            vars["authSearch"]=quoteattr(str(authField.getValues()[0]))
2315        sortingField = self._sortingCrit.getField()
2316        self._currentSorting=""
2317        if sortingField is not None:
2318            self._currentSorting=sortingField.getId()
2319        vars["currentSorting"]=""
2320        url=self._getURL()
2321        url.addParam("sortBy","number")
2322        vars["numberImg"]=""
2323        if self._currentSorting == "number":
2324            vars["currentSorting"] = """<input type="hidden" name="sortBy" value="number">"""
2325            if self._order == "down":
2326                vars["numberImg"] = """<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2327                url.addParam("order","up")
2328            elif self._order == "up":
2329                vars["numberImg"] = """<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2330                url.addParam("order","down")
2331        vars["numberSortingURL"]=quoteattr(str(url))
2332
2333        url = self._getURL()
2334        url.addParam("sortBy", "date")
2335        vars["dateImg"] = ""
2336        if self._currentSorting == "date":
2337            vars["currentSorting"]="""<input type="hidden" name="sortBy" value="date">"""
2338            if self._order == "down":
2339                vars["dateImg"]="""<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2340                url.addParam("order","up")
2341            elif self._order == "up":
2342                vars["dateImg"]="""<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2343                url.addParam("order","down")
2344        vars["dateSortingURL"]=quoteattr(str(url))
2345
2346        url = self._getURL()
2347        url.addParam("sortBy", "board_number")
2348        vars["boardNumImg"]=""
2349        if self._currentSorting == "board_number":
2350            vars["currentSorting"]="""<input type="hidden" name="sortBy" value="board_number">"""
2351            if self._order == "down":
2352                vars["boardNumImg"] = """<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2353                url.addParam("order","up")
2354            elif self._order == "up":
2355                vars["boardNumImg"] = """<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2356                url.addParam("order","down")
2357        vars["boardNumSortingURL"]=quoteattr(str(url))
2358
2359        url = self._getURL()
2360        url.addParam("sortBy", "type")
2361        vars["typeImg"] = ""
2362        if self._currentSorting == "type":
2363            vars["currentSorting"]="""<input type="hidden" name="sortBy" value="type">"""
2364            if self._order == "down":
2365                vars["typeImg"]="""<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2366                url.addParam("order","up")
2367            elif self._order == "up":
2368                vars["typeImg"]="""<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2369                url.addParam("order","down")
2370        vars["typeSortingURL"] = quoteattr( str( url ) )
2371
2372        url = self._getURL()
2373        url.addParam("sortBy", "name")
2374        vars["titleImg"] = ""
2375        if self._currentSorting == "name":
2376            vars["currentSorting"]="""<input type="hidden" name="sortBy" value="name">"""
2377            if self._order == "down":
2378                vars["titleImg"]="""<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2379                url.addParam("order","up")
2380            elif self._order == "up":
2381                vars["titleImg"]="""<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2382                url.addParam("order","down")
2383        vars["titleSortingURL"]=quoteattr(str(url))
2384
2385        url = self._getURL()
2386        url.addParam("sortBy", "speaker")
2387        vars["speakerImg"]=""
2388        if self._currentSorting=="speaker":
2389            vars["currentSorting"] = """<input type="hidden" name="sortBy" value="speaker">"""
2390            if self._order == "down":
2391                vars["speakerImg"] = """<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2392                url.addParam("order","up")
2393            elif self._order == "up":
2394                vars["speakerImg"] = """<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2395                url.addParam("order","down")
2396        vars["speakerSortingURL"]=quoteattr( str( url ) )
2397
2398        url = self._getURL()
2399        url.addParam("sortBy","track")
2400        vars["trackImg"] = ""
2401        if self._currentSorting == "track":
2402            vars["currentSorting"] = """<input type="hidden" name="sortBy" value="track">"""
2403            if self._order == "down":
2404                vars["trackImg"] = """<img src=%s alt="down">"""%(quoteattr(Config.getInstance().getSystemIconURL("downArrow")))
2405                url.addParam("order","up")
2406            elif self._order == "up":
2407                vars["trackImg"] = """<img src=%s alt="up">"""%(quoteattr(Config.getInstance().getSystemIconURL("upArrow")))
2408                url.addParam("order","down")
2409        vars["trackSortingURL"] = quoteattr( str( url ) )
2410        l = []
2411        numContribs=0
2412        f=filters.SimpleFilter(self._filterCrit,self._sortingCrit)
2413        contribsToPrint = []
2414        for contrib in f.apply(self._session.getContributionList()):
2415            l.append( self._getContribHTML( contrib ) )
2416            numContribs+=1
2417            contribsToPrint.append("""<input type="hidden" name="contributions" value="%s">"""%contrib.getId())
2418        if self._order =="up":
2419            l.reverse()
2420        vars["contributions"]="".join(l)
2421        vars["contribsToPrint"] = "".join(contribsToPrint)
2422        vars["contributionActionURL"]=quoteattr(str(urlHandlers.UHSessionModContributionAction.getURL(self._session)))
2423        vars["contributionsPDFURL"]=quoteattr(str(urlHandlers.UHSessionModToPDF.getURL(self._session)))
2424        vars["participantListURL"]=quoteattr(str(urlHandlers.UHSessionModParticipantList.getURL(self._session)))
2425        vars["addContribURL"]=quoteattr(str(urlHandlers.UHSessionModAddContribs.getURL(self._session)))
2426        vars["numContribs"]=str(numContribs)
2427        totaldur = self._totaldur
2428        days = totaldur.days
2429        hours = (totaldur.seconds)/3600
2430        dayhours = (days * 24)+hours
2431        mins = ((totaldur.seconds)/60)-(hours*60)
2432        vars["totaldur" ]="""%sh%sm"""%(dayhours,mins)
2433        return vars
2434
2435
2436class WSessionModPosterContribList(WSessionModContribList):
2437
2438    def _getContribHTML(self,contrib):
2439        sdate = ""
2440        if contrib.getAdjustedStartDate() is not None:
2441            sdate=contrib.getAdjustedStartDate().strftime("%Y-%b-%d %H:%M" )
2442        strdur = ""
2443        if contrib.getDuration() is not None and contrib.getDuration().seconds != 0:
2444            strdur = (datetime(1900,1,1)+ contrib.getDuration()).strftime("%Hh%M'")
2445            dur = contrib.getDuration()
2446            self._totaldur = self._totaldur + dur
2447        title = """<a href=%s>%s</a>"""%( quoteattr( str( urlHandlers.UHContributionModification.getURL( contrib ) ) ), self.htmlText( contrib.getTitle() ))
2448        l = []
2449        for spk in contrib.getSpeakerList():
2450            l.append( self.htmlText( spk.getFullName() ) )
2451        speaker = "<br>".join( l )
2452        track = ""
2453        if contrib.getTrack():
2454            track = self.htmlText( contrib.getTrack().getCode() )
2455        cType=""
2456        if contrib.getType() is not None:
2457            cType=contrib.getType().getName()
2458        status=ContribStatusList().getCode(contrib.getCurrentStatus().__class__)
2459        materials=""
2460        if contrib.getPaper() is not None:
2461            url=urlHandlers.UHMaterialModification.getURL(contrib.getPaper())
2462            materials+="""<a href=%s><img border="0" src=%s alt="paper"></a>"""%(
2463                    quoteattr(str(url)),
2464                    quoteattr(str(materialFactories.PaperFactory().getIconURL())))
2465        if contrib.getSlides() is not None:
2466            url=urlHandlers.UHMaterialModification.getURL(contrib.getSlides())
2467            materials+="""<a href=%s><img border="0" src=%s alt="slides"></a>"""%(
2468                    quoteattr(str(url)),
2469                    quoteattr(str(materialFactories.SlidesFactory().getIconURL())))
2470        editURL=urlHandlers.UHSessionModContribListEditContrib.getURL(contrib)
2471        if self._currentSorting!="":
2472            editURL.addParam("sortBy",self._currentSorting)
2473        editIconURL=Config.getInstance().getSystemIconURL("modify")
2474        html = """
2475            <tr>
2476                <td><input type="checkbox" name="contributions" value=%s></td>
2477                <td valign="top" class="abstractLeftDataCell" nowrap>%s</td>
2478                <td valign="top" nowrap class="abstractDataCell">%s</td>
2479                <td valign="top" class="abstractDataCell">%s</td>
2480                <td valign="top" class="abstractDataCell">%s</td>
2481                <td valign="top" class="abstractDataCell"><a href=%s><img src=%s border="0" alt=""></a>%s</td>
2482                <td valign="top" class="abstractDataCell">%s</td>
2483                <td valign="top" class="abstractDataCell">%s</td>
2484                <td valign="top" class="abstractDataCell">%s</td>
2485                <td valign="top" class="abstractDataCell">%s</td>
2486                <td valign="top" class="abstractDataCell">%s</td>
2487            </tr>
2488                """%(quoteattr(str(contrib.getId())),
2489                    self.htmlText(contrib.getId()),
2490                    sdate or "&nbsp;",
2491                    strdur or "&nbsp;",
2492                    cType or "&nbsp;",
2493                    quoteattr(str(editURL)),
2494                    quoteattr(str(editIconURL)),title or "&nbsp;",
2495                    speaker or "&nbsp;",
2496                    track or "&nbsp;",
2497                    status or "&nbsp;",
2498                    materials or "&nbsp;",
2499                    self.htmlText(contrib.getBoardNumber()) or "&nbsp;")
2500        return html
2501
2502
2503class WPModContribList(WPSessionModifBase):
2504
2505    def _setActiveTab(self):
2506        self._tabContribs.setActive()
2507
2508    def _getTabContent( self, params ):
2509        filterCrit=params.get("filterCrit",None)
2510        sortingCrit=params.get("sortingCrit",None)
2511        order = params.get("order","down")
2512        if self._session.getScheduleType()=="poster":
2513            wc=WSessionModPosterContribList(self._session,filterCrit,sortingCrit, order, self._getAW())
2514        else:
2515            wc=WSessionModContribList(self._session,filterCrit,sortingCrit, order, self._getAW())
2516        return wc.getHTML()
2517
2518
2519class WSessionModContribListEditContrib(wcomponents.WTemplated):
2520
2521    def __init__(self,contrib):
2522        self._contrib=contrib
2523
2524    def getVars(self):
2525        vars=wcomponents.WTemplated.getVars(self)
2526        url=vars["postURL"]
2527        if vars.get("sortBy","").strip()!="":
2528            url.addParam("sortBy",vars["sortBy"])
2529        vars["postURL"]=quoteattr(str(url))
2530        vars["title"]=self.htmlText(self._contrib.getTitle())
2531        defaultDefinePlace=defaultDefineRoom=""
2532        defaultInheritPlace=defaultInheritRoom="checked"
2533        locationName,locationAddress,roomName="","",""
2534        if self._contrib.getOwnLocation():
2535            defaultDefinePlace,defaultInheritPlace="checked",""
2536            locationName=self._contrib.getLocation().getName()
2537            locationAddress=self._contrib.getLocation().getAddress()
2538        if self._contrib.getOwnRoom():
2539            defaultDefineRoom,defaultInheritRoom="checked",""
2540            roomName=self._contrib.getRoom().getName()
2541        vars["defaultInheritPlace"]=defaultInheritPlace
2542        vars["defaultDefinePlace"]=defaultDefinePlace
2543        vars["confPlace"]=""
2544        confLocation=self._contrib.getOwner().getLocation()
2545        if self._contrib.isScheduled():
2546            confLocation=self._contrib.getSchEntry().getSchedule().getOwner().getLocation()
2547            sDate=self._contrib.getAdjustedStartDate()
2548            vars["sYear"]=quoteattr(str(sDate.year))
2549            vars["sMonth"]=quoteattr(str(sDate.month))
2550            vars["sDay"]=quoteattr(str(sDate.day))
2551            vars["sHour"]=quoteattr(str(sDate.hour))
2552            vars["sMinute"]=quoteattr(str(sDate.minute))
2553            vars["startDate"]=self._contrib.getAdjustedStartDate().strftime("%Y-%b-%d %H:%M")
2554        else:
2555            vars["sYear"]=quoteattr(str(""))
2556            vars["sMonth"]=quoteattr(str(""))
2557            vars["sDay"]=quoteattr(str(""))
2558            vars["sHour"]=quoteattr(str(""))
2559            vars["sMinute"]=quoteattr(str(""))
2560            vars["startDate"]= i18nformat("""--_("not scheduled")--""")
2561        vars["durHours"]=quoteattr(str((datetime(1900,1,1)+self._contrib.getDuration()).hour))
2562        vars["durMins"]=quoteattr(str((datetime(1900,1,1)+self._contrib.getDuration()).minute))
2563        if confLocation:
2564            vars["confPlace"]=confLocation.getName()
2565        vars["locationName"]=locationName
2566        vars["locationAddress"]=locationAddress
2567        vars["defaultInheritRoom"]=defaultInheritRoom
2568        vars["defaultDefineRoom"]=defaultDefineRoom
2569        vars["confRoom"]=""
2570        confRoom=self._contrib.getOwner().getRoom()
2571        if self._contrib.isScheduled():
2572            confRoom=self._contrib.getSchEntry().getSchedule().getOwner().getRoom()
2573        if confRoom:
2574            vars["confRoom"]=confRoom.getName()
2575        vars["roomName"]=roomName
2576        vars["parentType"]="conference"
2577        if self._contrib.getSession() is not None:
2578            vars["parentType"]="session"
2579            if self._contrib.isScheduled():
2580                vars["parentType"]="session slot"
2581        vars["boardNumber"]=quoteattr(str(self._contrib.getBoardNumber()))
2582        return vars
2583
2584
2585class WPModContribListEditContrib(WPModContribList):
2586
2587    def __init__(self,rh,contrib):
2588        WPModContribList.__init__(self,rh,contrib.getSession())
2589        self._contrib=contrib
2590
2591    def _getTabContent( self, params ):
2592        wc=WSessionModContribListEditContrib(self._contrib)
2593        return wc.getHTML({"sortBy":params.get("sortBy",""),
2594                            "postURL":urlHandlers.UHSessionModContribListEditContrib.getURL(self._contrib)})
2595
2596
2597class WSessionModAddContribs(wcomponents.WTemplated):
2598
2599    def __init__(self,session):
2600        self._session=session
2601
2602    def _getTrackItems(self):
2603        res=[ i18nformat("""<option value="--none--">--_("none")--</option>""")]
2604        for track in self._session.getConference().getTrackList():
2605            res.append("""<option value=%s>(%s) %s</option>"""%(quoteattr(str(track.getId())),self.htmlText(track.getCode()),self.htmlText(track.getTitle())))
2606        return "".join(res)
2607
2608    def _getContribItems(self):
2609        res=[]
2610        #available contributions to a session are those contributions which:
2611        #   1) are not included in any session
2612        #   2) are not withdrawn
2613        #   3) are not scheduled
2614        sc=contribFilters.SortingCriteria(["number"])
2615        contribList=filters.SimpleFilter(None,sc).apply(self._session.getConference().getContributionList())
2616        for contrib in contribList:
2617            if contrib.getSession() is not None or isinstance(contrib.getCurrentStatus(),conference.ContribStatusWithdrawn) or contrib.isScheduled():
2618                continue
2619            cType=""
2620            if contrib.getType() is not None:
2621                cType="%s"%contrib.getType().getName()
2622            spks=[self.htmlText(spk.getFullName()) for spk in contrib.getSpeakerList()]
2623            res.append("""
2624                <tr>
2625                    <td valgin="top"><input type="checkbox" name="manSelContribs" value=%s></td>
2626                    <td valgin="top">%s</td>
2627                    <td valgin="top">[%s]</td>
2628                    <td valgin="top"><i>%s</i></td>
2629                    <td valgin="top">%s</td>
2630                </tr>
2631                        """%(quoteattr(str(contrib.getId())), \
2632                        self.htmlText(contrib.getId()),\
2633                        self.htmlText(cType), \
2634                        self.htmlText(contrib.getTitle()),\
2635                        "<br>".join(spks)))
2636        return "".join(res)
2637
2638    def getVars(self):
2639        vars=wcomponents.WTemplated.getVars(self)
2640        vars["postURL"]=quoteattr(str(urlHandlers.UHSessionModAddContribs.getURL(self._session)))
2641        vars["tracks"]=self._getTrackItems()
2642        vars["availContribs"]=self._getContribItems()
2643        return vars
2644
2645
2646class WPModAddContribs(WPModContribList):
2647
2648    def _getTabContent( self, params ):
2649        wc=WSessionModAddContribs(self._session)
2650        return wc.getHTML()
2651
2652
2653class WPModImportContribsConfirmation(WPModContribList):
2654
2655    def _getTabContent( self, params ):
2656        wc=wcomponents.WConfModMoveContribsToSessionConfirmation(self._conf,params.get("contribIds",[]),self._session)
2657        p={"postURL":urlHandlers.UHSessionModAddContribs.getURL(self._session)}
2658        return wc.getHTML(p)
2659
2660
2661class WPModParticipantList( WPSessionModifBase ):
2662
2663    def __init__(self, rh, conf, emailList, displayedGroups, contribs):
2664        WPSessionModifBase.__init__(self, rh, conf)
2665        self._emailList = emailList
2666        self._displayedGroups = displayedGroups
2667        self._contribs = contribs
2668
2669    def _getBody( self, params ):
2670        WPSessionModifBase._getBody(self, params)
2671        wc = WContribParticipantList(self._conf, self._emailList, self._displayedGroups, self._contribs)
2672        params = {"urlDisplayGroup":urlHandlers.UHSessionModParticipantList.getURL(self._session)}
2673        return wc.getHTML(params)
2674
2675class WPSessionDisplayRemoveMaterialsConfirm( WPSessionDefaultDisplayBase ):
2676
2677    def __init__(self,rh, conf, mat):
2678        WPSessionDefaultDisplayBase.__init__(self,rh,conf)
2679        self._mat=mat
2680
2681    def _getBody(self,params):
2682        wc=wcomponents.WDisplayConfirmation()
2683        msg="""Are you sure you want to delete the following material?<br>
2684        <b><i>%s</i></b>
2685        <br>"""%self._mat.getTitle()
2686        url=urlHandlers.UHSessionDisplayRemoveMaterial.getURL(self._mat.getOwner())
2687        return wc.getHTML(msg,url,{"deleteMaterial":self._mat.getId()})
2688
2689class WPSessionModifRelocate(WPSessionModifBase):
2690
2691    def __init__(self, rh, session, entry, targetDay):
2692        WPSessionModifBase.__init__(self, rh, session)
2693        self._targetDay=targetDay
2694        self._entry=entry
2695
2696    def _getPageContent( self, params):
2697        wc=wcomponents.WSchRelocate(self._entry)
2698        p={"postURL":quoteattr(str(urlHandlers.UHSessionModifScheduleRelocate.getURL(self._entry))), \
2699                "targetDay":quoteattr(str(self._targetDay))}
2700        return wc.getHTML(p)
2701
2702
2703class WPSessionModifMaterials( WPSessionModifBase ):
2704
2705    _userData = ['favorite-user-list']
2706
2707    def __init__(self, rh, session):
2708        self._target = session
2709        WPSessionModifBase.__init__(self, rh, session)
2710
2711    def _setActiveTab( self ):
2712        self._tabMaterials.setActive()
2713
2714    ## def _getContent( self, pars ):
2715    ##     wc=wcomponents.WShowExistingMaterial(self._target)
2716    ##     return wc.getHTML( pars )
2717
2718    def _getTabContent( self, pars ):
2719        wc=wcomponents.WShowExistingMaterial(self._target)
2720        return wc.getHTML( pars )
2721
2722class WPSessionDatesModification(WPSessionModifSchedule):
2723
2724    def _getTabContent(self,params):
2725        p=WSessionModEditDates(self._session.getConference())
2726        params["postURL"]=urlHandlers.UHSessionDatesModification.getURL(self._session)
2727        return p.getHTML(params)
2728
2729class WSessionModEditDates(wcomponents.WTemplated):
2730
2731    def __init__(self,targetConf,targetDay=None):
2732        self._conf=targetConf
2733        self._targetDay=targetDay
2734
2735    def _getErrorHTML(self,l):
2736        if len(l)>0:
2737            return """
2738                <tr>
2739                    <td colspan="2" align="center">
2740                        <br>
2741                        <table bgcolor="red" cellpadding="6">
2742                            <tr>
2743                                <td bgcolor="white" style="color: red">%s</td>
2744                            </tr>
2745                        </table>
2746                        <br>
2747                    </td>
2748                </tr>
2749                    """%"<br>".join(l)
2750        else:
2751            return ""
2752
2753    def getVars( self ):
2754        vars=wcomponents.WTemplated.getVars(self)
2755        vars["errors"]=self._getErrorHTML(vars.get("errors",[]))
2756        vars["postURL"]=quoteattr(str(vars["postURL"]))
2757        vars["calendarIconURL"]=Config.getInstance().getSystemIconURL( "calendar" )
2758        vars["calendarSelectURL"]=urlHandlers.UHSimpleCalendar.getURL()
2759        refDate=self._conf.getSchedule().calculateDayEndDate(self._targetDay, self._conf.getTimezone())
2760        endDate = None
2761        if refDate.hour == 23:
2762            refDate = refDate - timedelta(minutes=refDate.minute)
2763            endDate = refDate + timedelta(minutes=59)
2764        vars["sDay"]=quoteattr(str(vars.get("sDay",refDate.day)))
2765        vars["sMonth"]=quoteattr(str(vars.get("sMonth",refDate.month)))
2766        vars["sYear"]=quoteattr(str(vars.get("sYear",refDate.year)))
2767        vars["sHour"]=quoteattr(str(vars.get("sHour",refDate.hour)))
2768        vars["sMinute"]=quoteattr(str(vars.get("sMinute",refDate.minute)))
2769        if not endDate:
2770            endDate=refDate+timedelta(hours=1)
2771        vars["eDay"]=quoteattr(str(vars.get("eDay",endDate.day)))
2772        vars["eMonth"]=quoteattr(str(vars.get("eMonth",endDate.month)))
2773        vars["eYear"]=quoteattr(str(vars.get("eYear",endDate.year)))
2774        vars["eHour"]=quoteattr(str(vars.get("eHour",endDate.hour)))
2775        vars["eMinute"]=quoteattr(str(vars.get("eMinute",endDate.minute)))
2776        vars["autoUpdate"]=""
2777        if not self._conf.getEnableSessionSlots():
2778            vars["disabled"] = "disabled"
2779        else:
2780            vars["disabled"] = ""
2781        vars["adjustSlots"]=""
2782        return vars
2783
Note: See TracBrowser for help on using the repository browser.