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
|