45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
# based on https://github.com/narrowfail/django-channels-chat
|
|
|
|
from asgiref.sync import async_to_sync
|
|
from channels.layers import get_channel_layer
|
|
from django.db import models
|
|
from django.db.models import CASCADE
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
from judge.models.profile import Profile
|
|
|
|
|
|
__all__ = ['Message']
|
|
|
|
|
|
class Message(models.Model):
|
|
author = models.ForeignKey(Profile, verbose_name=_('user'), on_delete=CASCADE)
|
|
time = models.DateTimeField(verbose_name=_('posted time'), auto_now_add=True)
|
|
body = models.TextField(verbose_name=_('body of comment'), max_length=8192)
|
|
|
|
def notify_ws_clients(self):
|
|
# inform client that there is a new message
|
|
notification = {
|
|
'type': 'recieve_group_message',
|
|
'message': '{}'.format(self.id)
|
|
}
|
|
channel_layer = get_channel_layer()
|
|
# print("user.id {}".format(self.user.id))
|
|
# print("user.id {}".format(self.recipient.id))
|
|
|
|
async_to_sync(channel_layer.group_send)("{}".format(self.user.id), notification)
|
|
async_to_sync(channel_layer.group_send)("{}".format(self.recipient.id), notification)
|
|
|
|
def save(self, *args, **kwargs):
|
|
new_message = self.id
|
|
self.body = self.body.strip()
|
|
super(Message, self).save(*args, **kwargs)
|
|
if new_message is None:
|
|
self.notify_ws_clients()
|
|
|
|
class Meta:
|
|
app_label = 'chat_box'
|
|
verbose_name = 'message'
|
|
verbose_name_plural = 'messages'
|
|
ordering = ('-time',)
|