views.py 7.46 KB
from django.shortcuts import get_object_or_404, redirect, render
from django.core.paginator import Paginator, EmptyPage
from django.http import Http404
from django.views import generic
from django.contrib import messages
from django.http import JsonResponse
from django.template.loader import render_to_string
from django.core.urlresolvers import reverse, reverse_lazy
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Q

from categories.models import Category
from subjects.models import Subject
from users.models import User

from .models import Conversation, GeneralTalk, CategoryTalk, SubjectTalk, TalkMessages, ChatVisualizations
from .forms import ChatMessageForm

class GeneralIndex(LoginRequiredMixin, generic.ListView):
	login_url = reverse_lazy("users:login")
	redirect_field_name = 'next'

	template_name = 'chat/list.html'
	context_object_name = "conversations"
	paginate_by = 10

	totals = {}

	def get_queryset(self):
		user = self.request.user
		page = self.request.GET.get('page', False)

		conversations = Conversation.objects.filter(Q(user_one = user) | Q(user_two = user))
		
		self.totals['general'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__generaltalk__isnull = False).count()
		self.totals['category'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__categorytalk__isnull = False).count()
		self.totals['subject'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__subjecttalk__isnull = False).count()

		return conversations

	def get_context_data(self, **kwargs):
		context = super(GeneralIndex, self).get_context_data(**kwargs)

		context['title'] = _('Messages')
		context['totals'] = self.totals
		context['chat_menu_active'] = 'subjects_menu_active'
		
		return context

class GeneralParticipants(LoginRequiredMixin, generic.ListView):
	login_url = reverse_lazy("users:login")
	redirect_field_name = 'next'

	template_name = 'chat/list_participants.html'
	context_object_name = "participants"
	paginate_by = 10

	totals = {}

	def get_queryset(self):
		user = self.request.user
		search = self.request.GET.get('search', '')

		users = User.objects.filter(Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)).distinct().order_by('social_name','username').exclude(email = user.email)
		
		self.totals['general'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__generaltalk__isnull = False).count()
		self.totals['category'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__categorytalk__isnull = False).count()
		self.totals['subject'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__subjecttalk__isnull = False).count()

		return users

	def get_context_data(self, **kwargs):
		context = super(GeneralParticipants, self).get_context_data(**kwargs)

		context['title'] = _('Messages - Participants')
		context['totals'] = self.totals
		context['search'] = self.request.GET.get('search')
		context['chat_menu_active'] = 'subjects_menu_active'
		
		return context

class ParticipantProfile(LoginRequiredMixin, generic.DetailView):
	login_url = reverse_lazy("users:login")
	redirect_field_name = 'next'

	model = User
	slug_field = 'email'
	slug_url_kwarg = 'email'
	context_object_name = 'participant'
	template_name = 'chat/_profile.html'

	def get_context_data(self, **kwargs):
		context = super(ParticipantProfile, self).get_context_data(**kwargs)

		context['space'] = self.request.GET.get('space', '0')
		context['space_type'] = self.request.GET.get('space_type', 'general')
		
		return context

class GetTalk(LoginRequiredMixin, generic.ListView):
	login_url = reverse_lazy("users:login")
	redirect_field_name = 'next'

	context_object_name = 'messages'
	template_name = 'chat/talk.html'
	paginate_by = 20
	talk_id = "-1"

	def get_queryset(self):
		user = self.request.user
		user_email = self.kwargs.get('email', '')

		talks = Conversation.objects.filter((Q(user_one = user) & Q(user_two__email = user_email)) | (Q(user_two = user) & Q(user_one__email = user_email)))

		messages = TalkMessages.objects.none()

		if talks.count() > 0:
			talk = talks[0]
			self.talk_id = talk.id

			messages = TalkMessages.objects.filter(talk = talk).order_by('-create_date')

		return messages

	def get_context_data(self, **kwargs):
		context = super(GetTalk, self).get_context_data(**kwargs)

		user_email = self.kwargs.get('email', '')

		context['participant'] = get_object_or_404(User, email = user_email)
		context['talk_id'] = self.talk_id
		context['space'] = self.request.GET.get('space', '0')
		context['space_type'] = self.request.GET.get('space_type', 'general')
		
		return context

class SendMessage(LoginRequiredMixin, generic.edit.CreateView):
	login_url = reverse_lazy("users:login")
	redirect_field_name = 'next'

	form_class = ChatMessageForm
	template_name = "chat/_form.html"

	def form_invalid(self, form):
		context = super(SendMessage, self).form_invalid(form)
		context.status_code = 400

		return context

	def form_valid(self, form):
		self.object = form.save(commit = False)

		self.object.user = self.request.user

		talk_id = self.kwargs.get('talk_id', '-1')
		user = get_object_or_404(User, email = self.kwargs.get('email', ''))
		space_type = self.kwargs.get('space_type', 'general')
		space = self.kwargs.get('space', 0)

		if talk_id == "-1":
			if space_type == 'general':
				talk = GeneralTalk.objects.create(user_one = self.request.user, user_two = user, space = 0)
			elif space_type == 'category':
				cat = get_object_or_404(Category, id = space)
				talk = CategoryTalk.objects.create(user_one = self.request.user, user_two = user, space = cat)
			else:
				sub = get_object_or_404(Subject, id = space)
				talk = SubjectTalk.objects.create(user_one = self.request.user, user_two = user, space = sub)
		else:
			talk = get_object_or_404(Conversation, id = talk_id)

		self.object.talk = talk

		self.object.save()

		#entries = []

		#paths = [reverse("mural:manage_general")]

		#notification = {
		#	"type": "mural",
		#	"subtype": "post",
		#	"paths": paths,
		#	"user_icon": self.object.user.image_url,
		#	"simple_notify": _("%s has made a post in General")%(str(self.object.user)),
		#	"complete": render_to_string("mural/_view.html", {"post": self.object}, self.request),
		#	"container": ".post",
		#	"accordion": False,
		#	"post_type": "general"
		#}

		#notification = json.dumps(notification)

		#Group("user-%s" % user.id).send({'text': notification})

		ChatVisualizations.objects.create(viewed = False, message = self.object, user = user)

		return super(SendMessage, self).form_valid(form)

	def get_context_data(self, **kwargs):
		context = super(SendMessage, self).get_context_data(**kwargs)

		context['form_url'] = reverse_lazy('chat:create', args = (), kwargs = {'email': self.kwargs.get('email', ''), 'talk_id': self.kwargs.get('talk_id', None), 'space': self.kwargs.get('space', '0'), 'space_type': self.kwargs.get('space_type', 'general')})
		
		return context

	def get_success_url(self):
		return reverse_lazy('chat:render_message', args = (self.object.id, ))

def render_message(request, talk_msg):
	msg = get_object_or_404(TalkMessages, id = talk_msg)

	context = {}
	context['talk_msg'] = msg
	
	message = _('Message sent successfully!')
	
	html = render_to_string("chat/_message.html", context, request)

	return JsonResponse({'message': message, 'view': html, 'new_id': msg.id})