mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-10-30 08:59:52 +01:00 
			
		
		
		
	Editing and deleting is working
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
		| @@ -62,11 +62,15 @@ class ChatConsumer(AsyncJsonWebsocketConsumer): | |||||||
|             case 'fetch_channels': |             case 'fetch_channels': | ||||||
|                 await self.fetch_channels() |                 await self.fetch_channels() | ||||||
|             case 'send_message': |             case 'send_message': | ||||||
|                 await self.receive_message(content) |                 await self.receive_message(**content) | ||||||
|  |             case 'edit_message': | ||||||
|  |                 await self.edit_message(**content) | ||||||
|  |             case 'delete_message': | ||||||
|  |                 await self.delete_message(**content) | ||||||
|             case 'fetch_messages': |             case 'fetch_messages': | ||||||
|                 await self.fetch_messages(**content) |                 await self.fetch_messages(**content) | ||||||
|             case 'start_private_chat': |             case 'start_private_chat': | ||||||
|                 await self.start_private_chat(content['user_id']) |                 await self.start_private_chat(**content) | ||||||
|             case unknown: |             case unknown: | ||||||
|                 print("Unknown message type:", unknown) |                 print("Unknown message type:", unknown) | ||||||
|  |  | ||||||
| @@ -90,10 +94,10 @@ class ChatConsumer(AsyncJsonWebsocketConsumer): | |||||||
|         } |         } | ||||||
|         await self.send_json(message) |         await self.send_json(message) | ||||||
|  |  | ||||||
|     async def receive_message(self, message: dict) -> None: |     async def receive_message(self, channel_id: int, content: str, **kwargs) -> None: | ||||||
|         user = self.scope['user'] |         user = self.scope['user'] | ||||||
|         channel = await Channel.objects.prefetch_related('tournament__pools__juries', 'pool', 'team', 'invited') \ |         channel = await Channel.objects.prefetch_related('tournament__pools__juries', 'pool', 'team', 'invited') \ | ||||||
|             .aget(id=message['channel_id']) |             .aget(id=channel_id) | ||||||
|         write_channels = await Channel.get_accessible_channels(user, 'write') |         write_channels = await Channel.get_accessible_channels(user, 'write') | ||||||
|         if not await write_channels.acontains(channel): |         if not await write_channels.acontains(channel): | ||||||
|             return |             return | ||||||
| @@ -101,7 +105,7 @@ class ChatConsumer(AsyncJsonWebsocketConsumer): | |||||||
|         message = await Message.objects.acreate( |         message = await Message.objects.acreate( | ||||||
|             author=user, |             author=user, | ||||||
|             channel=channel, |             channel=channel, | ||||||
|             content=message['content'], |             content=content, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         await self.channel_layer.group_send(f'chat-{channel.id}', { |         await self.channel_layer.group_send(f'chat-{channel.id}', { | ||||||
| @@ -114,6 +118,36 @@ class ChatConsumer(AsyncJsonWebsocketConsumer): | |||||||
|             'content': message.content, |             'content': message.content, | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|  |     async def edit_message(self, message_id: int, content: str, **kwargs) -> None: | ||||||
|  |         message = await Message.objects.aget(id=message_id) | ||||||
|  |         user = self.scope['user'] | ||||||
|  |         if user.id != message.author_id and not user.is_superuser: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         message.content = content | ||||||
|  |         await message.asave() | ||||||
|  |  | ||||||
|  |         await self.channel_layer.group_send(f'chat-{message.channel_id}', { | ||||||
|  |             'type': 'chat.edit_message', | ||||||
|  |             'id': message_id, | ||||||
|  |             'channel_id': message.channel_id, | ||||||
|  |             'content': content, | ||||||
|  |         }) | ||||||
|  |  | ||||||
|  |     async def delete_message(self, message_id: int, **kwargs) -> None: | ||||||
|  |         message = await Message.objects.aget(id=message_id) | ||||||
|  |         user = self.scope['user'] | ||||||
|  |         if user.id != message.author_id and not user.is_superuser: | ||||||
|  |             return | ||||||
|  |  | ||||||
|  |         await message.adelete() | ||||||
|  |  | ||||||
|  |         await self.channel_layer.group_send(f'chat-{message.channel_id}', { | ||||||
|  |             'type': 'chat.delete_message', | ||||||
|  |             'id': message_id, | ||||||
|  |             'channel_id': message.channel_id, | ||||||
|  |         }) | ||||||
|  |  | ||||||
|     async def fetch_messages(self, channel_id: int, offset: int = 0, limit: int = 50, **_kwargs) -> None: |     async def fetch_messages(self, channel_id: int, offset: int = 0, limit: int = 50, **_kwargs) -> None: | ||||||
|         channel = await Channel.objects.aget(id=channel_id) |         channel = await Channel.objects.aget(id=channel_id) | ||||||
|         read_channels = await Channel.get_accessible_channels(self.scope['user'], 'read') |         read_channels = await Channel.get_accessible_channels(self.scope['user'], 'read') | ||||||
| @@ -138,7 +172,7 @@ class ChatConsumer(AsyncJsonWebsocketConsumer): | |||||||
|             ])) |             ])) | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|     async def start_private_chat(self, user_id: int) -> None: |     async def start_private_chat(self, user_id: int, **kwargs) -> None: | ||||||
|         user = self.scope['user'] |         user = self.scope['user'] | ||||||
|         other_user = await User.objects.aget(id=user_id) |         other_user = await User.objects.aget(id=user_id) | ||||||
|         channel_qs = Channel.objects.filter(private=True).filter(invited=user).filter(invited=other_user) |         channel_qs = Channel.objects.filter(private=True).filter(invited=user).filter(invited=other_user) | ||||||
| @@ -183,6 +217,14 @@ class ChatConsumer(AsyncJsonWebsocketConsumer): | |||||||
|                               'timestamp': message['timestamp'], 'author': message['author'], |                               'timestamp': message['timestamp'], 'author': message['author'], | ||||||
|                               'content': message['content']}) |                               'content': message['content']}) | ||||||
|  |  | ||||||
|  |     async def chat_edit_message(self, message) -> None: | ||||||
|  |         print(message) | ||||||
|  |         await self.send_json({'type': 'edit_message', 'id': message['id'], 'channel_id': message['channel_id'], | ||||||
|  |                               'content': message['content']}) | ||||||
|  |  | ||||||
|  |     async def chat_delete_message(self, message) -> None: | ||||||
|  |         await self.send_json({'type': 'delete_message', 'id': message['id'], 'channel_id': message['channel_id']}) | ||||||
|  |  | ||||||
|     async def chat_start_private_chat(self, message) -> None: |     async def chat_start_private_chat(self, message) -> None: | ||||||
|         await self.channel_layer.group_add(f"chat-{message['channel']['id']}", self.channel_name) |         await self.channel_layer.group_add(f"chat-{message['channel']['id']}", self.channel_name) | ||||||
|         await self.send_json({'type': 'start_private_chat', 'channel': message['channel']}) |         await self.send_json({'type': 'start_private_chat', 'channel': message['channel']}) | ||||||
|   | |||||||
| @@ -122,6 +122,16 @@ function receiveMessage(message) { | |||||||
|         showNotification(channels[message['channel_id']]['name'], `${message['author']} : ${message['content']}`) |         showNotification(channels[message['channel_id']]['name'], `${message['author']} : ${message['content']}`) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function editMessage(data) { | ||||||
|  |     messages[data['channel_id']].get(data['id'])['content'] = data['content'] | ||||||
|  |     redrawMessages() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function deleteMessage(data) { | ||||||
|  |     messages[data['channel_id']].delete(data['id']) | ||||||
|  |     redrawMessages() | ||||||
|  | } | ||||||
|  |  | ||||||
| function fetchMessages(channel_id, offset = 0, limit = MAX_MESSAGES) { | function fetchMessages(channel_id, offset = 0, limit = MAX_MESSAGES) { | ||||||
|     socket.send(JSON.stringify({ |     socket.send(JSON.stringify({ | ||||||
|         'type': 'fetch_messages', |         'type': 'fetch_messages', | ||||||
| @@ -270,11 +280,14 @@ function registerMessageContextMenu(message, element) { | |||||||
|         menu_event.preventDefault() |         menu_event.preventDefault() | ||||||
|         removeAllPopovers() |         removeAllPopovers() | ||||||
|         let content = `<a id="send-private-message-link-msg-${message['id']}" class="nav-link" href="#" tabindex="0">Envoyer un message privé</a>` |         let content = `<a id="send-private-message-link-msg-${message['id']}" class="nav-link" href="#" tabindex="0">Envoyer un message privé</a>` | ||||||
|         if (message['author_id'] === USER_ID || IS_ADMIN) { |  | ||||||
|  |         let has_right_to_edit = message['author_id'] === USER_ID || IS_ADMIN | ||||||
|  |         if (has_right_to_edit) { | ||||||
|             content += `<hr class="my-1">` |             content += `<hr class="my-1">` | ||||||
|             content += `<a class="nav-link" href="#" tabindex="0">Modifier</a>` |             content += `<a id="edit-message-${message['id']}" class="nav-link" href="#" tabindex="0">Modifier</a>` | ||||||
|             content += `<a class="nav-link" href="#" tabindex="0">Supprimer</a>` |             content += `<a id="delete-message-${message['id']}" class="nav-link" href="#" tabindex="0">Supprimer</a>` | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         const popover = bootstrap.Popover.getOrCreateInstance(element, { |         const popover = bootstrap.Popover.getOrCreateInstance(element, { | ||||||
|             'content': content, |             'content': content, | ||||||
|             'html': true, |             'html': true, | ||||||
| @@ -290,6 +303,32 @@ function registerMessageContextMenu(message, element) { | |||||||
|                 'user_id': message['author_id'], |                 'user_id': message['author_id'], | ||||||
|             })) |             })) | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|  |         if (has_right_to_edit) { | ||||||
|  |             document.getElementById('edit-message-' + message['id']).addEventListener('click', event => { | ||||||
|  |                 event.preventDefault() | ||||||
|  |                 popover.dispose() | ||||||
|  |                 let new_message = prompt("Modifier le message", message['content']) | ||||||
|  |                 if (new_message) { | ||||||
|  |                     socket.send(JSON.stringify({ | ||||||
|  |                         'type': 'edit_message', | ||||||
|  |                         'message_id': message['id'], | ||||||
|  |                         'content': new_message, | ||||||
|  |                     })) | ||||||
|  |                 } | ||||||
|  |             }) | ||||||
|  |  | ||||||
|  |             document.getElementById('delete-message-' + message['id']).addEventListener('click', event => { | ||||||
|  |                 event.preventDefault() | ||||||
|  |                 popover.dispose() | ||||||
|  |                 if (confirm("Supprimer le message ?")) { | ||||||
|  |                     socket.send(JSON.stringify({ | ||||||
|  |                         'type': 'delete_message', | ||||||
|  |                         'message_id': message['id'], | ||||||
|  |                     })) | ||||||
|  |                 } | ||||||
|  |             }) | ||||||
|  |         } | ||||||
|     }) |     }) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -322,6 +361,12 @@ document.addEventListener('DOMContentLoaded', () => { | |||||||
|             case 'send_message': |             case 'send_message': | ||||||
|                 receiveMessage(data) |                 receiveMessage(data) | ||||||
|                 break |                 break | ||||||
|  |             case 'edit_message': | ||||||
|  |                 editMessage(data) | ||||||
|  |                 break | ||||||
|  |             case 'delete_message': | ||||||
|  |                 deleteMessage(data) | ||||||
|  |                 break | ||||||
|             case 'fetch_messages': |             case 'fetch_messages': | ||||||
|                 receiveFetchedMessages(data) |                 receiveFetchedMessages(data) | ||||||
|                 break |                 break | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user