def createRoom(cls, booking): """ Attempts to create a public room in Vidyo. Returns None on success. Will also set booking.setAccountName() if success, with the Indico & Vidyo login used successfully. Returns a VidyoError instance if there are problems. :param booking: the CSBooking object inside which we try to create the room :type booking: MaKaC.plugins.Collaboration.Vidyo.collaboration.CSBooking """ # we extract the different parameters # We set the original conference id because the bookings can belong to more than one conference and being cloned # and it is used for the long name, we need to keep always the same confId confId = booking.getConference().getId() bookingId = booking.getId() roomName = booking.getBookingParamByName("roomName") description = booking.getBookingParamByName("roomDescription") owner = booking.getOwnerObject() pin = booking.getPin() moderatorPin = booking.getModeratorPin() #we obtain the unicode object with the proper format for the room name roomNameForVidyo = VidyoTools.roomNameForVidyo(roomName) if isinstance(roomNameForVidyo, VidyoError): return roomNameForVidyo #we turn the description into a unicode object description = VidyoTools.descriptionForVidyo(description) if isinstance(description, VidyoError): return description #we obtain the most probable extension #TODO: there's a length limit for extensions, check this baseExtension = getVidyoOptionValue("prefix") + confId extension = baseExtension extensionSuffix = 1 #we produce the list of possible account names. We will loop through them to attempt to create the room possibleLogins = VidyoTools.getAvatarLoginList(owner) if not possibleLogins: return VidyoError("userHasNoAccounts", "create") # We check the moderator PIN is a 3-10 digit number if moderatorPin and (not moderatorPin.isdigit() or len(moderatorPin) < 3 or len(moderatorPin) > 10): return VidyoError("PINLength", "create") roomCreated = False loginToUse = 0 while not roomCreated and loginToUse < len(possibleLogins): #we loop changing the ownerName and the extension until room is created newRoom = SOAPObjectFactory.createRoom(roomNameForVidyo, description, possibleLogins[loginToUse], extension, pin, moderatorPin) try: AdminApi.addRoom(newRoom) roomCreated = True except WebFault, e: faultString = e.fault.faultstring if faultString.startswith('Room exist for name'): if VidyoOperations.roomWithSameOwner(possibleLogins[loginToUse], roomNameForVidyo): return VidyoError("duplicatedWithOwner", "create") else: return VidyoError("duplicated", "create") elif faultString.startswith('Member not found for ownerName'): loginToUse = loginToUse + 1 elif faultString.startswith('PIN should be a 3-10 digit number'): return VidyoError("PINLength", "create") elif faultString.startswith('Room exist for extension'): extension = baseExtension + str(extensionSuffix) extensionSuffix = extensionSuffix + 1 else: Logger.get('Vidyo').exception("""Evt:%s, booking:%s, Admin API's addRoom operation got WebFault: %s""" % (confId, bookingId, e.fault.faultstring)) raise
def createRoom(cls, booking): """ Attempts to create a public room in Vidyo. Returns None on success. Will also set booking.setAccountName() if success, with the Indico & Vidyo login used successfully. Returns a VidyoError instance if there are problems. :param booking: the CSBooking object inside which we try to create the room :type booking: MaKaC.plugins.Collaboration.Vidyo.collaboration.CSBooking """ # we extract the different parameters # We set the original conference id because the bookings can belong to more than one conference and being cloned # and it is used for the long name, we need to keep always the same confId confId = booking.getConference().getId() bookingId = booking.getId() roomName = booking.getBookingParamByName("roomName") description = booking.getBookingParamByName("roomDescription") owner = booking.getOwnerObject() pin = booking.getPin() moderatorPin = booking.getModeratorPin() #we obtain the unicode object with the proper format for the room name roomNameForVidyo = VidyoTools.roomNameForVidyo(roomName) if isinstance(roomNameForVidyo, VidyoError): return roomNameForVidyo #we turn the description into a unicode object description = VidyoTools.descriptionForVidyo(description) if isinstance(description, VidyoError): return description #we obtain the most probable extension #TODO: there's a length limit for extensions, check this baseExtension = getVidyoOptionValue("prefix") + confId extension = baseExtension extensionSuffix = 1 #we produce the list of possible account names. We will loop through them to attempt to create the room possibleLogins = VidyoTools.getAvatarLoginList(owner) if not possibleLogins: return VidyoError("userHasNoAccounts", "create") # We check the moderator PIN is a 3-10 digit number if moderatorPin and (not moderatorPin.isdigit() or len(moderatorPin) < 3 or len(moderatorPin) > 10): return VidyoError("PINLength", "create") roomCreated = False loginToUse = 0 while not roomCreated and loginToUse < len(possibleLogins): #we loop changing the ownerName and the extension until room is created newRoom = SOAPObjectFactory.createRoom(roomNameForVidyo, description, possibleLogins[loginToUse], extension, pin, moderatorPin) try: AdminApi.addRoom(newRoom) roomCreated = True except WebFault, e: faultString = e.fault.faultstring if faultString.startswith('Room exist for name'): if VidyoOperations.roomWithSameOwner( possibleLogins[loginToUse], roomNameForVidyo): return VidyoError("duplicatedWithOwner", "create") else: return VidyoError("duplicated", "create") elif faultString.startswith('Member not found for ownerName'): loginToUse = loginToUse + 1 elif faultString.startswith( 'PIN should be a 3-10 digit number'): return VidyoError("PINLength", "create") elif faultString.startswith('Room exist for extension'): extension = baseExtension + str(extensionSuffix) extensionSuffix = extensionSuffix + 1 else: Logger.get('Vidyo').exception( """Evt:%s, booking:%s, Admin API's addRoom operation got WebFault: %s""" % (confId, bookingId, e.fault.faultstring)) raise
def modifyRoom(cls, booking, oldBookingParams): # we extract the different parameters # We set the original conference id because the bookings can belong to more than one conference and being cloned # and it is used for the long name, we need to keep always the same confId confId = booking.getConference().getId() bookingId = booking.getId() roomId = booking.getRoomId() roomName = booking.getBookingParamByName("roomName") description = booking.getBookingParamByName("roomDescription") newOwner = booking.getOwnerObject() #an avatar object ownerAccountName = booking.getOwnerAccount() #a str oldOwner = oldBookingParams["owner"] #an IAvatarFossil fossil pin = booking.getPin() moderatorPin = booking.getModeratorPin() #we obtain the unicode object with the proper format for the room name roomNameForVidyo = VidyoTools.roomNameForVidyo(roomName) if isinstance(roomNameForVidyo, VidyoError): return roomNameForVidyo #we turn the description into a unicode object description = VidyoTools.descriptionForVidyo(description) if isinstance(description, VidyoError): return description #(the extension will not change) #we check if the owner has changed. If not, we reuse the same accountName useOldAccountName = True possibleLogins = [] if newOwner.getId() != oldOwner["id"]: useOldAccountName = False #we produce the list of possible account names. We will loop through them to attempt to create the room possibleLogins = VidyoTools.getAvatarLoginList(newOwner) if not possibleLogins: raise CollaborationException(_("The moderator has no login information")) # We check the moderator PIN is a 3-10 digit number if moderatorPin and (not moderatorPin.isdigit() or len(moderatorPin) < 3 or len(moderatorPin) > 10): return VidyoError("PINLength", "modify") roomModified = False loginToUse = 0 while not roomModified and (useOldAccountName or loginToUse < len(possibleLogins)): if not useOldAccountName: ownerAccountName = possibleLogins[loginToUse] newRoom = SOAPObjectFactory.createRoom(roomNameForVidyo, description, ownerAccountName, booking.getExtension(), pin, moderatorPin) try: AdminApi.updateRoom(roomId, newRoom) roomModified = True except WebFault, e: faultString = e.fault.faultstring if faultString.startswith('Room not exist for roomID'): return VidyoError("unknownRoom", "modify") elif faultString.startswith('Room exist for name'): return VidyoError("duplicated", "modify") elif faultString.startswith('Member not found for ownerName'): if useOldAccountName: #maybe the user was deleted between the time the room was created and now return VidyoError("badOwner", "modify") else: loginToUse = loginToUse + 1 elif faultString.startswith('PIN should be a 3-10 digit number'): return VidyoError("PINLength", "modify") else: Logger.get('Vidyo').exception("""Evt:%s, booking:%s, Admin API's updateRoom operation got WebFault: %s""" % (confId, bookingId, e.fault.faultstring)) raise
def modifyRoom(cls, booking, oldBookingParams): # we extract the different parameters # We set the original conference id because the bookings can belong to more than one conference and being cloned # and it is used for the long name, we need to keep always the same confId confId = booking.getConference().getId() bookingId = booking.getId() roomId = booking.getRoomId() roomName = booking.getBookingParamByName("roomName") description = booking.getBookingParamByName("roomDescription") newOwner = booking.getOwnerObject() #an avatar object ownerAccountName = booking.getOwnerAccount() #a str oldOwner = oldBookingParams["owner"] #an IAvatarFossil fossil pin = booking.getPin() moderatorPin = booking.getModeratorPin() #we obtain the unicode object with the proper format for the room name roomNameForVidyo = VidyoTools.roomNameForVidyo(roomName) if isinstance(roomNameForVidyo, VidyoError): return roomNameForVidyo #we turn the description into a unicode object description = VidyoTools.descriptionForVidyo(description) if isinstance(description, VidyoError): return description #(the extension will not change) #we check if the owner has changed. If not, we reuse the same accountName useOldAccountName = True possibleLogins = [] if newOwner.getId() != oldOwner["id"]: useOldAccountName = False #we produce the list of possible account names. We will loop through them to attempt to create the room possibleLogins = VidyoTools.getAvatarLoginList(newOwner) if not possibleLogins: raise CollaborationException( _("The moderator has no login information")) # We check the moderator PIN is a 3-10 digit number if moderatorPin and (not moderatorPin.isdigit() or len(moderatorPin) < 3 or len(moderatorPin) > 10): return VidyoError("PINLength", "modify") roomModified = False loginToUse = 0 while not roomModified and (useOldAccountName or loginToUse < len(possibleLogins)): if not useOldAccountName: ownerAccountName = possibleLogins[loginToUse] newRoom = SOAPObjectFactory.createRoom(roomNameForVidyo, description, ownerAccountName, booking.getExtension(), pin, moderatorPin) try: AdminApi.updateRoom(roomId, newRoom) roomModified = True except WebFault, e: faultString = e.fault.faultstring if faultString.startswith('Room not exist for roomID'): return VidyoError("unknownRoom", "modify") elif faultString.startswith('Room exist for name'): return VidyoError("duplicated", "modify") elif faultString.startswith('Member not found for ownerName'): if useOldAccountName: #maybe the user was deleted between the time the room was created and now return VidyoError("badOwner", "modify") else: loginToUse = loginToUse + 1 elif faultString.startswith( 'PIN should be a 3-10 digit number'): return VidyoError("PINLength", "modify") else: Logger.get('Vidyo').exception( """Evt:%s, booking:%s, Admin API's updateRoom operation got WebFault: %s""" % (confId, bookingId, e.fault.faultstring)) raise