From 25325b4fd9cae3b4113bb4d9ccbac5d78982578d Mon Sep 17 00:00:00 2001 From: Dinh Date: Tue, 28 Jan 2020 14:12:17 -0600 Subject: [PATCH] add chat model --- chat_box/admin.py | 3 -- chat_box/migrations/0001_initial.py | 30 +++++++++++++++++++ chat_box/models.py | 46 +++++++++++++++++++++++++++-- chat_box/views.py | 7 ++--- dmoj/urls.py | 4 +-- 5 files changed, 79 insertions(+), 11 deletions(-) delete mode 100644 chat_box/admin.py create mode 100644 chat_box/migrations/0001_initial.py diff --git a/chat_box/admin.py b/chat_box/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/chat_box/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/chat_box/migrations/0001_initial.py b/chat_box/migrations/0001_initial.py new file mode 100644 index 0000000..b311ab5 --- /dev/null +++ b/chat_box/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 2.2.9 on 2020-01-28 05:07 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('judge', '0100_auto_20200127_0059'), + ] + + operations = [ + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time', models.DateTimeField(auto_now_add=True, verbose_name='posted time')), + ('body', models.TextField(max_length=8192, verbose_name='body of comment')), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Profile', verbose_name='user')), + ], + options={ + 'verbose_name': 'message', + 'verbose_name_plural': 'messages', + 'ordering': ('-time',), + }, + ), + ] diff --git a/chat_box/models.py b/chat_box/models.py index 71a8362..297b921 100644 --- a/chat_box/models.py +++ b/chat_box/models.py @@ -1,3 +1,45 @@ -from django.db import models +# based on https://github.com/narrowfail/django-channels-chat -# Create your models here. +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',) diff --git a/chat_box/views.py b/chat_box/views.py index 74efe07..a032014 100644 --- a/chat_box/views.py +++ b/chat_box/views.py @@ -1,8 +1,7 @@ from django.shortcuts import render from django.utils.translation import gettext as _ +from django.views import View -def chat(request): - return render(request, 'chat/chat.html', { - 'title': _('Chat Box'), - }) +class ChatView(View): + template_name = 'chat.html' \ No newline at end of file diff --git a/dmoj/urls.py b/dmoj/urls.py index f302695..23cdb9c 100644 --- a/dmoj/urls.py +++ b/dmoj/urls.py @@ -1,4 +1,4 @@ -from chat_box.views import chat +from chat_box.views import ChatView from django.conf import settings from django.conf.urls import include, url from django.contrib import admin @@ -367,7 +367,7 @@ urlpatterns = [ url(r'^custom_checker_sample/', about.custom_checker_sample, name='custom_checker_sample'), - url(r'chat/', chat, name='chat'), + url(r'chat/', ChatView.as_view(), name='chat'), ] favicon_paths = ['apple-touch-icon-180x180.png', 'apple-touch-icon-114x114.png', 'android-chrome-72x72.png',