PonyConf/proposals/models.py

140 lines
4.2 KiB
Python
Raw Normal View History

2016-06-12 20:45:22 +00:00
from enum import IntEnum
from django.contrib.auth.models import User
2016-06-11 13:47:08 +00:00
from django.contrib.sites.models import Site
2016-06-12 16:35:59 +00:00
from django.core.urlresolvers import reverse
from django.core.validators import MaxValueValidator, MinValueValidator
2016-06-11 13:47:08 +00:00
from django.db import models
2016-07-23 10:03:12 +00:00
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ugettext
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
from autoslug import AutoSlugField
2016-06-07 20:59:13 +00:00
from accounts.models import Participation
from ponyconf.utils import PonyConfModel, enum_to_choices
2016-06-12 20:45:22 +00:00
from .utils import query_sum
2016-06-07 20:59:13 +00:00
class Conference(models.Model):
site = models.OneToOneField(Site, on_delete=models.CASCADE)
home = models.TextField(blank=True, default="")
def __str__(self):
return str(self.site)
class Topic(PonyConfModel):
2016-06-07 20:59:13 +00:00
2016-07-06 16:30:15 +00:00
site = models.ForeignKey(Site, on_delete=models.CASCADE)
2016-07-23 10:03:12 +00:00
name = models.CharField(max_length=128, verbose_name=_('Name'))
2016-06-07 20:59:13 +00:00
slug = AutoSlugField(populate_from='name', unique=True)
2016-08-07 08:20:26 +00:00
description = models.TextField(blank=True, verbose_name=_('Description'))
2016-06-07 20:59:13 +00:00
2016-07-23 10:03:12 +00:00
reviewers = models.ManyToManyField(User, blank=True, verbose_name=_('Reviewers'))
2016-07-11 20:58:46 +00:00
class Meta:
unique_together = ('site', 'name')
2016-06-07 20:59:13 +00:00
def __str__(self):
return self.name
2016-06-12 16:35:59 +00:00
def get_absolute_url(self):
2016-09-18 00:29:54 +00:00
return reverse('list-talks') + '?topic=%s' % self.slug
2016-06-12 16:35:59 +00:00
2016-06-07 20:59:13 +00:00
2016-09-21 22:53:09 +00:00
class Track(PonyConfModel):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
name = models.CharField(max_length=128, verbose_name=_('Name'))
slug = AutoSlugField(populate_from='name')
description = models.TextField(blank=True, verbose_name=_('Description'))
class Meta:
unique_together = ('site', 'name')
def __str__(self):
return self.name
class Event(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
name = models.CharField(max_length=64)
class Meta:
unique_together = ('site', 'name')
2016-09-18 00:00:46 +00:00
ordering = ('pk',)
def __str__(self):
return ugettext(self.name)
2016-06-07 20:59:13 +00:00
def get_absolute_url(self):
return reverse('list-talks') + '?kind=%d' % self.pk
class Talk(PonyConfModel):
2016-06-12 20:45:22 +00:00
2016-06-07 20:59:13 +00:00
site = models.ForeignKey(Site, on_delete=models.CASCADE)
2016-06-14 21:58:04 +00:00
proposer = models.ForeignKey(User, related_name='+')
2016-07-23 10:03:12 +00:00
speakers = models.ManyToManyField(User, verbose_name=_('Speakers'))
title = models.CharField(max_length=128, verbose_name=_('Title'))
2016-06-07 20:59:13 +00:00
slug = AutoSlugField(populate_from='title', unique=True)
abstract = models.CharField(max_length=255, blank=True, verbose_name=_('Abstract'))
2016-07-23 10:03:12 +00:00
description = models.TextField(blank=True, verbose_name=_('Description'))
topics = models.ManyToManyField(Topic, blank=True, verbose_name=_('Topics'))
2016-09-21 22:53:09 +00:00
track = models.ForeignKey(Track, blank=True, null=True, verbose_name=_('Track'))
notes = models.TextField(blank=True, verbose_name=_('Notes'))
2016-09-03 22:36:06 +00:00
event = models.ForeignKey(Event, verbose_name=_('Intervention kind'))
2016-07-03 20:39:29 +00:00
accepted = models.NullBooleanField(default=None)
2016-06-07 20:59:13 +00:00
2016-09-18 15:15:10 +00:00
class Meta:
ordering = ('title',)
2016-06-07 20:59:13 +00:00
def __str__(self):
return self.title
2016-06-12 16:35:59 +00:00
def get_absolute_url(self):
return reverse('show-talk', kwargs={'slug': self.slug})
def is_moderable_by(self, user):
2016-06-14 21:58:04 +00:00
if user.is_superuser:
return True
try:
2016-07-09 19:30:49 +00:00
participation = Participation.objects.get(site=self.site, user=user)
2016-06-14 21:58:04 +00:00
except Participation.DoesNotExists:
return False
return participation.orga or self.topics.filter(reviewers=participation.user).exists()
def is_editable_by(self, user):
return user == self.proposer or user in self.speakers.all() or self.is_moderable_by(user)
def score(self):
2016-09-16 16:12:21 +00:00
if self.vote_set.exists():
return query_sum(self.vote_set, 'vote') / len(self.vote_set.all())
else:
return 0
2016-08-21 22:28:14 +00:00
class Meta:
ordering = ('event__id',)
2016-08-21 22:28:14 +00:00
class Vote(PonyConfModel):
talk = models.ForeignKey(Talk)
2016-07-11 19:33:34 +00:00
user = models.ForeignKey(User)
vote = models.IntegerField(validators=[MinValueValidator(-2), MaxValueValidator(2)], default=0)
class Meta:
unique_together = ('talk', 'user')
def __str__(self):
return "%+i by %s for %s" % (self.vote, self.user, self.talk)
def get_absolute_url(self):
return self.talk.get_absolute_url()