annotate gpp/messages/models.py @ 101:4bbb6a9aa317

Forums: use select_related() with get_object_or_404() to reduce queries.
author Brian Neal <bgneal@gmail.com>
date Wed, 16 Sep 2009 00:39:27 +0000
parents dbd703f7d63a
children 9c18250972d5
rev   line source
gremmie@1 1 """Models for the messages application."""
gremmie@1 2
gremmie@1 3 import datetime
gremmie@1 4 from django.db import models
gremmie@1 5 from django.db.models import Q
gremmie@1 6 from django.contrib.auth.models import User
gremmie@1 7 from django.template.loader import render_to_string
gremmie@1 8
gremmie@1 9
gremmie@1 10 class MessageManager(models.Manager):
gremmie@1 11 """The manager for the Message model. Provides convenience functions."""
gremmie@1 12
gremmie@1 13 def inbox(self, user):
gremmie@1 14 return self.filter(receiver=user,
gremmie@1 15 receiver_delete_date__isnull=True)
gremmie@1 16
gremmie@1 17 def outbox(self, user):
gremmie@1 18 return self.filter(sender=user,
gremmie@1 19 sender_delete_date__isnull=True)
gremmie@1 20
gremmie@1 21 def trash(self, user):
gremmie@1 22 return self.filter(
gremmie@1 23 Q(sender=user, sender_delete_date__isnull=False) |
gremmie@1 24 Q(receiver=user, receiver_delete_date__isnull=False)
gremmie@1 25 )
gremmie@1 26
gremmie@1 27 def unread_count(self, user):
gremmie@1 28 return self.filter(receiver=user, read_date__isnull=True).count()
gremmie@1 29
gremmie@1 30
gremmie@1 31 class Message(models.Model):
gremmie@1 32 """The Message is a model for a private message between users."""
gremmie@1 33 sender = models.ForeignKey(User, related_name='sender')
gremmie@1 34 receiver = models.ForeignKey(User, related_name='receiver')
gremmie@1 35 send_date = models.DateTimeField('Date Sent', null=True, blank=True)
gremmie@1 36 read_date = models.DateTimeField('Date Received', null=True, blank=True)
gremmie@1 37 reply_date = models.DateTimeField('Date Replied', null=True, blank=True)
gremmie@1 38 subject = models.CharField(max_length=120)
gremmie@1 39 message = models.TextField()
gremmie@1 40 html = models.TextField()
gremmie@1 41 sender_delete_date = models.DateTimeField(null=True, blank=True)
gremmie@1 42 receiver_delete_date = models.DateTimeField(null=True, blank=True)
gremmie@1 43 signature_attached = models.BooleanField(default=False)
gremmie@1 44
gremmie@1 45 objects = MessageManager()
gremmie@1 46
gremmie@1 47 def unread(self):
gremmie@1 48 """returns True if the message has not been read yet"""
gremmie@1 49 return self.read_date is None
gremmie@1 50
gremmie@1 51 def replied_to(self):
gremmie@1 52 """returns True if the message has been replied to"""
gremmie@1 53 return self.reply_date is not None
gremmie@1 54
gremmie@1 55 def is_deleted(self, user):
gremmie@1 56 """returns True if the message has been deleted by the user"""
gremmie@1 57 if (user == self.sender and self.sender_delete_date is not None) or (
gremmie@1 58 user == self.receiver and self.receiver_delete_date is not None):
gremmie@1 59 return True
gremmie@1 60 return False
gremmie@1 61
gremmie@1 62 def save(self, force_insert = False, force_update = False):
gremmie@1 63 if not self.id:
gremmie@1 64 self.send_date = datetime.datetime.now()
gremmie@1 65 html = render_to_string('messages/markdown.html', {'data': self.message})
gremmie@1 66 self.html = html.strip()
gremmie@1 67 super(Message, self).save(force_insert, force_update)
gremmie@1 68
gremmie@1 69 @models.permalink
gremmie@1 70 def get_absolute_url(self):
gremmie@1 71 return ('messages.views.view', [str(self.id)])
gremmie@1 72
gremmie@1 73 def __unicode__(self):
gremmie@1 74 return self.subject
gremmie@1 75
gremmie@1 76 class Meta:
gremmie@1 77 ordering = ('-send_date', )
gremmie@1 78
gremmie@1 79
gremmie@1 80 class OptionsManager(models.Manager):
gremmie@1 81 """Manager class for Options model."""
gremmie@1 82
gremmie@1 83 def for_user(self, user):
gremmie@1 84 try:
gremmie@1 85 opts = self.get(user=user)
gremmie@1 86 except Options.DoesNotExist:
gremmie@1 87 opts = Options(user=user)
gremmie@1 88 opts.save()
gremmie@1 89 return opts
gremmie@1 90
gremmie@1 91
gremmie@1 92 class Options(models.Model):
gremmie@1 93 """Options is a model for user private message options."""
gremmie@1 94 user = models.ForeignKey(User, editable=False)
gremmie@1 95 attach_signature = models.BooleanField("Always attach signature?", default=True)
gremmie@1 96 notify_email = models.BooleanField("Notify me of new messages via email?", default=False)
gremmie@1 97
gremmie@1 98 objects = OptionsManager()
gremmie@1 99
gremmie@1 100 def __unicode__(self):
gremmie@1 101 return self.user.username
gremmie@1 102
gremmie@1 103
gremmie@1 104 # vim: ts=4 sw=4