annotate gpp/messages/models.py @ 265:1ba2c6bf6eb7

Closing #98. Animated GIFs were losing their transparency and animated properties when saved as avatars. Reworked the avatar save process to only run the avatar through PIL if it is too big. This preserves the original uploaded file if it is within the desired size settings. This may still mangle big animated gifs. If this becomes a problem, then maybe look into calling the PIL Image.resize() method directly. Moved the PIL image specific functions from bio.forms to a new module: core.image for better reusability in the future.
author Brian Neal <bgneal@gmail.com>
date Fri, 24 Sep 2010 02:12:09 +0000
parents 272d3a8c98e8
children 76ba9478ebbd
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,
gremmie@1 17 receiver_delete_date__isnull=True)
gremmie@1 18
gremmie@1 19 def outbox(self, user):
gremmie@1 20 return self.filter(sender=user,
gremmie@1 21 sender_delete_date__isnull=True)
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)
gremmie@1 27 )
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 @models.permalink
gremmie@1 71 def get_absolute_url(self):
gremmie@1 72 return ('messages.views.view', [str(self.id)])
gremmie@1 73
gremmie@1 74 def __unicode__(self):
gremmie@1 75 return self.subject
gremmie@1 76
gremmie@1 77 class Meta:
gremmie@1 78 ordering = ('-send_date', )
gremmie@1 79
gremmie@1 80
gremmie@1 81 class OptionsManager(models.Manager):
gremmie@1 82 """Manager class for Options model."""
gremmie@1 83
gremmie@1 84 def for_user(self, user):
gremmie@1 85 try:
gremmie@1 86 opts = self.get(user=user)
gremmie@1 87 except Options.DoesNotExist:
gremmie@1 88 opts = Options(user=user)
gremmie@1 89 opts.save()
gremmie@1 90 return opts
gremmie@1 91
gremmie@1 92
gremmie@1 93 class Options(models.Model):
gremmie@1 94 """Options is a model for user private message options."""
gremmie@1 95 user = models.ForeignKey(User, editable=False)
gremmie@1 96 attach_signature = models.BooleanField("Always attach signature?", default=True)
gremmie@1 97 notify_email = models.BooleanField("Notify me of new messages via email?", default=False)
gremmie@1 98
gremmie@1 99 objects = OptionsManager()
gremmie@1 100
gremmie@1 101 def __unicode__(self):
gremmie@1 102 return self.user.username
gremmie@1 103
bgneal@206 104 class Meta:
bgneal@206 105 verbose_name_plural = "Options"
gremmie@1 106
bgneal@206 107