PonyConf/conversations/models.py

128 lines
4.3 KiB
Python

from django.contrib.auth.models import User
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.db import models
from accounts.models import Participation
from ponyconf.utils import PonyConfModel
from proposals.models import Talk
from .utils import generate_message_token, notify_by_email
class Message(PonyConfModel):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
conversation = GenericForeignKey('content_type', 'object_id')
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
author = models.ForeignKey(User)
content = models.TextField(blank=True)
system = models.BooleanField(default=False)
class Meta:
ordering = ['created']
def __str__(self):
return "Message from %s" % self.author
def get_absolute_url(self):
return self.conversation.get_absolute_url()
class Conversation(PonyConfModel):
subscribers = models.ManyToManyField(User, related_name='+', blank=True)
class Meta:
abstract = True
class ConversationWithParticipant(Conversation):
participation = models.OneToOneField(Participation, related_name='conversation')
messages = GenericRelation(Message)
uri = 'inbox'
template = 'participant_message'
def __str__(self):
return "Conversation with %s" % self.participation.user
def get_absolute_url(self):
return reverse('user-conversation', kwargs={'username': self.participation.user.username})
def get_site(self):
return self.participation.site
def new_message(self, message):
site = self.get_site()
subject = '[%s] Conversation with %s' % (site.name, self.participation.user.profile)
recipients = list(self.subscribers.all())
# Auto-subscribe
if message.author != self.participation.user and message.author not in recipients:
self.subscribers.add(message.author)
data = {
'content': message.content,
'uri': site.domain + reverse('user-conversation', args=[self.participation.user.username]),
}
first = self.messages.first()
if first != message:
ref = first.token
else:
ref = None
notify_by_email('message', data, subject, message.author, recipients, message.token, ref)
if message.author != self.participation.user:
subject = '[%s] Message notification' % site.name
data.update({
'uri': site.domain + reverse('inbox')
})
notify_by_email('message', data, subject, message.author, [self.participation.user], message.token, ref)
class ConversationAboutTalk(Conversation):
talk = models.OneToOneField(Talk, related_name='conversation')
messages = GenericRelation(Message)
uri = 'inbox'
template = 'talk_message'
def __str__(self):
return "Conversation about %s" % self.talk.title
def get_absolute_url(self):
return self.talk.get_absolute_url()
def get_site(self):
return self.talk.site
def new_message(self, message):
site = self.get_site()
first = self.messages.first()
if not message.system and message.author not in self.subscribers.all():
self.subscribers.add(message.author)
recipients = self.subscribers.all()
data = {
'uri': site.domain + reverse('show-talk', args=[self.talk.slug]),
}
if first == message:
subject = '[%s] Talk: %s' % (site.name, self.talk.title)
template = 'talk_notification'
ref = None
data.update({
'talk': self.talk,
'proposer': message.author,
'proposer_uri': site.domain + reverse('show-participant', args=[message.author.username])
})
else:
subject = 'Re: [%s] Talk: %s' % (site.name, self.talk.title)
template = 'message'
ref = first.token
data.update({'content': message.content})
notify_by_email(template, data, subject, message.author, recipients, message.token, ref)