# HG changeset patch # User Brian Neal # Date 1299442989 0 # Node ID c8c0fa817a05672219b15c6fd29ac89db7186d58 # Parent e9a066db3f544e526e7b607bb0ab08c8064a3fb4 Fixing #181; delete PM's if we can. Add ability for a sender to take back a PM if they delete it before it has been read. diff -r e9a066db3f54 -r c8c0fa817a05 gpp/messages/views.py --- a/gpp/messages/views.py Sun Mar 06 00:40:50 2011 +0000 +++ b/gpp/messages/views.py Sun Mar 06 20:23:09 2011 +0000 @@ -1,6 +1,8 @@ """Views for the messages application""" +import collections import datetime + from django.shortcuts import render_to_response from django.template import RequestContext from django.http import HttpResponseRedirect @@ -25,6 +27,8 @@ 'trash': 'messages-trash', } +MSG_DELETED, MSG_TRASHED, MSG_ERROR = range(3) + def box_redirect(request): """ @@ -48,7 +52,7 @@ msgs = Message.objects.inbox(request.user) return render_to_response('messages/inbox.html', { 'msgs': msgs, - }, + }, context_instance = RequestContext(request)) @@ -58,7 +62,7 @@ msgs = Message.objects.outbox(request.user) return render_to_response('messages/outbox.html', { 'msgs': msgs, - }, + }, context_instance = RequestContext(request)) @@ -68,7 +72,7 @@ msgs = Message.objects.trash(request.user) return render_to_response('messages/trash.html', { 'msgs': msgs, - }, + }, context_instance = RequestContext(request)) @@ -92,7 +96,7 @@ 'box': box, 'msg': msg, 'is_deleted': msg.is_deleted(request.user), - }, + }, context_instance = RequestContext(request)) @@ -130,7 +134,7 @@ return render_to_response('messages/compose.html', { 'compose_form': compose_form, - }, + }, context_instance = RequestContext(request)) @@ -159,10 +163,49 @@ return render_to_response('messages/compose.html', { 'compose_form': compose_form, - }, + }, context_instance = RequestContext(request)) +def _delete_message(user, msg): + """ + Deletes a given message. The user must be either the sender or + receiver for this to succeed. + If both parties have deleted the message, it is deleted from the + database. If only one party has deleted the message, the message + is just sent to the trash. + + Returns MSG_DELETED, MSG_TRASHED, or MSG_ERROR to indicate what + action was performed. + + """ + if msg.sender == user: + if (msg.receiver_delete_date is not None or + msg.read_date is None): + # Both parties deleted the message or receiver hasn't read it yet, + # we can delete it now + msg.delete() + return MSG_DELETED + else: + # receiver still has it in inbox + msg.sender_delete_date = datetime.datetime.now() + msg.save() + return MSG_TRASHED + + elif msg.receiver == user: + if msg.sender_delete_date is not None: + # both parties deleted the message, we can delete it now + msg.delete() + return MSG_DELETED + else: + # sender still has it in the outbox + msg.receiver_delete_date = datetime.datetime.now() + msg.save() + return MSG_TRASHED + + return MSG_ERROR + + @login_required @require_POST def delete(request, msg_id): @@ -171,14 +214,13 @@ 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() + result = _delete_message(request.user, msg) + if result == MSG_DELETED: + messages.success(request, 'Message deleted.') + elif result == MSG_TRASHED: + messages.success(request, 'Message sent to trash.') else: - raise Http404 - msg.save() - messages.success(request, 'Message sent to trash.') + messages.error(request, 'Error deleting message.') return box_redirect(request) @@ -196,16 +238,20 @@ 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() + + msgs = Message.objects.filter(id__in=delete_ids) + + counts = collections.defaultdict(int) 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() - messages.success(request, 'Messages sent to the trash.') + result = _delete_message(request.user, msg) + counts[result] += 1 + + if counts[MSG_DELETED]: + messages.success(request, 'Messages deleted: %d' % counts[MSG_DELETED]) + if counts[MSG_TRASHED]: + messages.success(request, 'Messages sent to trash: %d' % counts[MSG_TRASHED]) + if counts[MSG_ERROR]: + messages.error(request, 'Message errors: %d' % counts[MSG_ERROR]) return box_redirect(request) @@ -282,6 +328,6 @@ return render_to_response('messages/options.html', { 'form': form, - }, + }, context_instance = RequestContext(request)) diff -r e9a066db3f54 -r c8c0fa817a05 static/css/base.css --- a/static/css/base.css Sun Mar 06 00:40:50 2011 +0000 +++ b/static/css/base.css Sun Mar 06 20:23:09 2011 +0000 @@ -419,3 +419,4 @@ .centered { text-align: center; } +.success {background:#99ff99;color:#264409;border-color:#339933;}