mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 10:22:11 +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