from django.utils.translation import gettext as _ from django.views.generic import ListView from django.http import HttpResponse, JsonResponse from django.core.paginator import Paginator from django.shortcuts import render from django.forms.models import model_to_dict from django.utils import timezone from judge.jinja2.gravatar import gravatar from .models import Message, Profile import json def format_messages(messages): msg_list = [{ 'time': msg.time, 'author': msg.author, 'body': msg.body, 'image': gravatar(msg.author, 32), 'id': msg.id, 'css_class': msg.author.css_class, } for msg in messages] return json.dumps(msg_list, default=str) def get_admin_online_status(): all_admin = Profile.objects.filter(display_rank='admin') last_five_minutes = timezone.now()-timezone.timedelta(minutes=5) ret = [] for admin in all_admin: is_online = False if (admin.last_access >= last_five_minutes): is_online = True ret.append({'user': admin, 'is_online': is_online}) return ret class ChatView(ListView): model = Message context_object_name = 'message' template_name = 'chat/chat.html' title = _('Chat Box') paginate_by = 50 paginator = Paginator(Message.objects.filter(hidden=False), paginate_by) def get_queryset(self): return Message.objects.filter(hidden=False) def get(self, request, *args, **kwargs): page = request.GET.get('page') if (page == None): # return render(request, 'chat/chat.html', {'message': format_messages(Message.objects.all())}) return super().get(request, *args, **kwargs) cur_page = self.paginator.get_page(page) return HttpResponse(format_messages(cur_page.object_list)) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # hard code, should be fixed later address = f'{self.request.get_host()}/ws/chat/' if self.request.is_secure(): context['ws_address'] = f'wss://{address}' else: context['ws_address'] = f'ws://{address}' context['title'] = self.title last_five_minutes = timezone.now()-timezone.timedelta(minutes=5) context['online_users'] = Profile.objects \ .filter(display_rank='user', last_access__gte = last_five_minutes)\ .order_by('-rating') context['admin_status'] = get_admin_online_status() return context def delete_message(request): ret = {'delete': 'done'} if request.method == 'GET': return JsonResponse(ret) if request.user.is_staff: messid = int(request.POST.get('messid')) all_mess = Message.objects.all() for mess in all_mess: if mess.id == messid: mess.hidden = True mess.save() new_elt = {'time': mess.time, 'content': mess.body} ret = new_elt break return JsonResponse(ret) return JsonResponse(ret)