diff messages/models.py @ 581:ee87ea74d46b

For Django 1.4, rearranged project structure for new manage.py.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 May 2012 17:10:48 -0500
parents gpp/messages/models.py@d0f0800eef0c
children 4a4fa174a0ec
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messages/models.py	Sat May 05 17:10:48 2012 -0500
@@ -0,0 +1,103 @@
+"""Models for the messages application."""
+
+import datetime
+
+from django.db import models
+from django.db.models import Q
+from django.contrib.auth.models import User
+
+from core.markup import site_markup
+
+
+class MessageManager(models.Manager):
+    """The manager for the Message model. Provides convenience functions."""
+
+    def inbox(self, user):
+        return self.filter(receiver=user,
+            receiver_delete_date__isnull=True).select_related('sender')
+
+    def outbox(self, user):
+        return self.filter(sender=user,
+            sender_delete_date__isnull=True).select_related('receiver')
+
+    def trash(self, user):
+        return self.filter(
+            Q(sender=user, sender_delete_date__isnull=False) |
+            Q(receiver=user, receiver_delete_date__isnull=False)
+        ).select_related()
+
+    def unread_count(self, user):
+        return self.filter(receiver=user, read_date__isnull=True).count()
+
+
+class Message(models.Model):
+    """The Message is a model for a private message between users."""
+    sender = models.ForeignKey(User, related_name='sender')
+    receiver = models.ForeignKey(User, related_name='receiver')
+    send_date = models.DateTimeField('Date Sent', null=True, blank=True)
+    read_date = models.DateTimeField('Date Received', null=True, blank=True)
+    reply_date = models.DateTimeField('Date Replied', null=True, blank=True)
+    subject = models.CharField(max_length=120)
+    message = models.TextField()
+    html = models.TextField()
+    sender_delete_date = models.DateTimeField(null=True, blank=True)
+    receiver_delete_date = models.DateTimeField(null=True, blank=True)
+    signature_attached = models.BooleanField(default=False)
+
+    objects = MessageManager()
+
+    def unread(self):
+        """returns True if the message has not been read yet"""
+        return self.read_date is None
+
+    def replied_to(self):
+        """returns True if the message has been replied to"""
+        return self.reply_date is not None
+
+    def is_deleted(self, user):
+        """returns True if the message has been deleted by the user"""
+        if (user == self.sender and self.sender_delete_date is not None) or (
+            user == self.receiver and self.receiver_delete_date is not None):
+            return True
+        return False
+
+    def save(self, *args, **kwargs):
+        if not self.id:
+            self.send_date = datetime.datetime.now()
+        self.html = site_markup(self.message)
+        super(Message, self).save(*args, **kwargs)
+
+    def __unicode__(self):
+        return self.subject
+
+    class Meta:
+        ordering = ('-send_date', )
+
+
+class OptionsManager(models.Manager):
+    """Manager class for Options model."""
+
+    def for_user(self, user):
+        try:
+            opts = self.get(user=user)
+        except Options.DoesNotExist:
+            opts = Options(user=user)
+            opts.save()
+        return opts
+
+
+class Options(models.Model):
+    """Options is a model for user private message options."""
+    user = models.ForeignKey(User, editable=False)
+    attach_signature = models.BooleanField("Always attach signature?", default=True)
+    notify_email = models.BooleanField("Notify me of new messages via email?", default=False)
+
+    objects = OptionsManager()
+
+    def __unicode__(self):
+        return self.user.username
+
+    class Meta:
+        verbose_name_plural = "Options"
+
+