def _api_check(request, room, room_slug, last_pk, spoke=False): """ Interal function to check for new messages and return a json response """ if not last_pk: return utils.jsonResponse({ 'success': False, 'error': 'No pointer provided', }) # Register the ping has_focus = request.POST.get('hasFocus', 'false') == 'true' _update_room_user(request, room, has_focus, spoke) # Prep list of messages messages = list(room.messages.filter(pk__gt=last_pk)) data = [ { 'pk': msg.pk, 'time': msg.timestamp, 'user': msg.user.username, 'content': msg.content, } for msg in messages ] return utils.jsonResponse({ 'success': True, 'last': last_pk if not messages else messages[-1].pk, 'time': int(time.time()), 'messages': data, 'users': _room_users(room, request.user), })
def api_history(request, room, room_slug): first_pk = request.POST.get('first', None) messages = room.messages.filter(pk__lt=first_pk) # Paginate msg_count = messages.count() remaining = 0 if msg_count > settings.PAGE_SIZE: remaining = msg_count - settings.PAGE_SIZE messages = messages[remaining:] # Need all messages now, force lookup # Need last message for javascript messages = list(messages) first_message = messages[0] if len(messages) > 0 else None data = [ { 'pk': msg.pk, 'time': msg.timestamp, 'user': msg.user.username, 'content': msg.content, } for msg in messages ] return utils.jsonResponse({ 'success': True, 'first': first_message.pk, 'remaining': remaining, 'messages': data, })
def api_send(request, room, room_slug): """ API: send message """ if request.POST: form = forms.MessageForm(request.POST) if form.is_valid(): message = form.save(commit=False) message.room = room message.user = request.user message.save() # Get response and update users before sending mail alerts response = _api_check( request, room, room_slug, last_pk=request.POST.get('last', None), spoke=True, ) _mail_alert(request, room) return response else: error = 'Invalid message' else: error = 'Invalid request' return utils.jsonResponse({ 'success': False, 'error': error, })