| 1 | """ |
|---|
| 2 | Schedule-related services |
|---|
| 3 | """ |
|---|
| 4 | |
|---|
| 5 | from MaKaC.services.implementation.base import ParameterManager |
|---|
| 6 | |
|---|
| 7 | import MaKaC.conference as conference |
|---|
| 8 | import MaKaC.schedule as schedule |
|---|
| 9 | |
|---|
| 10 | from MaKaC.common.PickleJar import DictPickler |
|---|
| 11 | from MaKaC.common.fossilize import fossilize |
|---|
| 12 | from MaKaC.fossils.schedule import IConferenceScheduleDisplayFossil |
|---|
| 13 | |
|---|
| 14 | from MaKaC.services.interface.rpc.common import ServiceError, TimingNoReportError,\ |
|---|
| 15 | NoReportError |
|---|
| 16 | |
|---|
| 17 | from MaKaC.services.implementation import conference as conferenceServices |
|---|
| 18 | from MaKaC.services.implementation import base |
|---|
| 19 | from MaKaC.services.implementation import roomBooking |
|---|
| 20 | from MaKaC.services.implementation import session as sessionServices |
|---|
| 21 | from MaKaC.common.timezoneUtils import setAdjustedDate |
|---|
| 22 | from MaKaC.common.utils import getHierarchicalId, formatTime, formatDateTime, parseDate |
|---|
| 23 | from MaKaC.common.contextManager import ContextManager |
|---|
| 24 | import MaKaC.common.info as info |
|---|
| 25 | from MaKaC.errors import TimingError |
|---|
| 26 | from MaKaC.fossils.schedule import ILinkedTimeSchEntryMgmtFossil, IBreakTimeSchEntryMgmtFossil, \ |
|---|
| 27 | IContribSchEntryMgmtFossil |
|---|
| 28 | from MaKaC.fossils.contribution import IContributionParticipationTTMgmtFossil, IContributionFossil |
|---|
| 29 | from MaKaC.fossils.conference import IConferenceParticipationFossil,\ |
|---|
| 30 | ISessionFossil |
|---|
| 31 | from MaKaC.common import timezoneUtils |
|---|
| 32 | from MaKaC.common.Conversion import Conversion |
|---|
| 33 | from MaKaC.schedule import BreakTimeSchEntry |
|---|
| 34 | from MaKaC.conference import SessionSlot, Material, Link |
|---|
| 35 | from MaKaC.webinterface.pages.sessions import WSessionICalExport |
|---|
| 36 | from MaKaC.webinterface.pages.contributions import WContributionICalExport |
|---|
| 37 | from indico.web.http_api.util import generate_public_auth_request |
|---|
| 38 | |
|---|
| 39 | import time, datetime, pytz, copy |
|---|
| 40 | |
|---|
| 41 | def translateAutoOps(autoOps): |
|---|
| 42 | |
|---|
| 43 | result = [] |
|---|
| 44 | |
|---|
| 45 | for source,op,target, newValue in autoOps: |
|---|
| 46 | |
|---|
| 47 | if type(newValue) == datetime.datetime: |
|---|
| 48 | finalTime = formatTime(newValue) |
|---|
| 49 | else: |
|---|
| 50 | finalTime = newValue |
|---|
| 51 | |
|---|
| 52 | result.append((getHierarchicalId(source), |
|---|
| 53 | op, |
|---|
| 54 | getHierarchicalId(target), |
|---|
| 55 | finalTime)) |
|---|
| 56 | return result |
|---|
| 57 | |
|---|
| 58 | |
|---|
| 59 | class ConferenceGetSchedule(conferenceServices.ConferenceDisplayBase): |
|---|
| 60 | def _checkParams(self): |
|---|
| 61 | conferenceServices.ConferenceDisplayBase._checkParams(self) |
|---|
| 62 | |
|---|
| 63 | def _getAnswer(self): |
|---|
| 64 | #TODO: tz = timezoneUtils.DisplayTZ(self._getAW()).getDisplayTZ() // use it in the fossilize? |
|---|
| 65 | return self._target.getSchedule().fossilize(IConferenceScheduleDisplayFossil) |
|---|
| 66 | |
|---|
| 67 | class LocationSetter: |
|---|
| 68 | def _setLocationInfo(self, target): |
|---|
| 69 | room = self._roomInfo.get('room', None) |
|---|
| 70 | address = self._roomInfo.get('address', None) |
|---|
| 71 | location = self._roomInfo.get('location', None) |
|---|
| 72 | if location != None: |
|---|
| 73 | loc = target.getOwnLocation() |
|---|
| 74 | if not loc: |
|---|
| 75 | loc = conference.CustomLocation() |
|---|
| 76 | target.setLocation(loc) |
|---|
| 77 | loc.setName(location) |
|---|
| 78 | loc.setAddress(address) |
|---|
| 79 | |
|---|
| 80 | #same as for the location |
|---|
| 81 | if room != None: |
|---|
| 82 | r = target.getOwnRoom() |
|---|
| 83 | if not r: |
|---|
| 84 | r = conference.CustomRoom() |
|---|
| 85 | target.setRoom(r) |
|---|
| 86 | r.setName(room) |
|---|
| 87 | minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() |
|---|
| 88 | if minfo.getRoomBookingModuleActive(): |
|---|
| 89 | r.retrieveFullName(location) |
|---|
| 90 | else: |
|---|
| 91 | # invalidate full name, as we have no way to know it |
|---|
| 92 | r.fullName = None |
|---|
| 93 | |
|---|
| 94 | class ScheduleOperation: |
|---|
| 95 | |
|---|
| 96 | def _getAnswer(self): |
|---|
| 97 | |
|---|
| 98 | self.initializeAutoOps() |
|---|
| 99 | |
|---|
| 100 | try: |
|---|
| 101 | return self._performOperation() |
|---|
| 102 | except TimingError, e: |
|---|
| 103 | raise TimingNoReportError(e.getMsg()) |
|---|
| 104 | |
|---|
| 105 | def initializeAutoOps(self): |
|---|
| 106 | ContextManager.set('autoOps',[]) |
|---|
| 107 | |
|---|
| 108 | def getAutoOps(self): |
|---|
| 109 | return ContextManager.get('autoOps') |
|---|
| 110 | |
|---|
| 111 | |
|---|
| 112 | class ScheduleAddContribution(ScheduleOperation, LocationSetter): |
|---|
| 113 | |
|---|
| 114 | def __addPeople(self, contribution, pManager, elemType, method): |
|---|
| 115 | """ Generic method for adding presenters, authors and |
|---|
| 116 | co-authors. """ |
|---|
| 117 | |
|---|
| 118 | pList = pManager.extract("%ss" % elemType, pType=list, |
|---|
| 119 | allowEmpty=True) |
|---|
| 120 | |
|---|
| 121 | for elemValues in pList: |
|---|
| 122 | element = conference.ContributionParticipation() |
|---|
| 123 | DictPickler.update(element, elemValues) |
|---|
| 124 | |
|---|
| 125 | # call the appropriate method |
|---|
| 126 | method(contribution, element) |
|---|
| 127 | |
|---|
| 128 | if self._privileges is not None: |
|---|
| 129 | if self._privileges.get('%s-grant-submission' % elemType, False): |
|---|
| 130 | contribution.grantSubmission(element) |
|---|
| 131 | |
|---|
| 132 | def _checkParams(self): |
|---|
| 133 | self._pManager = ParameterManager(self._params) |
|---|
| 134 | |
|---|
| 135 | self._roomInfo = self._pManager.extract("roomInfo", pType=dict, allowEmpty=True) |
|---|
| 136 | self._keywords = self._pManager.extract("keywords", pType=list, |
|---|
| 137 | allowEmpty=True) |
|---|
| 138 | self._boardNumber = self._pManager.extract("boardNumber", pType=str, allowEmpty=True, defaultValue="") |
|---|
| 139 | self._reportNumbers = self._pManager.extract("reportNumbers", pType=list, allowEmpty=True, defaultValue=[]) |
|---|
| 140 | |
|---|
| 141 | self._needsToBeScheduled = self._params.get("schedule", True) |
|---|
| 142 | if self._needsToBeScheduled: |
|---|
| 143 | self._dateTime = self._pManager.extract("startDate", pType=datetime.datetime) |
|---|
| 144 | |
|---|
| 145 | self._duration = self._pManager.extract("duration", pType=int) |
|---|
| 146 | self._title = self._pManager.extract("title", pType=str) |
|---|
| 147 | self._fields = {} |
|---|
| 148 | |
|---|
| 149 | for field in self._target.getConference().getAbstractMgr().getAbstractFieldsMgr().getFields(): |
|---|
| 150 | self._fields[field.getId()] = self._pManager.extract("field_%s"%field.getId(), pType=str, |
|---|
| 151 | allowEmpty=True, defaultValue='') |
|---|
| 152 | self._privileges = self._pManager.extract("privileges", pType=dict, allowEmpty=True) |
|---|
| 153 | self._contribTypeId = self._pManager.extract("type", pType=str, allowEmpty=True) |
|---|
| 154 | self._materials = self._pManager.extract("materials", pType=dict, allowEmpty=True) |
|---|
| 155 | |
|---|
| 156 | def _performOperation(self): |
|---|
| 157 | |
|---|
| 158 | contribution = conference.Contribution() |
|---|
| 159 | |
|---|
| 160 | self._addToParent(contribution) |
|---|
| 161 | |
|---|
| 162 | contribution.setTitle(self._title, notify = False) |
|---|
| 163 | |
|---|
| 164 | contribution.setKeywords('\n'.join(self._keywords)) |
|---|
| 165 | |
|---|
| 166 | contribution.setBoardNumber(self._boardNumber) |
|---|
| 167 | contribution.setDuration(self._duration/60, self._duration%60) |
|---|
| 168 | |
|---|
| 169 | if self._reportNumbers: |
|---|
| 170 | for reportTuple in self._reportNumbers: |
|---|
| 171 | for recordNumber in reportTuple[1]: |
|---|
| 172 | contribution.getReportNumberHolder().addReportNumber(reportTuple[0], recordNumber) |
|---|
| 173 | |
|---|
| 174 | if self._needsToBeScheduled: |
|---|
| 175 | checkFlag = self._getCheckFlag() |
|---|
| 176 | adjDate = setAdjustedDate(self._dateTime, self._conf) |
|---|
| 177 | contribution.setStartDate(adjDate, check = checkFlag) |
|---|
| 178 | |
|---|
| 179 | if self._materials: |
|---|
| 180 | for material in self._materials.keys(): |
|---|
| 181 | newMaterial = Material() |
|---|
| 182 | newMaterial.setTitle(material) |
|---|
| 183 | for resource in self._materials[material]: |
|---|
| 184 | newLink = Link() |
|---|
| 185 | newLink.setURL(resource) |
|---|
| 186 | newLink.setName(resource) |
|---|
| 187 | newMaterial.addResource(newLink) |
|---|
| 188 | contribution.addMaterial(newMaterial) |
|---|
| 189 | |
|---|
| 190 | self._schedule(contribution) |
|---|
| 191 | |
|---|
| 192 | for field, value in self._fields.iteritems(): |
|---|
| 193 | contribution.setField(field, value) |
|---|
| 194 | |
|---|
| 195 | if (self._target.getConference().getType() == "conference"): |
|---|
| 196 | # for conferences, add authors and coauthors |
|---|
| 197 | self.__addPeople(contribution, self._pManager, "author", conference.Contribution.addPrimaryAuthor) |
|---|
| 198 | self.__addPeople(contribution, self._pManager, "coauthor", conference.Contribution.addCoAuthor) |
|---|
| 199 | # and also set type if it exists |
|---|
| 200 | if (self._contribTypeId): |
|---|
| 201 | contribution.setType(self._target.getConference().getContribTypeById(self._contribTypeId)) |
|---|
| 202 | |
|---|
| 203 | |
|---|
| 204 | self.__addPeople(contribution, self._pManager, "presenter", conference.Contribution.newSpeaker) |
|---|
| 205 | |
|---|
| 206 | self._setLocationInfo(contribution) |
|---|
| 207 | |
|---|
| 208 | schEntry = contribution.getSchEntry() |
|---|
| 209 | fossilizedData = schEntry.fossilize({"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 210 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 211 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil}, |
|---|
| 212 | tz=self._conf.getTimezone()) |
|---|
| 213 | fossilizedDataSlotSchEntry = self._getSlotEntry() |
|---|
| 214 | |
|---|
| 215 | result = {'id': fossilizedData['id'], |
|---|
| 216 | 'entry': fossilizedData, |
|---|
| 217 | 'slotEntry': fossilizedDataSlotSchEntry, |
|---|
| 218 | 'autoOps': translateAutoOps(self.getAutoOps())} |
|---|
| 219 | |
|---|
| 220 | if self._needsToBeScheduled: |
|---|
| 221 | result['day'] = schEntry.getAdjustedStartDate().strftime("%Y%m%d") |
|---|
| 222 | |
|---|
| 223 | return result |
|---|
| 224 | |
|---|
| 225 | |
|---|
| 226 | class ConferenceScheduleAddContribution(ScheduleAddContribution, conferenceServices.ConferenceModifBase): |
|---|
| 227 | |
|---|
| 228 | def _checkParams(self): |
|---|
| 229 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 230 | ScheduleAddContribution._checkParams(self) |
|---|
| 231 | |
|---|
| 232 | def _addToParent(self, contribution): |
|---|
| 233 | self._target.addContribution( contribution ) |
|---|
| 234 | contribution.setParent(self._target) |
|---|
| 235 | |
|---|
| 236 | def _schedule(self, contribution): |
|---|
| 237 | if self._needsToBeScheduled: |
|---|
| 238 | self._target.getSchedule().addEntry(contribution.getSchEntry(), 2) |
|---|
| 239 | |
|---|
| 240 | def _getSlotEntry(self): |
|---|
| 241 | return None |
|---|
| 242 | |
|---|
| 243 | |
|---|
| 244 | class SessionSlotScheduleAddContribution(ScheduleAddContribution, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 245 | |
|---|
| 246 | def _checkParams(self): |
|---|
| 247 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 248 | ScheduleAddContribution._checkParams(self) |
|---|
| 249 | |
|---|
| 250 | def _addToParent(self, contribution): |
|---|
| 251 | self._session.addContribution( contribution ) |
|---|
| 252 | contribution.setParent(self._session.getConference()) |
|---|
| 253 | |
|---|
| 254 | def _schedule(self, contribution): |
|---|
| 255 | return self._slot.getSchedule().addEntry(contribution.getSchEntry(), |
|---|
| 256 | check = self._getCheckFlag()) |
|---|
| 257 | |
|---|
| 258 | def _getSlotEntry(self): |
|---|
| 259 | return self._slot.getConfSchEntry().fossilize({"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 260 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 261 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil}, |
|---|
| 262 | tz=self._conf.getTimezone()) |
|---|
| 263 | |
|---|
| 264 | |
|---|
| 265 | class ConferenceScheduleAddSession(ScheduleOperation, conferenceServices.ConferenceModifBase, LocationSetter): |
|---|
| 266 | |
|---|
| 267 | def __addConveners2Slot(self, slot): |
|---|
| 268 | for convenerValues in self._conveners: |
|---|
| 269 | convener = conference.SlotChair() |
|---|
| 270 | DictPickler.update(convener, convenerValues) |
|---|
| 271 | slot.addConvener(convener) |
|---|
| 272 | |
|---|
| 273 | def _checkParams(self): |
|---|
| 274 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 275 | |
|---|
| 276 | pManager = ParameterManager(self._params, timezone = self._conf.getTimezone()) |
|---|
| 277 | |
|---|
| 278 | self._roomInfo = pManager.extract("roomInfo", pType=dict, allowEmpty=True) |
|---|
| 279 | self._conveners = pManager.extract("conveners", pType=list, |
|---|
| 280 | allowEmpty=True) |
|---|
| 281 | self._startDateTime = pManager.extract("startDateTime", |
|---|
| 282 | pType=datetime.datetime) |
|---|
| 283 | self._endDateTime = pManager.extract("endDateTime", |
|---|
| 284 | pType=datetime.datetime) |
|---|
| 285 | self._title = pManager.extract("title", pType=str) |
|---|
| 286 | self._subtitle = pManager.extract("subtitle", pType=str, allowEmpty=True) |
|---|
| 287 | self._textColor = pManager.extract("textColor", pType=str) |
|---|
| 288 | self._bgColor = pManager.extract("bgColor", pType=str) |
|---|
| 289 | self._description = pManager.extract("description", pType=str, |
|---|
| 290 | allowEmpty=True) |
|---|
| 291 | self._scheduleType = pManager.extract("sessionType", pType=str, |
|---|
| 292 | allowEmpty=False) |
|---|
| 293 | |
|---|
| 294 | def _performOperation(self): |
|---|
| 295 | |
|---|
| 296 | conf = self._target |
|---|
| 297 | session = conference.Session() |
|---|
| 298 | |
|---|
| 299 | session.setValues({ |
|---|
| 300 | "title": self._title or "", |
|---|
| 301 | "description": self._description or "", |
|---|
| 302 | "sDate": self._startDateTime, |
|---|
| 303 | "eDate": self._endDateTime |
|---|
| 304 | }) |
|---|
| 305 | conf.addSession(session) |
|---|
| 306 | session.setScheduleType(self._scheduleType) |
|---|
| 307 | session.setTextColor(self._textColor) |
|---|
| 308 | session.setBgColor(self._bgColor) |
|---|
| 309 | |
|---|
| 310 | slot = conference.SessionSlot(session) |
|---|
| 311 | |
|---|
| 312 | slot.setTitle(self._subtitle or "") |
|---|
| 313 | slot.setStartDate(session.getStartDate()) |
|---|
| 314 | |
|---|
| 315 | tz = pytz.timezone(self._conf.getTimezone()) |
|---|
| 316 | if session.getEndDate().astimezone(tz).date() > session.getStartDate().astimezone(tz).date(): |
|---|
| 317 | newEndDate = session.getStartDate().astimezone(tz).replace(hour=23,minute=59).astimezone(timezone('UTC')) |
|---|
| 318 | else: |
|---|
| 319 | newEndDate = session.getEndDate() |
|---|
| 320 | dur = newEndDate - session.getStartDate() |
|---|
| 321 | if dur > datetime.timedelta(days=1): |
|---|
| 322 | dur = datetime.timedelta(days=1) |
|---|
| 323 | |
|---|
| 324 | slot.setDuration(dur=dur) |
|---|
| 325 | session.addSlot(slot) |
|---|
| 326 | |
|---|
| 327 | self.__addConveners2Slot(slot) |
|---|
| 328 | self._setLocationInfo(slot) |
|---|
| 329 | |
|---|
| 330 | logInfo = session.getLogInfo() |
|---|
| 331 | logInfo["subject"] = _("Create new session: %s")%session.getTitle() |
|---|
| 332 | self._conf.getLogHandler().logAction(logInfo,"Timetable/Session",self._getUser()) |
|---|
| 333 | |
|---|
| 334 | schEntry = slot.getConfSchEntry() |
|---|
| 335 | fossilizedData = schEntry.fossilize(ILinkedTimeSchEntryMgmtFossil, tz=conf.getTimezone()) |
|---|
| 336 | fossilizedData['entries'] = {} |
|---|
| 337 | |
|---|
| 338 | self.initializeFilteringCriteria(session.getId(), schEntry.getSchedule().getOwner().getId()) |
|---|
| 339 | |
|---|
| 340 | return {'day': slot.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 341 | 'id': fossilizedData['id'], |
|---|
| 342 | 'entry': fossilizedData, |
|---|
| 343 | 'session': session.fossilize(ISessionFossil, tz=self._conf.getTimezone()), |
|---|
| 344 | 'autoOps': translateAutoOps(self.getAutoOps())} |
|---|
| 345 | |
|---|
| 346 | def initializeFilteringCriteria(self, sessionId, conferenceId): |
|---|
| 347 | # Filtering criteria: by default make new session type checked |
|---|
| 348 | websession = self._getSession() |
|---|
| 349 | sessionDict = websession.getVar("ContributionFilterConf%s"%conferenceId) |
|---|
| 350 | if not sessionDict: |
|---|
| 351 | #Create a new dictionary |
|---|
| 352 | sessionDict = {} |
|---|
| 353 | if sessionDict.has_key('sessions'): |
|---|
| 354 | #Append the new type to the existing list |
|---|
| 355 | sessionDict['sessions'].append(sessionId) |
|---|
| 356 | websession._p_changed = 1 |
|---|
| 357 | else: |
|---|
| 358 | #Create a new entry for the dictionary containing the new type |
|---|
| 359 | sessionDict['sessions'] = [sessionId] |
|---|
| 360 | |
|---|
| 361 | class ConferenceScheduleDeleteSession(ScheduleOperation, conferenceServices.ConferenceScheduleModifBase): |
|---|
| 362 | |
|---|
| 363 | def _performOperation(self): |
|---|
| 364 | sessionSlot = self._schEntry.getOwner() |
|---|
| 365 | session = sessionSlot.getSession() |
|---|
| 366 | |
|---|
| 367 | logInfo = session.getLogInfo() |
|---|
| 368 | logInfo["subject"] = "Deleted session: %s"%session.getTitle() |
|---|
| 369 | self._conf.getLogHandler().logAction(logInfo,"Timetable/Session",self._getUser()) |
|---|
| 370 | |
|---|
| 371 | self._conf.removeSession(session) |
|---|
| 372 | |
|---|
| 373 | class ConferenceScheduleDeleteContribution(ScheduleOperation, conferenceServices.ConferenceScheduleModifBase): |
|---|
| 374 | |
|---|
| 375 | def _performOperation(self): |
|---|
| 376 | |
|---|
| 377 | contrib = self._schEntry.getOwner() |
|---|
| 378 | logInfo = contrib.getLogInfo() |
|---|
| 379 | |
|---|
| 380 | if self._conf.getType() == "meeting": |
|---|
| 381 | logInfo["subject"] = _("Deleted contribution: %s")%contrib.getTitle() |
|---|
| 382 | contrib.delete() |
|---|
| 383 | else: |
|---|
| 384 | logInfo["subject"] = _("Unscheduled contribution: %s")%contrib.getTitle() |
|---|
| 385 | self._conf.getLogHandler().logAction(logInfo,"Timetable/Contribution",self._getUser()) |
|---|
| 386 | |
|---|
| 387 | self._conf.getSchedule().removeEntry(self._schEntry) |
|---|
| 388 | |
|---|
| 389 | class SessionScheduleDeleteSessionSlot(ScheduleOperation, sessionServices.SessionModifUnrestrictedTTCoordinationBase): |
|---|
| 390 | |
|---|
| 391 | def _performOperation(self): |
|---|
| 392 | self._session.removeSlot(self._slot) |
|---|
| 393 | |
|---|
| 394 | class SessionScheduleChangeSessionColors(ScheduleOperation, sessionServices.SessionModifBase): |
|---|
| 395 | |
|---|
| 396 | def _checkParams(self): |
|---|
| 397 | sessionServices.SessionModifBase._checkParams(self) |
|---|
| 398 | |
|---|
| 399 | try: |
|---|
| 400 | self._bgColor = self._params["bgColor"] |
|---|
| 401 | self._textColor = self._params["textColor"] |
|---|
| 402 | except: |
|---|
| 403 | raise ServiceError("ERR-S4", "Color parameters not provided.") |
|---|
| 404 | |
|---|
| 405 | def _performOperation(self): |
|---|
| 406 | self._session.setBgColor(self._bgColor) |
|---|
| 407 | self._session.setTextColor(self._textColor) |
|---|
| 408 | |
|---|
| 409 | class ScheduleEditBreakBase(ScheduleOperation, LocationSetter): |
|---|
| 410 | |
|---|
| 411 | def _checkParams(self): |
|---|
| 412 | |
|---|
| 413 | pManager = ParameterManager(self._params, timezone = self._conf.getTimezone()) |
|---|
| 414 | |
|---|
| 415 | self._roomInfo = pManager.extract("roomInfo", pType=dict, allowEmpty=True) |
|---|
| 416 | self._dateTime = pManager.extract("startDate", pType=datetime.datetime) |
|---|
| 417 | self._duration = pManager.extract("duration", pType=int) |
|---|
| 418 | self._title = pManager.extract("title", pType=str) |
|---|
| 419 | self._description = pManager.extract("description", pType=str, |
|---|
| 420 | allowEmpty=True) |
|---|
| 421 | self._textColor = pManager.extract("textColor", pType=str) |
|---|
| 422 | self._bgColor = pManager.extract("bgColor", pType=str) |
|---|
| 423 | self._oldId = None |
|---|
| 424 | |
|---|
| 425 | def _performOperation(self): |
|---|
| 426 | |
|---|
| 427 | self._brk.setValues({"title": self._title or "", |
|---|
| 428 | "description": self._description or "", |
|---|
| 429 | "startDate": self._dateTime, |
|---|
| 430 | "durMins": str(self._duration), |
|---|
| 431 | "durHours": "0"}, |
|---|
| 432 | check = 2, |
|---|
| 433 | tz = self._conf.getTimezone()) |
|---|
| 434 | |
|---|
| 435 | self._brk.setTextColor(self._textColor) |
|---|
| 436 | self._brk.setBgColor(self._bgColor) |
|---|
| 437 | |
|---|
| 438 | self._setLocationInfo(self._brk) |
|---|
| 439 | self._addToSchedule(self._brk) |
|---|
| 440 | |
|---|
| 441 | fossilizedDataSlotSchEntry = self._getSlotEntry() |
|---|
| 442 | fossilizedData = self._brk.fossilize(IBreakTimeSchEntryMgmtFossil, tz=self._conf.getTimezone()) |
|---|
| 443 | |
|---|
| 444 | res = {'day': self._brk.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 445 | 'id': fossilizedData['id'], |
|---|
| 446 | 'slotEntry': fossilizedDataSlotSchEntry, |
|---|
| 447 | 'autoOps': translateAutoOps(self.getAutoOps()), |
|---|
| 448 | 'entry': fossilizedData} |
|---|
| 449 | |
|---|
| 450 | if self._oldId and self._oldId != Conversion.locatorString(self._schEntry)+"b"+self._schEntry.getId(): |
|---|
| 451 | res['oldId'] = self._oldId |
|---|
| 452 | |
|---|
| 453 | return res |
|---|
| 454 | |
|---|
| 455 | class ConferenceScheduleAddBreak(ScheduleEditBreakBase, conferenceServices.ConferenceModifBase): |
|---|
| 456 | |
|---|
| 457 | def _checkParams(self): |
|---|
| 458 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 459 | ScheduleEditBreakBase._checkParams(self) |
|---|
| 460 | self._brk = schedule.BreakTimeSchEntry() |
|---|
| 461 | |
|---|
| 462 | def _addToSchedule(self, b): |
|---|
| 463 | self._target.getSchedule().addEntry(b, 2) |
|---|
| 464 | |
|---|
| 465 | def _getSlotEntry(self): |
|---|
| 466 | return None |
|---|
| 467 | |
|---|
| 468 | |
|---|
| 469 | class ConferenceScheduleEditBreak(ScheduleEditBreakBase, conferenceServices.ConferenceScheduleModifBase): |
|---|
| 470 | |
|---|
| 471 | def _checkParams(self): |
|---|
| 472 | conferenceServices.ConferenceScheduleModifBase._checkParams(self) |
|---|
| 473 | ScheduleEditBreakBase._checkParams(self) |
|---|
| 474 | self._brk = self._schEntry |
|---|
| 475 | |
|---|
| 476 | def _addToSchedule(self, b): |
|---|
| 477 | pass |
|---|
| 478 | |
|---|
| 479 | def _getSlotEntry(self): |
|---|
| 480 | return None |
|---|
| 481 | |
|---|
| 482 | class ConferenceScheduleDeleteBreak(ScheduleOperation, conferenceServices.ConferenceScheduleModifBase): |
|---|
| 483 | |
|---|
| 484 | def _performOperation(self): |
|---|
| 485 | self._conf.getSchedule().removeEntry(self._schEntry) |
|---|
| 486 | |
|---|
| 487 | class SessionSlotScheduleAddBreak(ScheduleEditBreakBase, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 488 | |
|---|
| 489 | def _checkParams(self): |
|---|
| 490 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 491 | ScheduleEditBreakBase._checkParams(self) |
|---|
| 492 | self._brk = schedule.BreakTimeSchEntry() |
|---|
| 493 | |
|---|
| 494 | def _addToSchedule(self, b): |
|---|
| 495 | self._slot.getSchedule().addEntry(b, check = self._getCheckFlag()) |
|---|
| 496 | |
|---|
| 497 | def _getSlotEntry(self): |
|---|
| 498 | return self._slot.getConfSchEntry().fossilize({"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 499 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 500 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil}, |
|---|
| 501 | tz=self._conf.getTimezone()) |
|---|
| 502 | |
|---|
| 503 | |
|---|
| 504 | class SessionSlotScheduleEditBreak(ScheduleEditBreakBase, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 505 | |
|---|
| 506 | def _checkParams(self): |
|---|
| 507 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 508 | ScheduleEditBreakBase._checkParams(self) |
|---|
| 509 | self._brk = self._schEntry |
|---|
| 510 | self._oldStartDate = self._schEntry.getStartDate().date() |
|---|
| 511 | self._oldId = Conversion.locatorString(self._schEntry)+"b"+self._schEntry.getId() |
|---|
| 512 | |
|---|
| 513 | def _addToSchedule(self, b): |
|---|
| 514 | # if the schedule target day is different from the current |
|---|
| 515 | if self._oldStartDate != self._dateTime.date(): |
|---|
| 516 | |
|---|
| 517 | # remove the entry |
|---|
| 518 | self._schEntry.getSchedule().removeEntry(self._schEntry) |
|---|
| 519 | |
|---|
| 520 | # set it to the new date |
|---|
| 521 | self._schEntry.setStartDate(self._dateTime) |
|---|
| 522 | # add it on the new date |
|---|
| 523 | self._conf.getSchedule().addEntry(self._schEntry, check=2) |
|---|
| 524 | |
|---|
| 525 | def _getSlotEntry(self): |
|---|
| 526 | return self._slot.getConfSchEntry().fossilize({"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 527 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 528 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil}, |
|---|
| 529 | tz=self._conf.getTimezone()) |
|---|
| 530 | |
|---|
| 531 | |
|---|
| 532 | class SessionSlotScheduleDeleteBreak(ScheduleOperation, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 533 | |
|---|
| 534 | def _checkParams(self): |
|---|
| 535 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 536 | |
|---|
| 537 | def _performOperation(self): |
|---|
| 538 | self._slot.getSchedule().removeEntry(self._schEntry) |
|---|
| 539 | |
|---|
| 540 | class SessionSlotScheduleDeleteContribution(ScheduleOperation, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 541 | |
|---|
| 542 | def _checkParams(self): |
|---|
| 543 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 544 | |
|---|
| 545 | def _performOperation(self): |
|---|
| 546 | |
|---|
| 547 | contrib = self._schEntry.getOwner() |
|---|
| 548 | |
|---|
| 549 | logInfo = contrib.getLogInfo() |
|---|
| 550 | |
|---|
| 551 | if type == "meeting": |
|---|
| 552 | logInfo["subject"] = "Deleted contribution: %s" %contrib.getTitle() |
|---|
| 553 | contrib.delete() |
|---|
| 554 | else: |
|---|
| 555 | logInfo["subject"] = "Unscheduled contribution: %s"%contrib.getTitle() |
|---|
| 556 | |
|---|
| 557 | self._slot.getSchedule().removeEntry(self._schEntry) |
|---|
| 558 | self._conf.getLogHandler().logAction(logInfo,"Timetable/Contribution",self._getUser()) |
|---|
| 559 | self._slot.getSchedule().removeEntry(self._schEntry) |
|---|
| 560 | |
|---|
| 561 | |
|---|
| 562 | class ModifyStartEndDate(ScheduleOperation): |
|---|
| 563 | |
|---|
| 564 | def _checkParams(self): |
|---|
| 565 | |
|---|
| 566 | pManager = ParameterManager(self._params, timezone = self._conf.getTimezone()) |
|---|
| 567 | self._startDate = pManager.extract("startDate", pType=datetime.datetime) |
|---|
| 568 | self._endDate = pManager.extract("endDate", pType=datetime.datetime) |
|---|
| 569 | self._reschedule = pManager.extract("reschedule", pType=bool) |
|---|
| 570 | |
|---|
| 571 | def _performOperation(self): |
|---|
| 572 | |
|---|
| 573 | checkFlag = self._getCheckFlag() |
|---|
| 574 | |
|---|
| 575 | # if we want to reschedule other entries, let's store the old parameters |
|---|
| 576 | # and the list of entries that will be rescheduled (after this one) |
|---|
| 577 | |
|---|
| 578 | if self._reschedule: |
|---|
| 579 | oldStartDate=copy.copy(self._schEntry.getStartDate()) |
|---|
| 580 | oldDuration=copy.copy(self._schEntry.getDuration()) |
|---|
| 581 | i = self._schEntry.getSchedule().getEntries().index(self._schEntry) + 1 |
|---|
| 582 | lentries = len(self._schEntry.getSchedule().getEntries()) |
|---|
| 583 | while i < lentries and self._schEntry.getStartDate() >= self._schEntry.getSchedule().getEntries()[i].getStartDate(): |
|---|
| 584 | i += 1 |
|---|
| 585 | j = i |
|---|
| 586 | while j < lentries and self._schEntry.getAdjustedStartDate().date() == \ |
|---|
| 587 | self._schEntry.getSchedule().getEntries()[j].getAdjustedStartDate().date(): |
|---|
| 588 | j += 1 |
|---|
| 589 | entriesList = self._schEntry.getSchedule().getEntries()[i:j] |
|---|
| 590 | |
|---|
| 591 | duration = self._endDate - self._startDate |
|---|
| 592 | owner = self._schEntry.getOwner() |
|---|
| 593 | if isinstance(owner, SessionSlot) and owner.getSession().getScheduleType() == "poster": |
|---|
| 594 | # If it is a poster session we must modify the size of all the contributions inside it. |
|---|
| 595 | for entry in owner.getSchedule().getEntries(): |
|---|
| 596 | entry.setDuration(dur=duration, check=0) |
|---|
| 597 | # The order to set the start date and duration is important, please keep it like this. |
|---|
| 598 | # Otherwise, by modifying the startDate we might find entries inside a slot that are |
|---|
| 599 | # temporarly outside and an exception will be raised. |
|---|
| 600 | self._schEntry.setDuration(dur=duration,check=checkFlag) |
|---|
| 601 | self._schEntry.setStartDate(self._startDate, moveEntries=1, check=checkFlag) |
|---|
| 602 | |
|---|
| 603 | # In case of 'reschedule', calculate the time difference |
|---|
| 604 | if self._reschedule: |
|---|
| 605 | diff = (self._schEntry.getStartDate() - oldStartDate) + (self._schEntry.getDuration() - oldDuration) |
|---|
| 606 | |
|---|
| 607 | # shift accordingly |
|---|
| 608 | self._schEntry.getSchedule().moveEntriesBelow(diff, entriesList) |
|---|
| 609 | |
|---|
| 610 | # retrieve results |
|---|
| 611 | fossilizedData = schedule.ScheduleToJson.process(self._schEntry.getSchedule(), self._conf.getTimezone(), |
|---|
| 612 | None, days = [self._schEntry.getAdjustedStartDate()], |
|---|
| 613 | mgmtMode = True) |
|---|
| 614 | entryId = fossilizedData.keys()[0] |
|---|
| 615 | fossilizedData = fossilizedData.values()[0] |
|---|
| 616 | else: |
|---|
| 617 | entryId, fossilizedData = schedule.ScheduleToJson.processEntry(self._schEntry, self._conf.getTimezone(), |
|---|
| 618 | None, mgmtMode = True) |
|---|
| 619 | |
|---|
| 620 | return {'day': self._schEntry.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 621 | 'id': entryId, |
|---|
| 622 | 'entry': fossilizedData, |
|---|
| 623 | 'autoOps': translateAutoOps(self.getAutoOps())} |
|---|
| 624 | |
|---|
| 625 | |
|---|
| 626 | class SessionSlotScheduleModifyStartEndDate(ModifyStartEndDate, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 627 | |
|---|
| 628 | def _checkParams(self): |
|---|
| 629 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 630 | ModifyStartEndDate._checkParams(self) |
|---|
| 631 | pm = ParameterManager(self._params) |
|---|
| 632 | self._isSessionTimetable = pm.extract("sessionTimetable", pType=bool, allowEmpty=True) |
|---|
| 633 | |
|---|
| 634 | |
|---|
| 635 | def _performOperation(self): |
|---|
| 636 | |
|---|
| 637 | result = ModifyStartEndDate._performOperation(self) |
|---|
| 638 | |
|---|
| 639 | if self._isSessionTimetable: |
|---|
| 640 | schEntry = self._slot.getSessionSchEntry() |
|---|
| 641 | else: |
|---|
| 642 | schEntry = self._slot.getConfSchEntry() |
|---|
| 643 | |
|---|
| 644 | fossilizedDataSlotSchEntry = schEntry.fossilize({"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 645 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 646 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil}, |
|---|
| 647 | tz=self._conf.getTimezone()) |
|---|
| 648 | fossilizedDataSession = self._session.fossilize(ISessionFossil, tz=self._conf.getTimezone()) |
|---|
| 649 | result.update({'slotEntry': fossilizedDataSlotSchEntry, |
|---|
| 650 | 'session': fossilizedDataSession}) |
|---|
| 651 | |
|---|
| 652 | return result |
|---|
| 653 | |
|---|
| 654 | |
|---|
| 655 | class ConferenceScheduleModifyStartEndDate(ModifyStartEndDate, conferenceServices.ConferenceScheduleModifBase): |
|---|
| 656 | |
|---|
| 657 | def _checkParams(self): |
|---|
| 658 | conferenceServices.ConferenceScheduleModifBase._checkParams(self) |
|---|
| 659 | ModifyStartEndDate._checkParams(self) |
|---|
| 660 | |
|---|
| 661 | |
|---|
| 662 | class SessionScheduleModifyStartEndDate(ModifyStartEndDate, sessionServices.SessionModifUnrestrictedTTCoordinationBase): |
|---|
| 663 | |
|---|
| 664 | def _checkParams(self): |
|---|
| 665 | sessionServices.SessionModifUnrestrictedTTCoordinationBase._checkParams(self) |
|---|
| 666 | ModifyStartEndDate._checkParams(self) |
|---|
| 667 | |
|---|
| 668 | class ConferenceScheduleGetDayEndDate(ScheduleOperation, conferenceServices.ConferenceModifBase): |
|---|
| 669 | |
|---|
| 670 | def _checkParams(self): |
|---|
| 671 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 672 | pManager = ParameterManager(self._params) |
|---|
| 673 | |
|---|
| 674 | date = pManager.extract("selectedDay", pType=datetime.date) |
|---|
| 675 | self._date = datetime.datetime(date.year, date.month, date.day, tzinfo=pytz.timezone(self._conf.getTimezone())) |
|---|
| 676 | |
|---|
| 677 | def _performOperation(self): |
|---|
| 678 | return self._target.getSchedule().calculateDayEndDate(self._date).strftime('%Y/%m/%d %H:%M') |
|---|
| 679 | |
|---|
| 680 | class SessionSlotScheduleGetDayEndDate(ScheduleOperation, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 681 | |
|---|
| 682 | def _checkParams(self): |
|---|
| 683 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 684 | pManager = ParameterManager(self._params) |
|---|
| 685 | date = pManager.extract("selectedDay", pType=datetime.date) |
|---|
| 686 | self._date = datetime.datetime(date.year, date.month, date.day, tzinfo=pytz.timezone(self._conf.getTimezone())) |
|---|
| 687 | |
|---|
| 688 | def _performOperation(self): |
|---|
| 689 | eDate = self._slot.getSchedule().calculateDayEndDate(self._date) |
|---|
| 690 | return eDate.strftime('%Y/%m/%d %H:%M') |
|---|
| 691 | |
|---|
| 692 | class SessionSlotGetFossil(sessionServices.SessionSlotDisplayBase): |
|---|
| 693 | |
|---|
| 694 | def _getAnswer(self): |
|---|
| 695 | return fossilize(self._slot) |
|---|
| 696 | |
|---|
| 697 | class SessionSlotGetBooking(ScheduleOperation, sessionServices.SessionSlotDisplayBase, roomBooking.GetBookingBase): |
|---|
| 698 | def _performOperation(self): |
|---|
| 699 | return self._getRoomInfo(self._target) |
|---|
| 700 | |
|---|
| 701 | class SessionScheduleGetDayEndDate(ScheduleOperation, sessionServices.SessionModifUnrestrictedTTCoordinationBase): |
|---|
| 702 | |
|---|
| 703 | def _checkParams(self): |
|---|
| 704 | sessionServices.SessionModifUnrestrictedTTCoordinationBase._checkParams(self) |
|---|
| 705 | pManager = ParameterManager(self._params) |
|---|
| 706 | |
|---|
| 707 | date = pManager.extract("selectedDay", pType=datetime.date) |
|---|
| 708 | self._date = datetime.datetime(date.year, date.month, date.day) |
|---|
| 709 | |
|---|
| 710 | def _performOperation(self): |
|---|
| 711 | eDate = self._target.getSchedule().calculateDayEndDate(self._date) |
|---|
| 712 | return eDate.strftime('%Y/%m/%d %H:%M') |
|---|
| 713 | |
|---|
| 714 | class ScheduleEditSlotBase(ScheduleOperation, LocationSetter): |
|---|
| 715 | |
|---|
| 716 | def _addConveners(self, slot): |
|---|
| 717 | pass |
|---|
| 718 | |
|---|
| 719 | def _setSessionTitle(self, slot): |
|---|
| 720 | pass |
|---|
| 721 | |
|---|
| 722 | def _checkParams(self): |
|---|
| 723 | self.pManager = ParameterManager(self._params) |
|---|
| 724 | |
|---|
| 725 | self._startDateTime = self.pManager.extract("startDateTime", |
|---|
| 726 | pType=datetime.datetime) |
|---|
| 727 | self._endDateTime = self.pManager.extract("endDateTime", |
|---|
| 728 | pType=datetime.datetime) |
|---|
| 729 | self._title = self.pManager.extract("title", pType=str, allowEmpty=True) |
|---|
| 730 | self._conveners = self.pManager.extract("conveners", pType=list, |
|---|
| 731 | allowEmpty=True) |
|---|
| 732 | self._roomInfo = self.pManager.extract("roomInfo", pType=dict, allowEmpty=True) |
|---|
| 733 | self._isSessionTimetable = self.pManager.extract("sessionTimetable", pType=bool, allowEmpty=True) |
|---|
| 734 | |
|---|
| 735 | def _performOperation(self): |
|---|
| 736 | #if there is something inside the session we have to move it as well |
|---|
| 737 | |
|---|
| 738 | values = {"title": self._title or "", |
|---|
| 739 | "sDate": self._startDateTime, |
|---|
| 740 | "eDate": self._endDateTime} |
|---|
| 741 | |
|---|
| 742 | if len(self._slot.getEntries()) != 0 : |
|---|
| 743 | values.update({"move": 1}) |
|---|
| 744 | self._slot.setValues(values) |
|---|
| 745 | |
|---|
| 746 | self. _addConveners(self._slot) |
|---|
| 747 | self._setLocationInfo(self._slot) |
|---|
| 748 | self._setSessionTitle(self._slot) |
|---|
| 749 | |
|---|
| 750 | self._addToSchedule() |
|---|
| 751 | |
|---|
| 752 | logInfo = self._slot.getLogInfo() |
|---|
| 753 | logInfo["subject"] = "Create new slot: %s"%self._slot.getTitle() |
|---|
| 754 | self._conf.getLogHandler().logAction(logInfo,"Timetable/Contribution",self._getUser()) |
|---|
| 755 | |
|---|
| 756 | if self._isSessionTimetable: |
|---|
| 757 | schEntry = self._slot.getSessionSchEntry() |
|---|
| 758 | else: |
|---|
| 759 | schEntry = self._slot.getConfSchEntry() |
|---|
| 760 | entryId, fossilizedData = schedule.ScheduleToJson.processEntry(schEntry, self._conf.getTimezone(), |
|---|
| 761 | None, mgmtMode = True) |
|---|
| 762 | |
|---|
| 763 | return {'day': schEntry.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 764 | 'id': fossilizedData['id'], |
|---|
| 765 | 'entry': fossilizedData, |
|---|
| 766 | 'autoOps': translateAutoOps(self.getAutoOps()), |
|---|
| 767 | 'session': self._slot.getSession().fossilize(ISessionFossil, tz=self._conf.getTimezone())} |
|---|
| 768 | |
|---|
| 769 | class SessionScheduleAddSessionSlot(ScheduleEditSlotBase, sessionServices.SessionModifUnrestrictedTTCoordinationBase): |
|---|
| 770 | |
|---|
| 771 | def _checkParams(self): |
|---|
| 772 | sessionServices.SessionModifUnrestrictedTTCoordinationBase._checkParams(self) |
|---|
| 773 | ScheduleEditSlotBase._checkParams(self) |
|---|
| 774 | self._slot = conference.SessionSlot(self._target) |
|---|
| 775 | |
|---|
| 776 | def _addToSchedule(self): |
|---|
| 777 | self._target.addSlot(self._slot) |
|---|
| 778 | |
|---|
| 779 | def _addConveners(self, slot): |
|---|
| 780 | for convenerValues in self._conveners: |
|---|
| 781 | convener = conference.SlotChair() |
|---|
| 782 | DictPickler.update(convener, convenerValues) |
|---|
| 783 | slot.addConvener(convener) |
|---|
| 784 | |
|---|
| 785 | class SessionScheduleEditSessionSlot(ScheduleEditSlotBase, sessionServices.SessionModifUnrestrictedTTCoordinationBase): |
|---|
| 786 | |
|---|
| 787 | def _checkParams(self): |
|---|
| 788 | sessionServices.SessionModifUnrestrictedTTCoordinationBase._checkParams(self) |
|---|
| 789 | ScheduleEditSlotBase._checkParams(self) |
|---|
| 790 | self._sessionTitle = self.pManager.extract("sessionTitle", pType = str, allowEmpty=False) |
|---|
| 791 | |
|---|
| 792 | def _addToSchedule(self): |
|---|
| 793 | pass |
|---|
| 794 | |
|---|
| 795 | def _addConveners(self, slot): |
|---|
| 796 | convenersIds = [] |
|---|
| 797 | for convenerValues in self._conveners: |
|---|
| 798 | if convenerValues.has_key("isConfParticipant"): |
|---|
| 799 | convener = slot.getConvenerById(str(convenerValues['id'])) |
|---|
| 800 | DictPickler.update(convener, convenerValues) |
|---|
| 801 | else: |
|---|
| 802 | convener = conference.SlotChair() |
|---|
| 803 | DictPickler.update(convener, convenerValues) |
|---|
| 804 | slot.addConvener(convener) |
|---|
| 805 | convenersIds.append(convener.getId()) |
|---|
| 806 | |
|---|
| 807 | for conv in slot.getConvenerList()[:]: |
|---|
| 808 | if conv.getId() not in convenersIds: |
|---|
| 809 | slot.removeConvener(conv) |
|---|
| 810 | |
|---|
| 811 | def _setSessionTitle(self, slot): |
|---|
| 812 | slot.getSession().setTitle(self._sessionTitle) |
|---|
| 813 | |
|---|
| 814 | |
|---|
| 815 | class SessionScheduleEditSessionSlotById(SessionScheduleEditSessionSlot): |
|---|
| 816 | """ |
|---|
| 817 | Edits session slot. Session slot is identified by its id within a session, |
|---|
| 818 | not like in the parent's class by schedule id. |
|---|
| 819 | """ |
|---|
| 820 | def _checkParams(self): |
|---|
| 821 | if self._params.has_key("scheduleEntry"): |
|---|
| 822 | del self._params["scheduleEntry"] |
|---|
| 823 | SessionScheduleEditSessionSlot._checkParams(self) |
|---|
| 824 | self._slot = self._session.slots[self._params["sessionSlotId"]] |
|---|
| 825 | |
|---|
| 826 | |
|---|
| 827 | class ConferenceSetSessionSlots( conferenceServices.ConferenceTextModificationBase ): |
|---|
| 828 | """ |
|---|
| 829 | Set or unset automatic conflict solving for timetable |
|---|
| 830 | """ |
|---|
| 831 | def _handleSet(self): |
|---|
| 832 | if self._value: |
|---|
| 833 | if not self._target.getEnableSessions(): |
|---|
| 834 | raise ServiceError("ERR-S0", "Sessions must be active for"+ |
|---|
| 835 | " session slots to be enabled.") |
|---|
| 836 | self._target.enableSessionSlots() |
|---|
| 837 | else: |
|---|
| 838 | for s in self._target.getSessionList() : |
|---|
| 839 | if len(s.getSlotList()) > 1 : |
|---|
| 840 | raise ServiceError("ERR-S1", "More than one slot defined for session "+ |
|---|
| 841 | "'%s'. Cannot disable displaying multiple" |
|---|
| 842 | " session slots." % self._target.getTitle()) |
|---|
| 843 | self._target.disableSessionSlots() |
|---|
| 844 | |
|---|
| 845 | |
|---|
| 846 | def _handleGet(self): |
|---|
| 847 | return self._target.getEnableSessionSlots() |
|---|
| 848 | |
|---|
| 849 | class ConferenceSetScheduleSessions( conferenceServices.ConferenceTextModificationBase ): |
|---|
| 850 | """ |
|---|
| 851 | Set or unset automatic conflict solving for timetable |
|---|
| 852 | """ |
|---|
| 853 | def _handleSet(self): |
|---|
| 854 | if self._value: |
|---|
| 855 | self._target.enableSessions() |
|---|
| 856 | else: |
|---|
| 857 | if len(self._target.getSessionList()) > 0 : |
|---|
| 858 | raise ServiceError("ERR-S2","Sessions already defined. "+ |
|---|
| 859 | "Cannot disable them now.") |
|---|
| 860 | self._target.disableSessions() |
|---|
| 861 | self._target.disableSessionSlots() |
|---|
| 862 | |
|---|
| 863 | |
|---|
| 864 | def _handleGet(self): |
|---|
| 865 | return self._target.getEnableSessions() |
|---|
| 866 | |
|---|
| 867 | class ConferenceGetAllSpeakers(conferenceServices.ConferenceDisplayBase): |
|---|
| 868 | """ |
|---|
| 869 | Get all speakers from contributions from the event |
|---|
| 870 | """ |
|---|
| 871 | def _getAnswer(self): |
|---|
| 872 | d = {} |
|---|
| 873 | for contribution in self._target.getContributionList() : |
|---|
| 874 | for elem in contribution.getSpeakerList().fossilize(IContributionParticipationTTMgmtFossil): |
|---|
| 875 | elem['id'] = "%s.%s" % (contribution.getId(), elem['id']) |
|---|
| 876 | d[elem['name']] = elem |
|---|
| 877 | return d.values() |
|---|
| 878 | |
|---|
| 879 | class ConferenceGetAllConveners(conferenceServices.ConferenceDisplayBase): |
|---|
| 880 | """ |
|---|
| 881 | Get all conveners of sessions from the event |
|---|
| 882 | """ |
|---|
| 883 | def _getAnswer(self): |
|---|
| 884 | d = {} |
|---|
| 885 | for session in self._target.getSessionList() : |
|---|
| 886 | for elem in session.getConvenerList().fossilize(IConferenceParticipationFossil): |
|---|
| 887 | elem['id'] = "%s.%s" % (session.getId(), elem['id']) |
|---|
| 888 | d[elem['name']] = elem |
|---|
| 889 | return d.values() |
|---|
| 890 | |
|---|
| 891 | ### Breaks |
|---|
| 892 | |
|---|
| 893 | class BreakBase(object): |
|---|
| 894 | |
|---|
| 895 | def _checkParams( self ): |
|---|
| 896 | |
|---|
| 897 | try: |
|---|
| 898 | self._target = self._conf = conference.ConferenceHolder().getById(self._params["conference"]); |
|---|
| 899 | if self._conf == None: |
|---|
| 900 | raise Exception("Conference id not specified.") |
|---|
| 901 | except: |
|---|
| 902 | raise ServiceError("ERR-E4", "Invalid conference id.") |
|---|
| 903 | |
|---|
| 904 | slotId = self._params.get("slot", None) |
|---|
| 905 | |
|---|
| 906 | try: |
|---|
| 907 | if slotId != None: |
|---|
| 908 | self._slot = self._session.getSlotById(slotId) |
|---|
| 909 | except Exception, e: |
|---|
| 910 | raise ServiceError("ERR-S3", "Invalid slot id.",inner=str(e)) |
|---|
| 911 | |
|---|
| 912 | except: |
|---|
| 913 | raise ServiceError("ERR-C0", "Invalid break id.") |
|---|
| 914 | |
|---|
| 915 | try: |
|---|
| 916 | entry = self._params["break"] |
|---|
| 917 | |
|---|
| 918 | if slotId != None: |
|---|
| 919 | self._break = self._slot.getSchedule().getEntryById(entry) |
|---|
| 920 | else: |
|---|
| 921 | self._break = self._conf.getSchedule().getEntryById(entry) |
|---|
| 922 | |
|---|
| 923 | if self._break == None: |
|---|
| 924 | raise Exception("Break id not specified.") |
|---|
| 925 | except: |
|---|
| 926 | raise ServiceError("ERR-C0", "Invalid break id.") |
|---|
| 927 | |
|---|
| 928 | |
|---|
| 929 | # create a parameter manager that checks the consistency of passed parameters |
|---|
| 930 | self._pm = ParameterManager(self._params) |
|---|
| 931 | |
|---|
| 932 | class BreakDisplayBase(base.ProtectedDisplayService, BreakBase): |
|---|
| 933 | |
|---|
| 934 | def _checkParams(self): |
|---|
| 935 | BreakBase._checkParams(self) |
|---|
| 936 | base.ProtectedDisplayService._checkParams(self) |
|---|
| 937 | |
|---|
| 938 | |
|---|
| 939 | class BreakGetBooking(BreakDisplayBase, roomBooking.GetBookingBase): |
|---|
| 940 | def _getAnswer(self): |
|---|
| 941 | return self._getRoomInfo(self._break) |
|---|
| 942 | |
|---|
| 943 | |
|---|
| 944 | class GetUnscheduledContributions(ScheduleOperation): |
|---|
| 945 | |
|---|
| 946 | """ Returns the list of unscheduled contributions for the target """ |
|---|
| 947 | |
|---|
| 948 | def _performOperation(self): |
|---|
| 949 | unscheduledList = [] |
|---|
| 950 | |
|---|
| 951 | for contrib in self._target.getContributionList(): |
|---|
| 952 | if self._isScheduled(contrib): |
|---|
| 953 | continue |
|---|
| 954 | unscheduledList.append(contrib) |
|---|
| 955 | |
|---|
| 956 | return fossilize(unscheduledList, IContributionFossil, tz=self._conf.getTimezone()) |
|---|
| 957 | |
|---|
| 958 | class ConferenceGetUnscheduledContributions(GetUnscheduledContributions, conferenceServices.ConferenceModifBase): |
|---|
| 959 | |
|---|
| 960 | def _isScheduled(self, contrib): |
|---|
| 961 | return contrib.getSession() is not None or \ |
|---|
| 962 | contrib.isScheduled() or \ |
|---|
| 963 | isinstance(contrib.getCurrentStatus(),conference.ContribStatusWithdrawn) |
|---|
| 964 | |
|---|
| 965 | class SessionGetUnscheduledContributions(GetUnscheduledContributions, sessionServices.SessionModifCoordinationBase): |
|---|
| 966 | |
|---|
| 967 | def _isScheduled(self, contrib): |
|---|
| 968 | return contrib.isScheduled() or \ |
|---|
| 969 | isinstance(contrib.getCurrentStatus(),conference.ContribStatusWithdrawn) |
|---|
| 970 | |
|---|
| 971 | |
|---|
| 972 | |
|---|
| 973 | class ScheduleContributions(ScheduleOperation): |
|---|
| 974 | |
|---|
| 975 | """ Schedules the contribution in the timetable of the event""" |
|---|
| 976 | |
|---|
| 977 | def _checkParams(self): |
|---|
| 978 | pManager = ParameterManager(self._params, |
|---|
| 979 | timezone = self._target.getTimezone()) |
|---|
| 980 | |
|---|
| 981 | self._ids = pManager.extract("ids", pType=list, allowEmpty=False) |
|---|
| 982 | date = pManager.extract("date", pType=datetime.date, |
|---|
| 983 | allowEmpty=False) |
|---|
| 984 | |
|---|
| 985 | # convert date to datetime |
|---|
| 986 | self._date = pytz.timezone(self._target.getTimezone()).localize(datetime.datetime(*(date.timetuple()[:6]+(0,)))) |
|---|
| 987 | |
|---|
| 988 | |
|---|
| 989 | def _performOperation(self): |
|---|
| 990 | |
|---|
| 991 | entries = [] |
|---|
| 992 | |
|---|
| 993 | for contribId in self._ids: |
|---|
| 994 | |
|---|
| 995 | contrib = self._getContributionId(contribId) |
|---|
| 996 | |
|---|
| 997 | isPoster = self._handlePosterContributions(contrib) |
|---|
| 998 | |
|---|
| 999 | if not isPoster: |
|---|
| 1000 | d = self._target.getSchedule().calculateDayEndDate(self._date) |
|---|
| 1001 | contrib.setStartDate(d) |
|---|
| 1002 | |
|---|
| 1003 | schEntry = contrib.getSchEntry() |
|---|
| 1004 | |
|---|
| 1005 | self._target.getSchedule().addEntry(schEntry, check = self._getCheckFlag()) |
|---|
| 1006 | |
|---|
| 1007 | fossilizedData = schEntry.fossilize(IContribSchEntryMgmtFossil, tz=self._conf.getTimezone()) |
|---|
| 1008 | fossilizedDataSlotSchEntry = self._getSlotEntry() |
|---|
| 1009 | |
|---|
| 1010 | entries.append({'day': schEntry.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 1011 | 'id': fossilizedData['id'], |
|---|
| 1012 | 'entry': fossilizedData, |
|---|
| 1013 | 'slotEntry': fossilizedDataSlotSchEntry, |
|---|
| 1014 | 'autoOps': translateAutoOps(self.getAutoOps()) |
|---|
| 1015 | }) |
|---|
| 1016 | return entries |
|---|
| 1017 | |
|---|
| 1018 | class SessionSlotScheduleContributions(ScheduleContributions, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 1019 | def _checkParams(self): |
|---|
| 1020 | |
|---|
| 1021 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 1022 | ScheduleContributions._checkParams(self) |
|---|
| 1023 | |
|---|
| 1024 | pManager = ParameterManager(self._params, |
|---|
| 1025 | timezone = self._target.getTimezone()) |
|---|
| 1026 | |
|---|
| 1027 | self._isSessionTimetable = pManager.extract("sessionTimetable", pType=bool, allowEmpty=True) |
|---|
| 1028 | |
|---|
| 1029 | |
|---|
| 1030 | def _getContributionId(self, contribId): |
|---|
| 1031 | return self._target.getSession().getContributionById(contribId) |
|---|
| 1032 | |
|---|
| 1033 | def _handlePosterContributions(self, contrib): |
|---|
| 1034 | if self._slot.getSession().getScheduleType() == "poster": |
|---|
| 1035 | contrib.setStartDate(self._slot.getStartDate()) |
|---|
| 1036 | contrib.setDuration(dur=self._slot.getDuration()) |
|---|
| 1037 | return True |
|---|
| 1038 | return False |
|---|
| 1039 | |
|---|
| 1040 | def _getSlotEntry(self): |
|---|
| 1041 | |
|---|
| 1042 | if self._isSessionTimetable: |
|---|
| 1043 | entry = self._slot.getSessionSchEntry() |
|---|
| 1044 | else: |
|---|
| 1045 | entry = self._slot.getConfSchEntry() |
|---|
| 1046 | |
|---|
| 1047 | return entry.fossilize({"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 1048 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 1049 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil}, |
|---|
| 1050 | tz=self._conf.getTimezone()) |
|---|
| 1051 | |
|---|
| 1052 | class ConferenceScheduleContributions(ScheduleContributions, conferenceServices.ConferenceModifBase): |
|---|
| 1053 | def _checkParams(self): |
|---|
| 1054 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 1055 | ScheduleContributions._checkParams(self) |
|---|
| 1056 | |
|---|
| 1057 | def _getContributionId(self, contribId): |
|---|
| 1058 | return self._target.getContributionById(contribId) |
|---|
| 1059 | |
|---|
| 1060 | def _handlePosterContributions(self, contrib): |
|---|
| 1061 | pass |
|---|
| 1062 | |
|---|
| 1063 | def _getSlotEntry(self): |
|---|
| 1064 | return None |
|---|
| 1065 | |
|---|
| 1066 | class MoveEntryBase(ScheduleOperation): |
|---|
| 1067 | |
|---|
| 1068 | def _checkParams(self): |
|---|
| 1069 | pManager = ParameterManager(self._params, timezone = self._conf.getTimezone()) |
|---|
| 1070 | self._contribPlace = pManager.extract("value", pType=str, allowEmpty=False) |
|---|
| 1071 | self._schEntryId = pManager.extract("scheduleEntryId", pType=int, allowEmpty=False) |
|---|
| 1072 | self._sessionId = pManager.extract("sessionId", pType=str, allowEmpty=True, defaultValue=None) |
|---|
| 1073 | self._sessionSlotId = pManager.extract("sessionSlotId", pType=str, allowEmpty=True, defaultValue=None) |
|---|
| 1074 | self._newTime = pManager.extract("newTime", pType=datetime.datetime, allowEmpty=True, defaultValue=None) |
|---|
| 1075 | |
|---|
| 1076 | def _performOperation(self): |
|---|
| 1077 | utc = pytz.timezone('UTC') |
|---|
| 1078 | if (self._sessionId != None and self._sessionSlotId != None): |
|---|
| 1079 | self._schEntry = self._conf.getSessionById(self._sessionId).getSlotById(self._sessionSlotId).getSchedule().getEntryById(self._schEntryId) |
|---|
| 1080 | else: |
|---|
| 1081 | self._schEntry = self._conf.getSchedule().getEntryById(self._schEntryId) |
|---|
| 1082 | |
|---|
| 1083 | owner = self._schEntry.getOwner() |
|---|
| 1084 | |
|---|
| 1085 | if self._contribPlace.strip() != "": |
|---|
| 1086 | entriesFossilsDict = {"MaKaC.schedule.LinkedTimeSchEntry": ILinkedTimeSchEntryMgmtFossil, |
|---|
| 1087 | "MaKaC.schedule.BreakTimeSchEntry" : IBreakTimeSchEntryMgmtFossil, |
|---|
| 1088 | "MaKaC.schedule.ContribSchEntry" : IContribSchEntryMgmtFossil} |
|---|
| 1089 | oldSch = self._schEntry.fossilize(entriesFossilsDict) |
|---|
| 1090 | oldDate = self._schEntry.getStartDate() |
|---|
| 1091 | oldSch['startDate'] = formatDateTime(oldDate.astimezone(pytz.timezone(owner.getTimezone()))) |
|---|
| 1092 | |
|---|
| 1093 | sessionId,sessionSlotId = self._contribPlace.split(":") |
|---|
| 1094 | |
|---|
| 1095 | if sessionId != "conf": |
|---|
| 1096 | # Moving inside a session |
|---|
| 1097 | session = self._conf.getSessionById(sessionId) |
|---|
| 1098 | |
|---|
| 1099 | if session.getScheduleType() == "poster" and isinstance(self._schEntry, BreakTimeSchEntry): |
|---|
| 1100 | raise NoReportError(_("It is not possible to move a break inside a poster session")) |
|---|
| 1101 | |
|---|
| 1102 | if session is not None: |
|---|
| 1103 | slot = session.getSlotById(sessionSlotId) |
|---|
| 1104 | if slot is not None: |
|---|
| 1105 | fossilizedDataSession = session.fossilize(ISessionFossil, tz=self._conf.getTimezone()) |
|---|
| 1106 | # unschedule entry from previous place |
|---|
| 1107 | self._schEntry.getSchedule().removeEntry(self._schEntry) |
|---|
| 1108 | if isinstance(owner, conference.Contribution): |
|---|
| 1109 | owner.setSession(session) |
|---|
| 1110 | if session.getScheduleType() == "poster": |
|---|
| 1111 | self._schEntry.setStartDate(slot.getStartDate()) |
|---|
| 1112 | self._schEntry.setDuration(dur=slot.getDuration()) |
|---|
| 1113 | else: |
|---|
| 1114 | if self._newTime: |
|---|
| 1115 | self._schEntry.setStartDate(self._newTime.astimezone(utc)) |
|---|
| 1116 | else: |
|---|
| 1117 | # if we have no clear indication of where we should place this, |
|---|
| 1118 | # put it after everything else |
|---|
| 1119 | self._schEntry.setStartDate(slot.getSchedule().calculateEndDate()) |
|---|
| 1120 | #self._schEntry.setDuration(dur=session.getContribDuration()) |
|---|
| 1121 | # add it to new container |
|---|
| 1122 | slot.getSchedule().addEntry(self._schEntry, check=2) |
|---|
| 1123 | fossilizedDataSlotSchEntry = slot.getConfSchEntry().fossilize(entriesFossilsDict, tz=self._conf.getTimezone()) |
|---|
| 1124 | else: |
|---|
| 1125 | raise ServiceError("ERR-S3","Invalid slot ID") |
|---|
| 1126 | else: |
|---|
| 1127 | raise ServiceError("ERR-S4","Invalid session ID") |
|---|
| 1128 | else: |
|---|
| 1129 | # Moving inside the top-level timetable |
|---|
| 1130 | |
|---|
| 1131 | fossilizedDataSlotSchEntry = None |
|---|
| 1132 | if isinstance(owner, conference.Contribution): |
|---|
| 1133 | fossilizedDataSession = owner.getOwner().fossilize(tz=self._conf.getTimezone()) |
|---|
| 1134 | else: |
|---|
| 1135 | fossilizedDataSession = None |
|---|
| 1136 | |
|---|
| 1137 | # the target date/time |
|---|
| 1138 | parsedDate = parseDate(sessionSlotId, format="%Y%m%d") |
|---|
| 1139 | |
|---|
| 1140 | if self._newTime: |
|---|
| 1141 | newStartDate = self._newTime.astimezone(utc) |
|---|
| 1142 | else: |
|---|
| 1143 | owner_tz = pytz.timezone(owner.getTimezone()) |
|---|
| 1144 | newStartDate = owner_tz.localize(datetime.datetime.combine(parsedDate, |
|---|
| 1145 | oldDate.astimezone(owner_tz).time())).astimezone(utc) |
|---|
| 1146 | |
|---|
| 1147 | self._schEntry.getSchedule().removeEntry(self._schEntry) |
|---|
| 1148 | |
|---|
| 1149 | self._schEntry.setStartDate(newStartDate) |
|---|
| 1150 | if isinstance(owner, conference.Contribution): |
|---|
| 1151 | owner.setSession(None) |
|---|
| 1152 | self._conf.getSchedule().addEntry(self._schEntry, check=2) |
|---|
| 1153 | |
|---|
| 1154 | newFossilizedEntry = self._schEntry.fossilize(entriesFossilsDict) |
|---|
| 1155 | return {'entry': newFossilizedEntry, |
|---|
| 1156 | 'old': oldSch, |
|---|
| 1157 | 'id': newFossilizedEntry['id'], |
|---|
| 1158 | 'day': self._schEntry.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 1159 | 'session': fossilizedDataSession , |
|---|
| 1160 | 'slotEntry': fossilizedDataSlotSchEntry, |
|---|
| 1161 | 'autoOps': translateAutoOps(self.getAutoOps())} |
|---|
| 1162 | |
|---|
| 1163 | class MoveEntry(MoveEntryBase, conferenceServices.ConferenceModifBase): |
|---|
| 1164 | |
|---|
| 1165 | def _checkParams(self): |
|---|
| 1166 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 1167 | MoveEntryBase._checkParams(self) |
|---|
| 1168 | |
|---|
| 1169 | class MoveEntryFromSessionBlock(MoveEntryBase, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 1170 | |
|---|
| 1171 | def _checkParams(self): |
|---|
| 1172 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 1173 | MoveEntryBase._checkParams(self) |
|---|
| 1174 | |
|---|
| 1175 | |
|---|
| 1176 | class MoveEntryUpDown(ScheduleOperation): |
|---|
| 1177 | def _checkParams(self): |
|---|
| 1178 | |
|---|
| 1179 | pManager = ParameterManager(self._params, timezone = self._conf.getTimezone()) |
|---|
| 1180 | self._direction = pManager.extract("direction", pType=bool, allowEmpty=False) |
|---|
| 1181 | self._schEntryId = pManager.extract("scheduleEntryId", pType=int, allowEmpty=False) |
|---|
| 1182 | |
|---|
| 1183 | |
|---|
| 1184 | def _performOperation(self): |
|---|
| 1185 | |
|---|
| 1186 | sched = self._target.getSchedule() |
|---|
| 1187 | schEntry = sched.getEntryById(self._schEntryId) |
|---|
| 1188 | |
|---|
| 1189 | if self._direction: |
|---|
| 1190 | sched.moveUpEntry(schEntry) |
|---|
| 1191 | else: |
|---|
| 1192 | sched.moveDownEntry(schEntry) |
|---|
| 1193 | |
|---|
| 1194 | return schedule.ScheduleToJson.process(sched, self._conf.getTimezone(), None, |
|---|
| 1195 | days = [ schEntry.getAdjustedStartDate() ], |
|---|
| 1196 | mgmtMode = True) |
|---|
| 1197 | |
|---|
| 1198 | |
|---|
| 1199 | class ConferenceTimetableMoveEntryUpDown(MoveEntryUpDown, conferenceServices.ConferenceModifBase): |
|---|
| 1200 | |
|---|
| 1201 | def _checkParams(self): |
|---|
| 1202 | conferenceServices.ConferenceModifBase._checkParams(self) |
|---|
| 1203 | MoveEntryUpDown._checkParams(self) |
|---|
| 1204 | |
|---|
| 1205 | class SessionSlotTimetableMoveEntryUpDown(MoveEntryUpDown, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 1206 | |
|---|
| 1207 | def _checkParams(self): |
|---|
| 1208 | sessionServices.SessionSlotModifBase._checkParams(self) |
|---|
| 1209 | MoveEntryUpDown._checkParams(self) |
|---|
| 1210 | |
|---|
| 1211 | class SessionTimetableMoveEntryUpDown(MoveEntryUpDown, sessionServices.SessionModifCoordinationBase): |
|---|
| 1212 | |
|---|
| 1213 | def _checkParams(self): |
|---|
| 1214 | sessionServices.SessionModifCoordinationBase._checkParams(self) |
|---|
| 1215 | MoveEntryUpDown._checkParams(self) |
|---|
| 1216 | |
|---|
| 1217 | |
|---|
| 1218 | class EditRoomLocationBase(ScheduleOperation, LocationSetter): |
|---|
| 1219 | def _checkParams(self): |
|---|
| 1220 | self.pManager = ParameterManager(self._params) |
|---|
| 1221 | self._roomInfo = self.pManager.extract("roomInfo", pType=dict, allowEmpty=True) |
|---|
| 1222 | self._isSessionTimetable = self.pManager.extract("sessionTimetable", pType=bool, allowEmpty=True) |
|---|
| 1223 | |
|---|
| 1224 | def _performOperation(self): |
|---|
| 1225 | self._entry.setRoom(None) |
|---|
| 1226 | self._entry.setLocation(None) |
|---|
| 1227 | self._setLocationInfo(self._entry) |
|---|
| 1228 | entryId, pickledData = schedule.ScheduleToJson.processEntry(self._schEntry, self._conf.getTimezone(), |
|---|
| 1229 | None, mgmtMode = True) |
|---|
| 1230 | |
|---|
| 1231 | return {'day': self._schEntry.getAdjustedStartDate().strftime("%Y%m%d"), |
|---|
| 1232 | 'id': entryId, |
|---|
| 1233 | 'entry': pickledData, |
|---|
| 1234 | 'autoOps': translateAutoOps(self.getAutoOps())} |
|---|
| 1235 | |
|---|
| 1236 | |
|---|
| 1237 | class EventEditRoomLocation(EditRoomLocationBase, conferenceServices.ConferenceScheduleModifBase): |
|---|
| 1238 | |
|---|
| 1239 | def _checkParams(self): |
|---|
| 1240 | conferenceServices.ConferenceScheduleModifBase._checkParams(self) |
|---|
| 1241 | EditRoomLocationBase._checkParams(self) |
|---|
| 1242 | self._entry = self._schEntry |
|---|
| 1243 | |
|---|
| 1244 | class SessionEditRoomLocation(EditRoomLocationBase, sessionServices.SessionModifUnrestrictedTTCoordinationBase): |
|---|
| 1245 | |
|---|
| 1246 | def _checkParams(self): |
|---|
| 1247 | sessionServices.SessionModifUnrestrictedTTCoordinationBase._checkParams(self) |
|---|
| 1248 | EditRoomLocationBase._checkParams(self) |
|---|
| 1249 | if not hasattr(self, "_slot"): |
|---|
| 1250 | self._slot = self._session.slots[self._params["slot"]] |
|---|
| 1251 | if not hasattr(self, "_schEntry"): |
|---|
| 1252 | if self._params.get("sessionTimetable", False): |
|---|
| 1253 | self._schEntry = self._slot._sessionSchEntry |
|---|
| 1254 | else: |
|---|
| 1255 | self._schEntry = self._slot._confSchEntry |
|---|
| 1256 | self._entry = self._slot |
|---|
| 1257 | |
|---|
| 1258 | def _performOperation(self): |
|---|
| 1259 | result = EditRoomLocationBase._performOperation(self) |
|---|
| 1260 | |
|---|
| 1261 | pickledDataSlotSchEntry = fossilize(self._slot.getConfSchEntry(), tz=self._conf.getTimezone()) |
|---|
| 1262 | pickledDataSession = fossilize(self._session, tz=self._conf.getTimezone()) |
|---|
| 1263 | result.update({'slotEntry': pickledDataSlotSchEntry, |
|---|
| 1264 | 'session': pickledDataSession}) |
|---|
| 1265 | |
|---|
| 1266 | return result |
|---|
| 1267 | |
|---|
| 1268 | class SessionSlotEditRoomLocation(EditRoomLocationBase, sessionServices.SessionSlotModifCoordinationBase): |
|---|
| 1269 | |
|---|
| 1270 | def _checkParams(self): |
|---|
| 1271 | sessionServices.SessionSlotModifCoordinationBase._checkParams(self) |
|---|
| 1272 | EditRoomLocationBase._checkParams(self) |
|---|
| 1273 | self._entry = self._schEntry |
|---|
| 1274 | |
|---|
| 1275 | def _performOperation(self): |
|---|
| 1276 | result = EditRoomLocationBase._performOperation(self) |
|---|
| 1277 | pickledDataSlotSchEntry = fossilize(self._slot.getConfSchEntry(), tz=self._conf.getTimezone()) |
|---|
| 1278 | pickledDataSession = fossilize(self._session, tz=self._conf.getTimezone()) |
|---|
| 1279 | result.update({'slotEntry': pickledDataSlotSchEntry, |
|---|
| 1280 | 'session': pickledDataSession}) |
|---|
| 1281 | |
|---|
| 1282 | return result |
|---|
| 1283 | |
|---|
| 1284 | |
|---|
| 1285 | class SessionGetExportPopup(conferenceServices.ConferenceDisplayBase): |
|---|
| 1286 | |
|---|
| 1287 | def _checkParams(self): |
|---|
| 1288 | conferenceServices.ConferenceDisplayBase._checkParams(self) |
|---|
| 1289 | pm = ParameterManager(self._params) |
|---|
| 1290 | sessionId = pm.extract("sessionId", str, False, "") |
|---|
| 1291 | self._session = self._conf.getSessionById(sessionId) |
|---|
| 1292 | |
|---|
| 1293 | def _getAnswer(self): |
|---|
| 1294 | return WSessionICalExport( self._session, self._getUser() ).getHTML().replace("\n","") |
|---|
| 1295 | |
|---|
| 1296 | class SessionExportURLs(conferenceServices.ConferenceDisplayBase, base.ExportToICalBase): |
|---|
| 1297 | |
|---|
| 1298 | def _checkParams(self): |
|---|
| 1299 | conferenceServices.ConferenceDisplayBase._checkParams(self) |
|---|
| 1300 | base.ExportToICalBase._checkParams(self) |
|---|
| 1301 | pm = ParameterManager(self._params) |
|---|
| 1302 | self._sessionId = pm.extract("sessionId", str, False, "") |
|---|
| 1303 | |
|---|
| 1304 | def _getAnswer(self): |
|---|
| 1305 | minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() |
|---|
| 1306 | |
|---|
| 1307 | return generate_public_auth_request(self._apiMode, self._apiKey, '/export/event/%s/session/%s.ics'%(self._target.getId(), self._sessionId), {}, minfo.isAPIPersistentAllowed() and self._apiKey.isPersistentAllowed(), minfo.isAPIHTTPSRequired()) |
|---|
| 1308 | |
|---|
| 1309 | |
|---|
| 1310 | class ContributionGetExportPopup(conferenceServices.ConferenceDisplayBase): |
|---|
| 1311 | |
|---|
| 1312 | def _checkParams(self): |
|---|
| 1313 | conferenceServices.ConferenceDisplayBase._checkParams(self) |
|---|
| 1314 | pm = ParameterManager(self._params) |
|---|
| 1315 | contribId = pm.extract("contribId", str, False, "") |
|---|
| 1316 | self._contribution = self._conf.getContributionById(contribId) |
|---|
| 1317 | |
|---|
| 1318 | def _getAnswer(self): |
|---|
| 1319 | return WContributionICalExport( self._contribution, self._getUser() ).getHTML().replace("\n","") |
|---|
| 1320 | |
|---|
| 1321 | class ContributionExportURLs(conferenceServices.ConferenceDisplayBase, base.ExportToICalBase): |
|---|
| 1322 | |
|---|
| 1323 | def _checkParams(self): |
|---|
| 1324 | conferenceServices.ConferenceDisplayBase._checkParams(self) |
|---|
| 1325 | base.ExportToICalBase._checkParams(self) |
|---|
| 1326 | pm = ParameterManager(self._params) |
|---|
| 1327 | self._contribId = pm.extract("contribId", str, False, "") |
|---|
| 1328 | |
|---|
| 1329 | def _getAnswer(self): |
|---|
| 1330 | result = {} |
|---|
| 1331 | |
|---|
| 1332 | minfo = info.HelperMaKaCInfo.getMaKaCInfoInstance() |
|---|
| 1333 | |
|---|
| 1334 | urls = generate_public_auth_request(self._apiMode, self._apiKey, '/export/event/%s/contribution/%s.ics'%(self._target.getId(), self._contribId), {}, minfo.isAPIPersistentAllowed() and self._apiKey.isPersistentAllowed(), minfo.isAPIHTTPSRequired()) |
|---|
| 1335 | result["publicRequestURL"] = urls["publicRequestURL"] |
|---|
| 1336 | result["authRequestURL"] = urls["authRequestURL"] |
|---|
| 1337 | |
|---|
| 1338 | return result |
|---|
| 1339 | |
|---|
| 1340 | methodMap = { |
|---|
| 1341 | "get": ConferenceGetSchedule, |
|---|
| 1342 | |
|---|
| 1343 | "event.addContribution": ConferenceScheduleAddContribution, |
|---|
| 1344 | "event.addSession": ConferenceScheduleAddSession, |
|---|
| 1345 | "event.addBreak": ConferenceScheduleAddBreak, |
|---|
| 1346 | "event.editBreak": ConferenceScheduleEditBreak, |
|---|
| 1347 | "event.modifyStartEndDate": ConferenceScheduleModifyStartEndDate, |
|---|
| 1348 | "event.deleteContribution": ConferenceScheduleDeleteContribution, |
|---|
| 1349 | "event.deleteSession": ConferenceScheduleDeleteSession, |
|---|
| 1350 | "event.deleteBreak": ConferenceScheduleDeleteBreak, |
|---|
| 1351 | "event.getDayEndDate": ConferenceScheduleGetDayEndDate, |
|---|
| 1352 | "event.getUnscheduledContributions": ConferenceGetUnscheduledContributions, |
|---|
| 1353 | "event.scheduleContributions": ConferenceScheduleContributions, |
|---|
| 1354 | "event.moveEntry": MoveEntry, |
|---|
| 1355 | |
|---|
| 1356 | "slot.addContribution": SessionSlotScheduleAddContribution, |
|---|
| 1357 | "slot.addBreak": SessionSlotScheduleAddBreak, |
|---|
| 1358 | "slot.editBreak": SessionSlotScheduleEditBreak, |
|---|
| 1359 | "slot.deleteContribution": SessionSlotScheduleDeleteContribution, |
|---|
| 1360 | "slot.deleteBreak": SessionSlotScheduleDeleteBreak, |
|---|
| 1361 | "slot.getDayEndDate": SessionSlotScheduleGetDayEndDate, |
|---|
| 1362 | "slot.getBooking": SessionSlotGetBooking, |
|---|
| 1363 | "slot.getFossil": SessionSlotGetFossil, |
|---|
| 1364 | "slot.modifyStartEndDate": SessionSlotScheduleModifyStartEndDate, |
|---|
| 1365 | "slot.moveEntry": MoveEntryFromSessionBlock, |
|---|
| 1366 | |
|---|
| 1367 | "session.getDayEndDate": SessionScheduleGetDayEndDate, |
|---|
| 1368 | "session.addSlot": SessionScheduleAddSessionSlot, |
|---|
| 1369 | "session.editSlot": SessionScheduleEditSessionSlot, |
|---|
| 1370 | "session.editSlotById": SessionScheduleEditSessionSlotById, |
|---|
| 1371 | "session.deleteSlot": SessionScheduleDeleteSessionSlot, |
|---|
| 1372 | "session.changeColors": SessionScheduleChangeSessionColors, |
|---|
| 1373 | "session.modifyStartEndDate": SessionScheduleModifyStartEndDate, |
|---|
| 1374 | |
|---|
| 1375 | |
|---|
| 1376 | "session.getUnscheduledContributions": SessionGetUnscheduledContributions, |
|---|
| 1377 | "slot.scheduleContributions": SessionSlotScheduleContributions, |
|---|
| 1378 | |
|---|
| 1379 | "break.getBooking": BreakGetBooking, |
|---|
| 1380 | |
|---|
| 1381 | "setSessionSlots": ConferenceSetSessionSlots, |
|---|
| 1382 | "setScheduleSessions": ConferenceSetScheduleSessions, |
|---|
| 1383 | |
|---|
| 1384 | "getAllSessionConveners": ConferenceGetAllConveners, |
|---|
| 1385 | "getAllSpeakers": ConferenceGetAllSpeakers, |
|---|
| 1386 | |
|---|
| 1387 | "event.moveEntryUpDown": ConferenceTimetableMoveEntryUpDown, |
|---|
| 1388 | "session.moveEntryUpDown": SessionTimetableMoveEntryUpDown, |
|---|
| 1389 | "slot.moveEntryUpDown": SessionSlotTimetableMoveEntryUpDown, |
|---|
| 1390 | |
|---|
| 1391 | "event.editRoomLocation": EventEditRoomLocation, |
|---|
| 1392 | "session.editRoomLocation": SessionEditRoomLocation, |
|---|
| 1393 | "slot.editRoomLocation": SessionSlotEditRoomLocation, |
|---|
| 1394 | |
|---|
| 1395 | "api.getSessionExportPopup": SessionGetExportPopup, |
|---|
| 1396 | "api.getSessionExportURLs": SessionExportURLs, |
|---|
| 1397 | "api.getContribExportPopup": ContributionGetExportPopup, |
|---|
| 1398 | "api.getContribExportURLs": ContributionExportURLs |
|---|
| 1399 | } |
|---|