From 4dda648bc053a8d9704993e2cb2fdf81f525f94e Mon Sep 17 00:00:00 2001 From: Adrian Moennich Date: Tue, 7 Oct 2014 16:51:28 +0200 Subject: [PATCH] Handle event deletion --- chat/indico_chat/controllers.py | 16 +++++++--------- chat/indico_chat/models/chatrooms.py | 22 ++++++++++++++++++++-- chat/indico_chat/plugin.py | 5 +++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/chat/indico_chat/controllers.py b/chat/indico_chat/controllers.py index 750bf09..09f643c 100644 --- a/chat/indico_chat/controllers.py +++ b/chat/indico_chat/controllers.py @@ -31,7 +31,7 @@ from indico_chat.forms import AddChatroomForm, EditChatroomForm from indico_chat.models.chatrooms import ChatroomEventAssociation, Chatroom from indico_chat.util import is_chat_admin from indico_chat.views import WPChatEventPage, WPChatEventMgmt -from indico_chat.xmpp import create_room, update_room, delete_room +from indico_chat.xmpp import create_room, update_room class RHChatEventPage(RHConferenceBaseDisplay): @@ -69,7 +69,8 @@ class RHChatManageEvent(RHChatManageEventBase): """Lists the chatrooms of an event""" def _process(self): - chatrooms = ChatroomEventAssociation.find_for_event(self.event, include_hidden=True, _eager='chatroom.events') + chatrooms = ChatroomEventAssociation.find_for_event(self.event, include_hidden=True, + _eager='chatroom.events').all() chatroom_filter = (~Chatroom.id.in_(x.chatroom_id for x in chatrooms)) if chatrooms else True available_chatrooms = Chatroom.find_all(Chatroom.created_by_id == int(session.user.id), chatroom_filter) return WPChatEventMgmt.render_template('manage_event.html', self._conf, event_chatrooms=chatrooms, @@ -145,12 +146,9 @@ class RHChatManageEventRemove(RHChatManageEventBase): self.chatroom = self.event_chatroom.chatroom def _process(self): - db.session.delete(self.event_chatroom) - db.session.flush() - if self.chatroom.events: - flash('Chatroom removed from event', 'success') - else: - db.session.delete(self.chatroom) - delete_room(self.chatroom) + chatroom_deleted = self.event_chatroom.delete() + if chatroom_deleted: flash('Chatroom deleted', 'success') + else: + flash('Chatroom removed from event', 'success') return redirect(url_for_plugin('.manage_rooms', self.event)) diff --git a/chat/indico_chat/models/chatrooms.py b/chat/indico_chat/models/chatrooms.py index 58c379c..9ab3de7 100644 --- a/chat/indico_chat/models/chatrooms.py +++ b/chat/indico_chat/models/chatrooms.py @@ -23,7 +23,7 @@ from indico.util.date_time import now_utc from indico.util.string import return_ascii from MaKaC.user import AvatarHolder from MaKaC.conference import ConferenceHolder -from indico_chat.xmpp import generate_jid +from indico_chat.xmpp import generate_jid, delete_room class Chatroom(db.Model): @@ -114,6 +114,11 @@ class Chatroom(db.Model): server = '!' + server return ''.format(self.id, self.name, self.jid_node, server) + def __committed__(self, change): + super(Chatroom, self).__committed__(change) + if change == 'delete': + delete_room(self) + def generate_jid(self): """Generates the JID based on the room name""" assert self.jid_node is None @@ -154,7 +159,7 @@ class ChatroomEventAssociation(db.Model): chatroom = db.relationship( 'Chatroom', lazy=False, - backref='events' + backref=db.backref('events', cascade='all, delete-orphan') ) @property @@ -185,3 +190,16 @@ class ChatroomEventAssociation(db.Model): if not include_hidden: query = query.filter(~cls.hidden) return query + + def delete(self): + """Deletes the event chatroom and if necessary the chatroom, too. + + :return: True if the associated chatroom was also + deleted, otherwise False + """ + db.session.delete(self) + db.session.flush() + if not self.chatroom.events: + db.session.delete(self.chatroom) + return True + return False diff --git a/chat/indico_chat/plugin.py b/chat/indico_chat/plugin.py index 1119a7c..d35b7cf 100644 --- a/chat/indico_chat/plugin.py +++ b/chat/indico_chat/plugin.py @@ -89,6 +89,7 @@ class ChatPlugin(IndicoPlugin): self.connect(signals.event_sidemenu, self.extend_event_menu) self.connect(signals.event_management_sidemenu, self.extend_event_management_menu) self.connect(signals.event_management_clone, self.extend_event_management_clone) + self.connect(signals.event_deleted, self.event_deleted) self.template_hook('event-header', self.inject_event_header) for wp in (WPTPLConferenceDisplay, WPXSLConferenceDisplay, WPChatEventPage, WPChatEventMgmt): self.inject_css('chat_css', wp) @@ -122,6 +123,10 @@ class ChatPlugin(IndicoPlugin): def extend_event_management_clone(self, event, **kwargs): return ChatroomCloner(self, event) + def event_deleted(self, event, **kwargs): + for event_chatroom in ChatroomEventAssociation.find_for_event(event, include_hidden=True): + event_chatroom.delete() + class ChatroomCloner(EventCloner): def get_options(self):