import otree.views.cbv from otree.channels import utils as channel_utils from otree.room import ROOM_DICT, BaseRoom from otree.session import SESSION_CONFIGS_DICT from otree.views.admin import CreateSessionForm from .cbv import AdminView class Rooms(AdminView): url_pattern = '/rooms' def vars_for_template(self): from threading import get_ident return {'rooms': ROOM_DICT.values()} class RoomWithoutSession(AdminView): room: BaseRoom form_class = CreateSessionForm url_pattern = '/room_without_session/{room_name}' def intercept_dispatch(self, room_name): self.room_name = room_name self.room = ROOM_DICT[room_name] if self.room.has_session(): return self.redirect('RoomWithSession', room_name=room_name) def get_form(self): return CreateSessionForm(data=dict(room_name=self.room_name)) def get_context_data(self, **kwargs): return super().get_context_data( configs=SESSION_CONFIGS_DICT.values(), participant_urls=self.room.get_participant_urls(self.request), room_wide_url=self.room.get_room_wide_url(self.request), room=self.room, collapse_links=True, **kwargs ) def socket_url(self): return channel_utils.room_admin_path(self.room.name) class RoomWithSession(AdminView): template_name = 'otree/RoomWithSession.html' room = None url_pattern = '/room_with_session/{room_name}' def intercept_dispatch(self, room_name): self.room = ROOM_DICT[room_name] if not self.room.has_session(): return self.redirect('RoomWithoutSession', room_name=room_name) def get_context_data(self, **kwargs): from otree.asgi import reverse session_code = self.room.get_session().code return super().get_context_data( participant_urls=self.room.get_participant_urls(self.request), room_wide_url=self.room.get_room_wide_url(self.request), session_url=reverse('SessionMonitor', code=session_code), room=self.room, collapse_links=True, **kwargs ) class CloseRoom(AdminView): url_pattern = '/CloseRoom/{room_name}' def post(self, request, room_name): self.room = ROOM_DICT[room_name] self.room.set_session(None) return self.redirect('RoomWithoutSession', room_name=room_name)