class DialogView(TemplateView): template_name = 'dialogs/dialog.html' @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): self.opponent = None self.dialog = None self.form = None if 'user_id' in kwargs: self.opponent = get_object_or_404(get_user_model(), pk=kwargs['user_id']) self.dialog = Dialog.objects.get_or_create(request.user, self.opponent) if not self.dialog: raise Http404 self.form = MessageForm(request.POST or None) return super(DialogView, self).dispatch(request, *args, **kwargs) def get_dialogs(self): qs = Dialog.objects.for_user(self.request.user).select_related('user1', 'user2').filter( last_message__isnull=False ).order_by('-last_message__created') paginator = Paginator(qs, 20) page = self.request.GET.get('dialogs-page') try: items = paginator.page(page) except PageNotAnInteger: items = paginator.page(1) except EmptyPage: items = paginator.page(paginator.num_pages) return items def get_messages(self): if not self.dialog: return paginator = Paginator(self.dialog.messages.all(), 20) page = self.request.GET.get('messages-page') try: items = paginator.page(page) except PageNotAnInteger: items = paginator.page(1) except EmptyPage: items = paginator.page(paginator.num_pages) return items def get_context_data(self, **kwargs): context = super(DialogView, self).get_context_data(**kwargs) context['dialogs'] = self.get_dialogs() context['opponent'] = self.opponent context['dialog_messages'] = self.get_messages() context['form'] = self.form return context def post(self, request, *args, **kwargs): if self.form and self.form.is_valid(): message = self.form.save(commit=False) message.dialog = self.dialog message.sender = request.user message.save() # return redirect('messages', kwargs={'user_id': self.opponent.pk}) return redirect(request.get_full_path()) return self.get(request, *args, **kwargs)
def messages_view(request): if request.POST: form = MessageForm(request.POST, user=request.user) if form.is_valid(): form.save() form.post() return redirect(reverse('dialogs:chat', kwargs={ 'thread_id': form.get_thread_id() })) else: form = MessageForm() thread_list = Thread.objects.filter( participants=request.user).order_by("-last_message") unread_messages = 0 for thread in thread_list: thread.unread_messages_count = thread.get_user_unread_messages_count( request.user) unread_messages += thread.unread_messages_count return render(request, 'private_messages.html', { "thread_list": thread_list, 'form': form, 'unread_messages': unread_messages, })
class DialogView(TemplateView): template_name = 'dialog/dialog.html' @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): self.opponent = None self.dialog = None self.form = None if 'user_id' in kwargs: self.opponent = get_object_or_404(get_user_model(), pk=kwargs['user_id']) self.dialog = Dialog.objects.get_or_create(request.user, self.opponent) if not self.dialog: raise Http404 self.form = MessageForm(request.POST or None) return super(DialogView, self).dispatch(request, *args, **kwargs) def get_dialogs(self): qs = Dialog.objects.for_user(self.request.user).select_related('user1', 'user2').filter( last_message__isnull=False ).order_by('-last_message__created') paginator = Paginator(qs, 20) page = self.request.GET.get('dialogs-page') try: items = paginator.page(page) except PageNotAnInteger: items = paginator.page(1) except EmptyPage: items = paginator.page(paginator.num_pages) return items def get_messages(self): if not self.dialog: return paginator = Paginator(self.dialog.messages.select_related('sender'), 20) page = self.request.GET.get('messages-page') try: items = paginator.page(page) except PageNotAnInteger: items = paginator.page(1) except EmptyPage: items = paginator.page(paginator.num_pages) return items def get_context_data(self, **kwargs): context = super(DialogView, self).get_context_data(**kwargs) context['dialogs'] = self.get_dialogs() context['opponent'] = self.opponent context['dialog_messages'] = self.get_messages() context['form'] = self.form return context def post(self, request, *args, **kwargs): if self.form and self.form.is_valid(): message = self.form.save(commit=False) message.sender = request.user message.dialog = self.dialog message.save() return redirect(request.path) return self.get(request, *args, **kwargs)
def post(self, request, chat_id): form = MessageForm(data=request.POST) if form.is_valid(): message = form.save(commit=False) message.chat_id = chat_id message.author = request.user message.save() return redirect(reverse('messages', kwargs={'chat_id': chat_id}))
def create(request): form = MessageForm(request.POST) if form.is_valid(): session = boto3.session.Session() s3_client = session.client( service_name='s3', endpoint_url='http://hb.bizmrg.com', aws_access_key_id='6Da62vVLUi6AKbFnnRoeA3', aws_secret_access_key= 'gDYg4Bu15yUpNYGKmmpiVNGvLRWhUAJ3m1GGRvg8KTbU', ) user = User.objects.get(username=request.POST['username']) chats = Member.objects.filter(user=user) for chat in chats: op = Member.objects.filter(chat=chat.chat).exclude(user=user).get() if op.user.username == request.POST['opponent']: result = chat.chat break message = Message(content=request.POST['content'], chat=result, user=user, added_at=request.POST['date']) message.save() response = [message.id] result.last_message = '(' + request.POST['attach_type'] + ') ' +\ request.POST['content'] if request.POST['attach_type'] != 'none' else request.POST['content'] result.save() chat.last_read_message = Message.objects.filter(chat=result).filter( user=op.user).last() chat.save() attachs = {} attachs['type'] = request.POST['attach_type'] if request.POST['attach_type'] == 'geolocation': attachment = Attachment( chat=result, user=user, message=message, attach_type='geolocation', url=request.POST['content'], ) attachment.save() attachs['url'] = attachment.url response.append(attachment.id) else: attachs['url'] = [] for file in request.FILES: key = 'attachments/' + request.POST[ 'attach_type'] + result.topic + '/' + str(hash(file)) s3_client.put_object( Bucket='tsyrkov_messanger_bucket', Key=key, Body=request.FILES[file], ) attachment = Attachment( chat=result, user=user, message=message, attach_type=request.POST['attach_type'], url=key, ) attachment.save() attachs['url'].append( s3_client.generate_presigned_url( 'get_object', Params={ 'Bucket': 'tsyrkov_messanger_bucket', 'Key': attachment.url, }, ExpiresIn=3600)) response.append(attachment.id) # send message to client if attachs['type'] == 'audio': attachs['url'] = attachs['url'][0] avatar = s3_client.generate_presigned_url( 'get_object', Params={ 'Bucket': 'tsyrkov_messanger_bucket', 'Key': message.user.avatar, }, ExpiresIn=3600) command_1 = { 'method': 'publish', 'params': { 'channel': op.user.username + '_with_' + user.username, 'data': { 'avatar': avatar, 'opponent': message.user.username, 'topic': result.topic, 'author': message.user.username, 'last_message': result.last_message, 'read': False, 'date': 'T'.join(message.added_at.split(' ')), 'message': message.content, 'attachments': attachs, } } } command_2 = { 'method': 'publish', 'params': { 'channel': op.user.username, 'data': { 'avatar': avatar, 'opponent': message.user.username, 'topic': result.topic, 'author': message.user.username, 'last_message': result.last_message, 'read': False, 'date': 'T'.join(message.added_at.split(' ')), 'message': message.content, 'attachments': attachs, } } } headers = { 'Content-Type': 'application/json', 'Authorization': 'apikey ' + API_KEY, } requests.post(url='http://localhost:9000/api', data=json.dumps(command_1), headers=headers) requests.post(url='http://localhost:9000/api', data=json.dumps(command_2), headers=headers) return JsonResponse({'success': response}) return JsonResponse({'errors': form.errors}, status=400)