PonyConf/conversations/models.py

128 lines
4.3 KiB
Python
Raw Normal View History

2016-06-14 19:39:04 +00:00
from django.contrib.auth.models import User
2016-06-14 21:58:04 +00:00
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
2016-06-12 21:39:04 +00:00
2016-06-14 19:39:04 +00:00
from accounts.models import Participation
from ponyconf.utils import PonyConfModel
2016-06-14 21:58:04 +00:00
from proposals.models import Talk
2016-06-13 00:00:30 +00:00
from .utils import generate_message_token, notify_by_email
2016-06-12 21:39:04 +00:00
class Message(PonyConfModel):
2016-06-12 21:39:04 +00:00
2016-06-14 21:58:04 +00:00
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
conversation = GenericForeignKey('content_type', 'object_id')
2016-06-12 21:39:04 +00:00
2016-06-15 20:31:03 +00:00
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
2016-06-14 19:39:04 +00:00
2016-06-12 21:39:04 +00:00
author = models.ForeignKey(User)
2016-09-28 21:58:13 +00:00
content = models.TextField(blank=True)
system = models.BooleanField(default=False)
2016-06-12 21:39:04 +00:00
class Meta:
ordering = ['created']
2016-06-12 21:39:04 +00:00
def __str__(self):
return "Message from %s" % self.author
2016-06-14 21:58:04 +00:00
def get_absolute_url(self):
return self.conversation.get_absolute_url()
2016-06-14 21:58:04 +00:00
class Conversation(PonyConfModel):
2016-06-14 21:58:04 +00:00
subscribers = models.ManyToManyField(User, related_name='+', blank=True)
class Meta:
abstract = True
class ConversationWithParticipant(Conversation):
2016-06-14 21:58:04 +00:00
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):
2016-11-12 12:56:21 +00:00
return reverse('user-conversation', kwargs={'username': self.participation.user.username})
def get_site(self):
return self.participation.site
2016-06-14 21:58:04 +00:00
def new_message(self, message):
site = self.get_site()
2016-06-15 20:31:03 +00:00
subject = '[%s] Conversation with %s' % (site.name, self.participation.user.profile)
2016-06-14 21:58:04 +00:00
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,
2016-11-12 12:56:21 +00:00
'uri': site.domain + reverse('user-conversation', args=[self.participation.user.username]),
2016-06-14 21:58:04 +00:00
}
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:
2016-06-15 20:31:03 +00:00
subject = '[%s] Message notification' % site.name
2016-06-14 21:58:04 +00:00
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):
2016-06-25 14:27:35 +00:00
return self.talk.get_absolute_url()
def get_site(self):
return self.talk.site
2016-06-14 21:58:04 +00:00
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)
2016-06-14 21:58:04 +00:00
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,
2016-11-12 12:56:21 +00:00
'proposer_uri': site.domain + reverse('show-participant', args=[message.author.username])
2016-06-14 21:58:04 +00:00
})
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)