diff gpp/messages/views.py @ 1:dbd703f7d63a

Initial import of sg101 stuff from private repository.
author gremmie
date Mon, 06 Apr 2009 02:43:12 +0000
parents
children ab7830b067b3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/messages/views.py	Mon Apr 06 02:43:12 2009 +0000
@@ -0,0 +1,310 @@
+"""Views for the messages application"""
+
+import datetime
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.contrib.auth.models import User
+from django.http import HttpResponseRedirect
+from django.http import HttpResponse
+from django.http import HttpResponseBadRequest
+from django.http import HttpResponseForbidden
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import get_object_or_404
+from django.core.urlresolvers import reverse
+from django.http import Http404
+
+from messages.models import Message
+from messages.models import Options
+from messages.forms import ComposeForm
+from messages.forms import OptionsForm
+from messages.utils import reply_subject
+from messages.utils import quote_message
+
+
+BOX_MAP = {
+    'inbox': 'messages-inbox',
+    'outbox': 'messages-outbox',
+    'trash': 'messages-trash',
+}
+
+
+def box_redirect(request):
+    """
+    Determines which box to redirect to by looking for a GET or
+    POST parameter.
+    """
+    if request.method == 'GET':
+        box = request.GET.get('box', 'inbox')
+    else:
+        box = request.POST.get('box', 'inbox')
+    if BOX_MAP.has_key(box):
+        url = reverse(BOX_MAP[box])
+    else:
+        url = reverse(BOX_MAP['inbox'])
+    return HttpResponseRedirect(url)
+
+
+@login_required
+def inbox(request):
+    """Displays the inbox for the user making the request."""
+    msgs = Message.objects.inbox(request.user)
+    return render_to_response('messages/inbox.html', {
+        'msgs': msgs,
+        }, 
+        context_instance = RequestContext(request))
+
+
+@login_required
+def outbox(request):
+    """Displays the outbox for the user making the request."""
+    msgs = Message.objects.outbox(request.user)
+    return render_to_response('messages/outbox.html', {
+        'msgs': msgs,
+        }, 
+        context_instance = RequestContext(request))
+
+
+@login_required
+def trash(request):
+    """Displays the trash for the user making the request."""
+    msgs = Message.objects.trash(request.user)
+    return render_to_response('messages/trash.html', {
+        'msgs': msgs,
+        }, 
+        context_instance = RequestContext(request))
+
+
+@login_required
+def view(request, msg_id):
+    """
+    View a given message. Only the sender or receiver can see
+    the message.
+    """
+    msg = get_object_or_404(Message, pk=msg_id)
+    if msg.sender != request.user and msg.receiver != request.user:
+        raise Http404
+
+    if msg.receiver == request.user and msg.read_date is None:
+        msg.read_date = datetime.datetime.now()
+        msg.save()
+
+    box = request.GET.get('box', None)
+
+    return render_to_response('messages/view.html', {
+        'box': box,
+        'msg': msg,
+        'is_deleted': msg.is_deleted(request.user),
+        }, 
+        context_instance = RequestContext(request))
+
+
+@login_required
+def reply(request, msg_id):
+    """
+    Process or prepare the compose form in order to reply
+    to a given message.
+    """
+    msg = get_object_or_404(Message, pk=msg_id)
+
+    if request.method == "POST":
+        if request.POST.get('submit_button', 'Cancel') == 'Cancel':
+            return box_redirect(request)
+        compose_form = ComposeForm(request.user, request.POST)
+        if compose_form.is_valid():
+            compose_form.save(sender=request.user, parent_msg=msg)
+            request.user.message_set.create(message='Reply sent.')
+            return box_redirect(request)
+    else:
+        if msg.receiver == request.user:
+            receiver_name = msg.sender.username
+        else:
+            # replying to message in outbox
+            receiver_name = msg.receiver.username
+
+        form_data = {
+            'receiver': receiver_name,
+            'subject': reply_subject(msg.subject),
+            'message': quote_message(msg.sender, msg.send_date, msg.message),
+            'box': request.GET.get('box', 'inbox'),
+        }
+
+        compose_form = ComposeForm(request.user, initial=form_data)
+
+    return render_to_response('messages/compose.html', {
+        'compose_form': compose_form,
+        }, 
+        context_instance = RequestContext(request))
+
+
+@login_required
+def compose(request, receiver=None):
+    """
+    Process or prepare the compose form in order to create
+    a new message.
+    """
+    if request.method == "POST":
+        if request.POST.get('submit_button', 'Cancel') == 'Cancel':
+            return HttpResponseRedirect(reverse('messages-inbox'))
+        compose_form = ComposeForm(request.user, request.POST)
+        if compose_form.is_valid():
+            compose_form.save(sender=request.user)
+            request.user.message_set.create(message='Message sent.')
+            return HttpResponseRedirect(reverse('messages-inbox'))
+    else:
+        if receiver is not None:
+            form_data = {
+                'receiver': receiver,
+            }
+            compose_form = ComposeForm(request.user, initial=form_data)
+        else:
+            compose_form = ComposeForm(request.user)
+
+    return render_to_response('messages/compose.html', {
+        'compose_form': compose_form,
+        }, 
+        context_instance = RequestContext(request))
+
+
+@login_required
+def delete(request, msg_id):
+    """
+    Deletes a given message. The user must be either the sender or
+    receiver for this to succeed.
+    """
+    msg = get_object_or_404(Message, pk=msg_id)
+    if msg.sender == request.user:
+        msg.sender_delete_date = datetime.datetime.now()
+    elif msg.receiver == request.user:
+        msg.receiver_delete_date = datetime.datetime.now()
+    else:
+        raise Http404
+    msg.save()
+    request.user.message_set.create(message='Message sent to trash.')
+
+    return box_redirect(request)
+
+
+@login_required
+def delete_bulk(request):
+    """
+    Deletes messages in bulk. The message ID's to be deleted are expected
+    to be in the delete POST array. The user must be either the sender
+    or receiver for this to succeed.
+    """
+    if request.method == "POST":
+        delete_ids = request.POST.getlist('delete_ids')
+        try:
+            delete_ids = [int(id) for id in delete_ids]
+        except ValueError:
+            raise Http404
+        msgs = Message.objects.filter(id__in = delete_ids)
+        now = datetime.datetime.now()
+        for msg in msgs:
+            if msg.sender == request.user:
+                msg.sender_delete_date = now
+                msg.save()
+            elif msg.receiver == request.user:
+                msg.receiver_delete_date = now
+                msg.save()
+        request.user.message_set.create(message='Messages sent to the trash.')
+
+    return box_redirect(request)
+
+
+@login_required
+def undelete(request, msg_id):
+    """
+    Undeletes a given message. The user must be either the sender or
+    receiver for this to succeed.
+    """
+    msg = get_object_or_404(Message, pk=msg_id)
+    if msg.sender == request.user:
+        msg.sender_delete_date = None
+    elif msg.receiver == request.user:
+        msg.receiver_delete_date = None
+    else:
+        raise Http404
+    msg.save()
+    request.user.message_set.create(message='Message retrieved from the trash.')
+
+    return box_redirect(request)
+
+
+@login_required
+def undelete_bulk(request):
+    """
+    Undeletes messages in bulk. The message ID's to be deleted are expected
+    to be in the delete POST array. The user must be either the sender
+    or receiver for this to succeed.
+    """
+    if request.method == "POST":
+        undelete_ids = request.POST.getlist('undelete_ids')
+        try:
+            undelete_ids = [int(id) for id in undelete_ids]
+        except ValueError:
+            raise Http404
+        msgs = Message.objects.filter(id__in = undelete_ids)
+        for msg in msgs:
+            if msg.sender == request.user:
+                msg.sender_delete_date = None
+                msg.save()
+            elif msg.receiver == request.user:
+                msg.receiver_delete_date = None
+                msg.save()
+        request.user.message_set.create(message='Messages retrieved from the trash.')
+
+    return box_redirect(request)
+
+
+@login_required
+def options(request):
+    """
+    View to display/change user options.
+    """
+    if request.method == "POST":
+        if request.POST.get('submit_button', 'Cancel') == 'Cancel':
+            return HttpResponseRedirect(reverse('messages-inbox'))
+        options = Options.objects.for_user(request.user)
+        form = OptionsForm(request.POST, instance=options)
+        if form.is_valid():
+            form.save()
+            request.user.message_set.create(message='Options saved.')
+            return HttpResponseRedirect(reverse('messages-inbox'))
+    else:
+        try:
+            options = Options.objects.for_user(request.user)
+        except:
+            options = Options()
+            options.user = request.user
+            options.save()
+
+        form = OptionsForm(instance=options)
+
+    return render_to_response('messages/options.html', {
+        'form': form,
+        }, 
+        context_instance = RequestContext(request))
+
+
+def ajax_users(request):
+    """
+    If the user is authenticated, return a string of usernames whose names start with
+    the 'q' GET parameter, limited by the 'limit' GET parameters. The names are separated
+    by newlines.
+    If the user is not authenticated, return an empty string.
+    This is used by the auto-complete function in the compose form.
+    """
+    q = request.GET.get('q', None)
+    if q is None:
+        return HttpResponseBadRequest()
+
+    if request.user.is_authenticated():
+        q = request.GET.get('q', ' ')
+        limit = int(request.GET.get('limit', 10))
+        users = User.objects.filter(username__istartswith=q).values_list('username', flat=True)[:limit]
+        user_list = u"\n".join(users)
+        return HttpResponse(user_list)
+    return HttpResponseForbidden()
+
+
+# vim: ts=4 sw=4