annotate messages/models.py @ 861:e4f8d87c3d30

Configure Markdown logger to reduce noise in logs. Markdown is logging at the INFO level whenever it loads an extension. This looks like it has been fixed in master at GitHub. But until then we will explicitly configure the MARKDOWN logger to log at WARNING or higher.
author Brian Neal <bgneal@gmail.com>
date Mon, 01 Dec 2014 18:36:27 -0600
parents 4a4fa174a0ec
children 82f1f6f905eb
rev   line source
gremmie@1 1 """Models for the messages application."""
gremmie@1 2
gremmie@1 3 import datetime
bgneal@128 4
gremmie@1 5 from django.db import models
gremmie@1 6 from django.db.models import Q
gremmie@1 7 from django.contrib.auth.models import User
bgneal@128 8
bgneal@128 9 from core.markup import site_markup
gremmie@1 10
gremmie@1 11
gremmie@1 12 class MessageManager(models.Manager):
gremmie@1 13 """The manager for the Message model. Provides convenience functions."""
gremmie@1 14
gremmie@1 15 def inbox(self, user):
gremmie@1 16 return self.filter(receiver=user,
bgneal@425 17 receiver_delete_date__isnull=True).select_related('sender')
gremmie@1 18
gremmie@1 19 def outbox(self, user):
gremmie@1 20 return self.filter(sender=user,
bgneal@425 21 sender_delete_date__isnull=True).select_related('receiver')
gremmie@1 22
gremmie@1 23 def trash(self, user):
gremmie@1 24 return self.filter(
gremmie@1 25 Q(sender=user, sender_delete_date__isnull=False) |
gremmie@1 26 Q(receiver=user, receiver_delete_date__isnull=False)
bgneal@425 27 ).select_related()
gremmie@1 28
gremmie@1 29 def unread_count(self, user):
gremmie@1 30 return self.filter(receiver=user, read_date__isnull=True).count()
gremmie@1 31
gremmie@1 32
gremmie@1 33 class Message(models.Model):
gremmie@1 34 """The Message is a model for a private message between users."""
gremmie@1 35 sender = models.ForeignKey(User, related_name='sender')
gremmie@1 36 receiver = models.ForeignKey(User, related_name='receiver')
gremmie@1 37 send_date = models.DateTimeField('Date Sent', null=True, blank=True)
gremmie@1 38 read_date = models.DateTimeField('Date Received', null=True, blank=True)
gremmie@1 39 reply_date = models.DateTimeField('Date Replied', null=True, blank=True)
gremmie@1 40 subject = models.CharField(max_length=120)
gremmie@1 41 message = models.TextField()
gremmie@1 42 html = models.TextField()
gremmie@1 43 sender_delete_date = models.DateTimeField(null=True, blank=True)
gremmie@1 44 receiver_delete_date = models.DateTimeField(null=True, blank=True)
gremmie@1 45 signature_attached = models.BooleanField(default=False)
gremmie@1 46
gremmie@1 47 objects = MessageManager()
gremmie@1 48
gremmie@1 49 def unread(self):
gremmie@1 50 """returns True if the message has not been read yet"""
gremmie@1 51 return self.read_date is None
gremmie@1 52
gremmie@1 53 def replied_to(self):
gremmie@1 54 """returns True if the message has been replied to"""
gremmie@1 55 return self.reply_date is not None
gremmie@1 56
gremmie@1 57 def is_deleted(self, user):
gremmie@1 58 """returns True if the message has been deleted by the user"""
gremmie@1 59 if (user == self.sender and self.sender_delete_date is not None) or (
gremmie@1 60 user == self.receiver and self.receiver_delete_date is not None):
gremmie@1 61 return True
gremmie@1 62 return False
gremmie@1 63
bgneal@182 64 def save(self, *args, **kwargs):
gremmie@1 65 if not self.id:
gremmie@1 66 self.send_date = datetime.datetime.now()
bgneal@128 67 self.html = site_markup(self.message)
bgneal@182 68 super(Message, self).save(*args, **kwargs)
gremmie@1 69
gremmie@1 70 def __unicode__(self):
gremmie@1 71 return self.subject
gremmie@1 72
gremmie@1 73 class Meta:
gremmie@1 74 ordering = ('-send_date', )
gremmie@1 75
gremmie@1 76
gremmie@1 77 class OptionsManager(models.Manager):
gremmie@1 78 """Manager class for Options model."""
gremmie@1 79
gremmie@1 80 def for_user(self, user):
gremmie@1 81 try:
gremmie@1 82 opts = self.get(user=user)
gremmie@1 83 except Options.DoesNotExist:
gremmie@1 84 opts = Options(user=user)
gremmie@1 85 opts.save()
gremmie@1 86 return opts
gremmie@1 87
gremmie@1 88
gremmie@1 89 class Options(models.Model):
gremmie@1 90 """Options is a model for user private message options."""
gremmie@1 91 user = models.ForeignKey(User, editable=False)
gremmie@1 92 attach_signature = models.BooleanField("Always attach signature?", default=True)
gremmie@1 93 notify_email = models.BooleanField("Notify me of new messages via email?", default=False)
gremmie@1 94
gremmie@1 95 objects = OptionsManager()
gremmie@1 96
gremmie@1 97 def __unicode__(self):
gremmie@1 98 return self.user.username
gremmie@1 99
bgneal@206 100 class Meta:
bgneal@206 101 verbose_name_plural = "Options"
gremmie@1 102
bgneal@206 103
bgneal@810 104 class Flag(models.Model):
bgneal@810 105 """The Flag model is used to represent when a receiver of a private message
bgneal@810 106 has flagged the message for spam or abuse.
bgneal@810 107
bgneal@810 108 """
bgneal@810 109 message = models.OneToOneField(Message)
bgneal@810 110 flag_date = models.DateTimeField()
bgneal@810 111 comments = models.TextField(blank=True)
bgneal@810 112
bgneal@810 113 def __unicode__(self):
bgneal@810 114 msg = self.message
bgneal@810 115 return "{} has flagged a PM from {}".format(msg.receiver.username,
bgneal@810 116 msg.sender.username)
bgneal@810 117
bgneal@810 118 def save(self, *args, **kwargs):
bgneal@810 119 if not self.id:
bgneal@810 120 self.flag_date = datetime.datetime.now()
bgneal@810 121 super(Flag, self).save(*args, **kwargs)
bgneal@810 122