From 112f2b57c334d068550efe1d1ecf8a5361698926 Mon Sep 17 00:00:00 2001 From: cuom1999 Date: Thu, 19 Mar 2020 16:51:56 -0600 Subject: [PATCH] add database to chatbox --- chat_box/consumers.py | 27 ++++++++++++--- chat_box/models.py | 11 ------ chat_box/routing.py | 2 +- chat_box/views.py | 20 ++--------- dmoj/routing.py | 9 +++-- dmoj/settings.py | 4 ++- dmoj/urls.py | 9 ++--- resources/base.scss | 4 +-- resources/icons/logo.png | Bin 9689 -> 24818 bytes resources/icons/logo.svg | 16 --------- resources/table.scss | 2 +- resources/vars.scss | 2 +- resources/widgets.scss | 4 +-- templates/chat/chat.html | 71 ++++++++++++++++++--------------------- 14 files changed, 77 insertions(+), 104 deletions(-) delete mode 100644 resources/icons/logo.svg diff --git a/chat_box/consumers.py b/chat_box/consumers.py index d200968..8e9db85 100644 --- a/chat_box/consumers.py +++ b/chat_box/consumers.py @@ -1,17 +1,19 @@ import json - from channels.generic.websocket import AsyncWebsocketConsumer +from .models import Message + +from judge.models.profile import Profile class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): - self.room_name = 'common' + self.room_name = 'room' self.room_group_name = 'chat_%s' % self.room_name # Join room group await self.channel_layer.group_add( self.room_group_name, - self.channel_name, + self.channel_name ) await self.accept() @@ -20,7 +22,7 @@ class ChatConsumer(AsyncWebsocketConsumer): # Leave room group await self.channel_layer.group_discard( self.room_group_name, - self.channel_name, + self.channel_name ) # Receive message from WebSocket @@ -40,8 +42,23 @@ class ChatConsumer(AsyncWebsocketConsumer): # Receive message from room group async def chat_message(self, event): message = event['message'] - + time = save_data_and_get_time(message) + message['time'] = format_time(time) # Send message to WebSocket await self.send(text_data=json.dumps({ 'message': message, })) + + +# return time +def save_data_and_get_time(message): + new_message = Message(body=message['body'], + author=Profile.objects + .get(id=message['author_id']), + ) + new_message.save() + return new_message.time + + +def format_time(time): + return time.strftime('%H:%M %p %d-%m-%Y') \ No newline at end of file diff --git a/chat_box/models.py b/chat_box/models.py index 748e933..b895f8d 100644 --- a/chat_box/models.py +++ b/chat_box/models.py @@ -1,5 +1,3 @@ -# 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 @@ -18,19 +16,10 @@ class Message(models.Model): 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): - notification = { - 'type': 'recieve_group_message', - 'message': '{}'.format(self.id) - } - channel_layer = get_channel_layer() - 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' diff --git a/chat_box/routing.py b/chat_box/routing.py index f420f4f..6a8fe06 100644 --- a/chat_box/routing.py +++ b/chat_box/routing.py @@ -4,4 +4,4 @@ from . import consumers websocket_urlpatterns = [ re_path(r'ws/chat/', consumers.ChatConsumer), -] +] \ No newline at end of file diff --git a/chat_box/views.py b/chat_box/views.py index d507c98..6a339a2 100644 --- a/chat_box/views.py +++ b/chat_box/views.py @@ -1,31 +1,17 @@ -from django.http import HttpResponseRedirect from django.utils.translation import gettext as _ from django.views.generic import ListView -from django.urls import reverse -from django.utils import timezone - from .models import Message class ChatView(ListView): model = Message - context_object_name = 'messages' + context_object_name = 'message' template_name = 'chat/chat.html' title = _('Chat Box') + paginate_by = 10 def get_context_data(self, **kwargs): - context = super(ChatView, self).get_context_data(**kwargs) + context = super().get_context_data(**kwargs) context['title'] = self.title return context - - def get_queryset(self): - return None - - -def send(request): - new_message = Message(body=request.POST['message'], - author=request.profile, - time=timezone.now()) - new_message.save() - return HttpResponseRedirect(reverse('chat')) diff --git a/dmoj/routing.py b/dmoj/routing.py index 42238b7..72e0379 100644 --- a/dmoj/routing.py +++ b/dmoj/routing.py @@ -1,13 +1,12 @@ -import chat_box.routing from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter - +import chat_box.routing application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( - chat_box.routing.websocket_urlpatterns, - ), + chat_box.routing.websocket_urlpatterns + ) ), -}) +}) \ No newline at end of file diff --git a/dmoj/settings.py b/dmoj/settings.py index 3f2b4cb..1040998 100644 --- a/dmoj/settings.py +++ b/dmoj/settings.py @@ -503,6 +503,8 @@ TESTCASE_VISIBLE_LENGTH = 60 DATA_UPLOAD_MAX_NUMBER_FIELDS = 10240 DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 +MESSAGES_TO_LOAD = 15 + ASGI_APPLICATION = 'dmoj.routing.application' CHANNEL_LAYERS = { 'default': { @@ -511,4 +513,4 @@ CHANNEL_LAYERS = { "hosts": [('0.0.0.0', 6379)], }, }, -} +} \ No newline at end of file diff --git a/dmoj/urls.py b/dmoj/urls.py index c13ab03..0df902b 100644 --- a/dmoj/urls.py +++ b/dmoj/urls.py @@ -1,4 +1,4 @@ -from chat_box.views import ChatView, send +from chat_box.views import ChatView from django.conf import settings from django.conf.urls import include, url from django.contrib import admin @@ -10,6 +10,8 @@ from django.urls import reverse from django.utils.functional import lazystr from django.utils.translation import ugettext_lazy as _ from django.views.generic import RedirectView +from django.contrib.auth.decorators import login_required + from judge.feed import AtomBlogFeed, AtomCommentFeed, AtomProblemFeed, BlogFeed, CommentFeed, ProblemFeed from judge.forms import CustomAuthenticationForm @@ -25,7 +27,6 @@ from judge.views.select2 import AssigneeSelect2View, CommentSelect2View, Contest ContestUserSearchSelect2View, OrganizationSelect2View, ProblemSelect2View, TicketUserSelect2View, \ UserSearchSelect2View, UserSelect2View - admin.autodiscover() register_patterns = [ @@ -368,8 +369,8 @@ urlpatterns = [ url(r'^custom_checker_sample/', about.custom_checker_sample, name='custom_checker_sample'), url(r'^chat/', include([ - url(r'^$', ChatView.as_view(), name='chat'), - url(r'send$', send, name='send_message') + url(r'^$', login_required(ChatView.as_view()), name='chat'), + ])), ] diff --git a/resources/base.scss b/resources/base.scss index 688ff31..1a648e7 100644 --- a/resources/base.scss +++ b/resources/base.scss @@ -219,7 +219,7 @@ header { #nav-shadow { height: 2px; - background: linear-gradient($widget_black, transparent); + background: linear-gradient(#63c8f9, transparent); } #nav-container { @@ -281,7 +281,7 @@ nav { height: 18px; &:link { - color: #FFF; + color: #9c3706; } &:hover { diff --git a/resources/icons/logo.png b/resources/icons/logo.png index 2ac6656922b99423df930b81e5396bdc2baecab1..9eb296acb0dc952a865a38ce36b093f855c0eaf8 100644 GIT binary patch literal 24818 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 diff --git a/resources/icons/logo.svg b/resources/icons/logo.svg deleted file mode 100644 index 3a3e1ab..0000000 --- a/resources/icons/logo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/resources/table.scss b/resources/table.scss index f0901d6..5570ff2 100644 --- a/resources/table.scss +++ b/resources/table.scss @@ -42,7 +42,7 @@ $table_header_rounding: 6px; th { height: 2em; - color: #2b333b; + color: white; background-color: $widget_black; border-color: #cccccc; border-width: 1px 1px 0 0; diff --git a/resources/vars.scss b/resources/vars.scss index b599307..bd43b26 100644 --- a/resources/vars.scss +++ b/resources/vars.scss @@ -1,5 +1,5 @@ $highlight_blue: white; -$widget_black: #63c8f9;//68BBE3, add8e6 +$widget_black: #00007d;//68BBE3, add8e6 $border_gray: #ccc; $background_gray: #ededed; $background_light_gray: #fafafa; diff --git a/resources/widgets.scss b/resources/widgets.scss index a819d77..fb8787b 100644 --- a/resources/widgets.scss +++ b/resources/widgets.scss @@ -419,7 +419,7 @@ ul.select2-selection__rendered { margin: 0 -5px; background: $widget_black; border-radius: $widget_border_radius $widget_border_radius 0 0; - color: #2b333b; + color: white; padding-top: 5px; padding-bottom: 5px; padding-left: 7px; @@ -427,7 +427,7 @@ ul.select2-selection__rendered { } .sidebox h3 .fa { - color: #2b333b; + color: white; float: right; margin: 0.2em 0.4em 0 0; } diff --git a/templates/chat/chat.html b/templates/chat/chat.html index 826c093..1a2e17a 100644 --- a/templates/chat/chat.html +++ b/templates/chat/chat.html @@ -1,7 +1,7 @@ -{% if request.user.is_authenticated %} {% extends "base.html" %} - {% block js_media %} + +