def undelete(request, message_id, success_url=None): """ Recovers a message from trash. This is achieved by removing the ``(sender|recipient)_deleted_at`` from the model. """ user = request.user message = get_object_or_404(Message, id=message_id) undeleted = False if success_url is None: success_url = reverse('messages_inbox') if request.GET.has_key('next'): success_url = request.GET['next'] if message.sender == user: message.sender_deleted_at = None undeleted = True if message.recipient == user: message.recipient_deleted_at = None undeleted = True if undeleted: message.save() user.message_set.create(message=_(u"Message successfully recovered.")) if notification: notification.send([user], "messages_recovered", {'message': message,}) return HttpResponseRedirect(success_url) raise Http404
def delete(request, message_id, success_url=None): """ Marks a message as deleted by sender or recipient. The message is not really removed from the database, because two users must delete a message before it's save to remove it completely. A cron-job should prune the database and remove old messages which are deleted by both users. As a side effect, this makes it easy to implement a trash with undelete. You can pass ?next=/foo/bar/ via the url to redirect the user to a different page (e.g. `/foo/bar/`) than ``success_url`` after deletion of the message. """ user = request.user now = datetime.datetime.now() message = get_object_or_404(Message, id=message_id) deleted = False if success_url is None: success_url = reverse('messages_inbox') if request.GET.has_key('next'): success_url = request.GET['next'] if message.sender == user: message.sender_deleted_at = now deleted = True if message.recipient == user: message.recipient_deleted_at = now deleted = True if deleted: message.save() user.message_set.create(message=_(u"Message successfully deleted.")) if notification: notification.send([user], "messages_deleted", {'message': message,}) return HttpResponseRedirect(success_url) raise Http404
def save(self, sender, parent_msg=None): recipients = self.cleaned_data['recipient'] subject = self.cleaned_data['subject'] body = self.cleaned_data['body'] message_list = [] for r in recipients: msg = Message( sender = sender, recipient = r, subject = subject, body = body, ) if parent_msg is not None: msg.parent_msg = parent_msg parent_msg.replied_at = datetime.datetime.now() parent_msg.save() msg.save() message_list.append(msg) if notification: if parent_msg is not None: notification.send([sender], "messages_replied", {'message': msg,}) notification.send([r], "messages_reply_received", {'message': msg,}) else: notification.send([sender], "messages_sent", {'message': msg,}) notification.send([r], "messages_received", {'message': msg,}) return message_list
def save_model(self, request, obj, form, change): """ Saves the message for the recipient and looks in the form instance for other possible recipients. Prevents duplication by excludin the original recipient from the list of optional recipients. When changing an existing message and choosing optional recipients, the message is effectively resent to those users. """ obj.save() if notification: # Getting the appropriate notice labels for the sender and recipients. if obj.parent_msg is None: sender_label = 'messages_sent' recipients_label = 'messages_received' else: sender_label = 'messages_replied' recipients_label = 'messages_reply_received' # Notification for the sender. notification.send([obj.sender], sender_label, {'message': obj,}) if form.cleaned_data['group'] == 'all': # send to all users recipients = User.objects.exclude(pk=obj.recipient.pk) else: # send to a group of users recipients = [] group = form.cleaned_data['group'] if group: group = Group.objects.get(pk=group) recipients.extend( list(group.user_set.exclude(pk=obj.recipient.pk))) # create messages for all found recipients for user in recipients: obj.pk = None obj.recipient = user obj.save() if notification: # Notification for the recipient. notification.send([user], recipients_label, {'message' : obj,})