diff --git a/vc_vidyo/indico_vc_vidyo/api/cache.py b/vc_vidyo/indico_vc_vidyo/api/cache.py index 69ef2c2..5d57483 100644 --- a/vc_vidyo/indico_vc_vidyo/api/cache.py +++ b/vc_vidyo/indico_vc_vidyo/api/cache.py @@ -14,24 +14,21 @@ # You should have received a copy of the GNU General Public License # along with Indico; if not, see . -from suds.cache import Cache +from zeep.cache import Base from indico.legacy.common.cache import GenericCache DEFAULT_CACHE_TTL = 24 * 3600 -class SudsCache(Cache): +class ZeepCache(Base): _instance = None def __init__(self, duration=DEFAULT_CACHE_TTL): - self._cache = GenericCache("SudsCache") + self._cache = GenericCache("ZeepCache") self._duration = duration - def get(self, key): - self._cache.get(key) + def get(self, url): + self._cache.get(url) - def put(self, key, val): - self._cache.set(key, val, self._duration) - - def purge(self, key): - self._cache.delete(key) + def add(self, url, content): + self._cache.set(url, content, self._duration) diff --git a/vc_vidyo/indico_vc_vidyo/api/client.py b/vc_vidyo/indico_vc_vidyo/api/client.py index d5e4bc9..b8826eb 100644 --- a/vc_vidyo/indico_vc_vidyo/api/client.py +++ b/vc_vidyo/indico_vc_vidyo/api/client.py @@ -14,13 +14,13 @@ # You should have received a copy of the GNU General Public License # along with Indico; if not, see . -import re +from requests import Session +from requests.auth import HTTPBasicAuth +from zeep import Client +from zeep.exceptions import Fault +from zeep.transports import Transport -from suds import WebFault -from suds.client import Client -from suds.transport.https import HttpAuthenticated - -from indico_vc_vidyo.api.cache import SudsCache +from indico_vc_vidyo.api.cache import ZeepCache DEFAULT_CLIENT_TIMEOUT = 30 AUTOMUTE_API_PROFILE = "NoAudioAndVideo" @@ -38,8 +38,8 @@ def raises_api_error(wrapped): def _wrapper(*args, **kwargs): try: return wrapped(*args, **kwargs) - except WebFault as err: - err_msg = err.fault.faultstring + except Fault as err: + err_msg = err.message if err_msg.startswith('Room not found for roomID') or 'Invalid roomID' in err_msg: raise RoomNotFoundAPIException() else: @@ -49,9 +49,11 @@ def raises_api_error(wrapped): class ClientBase(object): def __init__(self, wsdl, settings): - transport = HttpAuthenticated(username=settings.get('username'), password=settings.get('password'), - timeout=DEFAULT_CLIENT_TIMEOUT) - self.client = Client(wsdl, cache=SudsCache(), transport=transport, location=re.sub(r'\?wsdl$', '', wsdl)) + session = Session() + transport = Transport(session=session, cache=ZeepCache()) + session.auth = HTTPBasicAuth(settings.get('username'), settings.get('password')) + self.client = Client(wsdl, transport=transport) + self.factory = self.client.type_factory('ns0') @property def soap(self): @@ -68,25 +70,20 @@ class AdminClient(ClientBase): super(AdminClient, self).__init__(settings.get('admin_api_wsdl'), settings) def create_room_object(self, **kwargs): - room = self.client.factory.create('Room') - - for key, value in kwargs.iteritems(): - setattr(room, key, value) - - return room + return self.factory.Room(**kwargs) @raises_api_error def find_room(self, extension): from indico_vc_vidyo.plugin import VidyoPlugin - filter_ = self.client.factory.create('Filter') - filter_.query = extension - filter_.limit = 40 - filter_.dir = 'DESC' - + filter_ = { + 'query': extension, + 'limit': 40, + 'dir': 'DESC' + } counter = 0 while True: - filter_.start = counter * filter_.limit + filter_['start'] = counter * filter_['limit'] response = self.soap.getRooms(filter_) if not response.total: return None @@ -100,23 +97,23 @@ class AdminClient(ClientBase): @raises_api_error def get_room(self, vidyo_id): - return self.soap.getRoom(vidyo_id) + return self.soap.getRoom(roomID=vidyo_id) @raises_api_error def add_room(self, room_obj): - self.soap.addRoom(room_obj) + self.soap.addRoom(room=room_obj) @raises_api_error def update_room(self, room_id, room_obj): - self.soap.updateRoom(room_id, room_obj) + self.soap.updateRoom(roomID=room_id, room=room_obj) @raises_api_error def delete_room(self, room_id): - self.soap.deleteRoom(room_id) + self.soap.deleteRoom(roomID=room_id) @raises_api_error def get_automute(self, room_id): - answer = self.soap.getRoomProfile(room_id) + answer = self.soap.getRoomProfile(roomID=room_id) if answer: return answer.roomProfileName == AUTOMUTE_API_PROFILE else: @@ -125,6 +122,6 @@ class AdminClient(ClientBase): @raises_api_error def set_automute(self, room_id, status): if status: - self.soap.setRoomProfile(room_id, AUTOMUTE_API_PROFILE) + self.soap.setRoomProfile(roomID=room_id, roomProfileName=AUTOMUTE_API_PROFILE) else: - self.soap.removeRoomProfile(room_id) + self.soap.removeRoomProfile(roomID=room_id) diff --git a/vc_vidyo/indico_vc_vidyo/plugin.py b/vc_vidyo/indico_vc_vidyo/plugin.py index a97cb38..99799f6 100644 --- a/vc_vidyo/indico_vc_vidyo/plugin.py +++ b/vc_vidyo/indico_vc_vidyo/plugin.py @@ -163,17 +163,24 @@ class VidyoPlugin(VCPluginMixin, IndicoPlugin): extension = next(extension_gen) while True: + room_mode = { + 'isLocked': False, + 'hasPIN': vc_room.data['room_pin'] != "", + 'hasModeratorPIN': vc_room.data['moderation_pin'] != "" + } + if room_mode['hasPIN']: + room_mode['roomPIN'] = vc_room.data['room_pin'] + if room_mode['hasModeratorPIN']: + room_mode['moderatorPIN'] = vc_room.data['moderation_pin'] + room_obj = client.create_room_object( name=vc_room.name, RoomType='Public', ownerName=login, extension=extension, groupName=self.settings.get('room_group_name'), - description=vc_room.data['description']) - - room_obj.RoomMode.isLocked = False - room_obj.RoomMode.hasPIN = vc_room.data['room_pin'] != "" - room_obj.RoomMode.hasModeratorPIN = vc_room.data['moderation_pin'] != "" + description=vc_room.data['description'], + RoomMode=room_mode) if room_obj.RoomMode.hasPIN: room_obj.RoomMode.roomPIN = vc_room.data['room_pin'] diff --git a/vc_vidyo/setup.py b/vc_vidyo/setup.py index 29e8a9e..546c2b4 100644 --- a/vc_vidyo/setup.py +++ b/vc_vidyo/setup.py @@ -32,7 +32,7 @@ setup( platforms='any', install_requires=[ 'indico>=1.9.10', - 'suds-jurko' + 'zeep' ], classifiers=[ 'Environment :: Plugins',